当前位置: 首页 > news >正文

YOLO26N 姿态估计 TensorRT 部署:Jetson 实时推理

YOLO26N 姿态估计 TensorRT 部署:Jetson 实时推理

1. TensorRT 转换

fromultralyticsimportYOLO model=YOLO("yolo26n-pose.pt")model.export(format="engine",imgsz=640,half=True,batch=1)
# 或 trtexec/usr/src/tensorrt/bin/trtexec\--onnx=yolo26n-pose.onnx\--saveEngine=yolo26n-pose.engine\--fp16\--workspace=2048

2. TensorRT 推理封装

#!/usr/bin/env python3"""trt_pose.py - TensorRT 姿态估计推理"""importtensorrtastrtimportpycuda.driverascudaimportpycuda.autoinitimportnumpyasnpimportcv2importtimeclassTRTPoseDetector:def__init__(self,engine_path,conf_thresh=0.3):self.conf_thresh=conf_thresh logger=trt.Logger(trt.Logger.WARNING)runtime=trt.Runtime(logger)withopen(engine_path,"rb")asf:self.engine=runtime.deserialize_cuda_engine(f.read())self.context=self.engine.create_execution_context()self.inputs=[]self.outputs=[]self.bindings=[]self.stream=cuda.Stream()foriinrange(self.engine.num_io_tensors):name=self.engine.get_tensor_name(i)dtype=trt.nptype(self.engine.get_tensor_dtype(name))shape=self.engine.get_tensor_shape(name)shape=tuple(max(1,s)ifs>=0else1forsinshape)size=trt.volume(shape)host_mem=cuda.pagelocked_empty(size,dtype)device_mem=cuda.mem_alloc(host_mem.nbytes)self.bindings.append(int(device_mem))info={"name":name,"host":host_mem,"device":device_mem,"shape":shape}ifself.engine.get_tensor_mode(name)==trt.TensorIOMode.INPUT:self.inputs.append(info)else:self.outputs.append(info)defpreprocess(self,image):h,w=image.shape[:2]scale=min(640/h,640/w)new_h,new_w=int(h*scale),int(w*scale)resized=cv2.resize(image,(new_w,new_h))canvas=np.full((640,640,3),114,dtype=np.uint8)dy,dx=(640-new_h)//2,(640-new_w)//2canvas[dy:dy+new_h,dx:dx+new_w]=resized blob=canvas[:,:,::-1].transpose(2,0,1).astype(np.float32)/255.0returnnp.expand_dims(blob,axis=0),scale,(dy,dx)defdetect(self,image):blob,scale,pad=self.preprocess(image)np.copyto(self.inputs[0]["host"],blob.ravel())cuda.memcpy_htod_async(self.inputs[0]["device"],self.inputs[0]["host"],self.stream)self.context.set_input_shape(self.inputs[0]["name"],blob.shape)self.context.execute_async_v2(bindings=self.bindings,stream_handle=self.stream.handle)cuda.memcpy_dtoh_async(self.outputs[0]["host"],self.outputs[0]["device"],self.stream)self.stream.synchronize()output=self.outputs[0]["host"].reshape(self.outputs[0]["shape"])returnself.postprocess(output,scale,pad,image.shape[:2])defpostprocess(self,output,scale,pad,orig_shape):predictions=output[0].T# [8400, 56]boxes=predictions[:,:4]scores=predictions[:,4]kpts=predictions[:,6:].reshape(-1,17,3)mask=scores>self.conf_thresh boxes=boxes[mask]scores=scores[mask]kpts=kpts[mask]# 坐标还原dy,dx=pad boxes[:,[0,2]]=(boxes[:,[0,2]]-dx)/scale boxes[:,[1,3]]=(boxes[:,[1,3]]-dy)/scale kpts[:,:,0]=(kpts[:,:,0]-dx)/scale kpts[:,:,1]=(kpts[:,:,1]-dy)/scale results=[]foriinrange(len(boxes)):results.append({'bbox':boxes[i].tolist(),'score':float(scores[i]),'keypoints':kpts[i].tolist(),})returnresults# 骨架连接SKELETON=[(0,1),(0,2),(1,3),(2,4),(5,6),(5,7),(6,8),(7,9),(8,10),(11,12),(11,13),(12,14),(13,15),(14,16),(5,11),(6,12),]defdraw_pose(image,detections):fordetindetections:kpts=det['keypoints']for(i,j)inSKELETON:ifkpts[i][2]>0.3andkpts[j][2]>0.3:pt1=(int(kpts[i][0]),int(kpts[i][1]))pt2=(int(kpts[j][0]),int(kpts[j][1]))cv2.line(image,pt1,pt2,(0,255,0),2)for(x,y,vis)inkpts:ifvis>0.3:cv2.circle(image,(int(x),int(y)),3,(0,0,255),-1)returnimageif__name__=="__main__":model=TRTPoseDetector("yolo26n-pose.engine")cap=cv2.VideoCapture(0)fps_count,fps_start=0,time.time()whileTrue:ret,frame=cap.read()ifnotret:breakdetections=model.detect(frame)frame=draw_pose(frame,detections)fps_count+=1iftime.time()-fps_start>=1.0:fps=fps_count/(time.time()-fps_start)fps_count,fps_start=0,time.time()cv2.putText(frame,f"FPS:{fps:.0f}",(10,30),cv2.FONT_HERSHEY_SIMPLEX,1,(0,255,0),2)cv2.imshow("Pose",frame)ifcv2.waitKey(1)&0xFF==ord('q'):breakcap.release()cv2.destroyAllWindows()

