YOLOv3: An Incremental Improvement

摘要

在论文YOLO v3中作者借鉴了很多好的方案融合到了YOLO里面,并且分享了很多经验(尝试),从结果来说结果也是不错的在保持速度优势的前提下,提升了预测精度,尤其是加强了对小物体的识别能力。
论文地址:YOLOv3: An Incremental Improvement

网络结构

backbone:Darknet-53,如图1。
YOLOv3: An Incremental Improvement

图1

backbone部分由Yolov2时期的Darknet-19进化至Darknet-53,加深了网络层数,引入了Resnet中的跨层加和操作。

网络结构解析:

  1. Yolov3中,只有卷积层,通过调节卷积步长控制输出特征图的尺寸。所以对于输入图片尺寸没有特别限制。流程图中,输入图片以256*256作为样例。
  2. Yolov3借鉴了金字塔特征图思想,小尺寸特征图用于检测大尺寸物体,而大尺寸特征图检测小尺寸物体。特征图的输出维度为 N ∗ N ∗ [ 3 ∗ ( 4 + 1 + 80 ) ] N*N*[3*(4+1+80)] N∗N∗[3∗(4+1+80)], N ∗ N N*N N∗N为输出特征图格点数,一共3个Anchor框,每个框有4维预测框数值 t x , t y , t w , t h t_x,t_y,t_w,t_h tx​,ty​,tw​,th​,1维预测框置信度,80维物体类别数。所以第一层特征图的输出维度为88255。
  3. Yolov3总共输出3个特征图,第一个特征图下采样32倍,第二个特征图下采样16倍,第三个下采样8倍。输入图像经过Darknet-53(无全连接层),再经过Yoloblock生成的特征图被当作两用,第一用为经过33卷积层、11卷积之后生成特征图一,第二用为经过1*1卷积层加上采样层,与Darnet-53网络的中间层输出结果进行拼接,产生特征图二。同样的循环之后产生特征图三。
  4. concat操作与加和操作的区别:加和操作来源于ResNet思想,将输入的特征图,与输出特征图对应维度进行相加,即 y = f ( x ) + x y=f(x)+x y=f(x)+x;而concat操作源于DenseNet网络的设计思路,将特征图按照通道维度直接进行拼接,例如8816的特征图与8816的特征图拼接后生成8832的特征图。
  5. 上采样层(upsample):作用是将小尺寸特征图通过插值等方法,生成大尺寸图像。例如使用最近邻插值算法,将88的图像变换为1616。上采样层不改变特征图的通道数。

Yolo的整个网络,吸取了Resnet、Densenet、FPN的精髓,可以说是融合了目标检测当前业界最有效的全部技巧。

Yolo输出特征图解码(前向过程)

据不同的输入尺寸,会得到不同大小的输出特征图,以图二中输入图片256 × 256 × 3为例,输出的特征图为8 × 8 × 255、16 × 16 × 255、32 × 32 × 255。在Yolov3的设计中,每个特征图的每个格子中,都配置3个不同的先验框,所以最后三个特征图,这里暂且reshape为8 × 8 × 3 × 85、16 × 16 × 3 × 85、32 × 32 × 3 × 85,这样更容易理解,在代码中也是reshape成这样之后更容易操作。

三张特征图就是整个Yolo输出的检测结果,检测框位置(4维)、检测置信度(1维)、类别(80维)都在其中,加起来正好是85维。特征图最后的维度85,代表的就是这些信息,而特征图其他维度N × N × 3,N × N代表了检测框的参考位置信息,3是3个不同尺度的先验框。

检测信息解码

先验框

在Yolov1中,网络直接回归检测框的宽、高,这样效果有限。所以在Yolov2中,改为了回归基于先验框的变化值,这样网络的学习难度降低,整体精度提升不小。Yolov3沿用了Yolov2中关于先验框的技巧,并且使用k-means对数据集中的标签框进行聚类,得到类别中心点的9个框,作为先验框。在COCO数据集中(原始图片全部resize为416 × 416),九个框分别是 (10×13),(16×30),(33×23),(30×61),(62×45),(59× 119), (116 × 90), (156 × 198),(373 × 326) ,顺序为w × h。

