在旭日X3派上部署YOLOv5的过程中碰到了许多问题,来开个贴记录一下我所遇到的问题及其解决方法,此外,感谢各位大佬的帖子和博客给予的帮助!!!文章最后给出了提升识别速度的方法。(瞎猫碰到死耗子凑出来的,本人菜鸡,具体原理不清楚)
问题一:模型转换环境难以搭建
模型转换的时候我是跟着大佬小玺玺的教程来的
;由于本人电脑过于老旧(18年的笔记本),运行docker特别慢和卡,而且C盘空间占的太大了,对于新手来说不方便。因此我后面是跟着官方文档来的,在电脑里装了虚拟机,安装了Ubuntu系统,在Ubuntu系统里搭建好了模型转换环境,亲测有效。
问题二:后处理出现问题
我遇到的报错如下:
Traceback (most recent call last):
File "test_yolov5.py", line 56, in <module>
prediction_bbox = postprocess(outputs, model_hw_shape=(640, 640), origin_image=img_file)
File "/media/sdcard2/app/pydev_demo/07_yolov5_sample/postprocess.py", line 35, in postprocess
pred_sbbox = model_output[0].buffer.reshape([1, 80, 80, 3,
ValueError: cannot reshape array of size 226800 into shape (1,80,80,3,9)
后面逛论坛才知道时yolo版本的问题,要用官方的后处理函数的话,你的yolov5版本必须得是2.0,并且将pt文件转换为onnx文件的程序必须用2.0版本里的export.py程序,否则后处理也会报错。还有如果你想用小玺玺大佬自己写的Cython后处理函数来提升后处理速度的话,你的yolov5版本得是6.2,并且将pt文件转换为onnx文件的程序要用6.2版本里的export.py程序;或者将2.0版本训练好的pt模型文件用6.2版本里的export.py程序转化为onnx文件。onnx文件转为bin文件请参考官方教程。
问题三:识别速度慢
我的识别任务是垃圾四分类,用的官方给的教程(YOLOv5 2.0版本)总体识别速度大概是270ms(推理50ms+后处理220ms);
用的小玺玺大佬给的方法(YOLOv5 6.2 + 大佬写的后处理函数)总体识别速度大概为350ms(推理342ms+后处理7ms);
可以看出这两种方法各有各的优点,2.0的推理速度快,6.2的后处理速度快;突发奇想,能不能将两者结合一下?让整体识别速度更快。之所以只有6.2版本的模型才能使用大佬写的后处理函数,大概率是跟模型转换有关,因为yolov5虽然有版本迭代,但其整体网络结构不变啊。所以问题大概率出现在模型转换的过程中,二模型转换的第一个步骤就是pt转onnx。想法有了,开始实验!
用2.0版本的yolov5训练好pt模型,再将该模型用6.2版本的yolov5中的export.py程序转换为onnx文件,注意:将opset由12改为11.再在虚拟机里将onnx转换为bin文件,上板运行,完美!识别速度为140ms左右(推理速度131ms+后处理速度7ms)