【Jetson Orin NANO 实战】从零部署YOLOv5,让CSI/USB摄像头实时识别目标

【Jetson Orin NANO 实战】从零部署YOLOv5,让CSI/USB摄像头实时识别目标 1. Jetson Orin NANO开箱与环境准备拿到Jetson Orin NANO开发板的第一件事就是给它准备好运行环境。这块板子虽然只有信用卡大小但搭载了NVIDIA最新的Orin系列处理器AI算力可达40 TOPS跑YOLOv5这种目标检测模型再合适不过。我建议直接从NVIDIA官网下载最新的JetPack镜像。目前最新版本是JetPack 5.1.2已经预装了CUDA、cuDNN、TensorRT等关键组件。烧录镜像推荐使用Etcher工具比传统的dd命令更友好。烧录完第一次启动时记得连接显示器完成初始设置包括创建用户、设置密码等基础配置。提示JetPack镜像约15GB下载需要一定时间建议提前准备高速网络环境完成系统初始化后先更新下软件源sudo apt update sudo apt upgrade -y接着安装一些基础工具sudo apt install -y git cmake python3-pip python3-dev2. 摄像头配置与测试2.1 CSI摄像头使用Jetson Orin NANO自带MIPI CSI-2接口兼容Raspberry Pi相机模块。我测试用的是IMX219传感器1600万像素连接时注意排线金手指朝向板子外侧。测试摄像头最快捷的方式是用NVIDIA提供的GStreamer工具nvgstcapture-1.0 --prev-res3这个命令会打开实时预览窗口分辨率级别3对应1080p。按键盘上的q退出预览j拍照保存space开始/停止录像2.2 USB摄像头接入对于常见的USB摄像头比如罗技C920插上就能用。先检查设备节点ls /dev/video*通常CSI摄像头是/dev/video0USB摄像头是/dev/video1。测试可以用V4L2工具sudo apt install v4l-utils v4l2-ctl --list-devices如果想用Python操作摄像头推荐安装OpenCVpip3 install opencv-python然后写个简单的测试脚本import cv2 cap cv2.VideoCapture(0) # 0对应CSI1对应USB while True: ret, frame cap.read() cv2.imshow(Preview, frame) if cv2.waitKey(1) ord(q): break cap.release()3. 深度学习环境搭建3.1 安装PyTorchJetson平台需要安装特定版本的PyTorch。目前官方推荐的是1.14.0版本wget https://nvidia.box.com/shared/static/ssf2v7pf5i245fk4i0q926hy4imzs2ph.whl -O torch-1.14.0-cp38-cp38-linux_aarch64.whl pip3 install torch-1.14.0-cp38-cp38-linux_aarch64.whl验证安装import torch print(torch.__version__) # 应输出1.14.0 print(torch.cuda.is_available()) # 应返回True3.2 安装Torchvision匹配PyTorch 1.14.0的是torchvision 0.15.0sudo apt install libjpeg-dev zlib1g-dev pip3 install torchvision0.15.03.3 配置TensorRTJetPack已经预装了TensorRT但需要确认版本dpkg -l | grep tensorrt我实测8.5.2版本与YOLOv5兼容性最好。如果遇到问题可以尝试重装sudo apt install --reinstall tensorrt4. YOLOv5模型部署4.1 克隆YOLOv5仓库建议使用v6.1版本这个版本对Jetson优化较好git clone -b v6.1 https://github.com/ultralytics/yolov5 cd yolov5 pip3 install -r requirements.txt4.2 模型转换与优化首先下载预训练模型wget https://github.com/ultralytics/yolov5/releases/download/v6.1/yolov5s.pt转换为TensorRT引擎import torch model torch.hub.load(ultralytics/yolov5, yolov5s, pretrainedTrue) model.eval() traced torch.jit.trace(model, torch.randn(1,3,640,640).cuda()) traced.save(yolov5s.engine)4.3 实时检测实现创建一个detect_camera.py脚本import cv2 import torch from yolov5.utils.general import non_max_suppression # 初始化模型 model torch.jit.load(yolov5s.engine).cuda() # 摄像头设置 cap cv2.VideoCapture(0) cap.set(cv2.CAP_PROP_FRAME_WIDTH, 640) cap.set(cv2.CAP_PROP_FRAME_HEIGHT, 480) while True: ret, frame cap.read() if not ret: break # 预处理 img cv2.cvtColor(frame, cv2.COLOR_BGR2RGB) img torch.from_numpy(img).float().permute(2,0,1).unsqueeze(0).cuda() / 255.0 # 推理 pred model(img)[0] pred non_max_suppression(pred, 0.5, 0.45)[0] # 绘制结果 for det in pred: xyxy det[:4].cpu().numpy().astype(int) cv2.rectangle(frame, (xyxy[0], xyxy[1]), (xyxy[2], xyxy[3]), (0,255,0), 2) cv2.imshow(YOLOv5, frame) if cv2.waitKey(1) ord(q): break cap.release()运行这个脚本你应该能看到实时检测效果。在我的测试中YOLOv5s在Orin NANO上能达到30FPS以上的处理速度。5. 性能优化技巧5.1 使用FP16精度修改模型导出代码启用FP16model.half() # 转换模型为FP16 traced torch.jit.trace(model, torch.randn(1,3,640,640).half().cuda())5.2 调整输入分辨率降低输入分辨率可以显著提升速度model torch.hub.load(ultralytics/yolov5, yolov5s, pretrainedTrue) model.eval() model.conf 0.5 # 置信度阈值 model.iou 0.45 # IOU阈值 model.amp True # 自动混合精度5.3 使用TensorRT加速更彻底的优化是转换为TensorRT引擎python3 export.py --weights yolov5s.pt --include engine --device 0 --half然后在代码中加载TRT引擎import tensorrt as trt with open(yolov5s.engine, rb) as f: runtime trt.Runtime(trt.Logger(trt.Logger.WARNING)) engine runtime.deserialize_cuda_engine(f.read())6. 常见问题解决6.1 摄像头无法打开如果遇到VIDEOIO ERROR: V4L2: Pixel format of incoming image is unsupported错误尝试指定视频编码格式cap cv2.VideoCapture(0) cap.set(cv2.CAP_PROP_FOURCC, cv2.VideoWriter_fourcc(M,J,P,G))6.2 内存不足Orin NANO 8GB版本运行YOLOv5可能会遇到内存问题解决方法使用更小的模型如YOLOv5n减少batch size关闭桌面环境释放内存sudo systemctl set-default multi-user.target sudo reboot6.3 模型转换失败如果遇到Unsupported ONNX opset version: 12错误需要指定opset版本torch.onnx.export(model, img, yolov5s.onnx, opset_version11)