yolort C++部署实战:在嵌入式设备上运行YOLOv5目标检测模型

yolort C++部署实战:在嵌入式设备上运行YOLOv5目标检测模型

【免费下载链接】yolortyolort is a runtime stack for yolov5 on specialized accelerators such as tensorrt, libtorch, onnxruntime, tvm and ncnn.项目地址: https://gitcode.com/gh_mirrors/yo/yolort

yolort是一个专为YOLOv5设计的运行时框架,能够在TensorRT、LibTorch、ONNX Runtime等专用加速器上高效部署目标检测模型。本文将带你一步步实现如何在嵌入式设备上使用C++部署YOLOv5模型,让你的边缘计算设备拥有强大的实时目标检测能力。

📌 为什么选择yolort进行C++部署?

yolort提供了完整的模型部署解决方案,特别适合资源受限的嵌入式环境:

  • 多后端支持:覆盖主流推理框架,包括TensorRT、LibTorch、ONNX Runtime和NCNN
  • 轻量级设计:针对嵌入式设备优化,最小化内存占用和计算资源消耗
  • C++原生支持:提供简洁的C++ API接口,易于集成到嵌入式系统中
  • 高性能推理:通过模型优化和硬件加速,实现实时目标检测

📋 部署前准备工作

开发环境要求

  • 操作系统:Linux(推荐Ubuntu 18.04或更高版本)
  • 编译器:GCC 7.5+ 或 Clang 8.0+
  • 构建工具:CMake 3.14+
  • 目标硬件:支持CUDA的嵌入式设备(如Jetson系列)或CPU

获取项目源码

git clone https://gitcode.com/gh_mirrors/yo/yolort cd yolort

🔍 yolort C++部署架构解析

yolort的部署架构设计清晰,主要包含输入处理、模型推理和结果后处理三个核心模块:

图:YOLOv5模型架构示意图,展示了从输入到输出的完整处理流程

从架构图中可以看到,yolort将YOLOv5模型分解为以下关键组件:

  • 输入转换:对图像进行预处理,包括缩放、归一化等操作
  • 骨干网络:提取图像特征,采用Darknet架构
  • 特征融合:使用PANet结构融合多尺度特征
  • 检测头:生成目标边界框和类别概率
  • 后处理:通过非极大值抑制(NMS)过滤冗余检测结果

🚀 编译C++部署程序

yolort为不同的推理后端提供了完整的C++部署示例,位于deployment目录下:

deployment/ ├── libtorch/ # LibTorch后端部署 ├── ncnn/ # NCNN后端部署 ├── onnxruntime/ # ONNX Runtime后端部署 ├── tensorrt/ # TensorRT后端部署 └── tensorrt-yolov6/ # TensorRT YOLOv6部署

以TensorRT后端为例进行编译

  1. 进入TensorRT部署目录:
cd deployment/tensorrt
  1. 创建构建目录并运行CMake:
mkdir build && cd build cmake ..
  1. 编译项目:
make -j4

编译完成后,将生成可执行文件,例如TensorRT后端生成的执行文件名为yolort_tensorrt(根据CMakeLists.txt中的add_executable(${PROJECT_NAME} main.cpp)定义)。

💻 运行目标检测程序

准备模型和测试图像

  1. 首先需要准备一个YOLOv5模型,可以使用官方预训练模型或自定义训练的模型
  2. 将模型转换为对应后端支持的格式(如TensorRT需要转换为.engine文件)
  3. 准备测试图像,项目中提供了示例图像:
    • 测试图像1:包含公交车和行人的街景图像
    • 测试图像2:包含人物的场景图像

执行目标检测

以TensorRT后端为例,运行编译好的可执行文件:

./yolort_tensorrt --model=path/to/model.engine --image=../../test/assets/bus.jpg

程序将输出检测结果,并可以选择将结果保存为图像文件。以下是使用yolort部署的YOLOv5模型对人物图像的检测结果:

图:YOLOv5目标检测结果示例,绿色框表示检测到的人物,粉色框表示检测到的领带

⚙️ 关键代码解析

主程序入口

每个后端的部署示例都提供了完整的C++代码,以ONNX Runtime后端的main.cpp为例:

#include <iostream> #include <string> #include <vector> #include "cmdline.h" #include "yolort_onnx.h" int main(int argc, char** argv) { // 解析命令行参数 cmdline::parser parser; parser.add<std::string>("model", 'm', "Path to ONNX model", true); parser.add<std::string>("image", 'i', "Path to input image", true); // ... 其他参数解析 // 创建YOLO推理器 YOLOORT detector(parser.get<std::string>("model")); // 加载并处理图像 cv::Mat image = cv::imread(parser.get<std::string>("image")); // 执行推理 std::vector<Detection> detections = detector.detect(image); // 绘制检测结果 draw_detections(image, detections); // 保存或显示结果 cv::imwrite("result.jpg", image); std::cout << "Detection result saved to result.jpg" << std::endl; return 0; }

CMake配置

每个后端目录下都有对应的CMakeLists.txt文件,用于配置编译选项和依赖库:

cmake_minimum_required(VERSION 3.14) project(yolort_torch) # 设置C++标准 set(CMAKE_CXX_STANDARD 14) set(CMAKE_CXX_STANDARD_REQUIRED ON) # 寻找依赖库 find_package(Torch REQUIRED) find_package(OpenCV REQUIRED) # 添加源文件 set(YOLO_SOURCE_FILES main.cpp) # 创建可执行文件 add_executable(yolort_torch ${YOLO_SOURCE_FILES}) # 链接库 target_link_libraries(yolort_torch ${TORCH_LIBRARIES} ${OpenCV_LIBS})

📝 常见问题解决

  1. 编译错误:确保所有依赖库(如OpenCV、TensorRT等)都已正确安装并配置环境变量
  2. 模型转换失败:参考项目中的模型转换工具tools/export_model.py
  3. 推理速度慢:尝试使用更小的模型(如yolov5n)或启用FP16/INT8量化
  4. 内存不足:减少输入图像尺寸或优化模型输入分辨率

🎯 总结

通过本文的介绍,你已经了解了如何使用yolort在嵌入式设备上部署YOLOv5目标检测模型。yolort提供了简单易用的C++接口和完整的部署示例,让你能够快速将强大的目标检测能力集成到嵌入式系统中。无论是智能监控、机器人视觉还是边缘计算应用,yolort都能为你提供高效可靠的模型部署解决方案。

想要深入了解更多细节,可以参考项目中的官方文档和示例代码:

  • 部署示例代码:deployment/
  • 模型导出工具:tools/export_model.py
  • 测试图像资源:test/assets/

【免费下载链接】yolortyolort is a runtime stack for yolov5 on specialized accelerators such as tensorrt, libtorch, onnxruntime, tvm and ncnn.项目地址: https://gitcode.com/gh_mirrors/yo/yolort

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考