一、参考资料
Jetson Orin部署YOLOv11:推理速度提升3倍的完整指南 - 知乎
二、准备工作
1. 硬件选型参考
| 型号 | 算力(TOPS) | 内存 | 功耗 | 价格 | 适用场景 |
|---|---|---|---|---|---|
| Orin Nano 4GB | 20 | 4GB | 7~15W | ~$250 | 单路摄像头、简单检测 |
| Orin Nano 8GB | 40 | 8GB | 7~15W | ~$350 | 多路摄像头、中等模型 |
| Orin NX 8GB | 70 | 8GB | 10~25W | ~$600 | 复杂检测、2~4路并行 |
| Orin NX 16GB | 100 | 16GB | 10~25W | ~$900 | 大模型、多路并行 |
| Orin AGX 32GB | 200 | 32GB | 15~50W | ~$2000 | 高端场景、多模型 |
推荐:工业单路检测选Orin Nano 8GB,性价比最高。
2. 系统安装
刷JetPack
# 在主机上安装 NVIDIA SDK Manager# 下载地址:https://developer.nvidia.com/sdk-manager# 连接Orin,进入recovery模式(按住Recovery按钮,按一下Reset)# 打开SDK Manager,选择:# - Target Hardware: Jetson Orin Nano# - OS: JetPack 6.0 (基于Ubuntu 22.04 + CUDA 12.2)# - 勾选: Jetson Runtime, CUDA, cuDNN, TensorRT, OpenCV# 等待刷机完成(约20~30分钟)刷机完成后首次启动Orin,进入Ubuntu系统:
# 检查环境cat/etc/nv_tegra_release# 应该显示: R36 (release), REVISION: 3.1, GCID: 35697395nvidia-smi# 显示Jetson GPU信息nvcc--version# 显示CUDA 12.2系统优化
# 开启MAXN模式(最大性能模式)sudonvpmodel-m0# 开启所有CPU核心满频sudojetson_clocks# 关闭图形界面(节省约1GB内存和10W功耗)sudosystemctl set-default multi-user.targetsudoreboot# 创建swap(4GB内存容易不够用)sudofallocate-l8G /var/swapfilesudochmod600/var/swapfilesudomkswap/var/swapfilesudoswapon/var/swapfileecho'/var/swapfile none swap sw 0 0'|sudotee-a/etc/fstab3. 安装Python环境
Jetson上不能用pip直接装PyTorch(需要用NVIDIA提供的预编译版本):
# 安装系统依赖sudoapt-getupdatesudoapt-getinstall-ypython3-pip libopenblas-base libopenmpi-dev libomp-dev# 创建虚拟环境python3-mvenv ~/yolo11_envsource~/yolo11_env/bin/activate# 安装PyTorch(Jetson专用版本)pipinstall--no-cache https://developer.download.nvidia.com/compute/redist/jp/v61/pytorch/torch-2.3.0-cp310-cp310-linux_aarch64.whl# 安装torchvision(需要从源码编译)sudoapt-getinstall-ylibjpeg-dev zlib1g-dev libpython3-dev libavcodec-dev libavformat-dev libswscale-dev pipinstalltorchvision==0.18.0# 安装Ultralyticspipinstallultralytics>=8.3.0# 验证python3-c"import torch; print(f'PyTorch: {torch.__version__}'); print(f'CUDA: {torch.cuda.is_available()}')"# 输出: PyTorch: 2.3.0, CUDA: True三、Jetson Orin部署YOLOv11
1. 模型转换(PyTorch → TensorRT)
1.1 导出ONNX
# export_onnx.pyfrom ultralyticsimportYOLO model=YOLO("yolo11s.pt")# 先下载好权重# 导出ONNXmodel.export(format="onnx",imgsz=640,opset=17,simplify=True,dynamic=False,# 固定输入尺寸,TensorRT优化更好half=False# 先导出FP32的ONNX)print("导出完成:yolo11s.onnx")1.2 转TensorRT引擎
方式一:用trtexec命令行转换(推荐,更稳定)
/usr/src/tensorrt/bin/trtexec\--onnx=yolo11s.onnx\--saveEngine=yolo11s.engine\--fp16\--workspace=4096\--minShapes=images:1x3x640x640\--optShapes=images:1x3x640x640\--maxShapes=images:1x3x640x640# 方式二:用Python API转换# pip install tensorrtpython3 export_tensorrt.py方式二:用Python API转换
pipinstalltensorrt python3 export_tensorrt.py# export_tensorrt.pyimporttensorrtastrtimportosdefbuild_engine(onnx_path,engine_path,fp16=True):TRT_LOGGER=trt.Logger(trt.Logger.WARNING)builder=trt.Builder(TRT_LOGGER)config=builder.create_builder_config()# 设置工作空间(Jetson 8GB建议设2~4GB)config.set_memory_pool_limit(trt.MemoryPoolType.WORKSPACE,4<<30)iffp16:config.set_flag(trt.BuilderFlag.FP16)# 显存优化config.set_flag(trt.BuilderFlag.STRICT_TYPES)# 读取ONNXnetwork=builder.create_network(1<<int(trt.NetworkDefinitionCreationFlag.EXPLICIT_BATCH))parser=trt.OnnxParser(network,TRT_LOGGER)withopen(onnx_path,'rb')asf:ifnotparser.parse(f.read()):forerrorinrange(parser.num_errors):print(f"解析错误:{parser.get_error(error)}")returnNone# 构建引擎print("正在构建TensorRT引擎(可能需要5~15分钟)...")engine_bytes=builder.build_serialized_network(network,config)withopen(engine_path,'wb')asf:f.write(engine_bytes)print(f"引擎已保存到:{engine_path}")# 显示引擎信息engine=trt.Runtime(TRT_LOGGER).deserialize_cuda_engine(engine_bytes)print(f"输入绑定:{engine.get_binding_shape(0)}")print(f"FP16模式:{fp16}")build_engine("yolo11s.onnx","yolo11s_fp16.engine",fp16=True)1.3 用Ultralytics直接导出(最简单)
# Ultralytics内置了TensorRT导出功能(最推荐的方式)yoloexportmodel=yolo11s.ptformat=engineimgsz=640half=Truedevice=0# 直接在Jetson上运行yolo predictmodel=yolo11s.enginesource=camera://02. 推理脚本
2.1 高效推理(TensorRT引擎)
# infer_jetson.pyimportcv2importtimeimportnumpyasnpfromultralyticsimportYOLOclassJetsonDetector:""" Jetson Orin上运行YOLOv11 TensorRT引擎 专为边缘设备优化 """def__init__(self,engine_path,conf=0.3,iou=0.45):self.model=YOLO(engine_path,task='detect')self.conf=conf self.iou=iou# 预热(首次推理会编译着色器,需要预热)dummy=np.zeros((640,640,3),dtype=np.uint8)_=self.model(dummy,verbose=False)print("预热完成")defdetect(self,image,draw=True):"""检测单张图片"""results=self.model(image,conf=self.conf,iou=self.iou,verbose=False)detections=[]annotated=image.copy()forresultinresults:forboxinresult.boxes:cls_id=int(box.cls[0])cls_name=self.model.names[cls_id]conf_score=float(box.conf[0])x1,y1,x2,y2=map(int,box.xyxy[0])detections.append({"class":cls_name,"confidence":conf_score,"bbox":[x1,y1,x2,y2]})ifdraw:cv2.rectangle(annotated,(x1,y1),(x2,y2),(0,255,0),2)cv2.putText(annotated,f"{cls_name}{conf_score:.2f}",(x1,y1-5),cv2.FONT_HERSHEY_SIMPLEX,0.5,(0,255,0),1)returndetections,annotateddefbenchmark(self,num_frames=300):"""性能测试"""dummy=np.random.randint(0,255,(640,480,3),dtype=np.uint8)# 预热for_inrange(30):self.model(dummy,verbose=False)# 正式测试times=[]for_inrange(num_frames):start=time.perf_counter()_=self.model(dummy,verbose=False)times.append((time.perf_counter()-start)*1000)times=np.array(times)print(f"=== Jetson 性能测试 ({num_frames}帧) ===")print(f"平均延迟:{times.mean():.1f}ms")print(f"P50延迟:{np.percentile(times,50):.1f}ms")print(f"P99延迟:{np.percentile(times,99):.1f}ms")print(f"FPS:{1000/times.mean():.1f}")print(f"GPU显存: 已使用TensorRT引擎,显存占用见nvidia-smi")# === 使用示例 ===if__name__=="__main__":detector=JetsonDetector("yolo11s_fp16.engine",conf=0.3)# 性能测试detector.benchmark(num_frames=500)# 摄像头检测cap=cv2.VideoCapture(0)cap.set(cv2.CAP_PROP_FRAME_WIDTH,640)cap.set(cv2.CAP_PROP_FRAME_HEIGHT,480)whileTrue:ret,frame=cap.read()ifnotret:breakdets,annotated=detector.detect(frame)cv2.imshow("Jetson YOLOv11",annotated)ifcv2.waitKey(1)&0xFF==ord('q'):breakcap.release()cv2.destroyAllWindows()2.2 DeepStream部署(专业方案)
DeepStream是NVIDIA官方的视频分析SDK,能在Jetson上实现多路并行。
安装DeepStream:
# 安装DeepStreamsudoapt-getinstall-ydeepstream-7.0创建配置文件:
# deepstream_config.txt(简化版)[application]enable-perf-measurement=1perf-measurement-interval-sec=5[stream0]uri=file:///path/to/test_video.mp4[primary-gie]unique-id=1engine-type=nvinfer config-file=detect_config.txt运行DeepStream:
deepstream-app-cdeepstream_app_config.txtNote:DeepStream配置比较复杂,入门建议先用Ultralytics推理,熟练后再迁移到DeepStream。
3. 速度优化对比
在Jetson Orin Nano 8GB上的实测数据:
| 方案 | FPS | 延迟(ms) | 功耗(W) | 说明 |
|---|---|---|---|---|
| PyTorch FP32 | 12 | 83 | 15 | 最慢,不推荐 |
| PyTorch FP16 | 18 | 55 | 15 | 半精度提升约50% |
| ONNX Runtime FP16 | 22 | 45 | 12 | 比PyTorch快一倍 |
| TensorRT FP16 | 38 | 26 | 10 | 推荐方案,提速3倍 |
| TensorRT INT8 | 52 | 19 | 10 | 最快,精度损失约1% |
| TensorRT FP16 + 480p | 65 | 15 | 8 | 降低输入分辨率提速 |
结论:TensorRT FP16是最佳平衡点,速度提升3倍,精度几乎无损。
4. 部署中的三个关键细节
4.1 性能模式要手动开启
Jetson出厂默认不是满血状态,需要手动切换:
# 开启MAXN模式(最大性能模式)sudonvpmodel-m0# 开启所有CPU核心满频sudojetson_clocks4.2 视频解码要用硬件加速
边缘设备通常接入USB摄像头或RTSP视频流。我们使用GStreamer管道做硬件解码,把视频处理从CPU卸载到GPU,避免CPU成为瓶颈。
4.3 推理和显示要异步并行
为了保证实时性,三个线程各司其职:
线程1(采集):持续抓帧 → 放入队列
线程2(推理):从队列取帧 → YOLO推理 → 输出结果
线程3(业务):读取结果 → 画框显示 → 判断是否报警
三个线程并行工作,互不阻塞。
四、FAQ
Q1:TensorRT构建引擎时OOM
方法一:减小workspace大小。
/usr/src/tensorrt/bin/trtexec--onnx=yolo11s.onnx--saveEngine=yolo11s.engine--fp16--workspace=2048方法二:或者使用更小的模型
yoloexportmodel=yolo11n.ptformat=engineimgsz=640half=TrueQ2:推理速度不稳定,时快时慢
解决方法:
# 确保开启了MAXN模式和jetson_clockssudonvpmodel-m0sudojetson_clocks# 检查CPU调频cat/sys/devices/system/cpu/cpu*/cpufreq/scaling_governor# 全部应该是performanceQ3:USB摄像头花屏
错误原因:Jetson的USB3.0可能不稳定。
解决方法:修改/etc/extlinux.conf。
sudovim/etc/extlinux.conf# 在APPEND行末尾添加:usbcore.autosuspend=-1# 重启sudoreboot