YOLO3各个版本对比
首先来看下官方给的在COCO数据集上的表现,可以看到SPP版本相对于前面几个版本,mAP有了好几个百分点的提升,在加了SPP模块之后的YOLOv3为何有这么大的提升?
YOLOv3和YOLOv3-spp网络结构对比
YOLOv3网络结构图:
YOLOv3-spp网络结构图:
SPP模块结构如下图:
相对于普通版本的YOLOv3,SPP版本在第五、六层卷积之间增加了一个SPP模块,这个模块主要是由不同的池化操作组成,具体的实现在YOLOv3-SPP的cfg文件中:
为什么会得固定大小的输出?
注意我们上面曾提到使用多个窗口(pooling窗口,上图中蓝色,青绿,银灰的窗口, 然后对feature maps 进行pooling,将分别得到的结果进行合并就会得到固定长度的输出), 这就是得到固定输出的秘密原因。
我们接下来用一个例子来弄懂这张图
如何理解yolov3中的spp模块?
在一般的CNN网络结构中,最后的分类层通常是由全连接组成,而全连接有个特点,那就是它的特征数是固定的,这就导致了图片在输入网络的时候,大小必须是固定的,但是在实际情况中,图片大小是多种多样的,如果不能满足网络的输入,图片将无法在网络中进行前向运算,所以为了得到固定尺寸的图片,必须对图片进行裁剪或者变形拉伸等,这样就很可能会导致图像失真,从而影响最终的精度,而我们希望网络能够保持原图大小的输入,得到最大的精度。
但SPP通常连接在最后一层卷基层。下图是CNN一般结构和SPP结构:
SPP全称为Spatial Pyramid Pooling(空间金字塔池化结构),它是由微软研究院的何凯明大神提出,主要是为了解决两个问题:
- 有效避免了对图像区域剪裁、缩放操作导致的图像失真等问题;
- 解决了卷积神经网络对图像重复特征提取的问题,大大提高了产生候选框的速度,且节省了计算成本。
SPP 显著特点
- 不管输入尺寸是怎样,SPP 可以产生固定大小的输出
- 使用多个窗口(pooling window)
- SPP 可以使用同一图像不同尺寸(scale)作为输入, 得到同样长度的池化特征。
其它特点
- 由于对输入图像的不同纵横比和不同尺寸,SPP同样可以处理,所以提高了图像的尺度不变(scale-invariance)和降低了过拟合(over-fitting)
- 实验表明训练图像尺寸的多样性比单一尺寸的训练图像更容易使得网络收敛(convergence)
- SPP 对于特定的CNN网络设计和结构是独立的。(也就是说,只要把SPP放在最后一层卷积层后面,对网络的结构是没有影响的, 它只是替换了原来的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-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的验证集上进行评估,各模型测试结果如下:
参考(感谢)
https://blog.csdn.net/qq_39056987/article/details/104327638
https://zhuanlan.zhihu.com/p/78942216
https://blog.csdn.net/yzf0011/article/details/75212513