1. 项目概述与背景
在边缘计算设备上实现实时目标检测与跟踪一直是计算机视觉领域的核心挑战。Jetson系列作为NVIDIA推出的嵌入式AI计算平台,凭借其强大的GPU加速能力和优化的深度学习推理框架,成为部署YOLOv5等先进目标检测模型的理想选择。本教程将详细解析如何在Jetson NX和Nano两款设备上,通过DeepStream SDK实现YOLOv5模型的部署与优化。
注意:Jetson设备具有不同的计算能力等级,NX采用NVIDIA Volta架构的384核GPU,而Nano采用128核Maxwell架构GPU,这直接影响可支持的DeepStream版本和模型推理性能。
2. 环境准备与DeepStream安装
2.1 Jetson NX环境配置
对于性能更强的Jetson NX,我们选择DeepStream 6.2版本以获得最新特性和优化。安装过程分为三个关键阶段:
- 基础依赖安装:
bash复制sudo apt install \
libssl1.1 \
libgstreamer1.0-0 \
gstreamer1.0-tools \
gstreamer1.0-plugins-good \
gstreamer1.0-plugins-bad \
gstreamer1.0-plugins-ugly \
gstreamer1.0-libav \
libgstreamer-plugins-base1.0-dev \
libgstrtspserver-1.0-0 \
libjansson4 \
libyaml-cpp-dev
- Kafka支持库编译安装:
bash复制git clone https://github.com/edenhill/librdkafka.git
cd librdkafka
git reset --hard 7101c2310341ab3f4675fc565f64f0967e135a6a
./configure
make -j$(nproc)
sudo make install
sudo cp /usr/local/lib/librdkafka* /opt/nvidia/deepstream/deepstream-6.2/lib
- DeepStream SDK安装:
bash复制sudo tar -xvf deepstream_sdk_v6.2.0_jetson.tbz2 -C /
cd /opt/nvidia/deepstream/deepstream-6.2
sudo ./install.sh
sudo ldconfig
2.2 Jetson Nano特殊处理
由于硬件限制,Nano只能运行DeepStream 6.0.1版本。关键差异点包括:
- 依赖库版本不同(如libssl1.0.0)
- SDK安装路径变更(/opt/nvidia/deepstream/deepstream-6.0)
- 需要特别指定libjansson4版本:
bash复制sudo apt install libjansson4=2.11-1
实测发现:Nano在编译librdkafka时容易因内存不足失败,建议添加swap空间:
bash复制sudo fallocate -l 4G /swapfile
sudo chmod 600 /swapfile
sudo mkswap /swapfile
sudo swapon /swapfile
3. YOLOv5模型转换与优化
3.1 模型选择与调整
建议使用官方YOLOv5s模型(约27MB)作为起点,平衡精度与速度:
- 修改models/yolov5s.yaml,调整nc参数为实际类别数(如person+car=2)
- 通过--weights参数加载预训练模型:
bash复制python export.py --weights yolov5s.pt --include onnx --dynamic
3.2 ONNX到TensorRT转换
使用DeepStream提供的转换工具时需注意:
- 校准集准备:至少500张代表性图像,存放在jpg格式目录
- 配置文件关键参数示例(config_infer_primary_yoloV5.txt):
ini复制[property]
...
net-scale-factor=0.0039215697906911373
model-engine-file=model_b1_gpu0_fp16.engine
onnx-file=yolov5s.onnx
model-color-format=0
...
[class-attrs-all]
pre-cluster-threshold=0.25
- 执行转换:
bash复制deepstream-app -c source1_yoloV5.txt
4. 目标跟踪集成与优化
4.1 DeepStream跟踪器配置
在pipeline配置中启用KLT跟踪器:
ini复制[tracker]
enable=1
tracker-width=640
tracker-height=384
ll-lib-file=/opt/nvidia/deepstream/deepstream/lib/libnvds_nvmultiobjecttracker.so
...
4.2 自定义CUDA核函数优化
对于需要特殊处理的目标检测输出,可参考以下CUDA核函数设计要点:
cpp复制__global__ void gpuYoloLayer_nc(
const float* input, int* num_detections, float* detection_boxes,...)
{
// 计算网格坐标
uint x_id = blockIdx.x * blockDim.x + threadIdx.x;
uint y_id = blockIdx.y * blockDim.y + threadIdx.y;
// 边界检查
if (x_id >= gridSizeX || y_id >= gridSizeY) return;
// 计算objectness
float objectness = input[bbindex + numGridCells*(z_id*(5+numOutputClasses)+4)];
if (objectness < scoreThreshold) return;
// 原子操作计数
int count = (int)atomicAdd(num_detections, 1);
// 坐标解码(使用scaleXY参数)
float x = (input[...] * alpha + beta + x_id) * netWidth / gridSizeX;
...
}
5. 性能调优实战技巧
5.1 帧率与分辨率平衡
实测数据对比(YOLOv5s模型):
| 设备 | 分辨率 | FP16模式 | 帧率(FPS) |
|---|---|---|---|
| Jetson NX | 1280x720 | 是 | 42 |
| Jetson NX | 640x480 | 否 | 58 |
| Jetson Nano | 640x480 | 是 | 12 |
5.2 内存优化策略
- 使用TensorRT的显存池技术:
python复制builder.max_workspace_size = 1 << 30 # 1GB
- 启用流式处理:
cpp复制cudaStream_t stream;
cudaStreamCreate(&stream);
context->enqueueV2(buffers, stream, nullptr);
- 对于Nano设备,强制使用FP16精度:
bash复制export TRTEXEC_PRECISION=FP16
6. 常见问题排查指南
6.1 依赖冲突解决
若遇到"libssl.so.1.1: version `OPENSSL_1_1_1' not found"错误:
bash复制sudo apt-get install libssl1.1=1.1.1f-1ubuntu2
6.2 模型转换错误处理
当ONNX转换失败时,检查:
- 输入维度是否动态(应有-1值)
- 使用onnx-simplifier优化模型:
bash复制python -m onnxsim yolov5s.onnx yolov5s-sim.onnx
6.3 跟踪丢失问题优化
调整跟踪器参数组合:
ini复制tracker-ll-config-file=/opt/nvidia/deepstream/deepstream/samples/configs/deepstream-app/config_tracker_IOU.yml
tracker-display-tracking-id=1
7. 扩展应用与二次开发
7.1 多流处理实现
修改配置文件支持多路RTSP输入:
ini复制[source0]
enable=1
type=4
uri=rtsp://192.168.1.100:554/stream1
...
[source1]
enable=1
type=4
uri=rtsp://192.168.1.101:554/stream2
7.2 自定义元数据输出
通过NvDsEventMsgMeta结构体扩展输出信息:
cpp复制typedef struct _NvDsEventMsgMeta {
gchar* trackingId;
gchar* objType;
NvDsRect bbox;
NvDsObjectMeta* objMeta;
...
} NvDsEventMsgMeta;
在实际部署中发现,Jetson NX在持续运行过程中温度控制至关重要。建议安装jtop监控工具:
bash复制sudo pip install jetson-stats
jtop
对于需要长期稳定运行的场景,可考虑添加散热风扇控制脚本,当GPU温度超过75℃时自动提高风扇转速:
bash复制#!/bin/bash
while true; do
temp=$(cat /sys/class/thermal/thermal_zone0/temp)
if [ $temp -gt 75000 ]; then
echo 150 | sudo tee /sys/devices/pwm-fan/target_pwm
else
echo 100 | sudo tee /sys/devices/pwm-fan/target_pwm
fi
sleep 30
done