前言
本文是yolo系列算法文章的第三篇,也是目前为止yolo系列算法的最终篇。从原理上看,yolov3并没有实质性的创新,主要是借鉴了一些时下state-of-the-art模型的优秀思想。本文重点讲解yolov3在v1和v2基础上做的改进,因此对yolov1和v2的原理还不太熟悉的小伙伴可以先看一下前面的两篇文章:yolo系列算法一和yolo系列算法二。
相较于v1和v2,yolov3的改进主要包括三点:新的backbone基础网络;多尺度预测;损失函数的调整。
backbone基础网络
为了改进模型效果,作者提出了一个新的基础网络darknet-53进行特征提取,该网络在darknet-19的基础上进一步扩充了网络深度,包括有53层卷积层,其网络架构如下图所示:
乍一看,darknet-53和resnet网络架构很像啊有木有。事实上,darknet-53可以说是青出于蓝而胜于蓝,具体改进如下:
充分借鉴了resnet网络中的残差结构,使得网络能够达到很深程度的同时避免了梯度消失问题;
去除了池化层而改用步长为2的卷积层的方式进行特征图的降维,更好的保持了信息传递;
充分吸收了network in network的思想,使用1*1卷积既降低了参数量,又增强了不同通道间的特征融合。
吸收了诸多优点的darknet-53最终取得了优异的成绩,能够在性能超过resnet-101的同时速度快1.5倍,在速度快2倍的前提下达到和resnet-152相似的性能。
多尺度融合
yolo自诞生之日起,就被打上了一个不太友好的标签:对小物体的检测效果不佳。这是原理上的限制,yolov1仅仅利用最后一层卷积层进行特征预测,而小物体的信息经过层层卷积后几乎完全丧失,从而制约了模型的效果。为了改进这一点,作者曾在yolov2中采用passthrough结构来改善细粒度特征的检测,但是效果依旧不理想。至yolov3,作者充分借鉴了FPN网络的思想,采用多尺度来对不同大小尺寸的目标物进行检测。小糖豆在查找资料时发现了下面这幅图,十分清晰明了的表示出yolov3中是如何进行多尺度级联预测的(原图出自Levio,感谢作者的劳作)。
416*416*3的图像输入网络后,经过5次下采样,得到第一张尺寸为13*13的预测特征图。随后,为了实现细粒度特征检测,在第79层特征图处进行上采样,并与来自第61层的特征图进行特征拼接,得到了第二张尺寸为26*26的预测特征图。同样地,在第91层特征图处再次进行上采样,与第36层特征图进行特征拼接,得到了第三张尺寸为52*52的预测特征图。
13*13的特征图由于下采样倍数大,单元网格的感受野比较大,适合检测尺寸比较大的目标物;26*26的特征图中单元网格感受野适中,适合检测尺寸中等的目标物;52*52的特征图中单元网格感受野相对较小,适合检测尺寸较小的目标物。
由于三张预测特征图承担的任务各不相同,相应的anchor box也需要进行调整。与v2中相同的是,v3延续了采用k-means聚类算法确定anchor box尺寸的方法,为每张特征图设定了3种anchor box,总共聚类得到9种尺寸的anchor box。在coco数据集上,这9个anchor box分别是(10x13),(16x30),(33x23),(30x61),(62x45),(59x119),(116x90),(156x198),(373x326)。分配的方式见下表所示,遵循的原则是特征图的尺寸越小,则分配的anchor box的尺寸越大。大家可以根据下面几幅图感受下不同anchor box对图像感知视野的不同(黄色框是ground true box,蓝色框是预先分配的anchor box)。
由于多尺度预测,yolov3对小物体的检测效果大大加强,yolov2和v3的检测效果对比如下图所示(成效真的很显著):
损失函数
损失函数的改进主要是在类别预测部分,用独立的logistic classifiers取代了softmax。作者在文章中解释道,这能帮助模型适应更复杂领域的数据集,比如Open Images数据集。在该数据集中,有很多标签的含义是重叠的,例如女人和人。而softmax需要假定每一个需要预测的类别都是互相独立的,很显然不适合这种情况。
与其他模型的比较
集百家之长的yolov3终于成长为目标检测界的标杆,傲视群雄。作者在此处很傲娇的将yolov3画在了第二象限(手动@作者,期盼yolov4早点问世哦)。
另附上一段小糖豆非常推崇的yolov3的评语:
2015 年,R-CNN横空出世,目标检测DL世代大幕拉开。各路豪杰快速迭代,陆续有了SPP,fast,faster版本,至R-FCN,速度与精度齐飞,区域推荐类网络大放异彩。奈何,未达实时检测之基准,难获工业应用之青睐。此时,凭速度之长,网格类检测异军突起,先有YOLO,继而SSD,更是摘实时检测之桂冠,与区域推荐类网络二分天下。然准确率却时遭世人诟病。遂有JR一鼓作气,并coco,推v2,增加输出类别,成就9000。此后一年,作者隐遁江湖,逍遥twitter。偶获灵感,终推v3,横扫武林!
霸气!Niubility!!!
下一代会是什么样子
在这里小糖豆结合目标检测领域的最新进展谈谈自己的看法。时下anchor-free类目标检测模型如雨后春笋般出现,yolov4很有可能会返璞归真。在小糖豆看来,yolo最核心的思想是将图像划分成网格,包含物体中心点的网格负责预测该物体。如果说改进下损失函数,使得模型能够精准定位到这些包含物体中心点的网格,在此基础上利用这些网格预测bounding box的其他属性,则可以成功避免依靠穷举法来获得潜在目标位置。这个思路和今年新发布的 centerNet(Objects as Points)的思路颇为相似。后期小糖豆会在yolov3的基础上尝试运用anchor-free的思想,如果效果好的话再分享给大家。
总结
yolo系列算法的原理讲解到这就暂告一段落了。小糖豆在前面的文章中也表达过自己的观点,要想真正弄清楚一个算法,仅仅弄明白它的原理是不够的,最合适的学习途径还是在学会原理的基础上动手实现它。因此,小糖豆在接下来的文章中会深入探索yolov3的代码,带领大家从零开始,动手实现yolov3的训练与检测。
最后献上一首诗与大家共勉:
古人学问无遗力,少壮功夫老始成。
纸上得来终觉浅,绝知此事要躬行!
参考:
https://arxiv.org/abs/1506.02640 yolov1
https://arxiv.org/abs/1612.08242 yolov2
https://arxiv.org/abs/1804.02767 yolov3
https://www.jiqizhixin.com/articles/2018-05-14-4