
YOLO26N 姿态估计 ONNX 导出与模型简化1. ONNX 导出#!/usr/bin/env python3export_pose_onnx.pyfromultralyticsimportYOLO modelYOLO(runs/pose/yolo26n_pose_custom/weights/best.pt)# 导出 ONNXmodel.export(formatonnx,imgsz640,opset11,# 兼容性最好simplifyTrue,# 简化模型dynamicFalse,# 边缘设备推荐静态batch1,)# 输出yolo26n-pose.onnx (~6.4MB)2. ONNX 模型验证#!/usr/bin/env python3verify_onnx.pyimportonnximportonnxruntimeasortimportnumpyasnp# 加载模型modelonnx.load(yolo26n-pose.onnx)onnx.checker.check_model(model)# 检查输入输出print(输入:)forinpinmodel.graph.input:shape[d.dim_valuefordininp.type.tensor_type.shape.dim]print(f{inp.name}:{shape})print(输出:)foroutinmodel.graph.output:shape[d.dim_valuefordinout.type.tensor_type.shape.dim]print(f{out.name}:{shape})# 推理测试sessionort.InferenceSession(yolo26n-pose.onnx)dummynp.random.randn(1,3,640,640).astype(np.float32)outputssession.run(None,{images:dummy})print(f输出 shape:{outputs[0].shape})# [1, 56, 8400]3. 模型简化onnxsim# 安装 onnxsimpipinstallonnxsim# 简化模型onnxsim yolo26n-pose.onnx yolo26n-pose-sim.onnx# 验证简化后的模型python-c import onnx model onnx.load(yolo26n-pose-sim.onnx) print(f节点数: {len(model.graph.node)}) print(f大小: {os.path.getsize(\yolo26n-pose-sim.onnx\) / 1024 / 1024:.1f} MB) 4. Netron 可视化# 使用 Netron 可视化模型结构# 访问 https://netron.app# 或本地安装pip install netron python-cimport netron; netron.start(yolo26n-pose.onnx)# 检查要点# 1. 输入 shape: [1, 3, 640, 640]# 2. 输出 shape: [1, 56, 8400]# 3. 无动态维度# 4. 算子兼容目标平台5. ONNX 推理#!/usr/bin/env python3onnx_pose_inference.pyimportonnxruntimeasortimportnumpyasnpimportcv2classONNXPoseDetector:def__init__(self,onnx_path,conf_thresh0.3):self.sessionort.InferenceSession(onnx_path)self.conf_threshconf_thresh self.input_nameself.session.get_inputs()[0].namedefpreprocess(self,image):imgcv2.resize(image,(640,640))imgcv2.cvtColor(img,cv2.COLOR_BGR2RGB)imgimg.astype(np.float32)/255.0imgimg.transpose(2,0,1)returnnp.expand_dims(img,axis0)defdetect(self,image):blobself.preprocess(image)outputsself.session.run(None,{self.input_name:blob})# 输出: [1, 56, 8400]predictionsoutputs[0][0].T# [8400, 56]# 分解boxespredictions[:,:4]# bboxscorespredictions[:,4]# confkptspredictions[:,6:]# 关键点 (51 维)# 过滤maskscoresself.conf_thresh boxesboxes[mask]scoresscores[mask]kptskpts[mask]# 解析关键点results[]foriinrange(len(boxes)):keypointskpts[i].reshape(17,3)results.append({bbox:boxes[i],score:scores[i],keypoints:keypoints,})returnresultsif__name____main__:detectorONNXPoseDetector(yolo26n-pose.onnx)imagecv2.imread(test.jpg)resultsdetector.detect(image)print(f检测到{len(results)}个人)6. 输出解析# YOLO26N-Pose 输出格式# tensor shape: [1, 56, 8400]# 56 4(bbox) 1(conf) 1(cls) 17*3(kpts)defparse_pose_output(output,conf_thresh0.3):解析姿态估计输出predictionsoutput[0].T# [8400, 56]# 边界框boxespredictions[:,:4]# cx, cy, w, h# 置信度confpredictions[:,4]# 类别person0clspredictions[:,5]# 关键点: [8400, 51] → [8400, 17, 3]kpts_rawpredictions[:,6:]kptskpts_raw.reshape(-1,17,3)# 过滤maskconfconf_threshreturnboxes[mask],conf[mask],kpts[mask]总结步骤命令输出导出model.export(formatonnx)yolo26n-pose.onnx简化onnxsim input.onnx output.onnx简化模型验证onnx.checker.check_model无报错推理ort.InferenceSession检测结果