yolo系列介绍好文章:https://www.cnblogs.com/makefile/p/YOLOv3.html

YOLOv3: An Incremental Improvement(一项渐进式的更新)

Absstract

<nobr aria&#45;hidden="true"> </nobr> <math xmlns="http&#58;&#47;&#47;www&#46;w3&#46;org&#47;1998&#47;Math&#47;MathML"> </math>本文为YOLO提供了一系列更新!它包含一堆小设计,可以使系统的性能得到更新;也包含一个新训练的、非常棒的神经网络,虽然比上一版更大一些,但精度也提高了。不用担心,虽然体量大了点,它的速度还是有保障的。在输入320×320的图片后,YOLOv3能在22毫秒内完成处理,并取得28.2mAP的成绩。它的精度和SSD相当,但速度要快上3倍。和旧版数据相比,v3版进步明显。在Titan X环境下,YOLOv3的检测精度为 <nobr aria&#45;hidden="true"> 57.9AP50 </nobr> <math xmlns="http&#58;&#47;&#47;www&#46;w3&#46;org&#47;1998&#47;Math&#47;MathML"> <mn> 57.9 </mn> <mi> A </mi> <msub> <mi> P </mi> <mrow class="MJX&#45;TeXAtom&#45;ORD"> <mn> 50 </mn> </mrow> </msub> </math>,用时51ms;而RetinaNet的精度只有 <nobr aria&#45;hidden="true"> 57.5AP50 </nobr> <math xmlns="http&#58;&#47;&#47;www&#46;w3&#46;org&#47;1998&#47;Math&#47;MathML"> <mn> 57.5 </mn> <mi> A </mi> <msub> <mi> P </mi> <mrow class="MJX&#45;TeXAtom&#45;ORD"> <mn> 50 </mn> </mrow> </msub> </math>,但却需要198ms,相当于YOLOv3的3.8倍。

1. Introduction

<nobr aria&#45;hidden="true"> </nobr> <math xmlns="http&#58;&#47;&#47;www&#46;w3&#46;org&#47;1998&#47;Math&#47;MathML"> </math>没有有价值的,就不翻译了

2.The Deal

<nobr aria&#45;hidden="true"> </nobr> <math xmlns="http&#58;&#47;&#47;www&#46;w3&#46;org&#47;1998&#47;Math&#47;MathML"> </math>谈到YOLOv3的更新情况,其实大多数时候我们就是直接把别人的好点子拿来用了。我们还训练了一个全新的、比其他网络更好的分类网络。为了方便你理解,让我们从头开始慢慢介绍。

2.1 Bounding Box Prediction

在YOLO9000后,我们的系统开始用dimension clusters固定anchor box来选定边界框。神经网络会为每个边界框预测4个坐标:tx、ty、tw、th。如果目标cell距离图像左上角的边距是(cx, cy),且它对应边界框的宽和高为pw、ph,那么网络的预测值会是:
<nobr aria&#45;hidden="true"> </nobr> <math xmlns="http&#58;&#47;&#47;www&#46;w3&#46;org&#47;1998&#47;Math&#47;MathML"> </math>
<nobr aria&#45;hidden="true"> </nobr> <math xmlns="http&#58;&#47;&#47;www&#46;w3&#46;org&#47;1998&#47;Math&#47;MathML"> </math>在训练期间,我们会计算方差。如果预测坐标的ground truth是tˆ,那相应的梯度就是ground truth值和预测值的差:tˆ-t*。利用上述公式,我们能轻松推出这个结论。通过对上面的公式变形,可以很容易地计算这个ground truth。

<nobr aria&#45;hidden="true"> </nobr> <math xmlns="http&#58;&#47;&#47;www&#46;w3&#46;org&#47;1998&#47;Math&#47;MathML"> </math>YOLOv3用逻辑回归预测每个边界框的objectness score。如果当前预测的边界框比之前的更好地与ground truth对象重合,那它的分数就是1。如果当前的预测不是最好的,但它和ground truth对象重合到了一定阈值以上,神经网络会忽视这个预测。我们使用的阈值是.5。与[17]不同,我们的系统只为每个ground truth对象分配一个边界框。如果先前的边界框并未分配给相应对象,那它只是检测错了对象,而不会对坐标或分类预测造成影响。

2.2 Class Prediction