检测框解码

有了先验框与输出特征图,就可以解码检测框 x,y,w,h。具体如图2。
YOLOv3: An Incremental Improvement

图2

如图3所示, σ ( t x ) , σ ( t y ) \sigma(t_x),\sigma(t_y) σ(tx​),σ(ty​)是基于矩形框中心点左上角格点坐标的偏移量, σ \sigma σ是激活函数,论文中作者使用sigmoid。 p w , p h p_w,p_h pw​,ph​是先验框的宽、高,通过上述公式,计算出实际预测框的宽高 ( b w , b h ) (b_w,b_h) (bw​,bh​)。
YOLOv3: An Incremental Improvement

图3

检测置信度解码

物体的检测置信度,在Yolo设计中非常重要,关系到算法的检测正确率与召回率。
置信度在输出85维中占固定一位,由sigmoid函数解码即可,解码之后数值区间在[0,1]中。

类别解码

COCO数据集有80个类别,所以类别数在85维输出中占了80维,每一维独立代表一个类别的置信度。使用sigmoid激活函数替代了Yolov2中的softmax,取消了类别之间的互斥,可以使网络更加灵活。

训练策略与损失函数(反向过程)

训练策略总结如下:

  1. 预测框一共分为三种情况:正例(positive)、负例(negative)、忽略样例(ignore)。
  2. 正例:任取一个ground truth,与4032个框全部计算IOU,IOU最大的预测框,即为正例。并且一个预测框,只能分配给一个ground truth。例如第一个ground truth已经匹配了一个正例检测框,那么下一个ground truth,就在余下的4031个检测框中,寻找IOU最大的检测框作为正例。ground truth的先后顺序可忽略。正例产生置信度loss、检测框loss、类别loss。预测框为对应的ground truth box标签(需要反向编码,使用真实的x、y、w、h计算出 [公式] );类别标签对应类别为1,其余为0;置信度标签为1。
  3. 忽略样例:正例除外,与任意一个ground truth的IOU大于阈值(论文中使用0.5),则为忽略样例。忽略样例不产生任何loss。
  4. 负例:正例除外(与ground truth计算后IOU最大的检测框,但是IOU小于阈值,仍为正例),与全部ground truth的IOU都小于阈值(0.5),则为负例。负例只有置信度产生loss,置信度标签为0。

Loss函数

特征图1的Yolov3的损失函数抽象表达式如图4:

YOLOv3: An Incremental Improvement

图4

Yolov3 Loss为三个特征图Loss之和,如图5:

YOLOv3: An Incremental Improvement

图5

λ \lambda λ为权重常数,控制检测框Loss、obj置信度Loss、noobj置信度Loss之间的比例,通常负例的个数是正例的几十倍以上,可以通过权重超参控制检测效果。
1 i j o b j 1^{obj}_{ij} 1ijobj​若是正例则输出1,否则为0; 1^{noobj}_{ij}若是负例则输出1,否则为0;忽略样例都输出0。
x、y、w、h使用MSE作为损失函数,也可以使用smooth L1 loss(出自Faster R-CNN)作为损失函数。smooth L1可以使训练更加平滑。置信度、类别标签由于是0,1二分类,所以使用交叉熵作为损失函数。

实验

Yolov3精度与SSD相比略有小优,与Faster R-CNN相比略有逊色,几乎持平,比RetinaNet差。但是速度是SSD、RetinaNet、Faster R-CNN至少2倍以上。输入尺寸为320*320的Yolov3,单张图片处理仅需22ms,简化后的Yolov3 tiny可以更快。
精度对比和性能对比见图6和图7。
YOLOv3: An Incremental Improvement

图6

YOLOv3: An Incremental Improvement

图7

上一篇:博客园页面自定义美化分享。


下一篇:增量学习-02-Essentials for Class Incremental Learning-CVPR2021