当前位置: 首页 > 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.gsyq.cn/news/1610623.html

相关文章:

  • 经典 CNN 网络 VGG
  • 配置外置与敏感隔离:基于 Django-environ 的多环境配置管理策略
  • 性能测试进阶:从压测工具到容量规划的系统工程实践
  • 学 Simulink — 航空航天 270 V DC 高压直流电源变换器的短路保护仿真
  • 二升三年级暑假特色作业(pdf图文版)
  • 【论文阅读笔记10】小样本充电数据驱动的电池寿命预测——双流ViT与ESA
  • DeepSeek 开始摇人,有点猛啊。
  • Magpie终极指南:15种超分辨率算法重塑Windows窗口放大体验
  • YOLO26N 姿态估计 INT8 量化:低算力设备极致优化
  • 3步掌握Twitch掉落自动获取:终极智能挖矿工具完整指南
  • [hot100]盛最多水的容器
  • 规约驱动开发(SDD)——让规约成为人与 AI 之间的“合同“
  • Pytest+BDD+Playwright:构建现代化Web自动化测试框架的完整指南
  • 6.28[a]
  • 5分钟快速上手Sunshine:打造免费的个人游戏串流服务器终极指南
  • 【亲测释放150多G系统盘空间】Win10 / Win11 系统深度清理教程:如果常规清理方式都无效,看这篇就对了
  • 基于HarmonyOS的选择困难抽签助手应用开发实战
  • Zabbix多GPU智能监控解决方案:告别手动运维,实现企业级NVIDIA显卡自动化管理
  • 安全组网供应商前五推荐
  • 3分钟完成GTNH汉化:让格雷科技新视野彻底变中文
  • 明日方舟素材资源库:一站式获取高清游戏美术资源的完整指南
  • IntelliJ IDEA 提交代码时,不想让 IDE 自动分析代码
  • 普通投资者做策略复盘时应该记录哪些技术字段
  • C++课后习题训练记录Day144
  • 股票因子组合怎么避免回测过拟合
  • 【毕业设计】师生健康信息管理系统 SpringBoot+Vue 完整源码(含论文+数据库,可运行)
  • 4步构建企业级质量保障体系:Vue.Draggable项目集成Git Hooks自动化检查实战指南
  • DeepSeek联合北大最新文章DSpark: 如何让大模型推理速度提升 85%?
  • 深入 Claude Code 源码(六):多智能体——Coordinator 与 AgentTool 深度解析
  • 9大网盘直链下载助手:浏览器一键解锁高速下载新体验