赞
踩
YOLOv3目前是业界比较流行的检测算法,在速度和精度上相对于其他检测算法,都有很大的优势,但是今天介绍的不是YOLOv3,而是它的改进版本yolov3-SPP,在学习的同时,也随便记录一下,如果有误还请大家指出。
首先来看下官方给的在COCO数据集上的表现,可以看到SPP版本相对于前面几个版本,mAP有了好几个百分点的提升,在加了SPP模块之后的YOLOv3为何有这么大的提升?
YOLOv3网络结构图:
YOLOv3-spp网络结构图:
SPP模块结构如下图:
从上述两副网络结构图中我们可以看出,在相对于普通版本的YOLOv3,SPP版本在第五、六层卷积之间增加了一个SPP模块,这个模块主要是由不同的池化操作组成,具体的实现在YOLOv3-SPP的cfg文件中:
### SPP ### [maxpool] stride=1 size=5 [route] layers=-2 [maxpool] stride=1 size=9 [route] layers=-4 [maxpool] stride=1 size=13 [route] layers=-1,-3,-5,-6
在一般的CNN网络结构中,最后的分类层通常是由全连接组成,而全连接有个特点,那就是它的特征数是固定的,这就导致了图片在输入网络的时候,大小必须是固定的,但是在实际情况中,图片大小是多种多样的,如果不能满足网络的输入,图片将无法在网络中进行前向运算,所以为了得到固定尺寸的图片,必须对图片进行裁剪或者变形拉伸等,这样就很可能会导致图像失真,从而影响最终的精度,而我们希望网络能够保持原图大小的输入,得到最大的精度。
SPP全称为Spatial Pyramid Pooling(空间金字塔池化结构),它是由微软研究院的何凯明大神提出,主要是为了解决两个问题:
但是在YOLOv3中,并不是解决这两个问题的,如果对于如何解决上述问题感兴趣的同学,可以去参考这篇博客SPP深度解析,在YOLOv3-SPP中,SPP module由四个并行的分支构成,分别是kernel size为 5×5, 9×9, 13×13的最大池化和一个跳跃连接。如下图所示,作者检测头前面的第5和第6卷积层之间集成SPP模块来获得YOLOv3-SPP,在Feature Map经过SPP module池化后的特征图重新cat起来传到下一层侦测网络中
所以说,YOLOv3-SPP版本实际上只是增加了SPP 模块,该模块借鉴了空间金字塔的思想,通过SPP模块实现了局部特征和全局特征,这也是为什么SPP模块中最大的池化核大小要尽可能的接近或者等于需要池化的特征图的大小,特征图经过局部特征与全局特征相融合后,丰富了特征图的表达能力,有利于待检测图像中目标大小差异较大的情况,尤其是对于YOLOv3这种复杂的多目标检测,所以对检测的精度上有了很大的提升。
YOLOv3还衍生了很多的版本,大家感兴趣的话也可以去了解了解,这里就不多说了,有时间再写:
YOLOv3-tiny(YOLOv3的tiny版本)
YOLOv3-SPP1(仅在第一个检测头前集成SPP模块)
YOLOv3-SPP3(在三个检测头前都加入了SPP模块)
SlimYOLOv3-SPP3-50(n=50, k=90, 迭代剪枝2次)
SlimYOLOv3-SPP3-90(n=90, k=90)
SlimYOLOv3-SPP3-95(n=95, k=90)
在VisDrone2018-Det dataset的验证集上进行评估,各模型测试结果如下:
——————————————————————————
参考文档:
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。