ss928平台移植官方yolov5s算法参考文章:https://www.ebaina.com/articles/140000017418,这位大佬也开源了代码,gitee链接:https://gitee.com/apchy_ll/ss928_yolov5s
本文在参考上述文章的基础上,将官方yolov5s模型跑通,验证推理图片正确,然后移植自训练的推理模型,在移植过程中遇到了一些问题,解决后记录一下。
一、模型转换
自训练模型是在yolov5-v7.0版本下训练的,通过export.py将pt模型转为onnx模型,需要注意的是在运行export.py转出前,需要将yolo.py文件里的foward函数修改为如下:
点击查看代码
def forward(self, x):
for i in range(self.nl):
x[i] = self.m[i](x[i])
bs, _, ny, nx = x[i].shape
x[i] = x[i].view(bs, self.na, self.no, ny, nx).permute(0, 1, 3, 4, 2).contiguous()
return x
二、模型部署
在参考上述提到的文章里的代码移植自己训练好的模型,与官方yolov5s不同的是自训练模型检测8类目标,需要修改如下几个地方:
1.模型调用路径
2.模型输入图像数据路径
3.后处理代码中的检测类别数量
4.画图可视化时目标标签类型
经过以上修改编译完成得到可执行文件,就可以用自训练模型推理了。
** 三、推理验证**
采用一张测试集中的图片进行推理测试,在板端推理结果如图1所示,在PC端用python工程推理结果如图2所示。
图1 板端推理结果
图2 PC端推理结果
明显可看出PC端检测结果要比板端检测结果好很多,验证了pt、onnx模型的推理结果都正常以及板端后处理代码无误后,定位问题出在om模型或输入推理模型的图像。进一步研究发现在使用act工具转om模型时会开启aipp_op配置,默认配置文件里是将YUV420SP_U8转为GRAY灰度图格式,对应代码中将输入的jpg图片转为YUV420SP_U8格式数据再输入给推理函数。这里推测自训练模型效果差是因为输入的是GRAY格式图片,训练的数据集都是jpg图片,可能不像官方yolov5s用的coco数据集那么多,导致模型推理GRAY格式图像检测精度下降。因此将代码修改如下:
1.输入图片letterbox预处理后不转为YUV420SP格式,直接保存为BGR格式的bin文件,然后再输入给推理函数。
2.此时保存的bin图像数据是BGR格式,在onnx转换om模型时,开启通道交换开关,将BGR格式转换为RGB格式。
这里配置时输入格式参数是RGB888_U8,其实应该写BGR的,但是查看了act工具手册里,该参数没有BGR合适的输入,最后验证这里写RGB888_U8,只开启通道交换功能,最后推理结果是正确的,说明BGR格式转为了RGB格式,aipp里的其它功能暂时没有使用过,不确定这样配置是否会影响其它功能正确使用。
修改后重新编译推理测试图片,推理结果如图所示。