English | ç®€ä½“ä¸æ–‡
🚀 TensorRT-YOLO 是一款专为 NVIDIA è®¾å¤‡è®¾è®¡çš„æ˜“ç”¨çµæ´»ã€æžè‡´é«˜æ•ˆçš„YOLO系列推ç†éƒ¨ç½²å·¥å…·ã€‚项目ä¸ä»…集æˆäº† TensorRT æ’件以增强åŽå¤„ç†æ•ˆæžœï¼Œè¿˜ä½¿ç”¨äº† CUDA æ ¸å‡½æ•°ä»¥åŠ CUDA 图æ¥åŠ é€ŸæŽ¨ç†ã€‚TensorRT-YOLO æä¾›äº† C++ å’Œ Python 推ç†çš„æ”¯æŒï¼Œæ—¨åœ¨æä¾›ðŸ“¦å¼€ç®±å³ç”¨çš„部署体验。包括 ç›®æ ‡æ£€æµ‹ã€å®žä¾‹åˆ†å‰²ã€å›¾åƒåˆ†ç±»ã€å§¿æ€è¯†åˆ«ã€æ—‹è½¬ç›®æ ‡æ£€æµ‹ã€è§†é¢‘分æžç‰ä»»åŠ¡åœºæ™¯ï¼Œæ»¡è¶³å¼€å‘者多场景的部署需求。
-
🔥 实战课程|TensorRT × Triton Inference Server 模型部署
- å¹³å°: BiliBili è¯¾å ‚ | å¾®ä¿¡å…¬ä¼—å· ðŸš€ HOT
- 团队: laugh12321 | ä¸å½’ç‰ 8000 ›é¡¿ç®¡çš„熊猫
- ðŸ› ç¡¬æ ¸ä¸“é¢˜:
â–¸ 自定义æ’ä»¶å¼€å‘(å«Plugin注册全æµç¨‹ï¼‰
â–¸ CUDA Graph 原ç†ä¸Žå·¥ç¨‹å®žè·µ
▸ Triton Inference Server 部署技巧
-
2025-04-19: æ·»åŠ å¯¹ YOLO-World, YOLOE 的支æŒï¼ŒåŒ…括分类ã€å®šå‘边界框ã€å§¿æ€ä¼°è®¡ä»¥åŠå®žä¾‹åˆ†å‰²ï¼Œè¯¦è§ B站。🌟 NEW
-
2025-03-29: æ·»åŠ å¯¹ YOLO12 的支æŒï¼ŒåŒ…括分类ã€å®šå‘边界框ã€å§¿æ€ä¼°è®¡ä»¥åŠå®žä¾‹åˆ†å‰²ï¼Œè¯¦è§ issues。🌟 NEW
-
性能飞跃ï¼TensorRT-YOLO 6.0 å…¨é¢å‡çº§è§£æžä¸Žå®žæˆ˜æŒ‡å— 🌟 NEW
- å…¨é¢å…¼å®¹ï¼šæ”¯æŒ 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 æ–¹å¼å¾—到的引擎进行推ç†çš„延迟时间(包括å‰å¤„ç†ã€æŽ¨ç†å’ŒåŽå¤„ç†ï¼‰ã€‚
- 安装指å—
- 使用示例
- API文档
- Python API文档(
âš ï¸ æœªå®žçŽ°ï¼‰ - C++ API文档(
âš ï¸ æœªå®žçŽ°ï¼‰
- Python API文档(
- 常è§é—®é¢˜
âš ï¸ æ”¶é›†ä¸ ...
- 模型支æŒåˆ—表
- CUDA:推è版本 ≥ 11.0.1
- TensorRT:推è版本 ≥ 8.6.1
- æ“作系统:Linux (x86_64 或 arm)(推è);Windows äº¦å¯æ”¯æŒ
- å‚考 📦 快速编译安装 文档。
- å‚考 🔧 模型导出 文档,导出适用于该项目推ç†çš„ONNX模型并构建为TensorRT引擎。
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; }
以下是predict方法的æµç¨‹å›¾ï¼Œå±•示了从输入图片到输出结果的完整æµç¨‹ï¼š
åªéœ€å°†å¾…推ç†çš„å›¾ç‰‡ä¼ é€’ç»™ predict 方法,predict 内部会自动完æˆé¢„处ç†ã€æ¨¡åž‹æŽ¨ç†å’ŒåŽå¤„ç†ï¼Œå¹¶è¾“出推ç†ç»“果,这些结果å¯è¿›ä¸€æ¥åº”用于下游任务(如å¯è§†åŒ–ã€ç›®æ ‡è·Ÿè¸ªç‰ï¼‰ã€‚
更多部署案例请å‚考模型部署示例 .
符å·è¯´æ˜Ž: (1) ✅ : å·²ç»æ”¯æŒ; (2) â”: æ£åœ¨è¿›è¡Œä¸; (3) ⎠: æš‚ä¸æ”¯æŒ; (4) 🟢 : 导出自行实现,å³å¯æŽ¨ç†.
å¼€æºä¸æ˜“ï¼Œå¦‚æžœæœ¬é¡¹ç›®å¯¹ä½ æœ‰æ‰€å¸®åŠ©ï¼Œæ¬¢è¿Žé€šè¿‡èµžåŠ©æ”¯æŒä½œè€…ã€‚ä½ çš„æ”¯æŒæ˜¯å¼€å‘者æŒç»ç»´æŠ¤çš„æœ€å¤§åŠ¨åŠ›ï¼
🙠衷心感谢以下支æŒè€…ä¸ŽèµžåŠ©å•†çš„æ— ç§æ”¯æŒï¼š
Note
以下是 GitHub Actions 自动生æˆçš„èµžåŠ©è€…åˆ—è¡¨ï¼Œæ¯æ—¥æ›´æ–° ✨。
TensorRT-YOLO采用 GPL-3.0许å¯è¯ï¼Œè¿™ä¸ªOSI 批准的开æºè®¸å¯è¯éžå¸¸é€‚åˆå¦ç”Ÿå’Œçˆ±å¥½è€…,å¯ä»¥æŽ¨åŠ¨å¼€æ”¾çš„å作和知识分享。请查看LICENSE 文件以了解更多细节。
感谢您选择使用 TensorRT-YOLO,我们鼓励开放的åä½œå’ŒçŸ¥è¯†åˆ†äº«ï¼ŒåŒæ—¶ä¹Ÿå¸Œæœ›æ‚¨éµå®ˆå¼€æºè®¸å¯çš„相关规定。
对于 TensorRT-YOLO 的错误报告和功能请求,请访问 GitHub Issuesï¼