1. 案例简介
2.效果展示
3.模型训练量化流程
3.1 模型训练代码(PC端)
https://github.com/ultralytics/ultralytics/tree/v8.2.103,训练过程与官方教程一致,此处不过多赘述,大家按照自己的数据集情况进行训练。本人用的数据集与pt模型放在附件中,但这个数据集比较糙(图片比较杂,数字0-17,但实际好像只看到16个类别),大家根据自己情况考虑是否使用
3.2 pt转onnx(PC端)
导出为onnx格式模型时需要对代码(ultralytics/ultralytics/nn/modules/head.py)做两处修改,更改后导出即可,注意导出时,opset=11
![]()
#约第64行的位置#原生代码# def forward(self, x):# """Concatenates and returns predicted bounding boxes and class probabilities."""# if self.end2end:# return self.forward_end2end(x)# for i in range(self.nl):# x[i] = torch.cat((self.cv2[i](x[i]), self.cv3[i](x[i])), 1)# if self.training: # Training path# return x# y = self._inference(x)# return y if self.export else (y, x)#更换代码def forward(self, x): # Detect result = [] for i in range(self.nl): result.append(self.cv2[i](x[i]).permute(0, 2, 3, 1).contiguous()) result.append(self.cv3[i](x[i]).permute(0, 2, 3, 1).contiguous()) return result #约第242行位置#原生代码# def forward(self, x):# """Perform forward pass through YOLO model and return predictions."""# bs = x[0].shape[0] # batch size# kpt = torch.cat([self.cv4[i](x[i]).view(bs, self.nk, -1) for i in range(self.nl)], -1) # (bs, 17*3, h*w)# x = Detect.forward(self, x)# if self.training:# return x, kpt# pred_kpt = self.kpts_decode(bs, kpt)# return torch.cat([x, pred_kpt], 1) if self.export else (torch.cat([x[0], pred_kpt], 1), (x[1], kpt))#更换代码def forward(self, x): detect_results = Detect.forward(self, x) kpt_results = [] for i in range(self.nl): kpt_results.append(self.cv4[i](x[i]).permute(0, 2, 3, 1).contiguous()) return (detect_results, kpt_results)
3.3 模型编译(PC端)
- 安装环境下载所需的OE包:https://developer.d-robotics.cc/rdk\_doc/Advanced\_development/toolchain\_development/intermediate/environment\_config#rdk-x5
- 将附件中08_pose文件夹放入horizon_x5_open_explorer/samples/ai_toolchain/horizon_model_convert_sample/路径下。
-
检查模型,将01_check脚本中的模型路径更换为自己的模型,运行脚本
-
准备校准图片,准备100张训练用的图片,将02_pre脚本中的源文件路径更换为100张图片的路径,运行脚本
-
编译模型,将config.yaml中的onnx模型更换为自己的onnx模型路径,运行03_build脚本,完成后生成yolo8_pose_bayese_640x640_nv12文件夹存放产物
-
移除bbox信息3个输出头的反量化节点,查看可被移除的反量化节点hb_model_modifier yolo8_pose_bayese_640x640_nv12.bin,查看生成的hb_model_modifier.log文件,找到维度为[1, 80, 80, 64][1, 40, 40, 64][1, 20, 20, 64]的三个输出名称,此处为output0,352,368,然后找到对应name进行移除,移除完成,该模型为最终模型,可上板运行
hb_model_modifier yolo11n_pose_bayese_640x640_nv12.bin -r 335_HzDequantize -r 351_HzDequantize -r 367_HzDequantize
3.4 代码仓库
3.5 说明
- 功能启动前需要设置CPU超频,帧率更加稳定,指令见github README
- 摄像头曝光时间会影响帧率,请设置合适的曝光时间
- 启动WEB展示将导致帧率下降,实际使用请确保web端展示未启动
- 保证板卡散热正常,避免因温度过高导致帧率下降
- 该模型使用RM社区开源数据集训练获得,由于数据集本身存在一些问题,效果没有特别好。另外方框是根据四个关键点生成的最小包围框,所以看起来会有点怪。该案例主要验证整体通路没有问题,并提供大致效果以及实际数据给大家参考评估。实际使用建议用新的数据集进行训练,也可使用其他模型,通过RDK X5量化工具链进行量化部署。
- 使用nv12格式图片的原因是因为RDK X5上基于硬件的图片resize功能以及编解码功能都是基于nv12的,所以改为nv12格式能够发挥RDK X5的优势
3.6 附件包
通过百度网盘分享的文件:附件包.zip
链接:百度网盘 请输入提取码
复制这段内容打开「百度网盘APP 即可获取」


