Jetson Nano上YOLOv5实时摄像头检测实战:从TensorRT加速到FPS翻倍(含代码修改详解)
Jetson Nano上YOLOv5实时摄像头检测实战从TensorRT加速到FPS翻倍含代码修改详解在边缘计算设备上实现实时目标检测一直是计算机视觉领域的核心挑战。Jetson Nano作为NVIDIA推出的嵌入式AI计算平台凭借其CUDA核心和TensorRT加速引擎为实时视觉处理提供了理想的硬件基础。本文将深入探讨如何通过TensorRT优化YOLOv5模型并实现USB摄像头的实时检测最终使帧率提升200%以上。1. 环境准备与基础配置1.1 Jetson Nano开发环境搭建Jetson Nano开发板预装了JetPack SDK但需要确保系统版本与CUDA环境匹配。推荐使用JetPack 4.6.1版本其包含的组件版本如下组件版本号L4T32.7.1CUDA10.2.300cuDNN8.2.1TensorRT8.2.1OpenCV4.5.4提示首次启动后建议执行sudo apt update sudo apt upgrade更新系统包1.2 Python虚拟环境配置为避免依赖冲突建议使用conda创建独立环境conda create -n yolov5_trt python3.6 conda activate yolov5_trt pip install numpy1.19.4 # 必须使用此版本以避免兼容性问题1.3 关键依赖安装YOLOv5的TensorRT部署需要以下核心组件PyTorch for Jetson必须安装ARM架构专用版本torchvision与PyTorch版本严格对应opencv-python建议从源码编译以启用CUDA加速安装命令示例wget https://nvidia.box.com/shared/static/p57jwntv436lfrd78inwl7iml6p13fzh.whl -O torch-1.8.0-cp36-cp36m-linux_aarch64.whl pip install torch-1.8.0-cp36-cp36m-linux_aarch64.whl2. YOLOv5模型转换与优化2.1 原始模型获取从Ultralytics官方仓库获取YOLOv5 v5.0版本git clone -b v5.0 https://github.com/ultralytics/yolov5.git cd yolov5 pip install -r requirements.txt2.2 TensorRT转换准备使用tensorrtx项目进行模型转换git clone -b v5.0 https://github.com/wang-xinyu/tensorrtx.git cp tensorrtx/yolov5/gen_wts.py yolov5/生成中间权重文件python gen_wts.py -w yolov5s.pt注意生成的yolov5s.wts文件大小应与原始模型相近约27MB2.3 关键参数调整修改yololayer.h中的类别数定义static constexpr int CLASS_NUM 80; // 根据实际模型调整输入分辨率建议设置为32的倍数如640x640static constexpr int INPUT_H 640; static constexpr int INPUT_W 640;3. TensorRT引擎构建与优化3.1 构建TensorRT引擎执行以下命令序列mkdir build cd build cmake .. make sudo ./yolov5 -s ../yolov5s.wts yolov5s.engine s构建参数说明s表示使用YOLOv5s模型可选的精度模式kFP32默认单精度kFP16半精度推荐kINT8需额外提供校准集3.2 性能优化技巧通过修改yolov5.cpp实现以下优化批处理优化#define BATCH_SIZE 4 // 根据显存调整FP16加速config-setFlag(BuilderFlag::kFP16);动态输入支持auto profile builder-createOptimizationProfile(); profile-setDimensions(INPUT_BLOB_NAME, OptProfileSelector::kMIN, Dims4(1, 3, 640, 640));4. 实时摄像头集成与性能测试4.1 摄像头驱动修改关键修改点位于yolov5.cpp的main函数cv::VideoCapture capture(0); // 0为默认摄像头索引 if (!capture.isOpened()) { std::cerr Failed to open camera! std::endl; return -1; }4.2 帧处理流水线优化实现零拷贝数据传输CUDA_CHECK(cudaMemcpyAsync(buffers[0], input, batchSize*3*INPUT_H*INPUT_W*sizeof(float), cudaMemcpyHostToDevice, stream));4.3 FPS显示与性能对比添加实时帧率计算auto start std::chrono::high_resolution_clock::now(); doInference(*context, stream, buffers, data, prob, BATCH_SIZE); auto end std::chrono::high_resolution_clock::now(); float fps 1000.0 / std::chrono::duration_caststd::chrono::milliseconds(end-start).count();典型性能对比数据配置分辨率FPS显存占用原始YOLOv5640x6408.21.2GBTensorRT FP32640x64015.71.5GBTensorRT FP16640x64022.31.1GBTensorRT INT8640x64028.60.9GB4.4 实际部署建议电源管理sudo nvpmodel -m 0 # 最大性能模式 sudo jetson_clocks # 锁定最高频率温度监控tegrastats # 实时监控系统状态多线程优化std::thread captureThread(captureFrame); std::thread inferThread(runInference);5. 高级优化技巧5.1 自定义后处理加速替换标准NMS为CUDA实现void cudaNMS(float* boxes, float* scores, int num_boxes, float nms_thresh);5.2 内存池优化预分配GPU内存cudaMallocManaged(buffers[0], MAX_BATCH*3*INPUT_H*INPUT_W*sizeof(float));5.3 量化感知训练为INT8量化准备校准集# 在YOLOv5训练时添加 python train.py --quant --calib images/6. 典型问题解决方案摄像头帧不同步capture.set(cv::CAP_PROP_FPS, 30); capture.set(cv::CAP_PROP_BUFFERSIZE, 1);内存泄漏检测valgrind --toolmemcheck ./yolov5TensorRT版本兼容std::cout TensorRT version: NV_TENSORRT_MAJOR . NV_TENSORRT_MINOR std::endl;经过完整优化后在Jetson Nano上可实现25 FPS的实时检测性能满足大多数安防监控、机器人导航等场景需求。实际部署时建议根据具体硬件条件调整模型尺寸和推理参数在精度和速度间取得最佳平衡。