8000
Skip to content

mrshao520/TensorRT-YOLO-Learning

 
 

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

291 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

English | 简体中文

GitHub License GitHub Release GitHub Repo Stars Linux Arch NVIDIA


🚀 TensorRT-YOLO 是一款专为 NVIDIA è®¾å¤‡è®¾è®¡çš„æ˜“ç”¨çµæ´»ã€æžè‡´é«˜æ•ˆçš„YOLO系列推ç†éƒ¨ç½²å·¥å…·ã€‚项目ä¸ä»…集æˆäº† TensorRT æ’件以增强åŽå¤„ç†æ•ˆæžœï¼Œè¿˜ä½¿ç”¨äº† CUDA æ ¸å‡½æ•°ä»¥åŠ CUDA 图æ¥åŠ é€ŸæŽ¨ç†ã€‚TensorRT-YOLO æä¾›äº† C++ å’Œ Python 推ç†çš„æ”¯æŒï¼Œæ—¨åœ¨æä¾›ðŸ“¦å¼€ç®±å³ç”¨çš„部署体验。包括 目标检测ã€å®žä¾‹åˆ†å‰²ã€å›¾åƒåˆ†ç±»ã€å§¿æ€è¯†åˆ«ã€æ—‹è½¬ç›®æ ‡æ£€æµ‹ã€è§†é¢‘分æžç­‰ä»»åŠ¡åœºæ™¯ï¼Œæ»¡è¶³å¼€å‘者多场景的部署需求。

🌠 近期更新

✨ 主è¦ç‰¹æ€§

🎯 多样化的 YOLO 支æŒ

  • å…¨é¢å…¼å®¹ï¼šæ”¯æŒ YOLOv3 至 YOLO12 å…¨ç³»åˆ—æ¨¡åž‹ï¼Œä»¥åŠ PP-YOLOEã€PP-YOLOE+ã€YOLO-World å’Œ YOLOE 等多ç§å˜ä½“ï¼Œæ»¡è¶³å¤šæ ·åŒ–éœ€æ±‚ï¼Œè¯¦è§ ðŸ–¥ï¸ æ¨¡åž‹æ”¯æŒåˆ—表。
  • çµæ´»åˆ‡æ¢ï¼šæä¾›ç®€æ´æ˜“用的接å£ï¼Œæ”¯æŒä¸åŒç‰ˆæœ¬ YOLO 模型的快速切æ¢ã€‚🌟 NEW
  • 多场景应用:æä¾›ä¸°å¯Œçš„示例代ç ï¼Œæ¶µç›–Detectã€Segmentã€Classifyã€Poseã€OBB等多ç§åº”用场景。

