RoboMaster-装甲板检测案例

1. 案例简介

2.效果展示

https://www.bilibili.com/video/BV1sAfhYEExh/?vd_source=50a352aec464dee8a9a0bc79476e3895#reply113872266593011

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端)

  • 检查模型,将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 即可获取」

你好,我是初学者,正准备复现一下这篇教程,请问附件包里的 yolo8_pose_bayese_640x640_nv12_modified.bin 文件是转换后的 可以直接上板运行的文件吗?或者是在 移除bbox信息3个输出头的反量化节点 步骤之前的那个文件?

bin文件是可以直接运行的哈

附件包好像不能用了,可以再上传一份吗,谢谢大佬

不好意思最近没看论坛,已更新