Simplestory's Blog

YOLO_v3

An Incremental Improvement

Word count: 1kReading time: 3 min
2020/01/17

是的,它来了。

简介

yolo3在\(320\times 320\)的分辨率输入下,准确率维持在\(28.2mAP\),运行速度大致为\(22ms\)

这个模型跟yolo2相比,并没有什么重大的改变,作者通过尝试许多技巧来提升模型性能,最后筛选出当前有用的一些技巧组合成yolo3。

边界框与类别预测

在yolo2中,边界框是通过预测框相对于图片左上角的中心坐标和先验框的长宽来得到框的位置大小:

\[ \begin{aligned} b_x & = \sigma(t_x)+c_x \\ b_y & = \sigma(t_y)+c_y \\ b_w & = p_we^{t_w} \\ b_h & = p_he^{t_h} \\ \end{aligned} \]

这里也沿用了yolo2的边界框预测方法。yolo3采用逻辑斯蒂回归对每个先验框进行物体对象存在性的评分。当某个先验框覆盖一个真实标记对象的面积相比于其它框都要大的时候,则该框的分数置1;当某个框不是最佳边界框,但确实与某个真实标记对象的重叠面积大于阈值(作者论文里选的阈值为0.5),作者仍将其忽略。所以作者只为每一个真实标记对象指定一个先验边界框,对于那些没有被指定的先验框,不会造成坐标和分类损失,而只会有目标对象存在性损失。通过这样的方式可以去除不必要的框,减少计算量。

关于类别预测,yolo3针对每个框都采用多标签分类来预测边界框可能包含的类。作者这里并没有采用softmax是因为作者发现这对模型的高性能并没有什么影响,而且独立的逻辑斯蒂分类加上二分类交叉熵损失函数这个模型可以方便地迁移到其它数据集上。

模型改进

在模型训练上,作者采用了跨尺度组合特征来进行预测。yolo3使用3个不同的长宽比来预测框,具体操作类似于\(FPN\)特征金字塔。作者在模型的特征提取器后面添加了几个卷积层,用来达到一个3维张量(包含了边界框、目标存在概率、各类别概率)。然后提取两层前的特征图并上采样与最后一层的输出进行合并,这样可以获得前面层的有意义的语义信息和细粒度。以此类推再添加一个合并层,所以最终模型使用了3个不同尺度进行预测。在先验框的选择上,作者延续了yolo2的操作,使用\(k-means\)聚类算法来得到候选框的尺寸。这里与yolo2不同的是作者选择了9个尺寸,然后将这些尺寸在3个不同的长宽比之间平均分配。附上一张结构图:

特征提取器

作者在yolo3里使用了一个全新的特征提取器。新的卷积堆中使用了连续的\(3\times 3\)\(1\times 1\)卷积核,同时添加上了残差模块。整个特征提取器共有53层,所以它被称为\(Darknet-53\)。结构如下图:

模型训练与不足

yolo3的训练仍采用没有经过难分样本挖掘的数据集进行训练,同时使用多尺度训练、大量的数据增强方法、批归一化等。模型的mAP值在COCO数据集上的新评估方法上与SSD模型旗鼓相当,但SSD的运行速度大约是yolo3的3倍。而换到旧的评估方法,模型的mAP值与RetinaNet相当并甩了SSD几条街。

yolo3还是有一些不足的。在前面版本中,yolo在小目标检测方面一直表现不优,经过多尺度训练后,模型对小目标检测有了很大的提升,但在中、大目标识别上的表现却不如从前。

致谢

本文主要参考自以下内容:

YOLOv3: An Incremental Improvement

YOLOv3 深入理解

yolo系列之yolo v3【深度解析】