<nobr aria&#45;hidden="true"> </nobr> <math xmlns="http&#58;&#47;&#47;www&#46;w3&#46;org&#47;1998&#47;Math&#47;MathML"> </math>每个边界框都会使用多标记分类来预测框中可能包含的类。我们不用softmax,而是用单独的逻辑分类器,因为我们发现前者对于提升网络性能没什么用。在训练过程中,我们用二元交叉熵损失来预测类别。
<nobr aria&#45;hidden="true"> </nobr> <math xmlns="http&#58;&#47;&#47;www&#46;w3&#46;org&#47;1998&#47;Math&#47;MathML"> </math>这个选择有助于我们把YOLO用于更复杂的领域,如Open Images Dataset 。这个数据集中包含了大量重叠的标签(如女性和人)。如果我们用的是softmax,它会强加一个假设,使得每个框只包含一个类别。但通常情况下这样做是不妥的,相比之下,多标记的分类方法能更好地模拟数据。

2.3. Predictions Across Scales

<nobr aria&#45;hidden="true"> </nobr> <math xmlns="http&#58;&#47;&#47;www&#46;w3&#46;org&#47;1998&#47;Math&#47;MathML"> </math>YOLOv3提供了3种尺寸不一的边界框。我们的系统用相似的概念提取这些尺寸的特征,以形成金字塔形网络。我们在基本特征提取器中增加了几个卷积层,并用最后的卷积层预测一个三维张量编码:边界框、框中目标和分类预测。在COCO数据集实验中,我们的神经网络分别为每种尺寸各预测了3个边界框,所以得到的张量是N ×N ×[3∗(4+ 1+ 80)],其中包含4个边界框offset、1个目标预测以及80种分类预测。
<nobr aria&#45;hidden="true"> </nobr> <math xmlns="http&#58;&#47;&#47;www&#46;w3&#46;org&#47;1998&#47;Math&#47;MathML"> </math>接着,我们从前两个图层中得到特征图,并对它进行2次上采样。再从网络更早的图层中获得特征图,用element-wise把高低两种分辨率的特征图连接到一起。这样做能使我们找到早期特征映射中的上采样特征和细粒度特征,并获得更有意义的语义信息。之后,我们添加几个卷积层来处理这个特征映射组合,并最终预测出一个相似的、大小是原先两倍的张量。
<nobr aria&#45;hidden="true"> </nobr> <math xmlns="http&#58;&#47;&#47;www&#46;w3&#46;org&#47;1998&#47;Math&#47;MathML"> </math>我们用同样的网络设计来预测边界框的最终尺寸,这个过程其实也有助于分类预测,因为我们可以从早期图像中筛选出更精细的特征。和上一版一样,YOLOv3使用的聚类方法还是K-Means,它能用来确定边界框的先验。在实验中,我们选择了9个聚类和3个尺寸,然后在不同尺寸的边界框上均匀分割维度聚类。在COCO数据集上,这9个聚类分别是:(10×13)、(16×30)、(33×23)、(30×61)、(62×45)、(59×119)、(116 × 90)、(156 × 198)、(373 × 326)。
<nobr aria&#45;hidden="true"> </nobr> <math xmlns="http&#58;&#47;&#47;www&#46;w3&#46;org&#47;1998&#47;Math&#47;MathML"> </math>这次我们用了一个新的网络来提取特征,它融合了YOLOv2、Darknet-19以及其他新型残差网络,由连续的3×3和1×1卷积层组合而成,当然,其中也添加了一些shortcut connection,整体体量也更大。因为一共有53个卷积层,所以我们称它为Darknet-53。

<nobr aria&#45;hidden="true"> </nobr> <math xmlns="http&#58;&#47;&#47;www&#46;w3&#46;org&#47;1998&#47;Math&#47;MathML"> </math>这个新型网络在性能上远超Darknet-19,但在效率上同样优于ResNet-101和ResNet-152。下表是在ImageNet上的实验结果:

