使用的网络比YOLOv1和YOLOv2都要大,但推断速度仍旧还算可以,与RetinaNet(另一个一阶段的网络)相比的话效果相当,但速度快了好几倍,和SSD对比也是如此。摘要和引言乃至全篇文章,写得非常口水话,更多是一篇博客而不是学术论文,本文也不避开这些口水话,尽量都翻译了。
自述:作者说他这一年没做什么研究,花了大量的时间在Twitter上,玩了一点生成对抗网络,剩余的时间也被用来研究其他乱七八糟的东西(附了两个很有意思的链接)。另外,作者强调他还微微改动了一下YOLO。引言最后就两行解释本文会告诉你YOLOv3到底搞了什么,并且展示一些尝试过但失败的实验。
YOLOv3学习了其他paper的先进思想融合到原有的方法中,也训练了一个效果还可以的新网络。
参考YOLOv2中的边界框聚类,YOLOv3对于每个框预测4个坐标参数,分别是 t x , t y , t w , t h t_x, t_y, t_w, t_h tx,ty,tw,th,假设某个cell的偏差是 ( c x , c y ) (c_x, c_y) (cx,cy),并且假设预设定的边界框的高和宽为 p w , p h p_w, p_h pw,ph,那么预测的边框实际得到的 ( b x , b y , b w , b h ) (b_x, b_y, b_w, b_h) (bx,by,bw,bh)的计算方式和YOLOv2中的一样,即
注意在计算loss的时候,用的是平方和误差。假设网络输出预测的坐标是 t ^ ∗ \hat t_* t^∗,那么梯度的计算就是真实值(需要通过上面的公式反推,因为一般label给的是前面的 b ∗ b_* b∗)减去预测的值(即 t ^ ∗ − t ∗ \hat t_* - t_* t^∗−t∗)。YOLOv3对于每一个边界框都会用逻辑斯蒂回归计算objectness得分。如果某个边界框的先验与真实区域的重叠面积比其他先验框都大,那么这个得分就应设为1。如果某个边界框与真实框有重叠但区域不是最大且重叠值大于某个设定的阈值(参考Faster R-CNN,作者把这个阈值设为0.5),那么就直接忽略这个框,不计算它的分类和定位loss,但计算objectness得分(?这段我理解不太好,请指教)。
YOLOv3中每个边界框的预测可能包含多个分类,这里并没有按以往那样利用softmax,而是之间对每个类采用独立的Logistic分类器,在计算分类loss的时候采用的是交叉熵。此做法的意图是因为诸如Open Images Dataset这种数据集有可能有一些重叠的labels(如Woman和Person),如果只用softmax意味着每个框只能单独预测一个类,这在大多数场景下并不适用。
YOLOv3在3个不同的尺度进行边界框的预测,本文使用类似feature pyramid networks(FPN)来提取多尺度的信息。最终的输出是三个预测向量的ensemble,比如对于COCO数据集,YOLOv3生成的那个特征向量是 N × N × [ 3 ∗ ( 4 + 1 + 80 ) ] N\times N\times [3*(4+1+80)] N×N×[3∗(4+1+80)](注意与YOLOv2对比多了一个3在里面)。也就是一个grid会生成3个边界框,而每个边界框都有自己的位置补偿、objectness得分和80种类别的预测。
这里要注意理解一下,最终生成的那个预测向量是concatenate了前面某两个地方的特征映射,他们的形状在通过下采样后都是一样的大的。因此实际在拼接了三个特征映射后,输出的通道数是3倍于真正需要的特征映射层大小。因此最终作者通过两步通道缩减使得这个特征映射层又变回最终所需要的尺寸大小。这里我解释得很乱,看不懂建议看原文2.3节,反正这种做法有利于整合从不同层提取到的精细特征,使得物体预测小物体更加厉害,定位也有所提升。
YOLOv3仍旧采用了YOLOv2所使用的k-means来决定anchor boxes(这篇文章中统一改名叫bounding box priors)的尺寸,这次预选的边界框一共是有9个,文章中也例举了所有9个预选框在实验中使用的尺寸。
本文设计了一个全新的网络,这个网络是Darknet-19和残差网络的结合体。网络使用了紧连的 3 × 3 3\times 3 3×3和 1 × 1 1\times 1 1×1的核,但也添加了跳跃连接,因为网络共有53层,因此也称为Darknet-53。具体结构如下(注意那个Residual就是残差连接):
这个网络虽然比Darknet-19要大,但还是比ResNet-101和ResNet152小得多且更高效。下表是不同的backbone在ImageNet上的分类效果,除了backbone,其余实验设定均一样:
仍旧是直接训练整个图片,且用了多尺度训练、数据增强、batch normalization以及其他常规套路(参考YOLOv2的设定,这里频繁使用stuff一词描述各种东西)。
YOLOv3的表现还可以,如下表所示,对于COCO奇怪的average mean AP度量指标,YOLOv3的效果与SSD变种相当,但速度是其三倍左右。客观而言还是落后RetinaNet不少,但如果只看老的检测指标,即[email protected](或者表中的 A P 50 AP_{50} AP50)那么YOLOv3的表现还是相当可以的,与RetinaNet有得一比,且效果远远优于SSD的变种。但一旦IOU的阈值增大,YOLOv3效果变差,说明YOLOv3不能很好得到与物体契合的边界框。
作者说这张表的内容的内容都是从RetinaNet(Focal loss for dense object detection)中偷来的,因为从0开始做这个表实在要花太(sooooo long)多的时间。
过去的YOLO不能很好地处理小物体,但现在随着多尺度预测理念的使用,YOLOv3有相对较高的 A P S AP_S APS值(小物体的AP)。作者通过在速度碾压其他方法认为YOLOv3 is faster and better。
1、在预测 x , y x, y x,y的时候用框的宽高作为补偿。
2、使用线性激活来预测 x , y x, y x,y的补偿而不是用logistic激活。
3、尝试Focal loss,直接掉了2个点。作者认为YOLOv3已经免疫了focal loss所需要处理的那个问题(隔离objectness预测和条件类的预测),不过究竟为啥作者也不太知道。
4、双IOU阈值和truth assignment。Faster R-CNN在训练的时候用了两个IOU阈值,如果预测超过了0.7,则是正样本,如果是[0.3-0.7],就会忽略这个框的loss,小于.3则被视为负样本,本文尝试了类似的策略,但没有成功。
总体来说作者挺喜欢自己的算法,因为它至少是一个局部最优值。不过作者认为以上的失败可能还需要继续调试,总有一个玄学参数能调出稳定的训练。
下面这个图展示了YOLO擅长的[email protected],为了夸张还把自己的曲线画到格子外面。
文章最后的总结又是一顿吐槽,吐槽为何度量方法要改,用老的.5IOU不好吗,人们根本区分不了0.3和0.5有什么区别。当然作者提到希望人们在cv中能得到开心。
YOLOv1
YOLOv2