Jetson Nano实战:用TensorRT加速YOLOv5实现高帧率目标检测

1. 边缘计算与实时视觉的完美结合

当我们需要在资源受限的嵌入式设备上实现实时目标检测时,Jetson Nano与TensorRT的组合无疑是最佳选择之一。这款信用卡大小的开发板搭载了128核NVIDIA Maxwell GPU,配合TensorRT的优化能力,可以让YOLOv5这样的先进检测模型流畅运行。

我曾在一个智能园艺项目中尝试这套方案,需要实时检测植物生长状态。最初使用原生PyTorch模型时帧率只有3-4FPS,经过TensorRT优化后提升到了22-25FPS,完全满足了实时监控的需求。这种性能提升在边缘计算场景中尤为珍贵。

为什么选择这个技术栈?

  • Jetson Nano:低功耗(5-10W)、高性能的嵌入式AI计算平台
  • YOLOv5:当前最先进的轻量级目标检测模型之一
  • TensorRT:NVIDIA专为深度学习推理设计的优化引擎

2. 开发环境搭建与准备

2.1 Jetson Nano基础配置

开始前需要准备:

  • Jetson Nano开发板(建议4GB内存版本)
  • 优质电源(5V/4A)
  • 高速MicroSD卡(至少32GB)
  • USB摄像头或CSI摄像头
# 检查JetPack版本
head -n 1 /etc/nv_tegra_release
# 示例输出:# R32 (release), REVISION: 6.2, GCID: 27863751, BOARD: t210ref, EABI: aarch64, DATE: Thu Mar 10 06:08:02 UTC 2022

注意:JetPack 4.6+版本已内置CUDA 10.2和cuDNN 8.0,这是运行TensorRT的基础环境。

2.2 Python环境配置

由于ARM架构限制,我们使用MiniConda而非Anaconda:

wget https://github.com/Archiconda/build-tools/releases/download/0.2.3/Archiconda3-0.2.3-Linux-aarch64.sh
bash Archiconda3-0.2.3-Linux-aarch64.sh
source ~/.bashrc
conda create -n yolov5_trt python=3.6
conda activate yolov5_trt

2.3 关键依赖安装

安装PyTorch for Jetson:

sudo apt-get install python3-pip libopenblas-base libopenmpi-dev 
pip3 install --upgrade pip
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.whl

验证安装:

import torch
print(torch.__version__)  # 应输出1.8.0
print(torch.cuda.is_available())  # 应输出True

3. YOLOv5模型转换与优化

3.1 获取YOLOv5模型

从官方仓库克隆代码并安装依赖:

git clone -b v5.0 https://github.com/ultralytics/yolov5.git
cd yolov5
pip install -r requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple

下载预训练权重:

wget https://github.com/ultralytics/yolov5/releases/download/v5.0/yolov5s.pt

3.2 模型转换全流程

  1. 首先获取tensorrtx转换工具:
git clone -b v5.0 https://github.com/wang-xinyu/tensorrtx.git
  1. 生成.wts中间文件:
# 将tensorrtx/yolov5/gen_wts.py复制到yolov5目录下
python3 gen_wts.py -w yolov5s.pt

这会生成yolov5s.wts文件,包含了模型结构和权重信息。

  1. 编译TensorRT引擎:
cd tensorrtx/yolov5
mkdir build
cd build
cmake ..
make
sudo ./yolov5 -s ../yolov5s.wts yolov5s.engine s

提示:引擎生成过程可能需要几分钟,这是在优化计算图和选择最佳内核实现。

3.3 关键参数调优

在yololayer.h中可以调整两个关键参数:

static constexpr int CLASS_NUM = 80;  // 根据你的数据集类别数修改
static constexpr int INPUT_H = 640;   // 输入高度(必须是32的倍数)
static constexpr int INPUT_W = 640;   // 输入宽度

精度与速度权衡选项

选项 精度 速度 显存占用
FP32 最高 最慢 最大
FP16 中等
INT8 中等 最快 最小

