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版本,其包含的组件版本如下:
| 组件 | 版本号 |
|---|---|
| L4T | 32.7.1 |
| CUDA | 10.2.300 |
| cuDNN | 8.2.1 |
| TensorRT | 8.2.1 |
| OpenCV | 4.5.4 |
提示:首次启动后建议执行
sudo apt update && sudo apt upgrade更新系统包
1.2 Python虚拟环境配置
为避免依赖冲突,建议使用conda创建独立环境:
conda create -n yolov5_trt python=3.6 conda activate yolov5_trt pip install numpy==1.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文件大小应与原始模型相近(约27MB)
2.3 关键参数调整
修改yololayer.h中的类别数定义:
static constexpr int CLASS_NUM = 80; // 根据实际模型调整输入分辨率建议设置为32的倍数(如640x640):
static 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_cast<std::chrono::milliseconds>(end-start).count();典型性能对比数据:
| 配置 | 分辨率 | FPS | 显存占用 |
|---|---|---|---|
| 原始YOLOv5 | 640x640 | 8.2 | 1.2GB |
| TensorRT FP32 | 640x640 | 15.7 | 1.5GB |
| TensorRT FP16 | 640x640 | 22.3 | 1.1GB |
| TensorRT INT8 | 640x640 | 28.6 | 0.9GB |
4.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 --tool=memcheck ./yolov5TensorRT版本兼容:
std::cout << "TensorRT version: " << NV_TENSORRT_MAJOR << "." << NV_TENSORRT_MINOR << std::endl;经过完整优化后,在Jetson Nano上可实现25+ FPS的实时检测性能,满足大多数安防监控、机器人导航等场景需求。实际部署时建议根据具体硬件条件调整模型尺寸和推理参数,在精度和速度间取得最佳平衡。