YOLO v3论文详解

YOLOv3: An Incremental Improvement

声明:笔者翻译论文仅为学习研究,如有侵权请联系作者删除博文,谢谢
源论文地址:https://pjreddie.com/media/files/papers/YOLOv3.pdf
:文字中标粗和亮色的部分为笔者认为有创新改进余地和需要注意的地方,斜体部分为笔者的一些想法,因水平所限,部分笔触可能有不实和错误之处,敬请广大读者批评指正,让我们一起进步~

YOLO V1 | YOLO V2的论文详解见:YOLO V1 | YOLO V2

源论文翻译比较好的两个博客:
https://blog.csdn.net/sinat_35907936/article/details/90447297
https://www.cnblogs.com/wj-1314/p/9744146.html

因为原论文中部分讨论与技术无关的话题,且创新点和技术分布较为零散。故集中整理如下:

YOLO v3 相对 v2 主要的改进有:调整了网络结构;利用多尺度特征进行对象检测;对象分类用Logistic取代了softmax。

新的网络结构Darknet-53

       在基本的图像特征提取方面,YOLO v3采用了称之为Darknet-53的网络结构(含有53个卷积层),它借鉴了残差网络residual network的做法,在一些层之间设置了快捷链路(shortcut connections)。
 图1 Darknet-53
        上图的Darknet-53网络采用256×256×3作为输入,最左侧那一列的1、2、8等数字表示多少个重复的残差组件。每个残差组件有两个卷积层和一个快捷链路,示意图如下:
在这里插入图片描述

利用多尺度特征进行对象检测

在这里插入图片描述
       YOLO2曾采用passthrough结构来检测细粒度特征,在YOLO3更进一步采用了3个不同尺度的特征图来进行对象检测
       结合上图看,卷积网络在79层后,经过下方几个黄色的卷积层得到一种尺度的检测结果。相比输入图像,这里用于检测的特征图有32倍的下采样。比如输入是416416的话,这里的特征图就是1313了。由于下采样倍数高,这里特征图的感受野比较大,因此适合检测图像中尺寸比较大的对象。
       为了实现细粒度的检测,第79层的特征图又开始作上采样(从79层往右开始上采样卷积),然后与第61层特征图融合(Concatenation),这样得到第91层较细粒度的特征图,同样经过几个卷积层后得到相对输入图像16倍下采样的特征图。它具有中等尺度的感受野,适合检测中等尺度的对象。
       最后,第91层特征图再次上采样,并与第36层特征图融合(Concatenation),最后得到相对输入图像8倍下采样的特征图。它的感受野最小,适合检测小尺寸的对象。

9种尺度的先验框

       随着输出的特征图的数量和尺度的变化,先验框的尺寸也需要相应的调整。YOLO2已经开始采用K-means聚类得到先验框的尺寸,YOLO3延续了这种方法,为每种下采样尺度设定3种先验框,总共聚类出9种尺寸的先验框。在COCO数据集这9个先验框是:(10x13),(16x30),(33x23),(30x61),(62x45),(59x119),(116x90),(156x198),(373x326)。
       分配上,在最小的1313特征图上(有最大的感受野)应用较大的先验框(116x90),(156x198),(373x326),适合检测较大的对象。中等的2626特征图上(中等感受野)应用中等的先验框(30x61),(62x45),(59x119),适合检测中等大小的对象。较大的52*52特征图上(较小的感受野)应用较小的先验框(10x13),(16x30),(33x23),适合检测较小的对象。
在这里插入图片描述       感受一下9种先验框的尺寸,下图中蓝色框为聚类得到的先验框。黄色框式ground truth,红框是对象中心点所在的网格。
在这里插入图片描述

对象分类softmax改成logistic

       预测对象类别时不使用softmax,改成使用logistic的输出进行预测。这样能够支持多标签对象(比如一个人有Woman 和 Person两个标签)

输入映射到输出结构图

在这里插入图片描述
       不考虑神经网络结构细节的话,总的来说,对于一个输入图像,YOLO3将其映射到3个尺度的输出张量,代表图像各个位置存在各种对象的概率。
       我们看一下YOLO3共进行了多少个预测。对于一个416×416的输入图像,在每个尺度的特征图的每个网格设置3个先验框,总共有 13×13×3 + 26×26×3 + 52×52×3 = 10647 个预测。每一个预测是一个(4+1+80)=85维向量,这个85维向量包含边框坐标(4个数值),边框置信度(1个数值),对象类别的概率(对于COCO数据集,有80种对象)。
       对比一下,YOLO2采用13×13×5 = 845个预测,YOLO3的尝试预测边框数量增加了10多倍,而且是在不同分辨率上进行,所以mAP以及对小物体的检测效果有一定的提升。

小结

       YOLO3借鉴了残差网络结构,形成更深的网络层次,以及多尺度检测,提升了mAP及小物体检测效果。如果采用COCO mAP50做评估指标(不是太介意预测框的准确性的话),YOLO3的表现相当惊人,如下图所示,在精确度相当的情况下,YOLOv3的速度是其它模型的3、4倍。
在这里插入图片描述       不过如果要求更精准的预测边框,采用COCO AP做评估标准的话,YOLO3在精确率上的表现就弱了一些。如下图所示。
在这里插入图片描述

最后,作者也做了些“失败”的尝试:

       我们在实现YOLOv3的过程中尝试了很多东西,但是很多都失败了,以下是我们还记得的一些失败的尝试。
       “锚点框”x,y偏移预测。**我们尝试使用常见的“锚点框”机制,通过使用线性激活将x,y的偏移预测为边框宽度或高度的倍数。但我们发现这种做法降低了模型的稳定性而且效果不佳。
       线性x,y预测而不是逻辑预测。我们尝试使用线性激活来直接预测x,y的偏移,而不是使用逻辑激活。这降低了mAP成绩。
       focal loss。我们尝试使用focal loss,但它大概吃掉了我们2个点的mAP。 这可能是因为具有单独的对象预测和条件类别预测的YOLOv3对于focal loss试图解决的问题已经具有相当的鲁棒性。是对于大多数例子,类别预测没有损失?还是其他什么原因?我们并不完全确定。
       双IOU阈值和真值分配。在训练期间,Faster- R-CNN用了两个IOU阈值,如果预测的边框与标注边框的重合度不低于0.7,那判定它为正样本。如果在0.3-0.7之间,则忽略。如果低于0.3,就判定它为负样本。我们也尝试了这种方法,但最终的效果并不好。
       我们非常喜爱我们现在的模型,它至少已经是目前的最佳状态。上述的有些技术可能会使我们的模型更好,但我们可能还需要对他们做一些调整。

PS:如果你有多余的时间,请一定读一下YOLO v3这篇有趣的原论文,你就会发现,在我们还在蒙头学技术而焦头烂额的时候,大神们早已经在思考技术存在的意义了…

参考文章:
这个博主建议关注一手,文章质量都很高~本文的大多数图片和部分文字借鉴与此 :https://zhuanlan.zhihu.com/p/49556105
这里有YOLO v3的代码loss函数:https://www.jianshu.com/p/da153a395a3c

发布了10 篇原创文章 · 获赞 8 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/dexterod/article/details/104582362