- 问题1:yolo模型转ncnn模型
- 问题2:yolo5n6.param参数修改
- anchor
- anchor是什么?
- anchor会放在哪?
- yolov5n6 不要anchor 64参数会影响什么
- 其它收获
背景: ncnn yolo demo源码里面使用的模型是yolov5s_6.0。在手机上运行检测正常,但是速度稍慢,打算更换模型为yolo5n6,遇到的问它再此记录 问题1:yolo模型转ncnn模型
-
进入虚拟环境
conda activate yolo5 -
安装onnx
pip install onnx
pip install onnx-simplifier -
运行export.py
python export.py --weights yolo5n6.pt --img 640 640 --batch 1 --train --simplify --include onnx
python -m onnxsim yolo5n6.onnx yolo5n6-sim.onnx -
在线ncnn转换:https://convertmodel.com/#outputFormat=ncnn
- 把所有Resharp层的 0=-1,使输出的BBOX可以自适应
- yolov5.cpp 每一层的参数需要与模型的anchors对应
- yolov5只处理了3个anchors,v6版本有4个
4.yolov5.cpp stride 8、16、32的层名字,要对应修改
ex.extract(blob_name, out);
我这边暂时按照原来3层输出的代码,丢弃了strip64的输出,检测正常。
但是准确率确实比v5s要差些。
后续研究strip64参数作用,修改代码增加strip64层输出,看效果是否有改善
anchor
网上看了很多篇文章,对新手来说都没有很好理解的,最终找到了这篇很不错:https://blog.csdn.net/qq_35054151/article/details/113011194
下面是其中以下核心的内容总结:
一组预设好不同大小、比例的框。例如三个尺度{128, 256, 512},三个比例{1:1,1:2,2:1},总共9个框
放在feature map每个点上。假设输入一张图片,经过各种卷积后,得到不同尺寸的特征图,4X4,2X2,1X1,那么就会在这些特征图每个点上放置这些anchor框,然后分别计算所有框里面是否有物体、类别、实际位置等。
所以前文说的yolov5n6模型里面这些参数,P3/4/5/6实际是不同feature map尺寸的anchor
anchors: - [19,27, 44,40, 38,94] # P3/8 - [96,68, 86,152, 180,137] # P4/16 - [140,301, 303,264, 238,542] # P5/32 - [436,615, 739,380, 925,792] # P6/64
所以,P6对应的是64featuremap,是大尺寸特征图,anchor检测的是小尺寸目标! 如果不计算这层参数,影响就是丢失小目标
其它收获anchor的大小、比例是预先定好的,所以如果实际目标比例和anchor设定的比例很不符的话,会影响检出。
所以我们训练模型时,设定的anchor,与实际图像比例、物体比例也有关系。