🚀 性能优化

  • CUDA 加速:通过 CUDA 核函数优化å‰å¤„ç†æµç¨‹ï¼Œå¹¶é‡‡ç”¨ CUDA 图技术加速推ç†è¿‡ç¨‹ã€‚
  • TensorRT 集æˆï¼šæ·±åº¦é›†æˆ TensorRT æ’件,显著加速åŽå¤„ç†ï¼Œæå‡æ•´ä½“æŽ¨ç†æ•ˆçŽ‡ã€‚
  • 多 Context 推ç†ï¼šæ”¯æŒå¤š Context 并行推ç†ï¼Œæœ€å¤§åŒ–硬件资æºåˆ©ç”¨çŽ‡ã€‚ðŸŒŸ NEW
  • 显存管ç†ä¼˜åŒ–:适é…多架构显存优化策略(如 Jetson çš„ Zero Copy 模å¼ï¼‰ï¼Œæå‡æ˜¾å­˜æ•ˆçŽ‡ã€‚ðŸŒŸ NEW

ðŸ› ï¸ æ˜“ç”¨æ€§

  • 开箱å³ç”¨ï¼šæä¾›å…¨é¢çš„ C++ å’Œ Python æŽ¨ç†æ”¯æŒï¼Œæ»¡è¶³ä¸åŒå¼€å‘者需求。
  • CLI 工具:内置命令行工具,支æŒå¿«é€Ÿæ¨¡åž‹å¯¼å‡ºä¸ŽæŽ¨ç†ï¼Œæå‡å¼€å‘效率。
  • Docker 支æŒï¼šæä¾› Docker 一键部署方案,简化环境é…置与部署æµç¨‹ã€‚
  • 无第三方ä¾èµ–:全部功能使用标准库实现,无需é¢å¤–ä¾èµ–,简化部署æµç¨‹ã€‚
  • 部署便æ·ï¼šæä¾›åЍæ€åº“编译支æŒï¼Œæ–¹ä¾¿è°ƒç”¨å’Œéƒ¨ç½²ã€‚

🌠兼容性

  • å¤šå¹³å°æ”¯æŒï¼šå…¨é¢å…¼å®¹ Windowsã€Linuxã€ARMã€x86 ç­‰å¤šç§æ“作系统与硬件平å°ã€‚
  • TensorRT å…¼å®¹ï¼šå®Œç¾Žé€‚é… TensorRT 10.x 版本,确ä¿ä¸Žæœ€æ–°æŠ€æœ¯ç”Ÿæ€æ— ç¼è¡”接。

🔧 çµæ´»é…ç½®

  • 预处ç†å‚数自定义:支æŒå¤šç§é¢„处ç†å‚æ•°çµæ´»é…置,包括 通é“äº¤æ¢ (SwapRB)ã€å½’ä¸€åŒ–å‚æ•°ã€è¾¹ç•Œå€¼å¡«å……。🌟 NEW

🚀 性能对比

Model Official + trtexec (ms) trtyolo + trtexec (ms) TensorRT-YOLO Inference (ms)
YOLOv11n 1.611 ± 0.061 1.428 ± 0.097 1.228 ± 0.048
YOLOv11s 2.055 ± 0.147 1.886 ± 0.145 1.687 ± 0.047
YOLOv11m 3.028 ± 0.167 2.865 ± 0.235 2.691 ± 0.085
YOLOv11l 3.856 ± 0.287 3.682 ± 0.309 3.571 ± 0.102
YOLOv11x 6.377 ± 0.487 6.195 ± 0.482 6.207 ± 0.231

Note

测试环境

  • GPU:NVIDIA RTX 2080 Ti 22GB
  • 输入尺寸:640×640 åƒç´ 

测试工具

  • Official:使用 Ultralytics 官方导出的 ONNX 模型。
  • trtyolo:使用 TensorRT-YOLO æä¾›çš„ CLI 工具 (trtyolo) 导出的带 EfficientNMS æ’ä»¶çš„ ONNX æ ¼å¼æ¨¡åž‹ã€‚
  • trtexec:使用 NVIDIA çš„ trtexec 工具将 ONNX æ¨¡åž‹æž„å»ºä¸ºå¼•æ“Žå¹¶è¿›è¡ŒæŽ¨ç†æµ‹è¯•。
    • 构建指令:trtexec -- --saveEngine=xxx.engine --fp16
    • 测试指令:trtexec --avgRuns=1000 --useSpinWait --loadEngine=xxx.engine
  • TensorRT-YOLO Inference:使用 TensorRT-YOLO 框架对 trtyolo + trtexec æ–¹å¼å¾—到的引擎进行推ç†çš„延迟时间(包括å‰å¤„ç†ã€æŽ¨ç†å’ŒåŽå¤„ç†ï¼‰ã€‚

🔮 文档教程

💨 快速开始

1. å‰ç½®ä¾èµ–

  • CUDA:推è版本 ≥ 11.0.1
  • TensorRT:推è版本 ≥ 8.6.1
  • æ“作系统:Linux (x86_64 或 arm)(推è);Windows äº¦å¯æ”¯æŒ

2. 安装

3. 模型导出

  • å‚考 🔧 模型导出 文档,导出适用于该项目推ç†çš„ONNX模型并构建为TensorRT引擎。

4. 推ç†ç¤ºä¾‹

Note

ClassifyModelã€DetectModelã€OBBModelã€SegmentModel å’Œ PoseModel 分别对应于图åƒåˆ†ç±»ï¼ˆClassifyï¼‰ã€æ£€æµ‹ï¼ˆDetectï¼‰ã€æ–¹å‘边界框(OBB)ã€åˆ†å‰²ï¼ˆSegment)ã€å§¿æ€ä¼°è®¡ï¼ˆPose)和模型。

  • 使用 Python 进行推ç†ï¼š

    import cv2
    from tensorrt_yolo.infer import InferOption, DetectModel, generate_labels, visualize
    
    def main():
        # -------------------- åˆå§‹åŒ–é…ç½® --------------------
        # é…置推ç†è®¾ç½®
        option = InferOption()
        option.enable_swap_rb()  # å°†OpenCV默认的BGRæ ¼å¼è½¬ä¸ºRGBæ ¼å¼
        # 特殊模型é…置示例(如PP-YOLOEç³»åˆ—éœ€å–æ¶ˆä¸‹æ–¹æ³¨é‡Šï¼‰
        # option.set_normalize_params([0.485, 0.456, 0.406], [0.229, 0.224, 0.225])
    
        # -------------------- 模型åˆå§‹åŒ– --------------------
        # 加载TensorRTå¼•æ“Žæ–‡ä»¶ï¼ˆæ³¨æ„æ£€æŸ¥æ–‡ä»¶è·¯å¾„)
        # æç¤ºï¼šé¦–次加载引擎å¯èƒ½éœ€è¦è¾ƒé•¿æ—¶é—´è¿›è¡Œä¼˜åŒ–
        model = DetectModel(engine_file="yolo11n-with-plugin.engine",
                          option=option)
    
        # -------------------- æ•°æ®é¢„å¤„ç† --------------------
        # 加载测试图片(建议添加文件存在性检查)
        input_img = cv2.imread("test_image.jpg")
        if input_img is None:
            raise FileNotFoundError("测试图片加载失败,请检查文件路径")
    
        # -------------------- æ‰§è¡ŒæŽ¨ç† --------------------
        # 执行目标检测(返回结果包å«è¾¹ç•Œæ¡†ã€ç½®ä¿¡åº¦ã€ç±»åˆ«ä¿¡æ¯ï¼‰
        detection_result = model.predict(input_img)
        print(f"==> detection_result: {detection_result}")
    
        # -------------------- 结果å¯è§†åŒ– --------------------
        # 加载类别标签(需确ä¿labels.txt与模型匹é…)
        class_labels = generate_labels(labels_file="labels.txt")
        # 生æˆå¯è§†åŒ–结果
        visualized_img = visualize(
            image=input_img,
            result=detection_result,
            labels=class_labels,
        )
        cv2.imwrite("vis_image.jpg", visualized_img)
    
        # -------------------- 模型克隆演示 --------------------
        # 克隆模型实例(适用于多线程场景)
        cloned_model = model.clone()  # 创建独立副本,é¿å…资æºç«žäº‰
        # 验è¯å…‹éš†æ¨¡åž‹æŽ¨ç†ä¸€è‡´æ€§
        cloned_result = cloned_model.predict(input_img)
        print(f"==> cloned_result: {cloned_result}")
    
    if __name__ == "__main__":
        main()
  • 使用 C++ 进行推ç†ï¼š

    #include <memory>
    #include <opencv2/opencv.hpp>
    
    // 为了方便调用,模å—除使用CUDAã€TensorRT外,其余å‡ä½¿ç”¨æ ‡å‡†åº“实现
    #include "deploy/model.hpp"  // åŒ…å«æ¨¡åž‹æŽ¨ç†ç›¸å…³çš„类定义
    #include "deploy/option.hpp"  // åŒ…å«æŽ¨ç†é€‰é¡¹çš„é…置类定义
    #include "deploy/result.hpp"  // åŒ…å«æŽ¨ç†ç»“果的定义
    
    int main() {
        try
    8000
     {
            // -------------------- åˆå§‹åŒ–é…ç½® --------------------
            deploy::InferOption option;
            option.enableSwapRB();  // BGR->RGB转æ¢
    
            // ç‰¹æ®Šæ¨¡åž‹å‚æ•°è®¾ç½®ç¤ºä¾‹
            // const std::vector<float> mean{0.485f, 0.456f, 0.406f};
            // const std::vector<float> std{0.229f, 0.224f, 0.225f};
            // option.setNormalizeParams(mean, std);
    
            // -------------------- 模型åˆå§‹åŒ– --------------------
            auto detector = std::make_unique<deploy::DetectModel>(
                "yolo11n-with-plugin.engine",  // 模型路径
                option                         // 推ç†è®¾ç½®
            );
    
            // -------------------- æ•°æ®åŠ è½½ --------------------
            cv::Mat cv_image = cv::imread("test_image.jpg");
            if (cv_image.empty()) {
                throw std::runtime_error("无法加载测试图片");
            }
    
            // å°è£…å›¾åƒæ•°æ®ï¼ˆä¸å¤åˆ¶åƒç´ æ•°æ®ï¼‰
            deploy::Image input_image(
                cv_image.data,     // åƒç´ æ•°æ®æŒ‡é’ˆ
                cv_image.cols,     // 图åƒå®½åº¦
                cv_image.rows     // 图åƒé«˜åº¦
            );
    
            // -------------------- æ‰§è¡ŒæŽ¨ç† --------------------
            deploy::DetectRes result = detector->predict(input_image);
            std::cout << result << std::endl;
    
            // -------------------- 结果å¯è§†åŒ–(示æ„) --------------------
            // 实际开å‘需实现å¯è§†åŒ–逻辑,示例:
            // cv::Mat vis_image = visualize_detections(cv_image, result);
            // cv::imwrite("vis_result.jpg", vis_image);
    
            // -------------------- 模型克隆演示 --------------------
            auto cloned_detector = detector->clone();  // 创建独立实例
            deploy::DetectRes cloned_result = cloned_detector->predict(input_image);
    
            // 验è¯ç»“果一致性
            std::cout << cloned_result << std::endl;
    
        } catch (const std::exception& e) {
            std::cerr << "程åºå¼‚常: " << e.what() << std::endl;
            return EXIT_FAILURE;
        }
        return EXIT_SUCCESS;
    }

