一、目标:训练输出img_size=640 的16、32、64倍降采样模型,并实现rv1126npu推理;
二、模型修改与训练
1、u版githubultralytics/yolov5: YOLOv5 in PyTorch > ONNX > CoreML > TFLite (github.com)https://github.com/ultralytics/yolov5
2、train.py
从models/hub/中拷贝一份yolov5s6.yaml到models下,尽量少在原文件修改。修改如下
修改类别nc和anchors,原文件为四组,这里修改为三组,保留16、32、64倍降采样输出。
head的最下面修改检测头,同样保留三个。删除原文件第一个。
三、pt模型转tmfile
3.1 pt模型转onnx
export.py需要将--train = True --opset = 11
3.2、onnx转Tengine tmfile模型
自行参考Tengine-lite GitHub官网
3.3 onnx转换前使用yolov5s-opt.py进行模型优化,实现一个算子替换。替换后推理速度有明显提升。
替换前后模型结构如下:
两种激活函数如下:
3.4、onnx 转tmfile 参考Tengine官网教程
3.5、模型量化 参考Tengine官网教程
./tools/quantize/quant_tool_uint8 -m best-opt.tmfile -i imgs/ -o best-opt-uint8.tmfile -g 3,640,640 -w 0,0,0 -s 0.003921,0.003921,0.003921 -c 0 -t 1 -y 640,640
imgs中存放图片,用于计算量化时的截断参数;
四、模型的部署
参考Tengine官方github,修改tm_yolov5s_timvx.cpp即可实现。这里需要注意anchors的具体值需要从yolov5的detect.py中获取,具体方式为:
使用debug detect.py检测过程,在yolo.py中打断点,查看anchor_grid变量。
到此,模型边可以在npu中进行推理了。rv1126 为2t的算力,推理时间在131ms左右。
这里anchors得尺寸推理和训练是不同,是什么原因导致得还得进一步看源码才知道,短时间内可以这样偷懒解决。