<nobr aria&#45;hidden="true"> </nobr> <math xmlns="http&#58;&#47;&#47;www&#46;w3&#46;org&#47;1998&#47;Math&#47;MathML"> </math>每个网络都使用相同的设置进行训练,输入256×256的图片,并进行单精度测试。运行环境为Titan X。我们得出的结论是Darknet-53在精度上可以与最先进的分类器相媲美,同时它的浮点运算更少,速度也更快。和ResNet-101相比,Darknet-53的速度是前者的1.5倍;而ResNet-152和它性能相似,但用时却是它的2倍以上。
<nobr aria&#45;hidden="true"> </nobr> <math xmlns="http&#58;&#47;&#47;www&#46;w3&#46;org&#47;1998&#47;Math&#47;MathML"> </math>Darknet-53也可以实现每秒最高的测量浮点运算。这意味着网络结构可以更好地利用GPU,使其预测效率更高,速度更快。这主要是因为ResNets的层数太多,效率不高。
<nobr aria&#45;hidden="true"> </nobr> <math xmlns="http&#58;&#47;&#47;www&#46;w3&#46;org&#47;1998&#47;Math&#47;MathML"> </math>我们只是输入完整的图像,并没有做其他处理。实验过程中涉及的多尺寸训练、大量数据增强和batch normalization等操作均符合标准。模型训练和测试的框架是Darknet神经网络。

3. How We Do

<nobr aria&#45;hidden="true"> </nobr> <math xmlns="http&#58;&#47;&#47;www&#46;w3&#46;org&#47;1998&#47;Math&#47;MathML"> </math>YOLOv3的表现非常好!请参见表3,就COCO数据集的平均mAP成绩而言,它与SSD变体相当,但速度提高了3倍。尽管如此,它仍然比像RetinaNet这样的模型要差一点。

<nobr aria&#45;hidden="true"> </nobr> <math xmlns="http&#58;&#47;&#47;www&#46;w3&#46;org&#47;1998&#47;Math&#47;MathML"> </math>如果仔细看这个表,我们可以发现在IOU=.5(即表中的AP50)时,YOLOv3非常强大。它几乎与RetinaNet相当,并且远高于SSD变体。这就证明了它其实是一款非常灵活的检测器,擅长为检测对象生成合适的边界框。然而,随着IOU阈值增加,YOLOv3的性能开始同步下降,这时它预测的边界框就不能做到完美对齐了。
<nobr aria&#45;hidden="true"> </nobr> <math xmlns="http&#58;&#47;&#47;www&#46;w3&#46;org&#47;1998&#47;Math&#47;MathML"> </math>在过去,YOLO一直致力于对小型对象进行检测。但现在我们可以预见其中的演变趋势,随着新的多尺寸预测功能上线,YOLOv3将具备更高的APS性能。但是它目前在中等尺寸或大尺寸物体上的表现还相对较差,仍需进一步的完善。
当我们基于AP50指标绘制精度和速度时,我们发现YOLOv3与其他检测系统相比具有显着优势。也就是说,它的速度正在越来越快。

4. Things We Tried That Didn’t Work

<nobr aria&#45;hidden="true"> </nobr> <math xmlns="http&#58;&#47;&#47;www&#46;w3&#46;org&#47;1998&#47;Math&#47;MathML"> </math>我们在研究YOLOv3时尝试了很多东西,以下是我们还记得的一些失败案例。
Anchor box坐标的偏移预测。我们尝试了常规的Anchor box预测方法,比如利用线性激活将坐标x、y的偏移程度预测为边界框宽度或高度的倍数。但我们发现这种做法降低了模型的稳定性,且效果不佳。
用线性方法预测x,y,而不是使用逻辑方法。我们尝试使用线性激活来直接预测x,y的offset,而不是逻辑激活。这降低了mAP成绩。
focal loss。我们尝试使用focal loss,但它使我们的mAP降低了2点。 对于focal loss函数试图解决的问题,YOLOv3从理论上来说已经很强大了,因为它具有单独的对象预测和条件类别预测。因此,对于大多数例子来说,类别预测没有损失?或者其他的东西?我们并不完全确定。
双IOU阈值和真值分配。在训练期间,Faster RCNN用了两个IOU阈值,如果预测的边框与.7的ground truth重合,那它是个正面的结果;如果在[.3—.7]之间,则忽略;如果和.3的ground truth重合,那它就是个负面的结果。我们尝试了这种思路,但效果并不好。我们对现在的更新状况很满意,它看起来已经是最佳状态。有些技术可能会产生更好的结果,但我们还需要对它们做一些调整来稳定训练。

5.What This All Means

<nobr aria&#45;hidden="true"> </nobr> <math xmlns="http&#58;&#47;&#47;www&#46;w3&#46;org&#47;1998&#47;Math&#47;MathML"> </math>瞎扯淡

参考文章

https://zhuanlan.zhihu.com/p/35023499
https://www.jianshu.com/p/3943be47fe84