5.æŽ¨ç†æµç¨‹å›¾

以下是predict方法的æµç¨‹å›¾ï¼Œå±•示了从输入图片到输出结果的完整æµç¨‹ï¼š

åªéœ€å°†å¾…推ç†çš„图片传递给 predict 方法,predict 内部会自动完æˆé¢„处ç†ã€æ¨¡åž‹æŽ¨ç†å’ŒåŽå¤„ç†ï¼Œå¹¶è¾“出推ç†ç»“果,这些结果å¯è¿›ä¸€æ­¥åº”用于下游任务(如å¯è§†åŒ–ã€ç›®æ ‡è·Ÿè¸ªç­‰ï¼‰ã€‚

更多部署案例请å‚考模型部署示例 .

ðŸ–¥ï¸ æ¨¡åž‹æ”¯æŒåˆ—表

Detect Segment
Pose OBB

符å·è¯´æ˜Ž: (1) ✅ : å·²ç»æ”¯æŒ; (2) â”: 正在进行中; (3) ⎠: æš‚ä¸æ”¯æŒ; (4) 🟢 : 导出自行实现,å³å¯æŽ¨ç†.

任务场景 模型 CLI 导出 推ç†éƒ¨ç½²
Detect ultralytics/yolov3 ✅ ✅
Detect ultralytics/yolov5 ✅ ✅
Detect meituan/YOLOv6 ⎠å‚考官方导出教程 ✅
Detect WongKinYiu/yolov7 ⎠å‚考官方导出教程 ✅
Detect WongKinYiu/yolov9 ⎠å‚考官方导出教程 ✅
Detect THU-MIG/yolov10 ✅ ✅
Detect sunsmarterjie/yolov12 ✅ ✅
Detect YOLO-World V2 (ultralytics) ✅ ✅
Detect THU-MIG/yoloe ✅ ✅
Detect ultralytics/ultralytics ✅ ✅
Detect PaddleDetection/PP-YOLOE+ ✅ ✅
Segment ultralytics/yolov3 ✅ ✅
Segment ultralytics/yolov5 ✅ ✅
Segment meituan/YOLOv6-seg ⎠å‚考tensorrt_yolo/export/head.py 自行实现 🟢
Segment WongKinYiu/yolov7 ⎠å‚考tensorrt_yolo/export/head.py 自行实现 🟢
Segment WongKinYiu/yolov9 ⎠å‚考tensorrt_yolo/export/head.py 自行实现 🟢
Segment THU-MIG/yoloe ✅ ✅
Segment ultralytics/ultralytics ✅ ✅
Classify ultralytics/yolov3 ✅ ✅
Classify ultralytics/yolov5 ✅ ✅
Classify ultralytics/ultralytics ✅ ✅
Pose ultralytics/ultralytics ✅ ✅
OBB ultralytics/ultralytics ✅ ✅

🌟 赞助与支æŒ

å¼€æºä¸æ˜“,如果本项目对你有所帮助,欢迎通过赞助支æŒä½œè€…ã€‚ä½ çš„æ”¯æŒæ˜¯å¼€å‘者æŒç»­ç»´æŠ¤çš„æœ€å¤§åŠ¨åŠ›ï¼


🙠衷心感谢以下支æŒè€…ä¸ŽèµžåŠ©å•†çš„æ— ç§æ”¯æŒï¼š

Note

以下是 GitHub Actions 自动生æˆçš„èµžåŠ©è€…åˆ—è¡¨ï¼Œæ¯æ—¥æ›´æ–° ✨。

📄 许å¯è¯

TensorRT-YOLO采用 GPL-3.0许å¯è¯ï¼Œè¿™ä¸ªOSI 批准的开æºè®¸å¯è¯éžå¸¸é€‚åˆå­¦ç”Ÿå’Œçˆ±å¥½è€…,å¯ä»¥æŽ¨åŠ¨å¼€æ”¾çš„å作和知识分享。请查看LICENSE 文件以了解更多细节。

感谢您选择使用 TensorRT-YOLO,我们鼓励开放的åä½œå’ŒçŸ¥è¯†åˆ†äº«ï¼ŒåŒæ—¶ä¹Ÿå¸Œæœ›æ‚¨éµå®ˆå¼€æºè®¸å¯çš„相关规定。

📞 è”系方å¼

对于 TensorRT-YOLO 的错误报告和功能请求,请访问 GitHub Issuesï¼

🙠致谢

Featured|HelloGitHub

About

🚀 Easier & Faster YOLO Deployment Toolkit for NVIDIA 🛠ï¸

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Co 3FA0 ntributors

Languages

  • C++ 51.3%
  • Cuda 23.6%
  • Python 21.3%
  • CMake 2.5%
  • Other 1.3%
0