3. 性能基准

YOLO26N-Pose TensorRT 性能(640x640): ┌──────────────────┬──────────┬──────────┐ │ 设备 │ FP16 │ INT8 │ ├──────────────────┼──────────┼──────────┤ │ Jetson Orin NX │ 5.2ms │ 3.8ms │ │ Jetson Orin Nano │ 9.5ms │ 6.5ms │ │ RTX 4090 │ 1.5ms │ 1.1ms │ │ RTX 3060 │ 4.2ms │ 3.0ms │ └──────────────────┴──────────┴──────────┘

总结

步骤工具输出
导出 ONNXUltralytics.onnx
转 TensorRTtrtexec / Ultralytics.engine
推理TRTPoseDetector关键点
可视化draw_pose骨架图
http://www.jsqmd.com/news/1098659/

相关文章:

  • 经典 CNN 网络 VGG
  • 2026Word文档过大怎么瘦身,多种压缩Word文件大小实操方法指南
  • 配置外置与敏感隔离:基于 Django-environ 的多环境配置管理策略
  • 基于HarmonyOS 7.0 跨端开发的全球火山活动监测页面实战
  • 性能测试进阶:从压测工具到容量规划的系统工程实践
  • 学 Simulink — 航空航天 270 V DC 高压直流电源变换器的短路保护仿真
  • Prompt工程设计实践:从基础模板到场景化策略
  • 二升三年级暑假特色作业(pdf图文版)
  • Python判断数字?别再用isdigit了,这些坑踩过的人都哭了
  • Pentaho Kettle企业级ETL架构设计与性能优化深度解析
  • 【论文阅读笔记10】小样本充电数据驱动的电池寿命预测——双流ViT与ESA
  • DeepSeek 开始摇人,有点猛啊。
  • 机器人顶刊T-RO收录!同济大学:扔掉标定板,实现全自动在线对齐
  • 抖音批量下载终极指南:3分钟学会高效采集视频、音乐、封面
  • 3步解决华硕笔记本控制难题:G-Helper轻量化性能管理实战指南
  • Xournal++:开源手写笔记软件的跨平台PDF批注解决方案深度解析
  • Magpie终极指南:15种超分辨率算法重塑Windows窗口放大体验
  • YOLO26N 姿态估计 INT8 量化:低算力设备极致优化
  • 最近很火的Loop Engineering到底是什么?
  • uni-app微信小程序开发:核心标签详解(一)
  • 基于HarmonyOS 7.0 跨端开发的宇宙探索科普页面实战
  • 数据中台的血缘管理的制作思路
  • 第六章-扫描路径
  • 3步掌握Twitch掉落自动获取:终极智能挖矿工具完整指南
  • 2026佛山黄金回收白银回收铂金回收旧料回收怎么选?五家高实价铂金白银线下门店测评清单 + 联系方式
  • 视频和音频怎么合并?分享一种免费的方法
  • [hot100]盛最多水的容器
  • 规约驱动开发(SDD)——让规约成为人与 AI 之间的“合同“
  • Pytest+BDD+Playwright:构建现代化Web自动化测试框架的完整指南
  • VS Code 通义灵码报错:调用异常 code=403 解决方案