启用FP16模式只需在CMake时添加:

cmake -DUSE_FP16=ON ..

4. 实时摄像头集成与性能优化

4.1 摄像头接入实现

修改yolov5.cpp实现实时检测:

cv::VideoCapture capture(0);  // 0为默认摄像头
if (!capture.isOpened()) {
    std::cerr << "无法打开摄像头!" << std::endl;
    return -1;
}

while (true) {
    cv::Mat frame;
    capture >> frame;
    if (frame.empty()) break;
    
    // 预处理帧
    cv::Mat pr_img = preprocess_img(frame, INPUT_W, INPUT_H);
    
    // 执行推理
    doInference(*context, stream, buffers, data, prob, BATCH_SIZE);
    
    // 后处理并显示结果
    cv::imshow("YOLOv5 TensorRT", frame);
    if (cv::waitKey(1) == 'q') break;
}

4.2 性能优化技巧

  1. 内存预分配
static float data[BATCH_SIZE * 3 * INPUT_H * INPUT_W];
static float prob[BATCH_SIZE * OUTPUT_SIZE];
  1. 异步数据传输
CUDA_CHECK(cudaMemcpyAsync(buffers[0], input, batchSize * 3 * INPUT_H * INPUT_W * sizeof(float), cudaMemcpyHostToDevice, stream));
  1. FPS显示实现
auto start = std::chrono::system_clock::now();
doInference(*context, stream, buffers, data, prob, BATCH_SIZE);
auto end = std::chrono::system_clock::now();
int fps = 1000.0 / std::chrono::duration_cast<std::chrono::milliseconds>(end - start).count();

4.3 典型性能指标

以下是在Jetson Nano上测试yolov5s模型的结果:

模式 分辨率 帧率(FPS) 显存占用
PyTorch FP32 640x640 3.5 1.2GB
TensorRT FP32 640x640 15.2 1.0GB
TensorRT FP16 640x640 22.7 0.8GB
TensorRT INT8 640x640 28.1 0.6GB

5. 实际应用案例与问题排查

5.1 智能监控系统实现

通过修改检测类别,我们可以快速实现特定场景的监控系统:

char *custom_classes[] = {
    "person", 
    "bag", 
    "vehicle",
    "intruder"
};

典型应用场景

  • 园区安全监控
  • 零售客流量分析
  • 工业生产线质检
  • 农业作物监测

5.2 常见问题解决方案

问题1:模型转换失败

  • 检查YOLOv5和tensorrtx版本是否匹配
  • 确保.wts文件生成时没有报错
  • 验证CUDA/cuDNN/TensorRT版本兼容性

问题2:摄像头无法打开

  • 检查摄像头权限: ls -l /dev/video*
  • 尝试不同的设备号(0,1,2等)
  • 对于CSI摄像头,可能需要专用驱动

问题3:帧率不稳定

  • 使用 sudo jetson_clocks 锁定最高频率
  • 关闭不必要的后台进程
  • 考虑降低分辨率或使用更小模型(yolov5n)

5.3 进阶优化方向

  1. 多模型流水线
# 伪代码示例
while True:
    frame = get_camera_frame()
    detections = yolov5_model(frame)
    for det in detections:
        if det.class == "face":
            features = face_net(det.roi)
            compare_with_database(features)
  1. 自定义插件开发 : 对于特殊需求,可以编写自定义TensorRT插件:
class MyPlugin : public IPluginV2IOExt {
    // 实现必要接口
    ...
};
  1. 模型量化训练 : 使用QAT(Quantization Aware Training)获得更好的INT8精度:
model = torch.quantization.quantize_dynamic(
    model, {torch.nn.Linear}, dtype=torch.qint8
)

这套技术栈已经成功应用于多个工业项目,从最初的帧率不足到现在的流畅运行,TensorRT的优化能力确实令人印象深刻。在实际部署中发现,合理设置输入分辨率对平衡精度和速度至关重要——对于近距离监控,480x480分辨率可能就已足够,而大范围监控则需要更高的640x640分辨率。

Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