代码地址:Github:ultralytics/yolov3
笔者在阅读《YOLO9000:Better, Faster, Stronger》原文后,根据自身理解及查阅资料,以入门角度尽可能想要还原论文细节,水平有限,欢迎交流。
YOLOv2 采用Darknet-19 作为特征提取网络,包括19个卷积层, 5个 maxpooling 层。
原型设计与 VGG16 一致,主要采用3x3卷积, 2x2 maxpooling层 (feature map维度降低两倍, channles增加两倍)。
与NIN (Network in Network) 类似,Darknet-19最终采用global avgpooling做预测。
在3x3卷积层之间使用1x1卷积层来压缩 feature map channles 以降低模型计算量和参数 (parameters)。
每个卷积层后面同样使用了 batch normalization 层以加快收敛速度,降低模型over-fitting。
原理等可参考:《Batch Normalization(BN)超易懂!图文详解——目的,原理,本质,有效性,副作用》
在每层卷积层的后面都加入 batch normalization 层,不再使用dropout,使得模型在 mAP 上提升了2.4%。
因为大部分的检测模型是使用 ImageNet 分类数据集上pre-train的模型,YOLOv1 采用 224x224 的图片分类器,但因为分辨率比较低,不利于检测模型。因此YOLO2 提高分辨率至 448x448 并在test数据集上进行 fine-tuning(微调)。
如果直接切换图片尺寸即分辨率大小,模型可能难以快速地对高分辨率的图片进行反应。因此,YOLO 训练由 2 个阶段组成。我们训练一个像 VGG16 这样的分类器网络。然后我们用卷积层替换全连接层,并对其进行端到端的重新训练以进行目标检测。
Pre-training步骤如下:
最终使得mAP提升了3.7%。
我们知道,卷积层会逐渐减小空间维度。随着相应分辨率的降低,也就更难检测到小物体。
YOLOv2 图片输入大小为 416 x 416,经过5次 maxpooling 后得到13x13 的feature map,并以此 feature map 采用卷积做预测,如此已经可以达到检测大物体的作用。但如果需要检测小物体,则还需要更精细的 feature map,因此 YOLOv2 提出了一种 passthrough 层以利用更精细的 feature map。
它将 26 × 26 × 512 层使用按行列隔行采样的方法,抽取 2x2 的局部区域,然后将其转化为 channel 维度,便可以巧妙地reshape为 13 × 13 × 2048。然后与原始的 13 × 13 ×1024 输出层连接。现在我们在新的 13 × 13 × 3072 层上应用卷积滤波器来进行预测,相当于做了一次特征融合,有利于检测小的目标。
由于模型仅使用卷积层和池化层,因此可以随时调整输入的大小。为了使 YOLOv2 在不同大小的图像上运行时具有鲁棒性,作者针对不同的输入大小训练了模型,就是在训练的过程中每间隔一定的 iterations 后改变输入的图片大小。
YOLOv2 下采样步长为32,因此输入图片大小要选择32的倍数 (最小尺寸为320x320, 最大尺寸为608x608)。在训练过程,每隔10个 iterations 随机选择一种输入图片大小,然后只需要修改对最后检测层的处理就可以重新训练。这起到了数据增强的作用,并迫使网络对不同的输入图像尺寸和比例进行良好的预测。
采用 Multi-Scale Training 策略使 YOLOv2 模型可以更好的预测不同大小的图片,由上图 VOC 2007 数据集上的结果可以看到: 采用较低分辨率的图片mAP 值略低,但速度更快。采用较高解析度的图片mAP 值较高,但速度较慢。对于 554X554 的图片 mAP 高达78.6%!
ps:原文中anchor也被称为prior box以表示对目标检测的最佳anchor的选择。
YOLOv1在训练过程中学习适应不同物体的形状比较困难,导致其在精度定位方面表现不佳。其早期训练容易受到不稳定梯度的影响。首先,YOLO对bounding box进行随机预测。这些随机的预测可能对部分目标的检测有效果,但对另一些目标识别却很糟糕,从而导致陡然的梯度变化。在早期的训练中,预测会在专门研究什么形状上去探索,尝试,甚至竞争。
例如上图,早期训练中,对人和车预测的bounding box形状可能都是竖着的。对人也许应该这样预测,因为行人的横纵比为0.41,但汽车显然需要更扁的bounding box来预测。
因为我们只需要一个猜测是正确,只要有一个猜测能找到物体就行,因此如果从生活中常见的猜测开始,那么初始训练就会更加地稳定。(比如预测一个横的,一个纵的)
**为了识别对训练数据具有最佳覆盖率的 top-K 边界框,我们对训练数据运行 K-means 聚类来定位 top-K 聚类的质心。**在许多问题域中,边界框具有很强的模式。在 Faster R-CNN 和 SSD 中,Anchor Box 的尺寸是手动选择的,有一定的主观性。若能选取合适的 Anchor Box,可以使模型更容易学习并预测出准确的 bounding box。例如,在自动驾驶中,最常见的 2 个边界框则是不同距离的汽车和行人。
聚类目的为提高选取的 Anchor Box 和同一个聚类下的 ground truth 之间的 IoU,采用的距离公式如下:
d ( b o x , c e n t r o i d ) = 1 − I o U ( b o x , c e n t r o i d ) d(box,centroid) = 1-IoU(box,centroid) d(box,centroid)=1−IoU(box,centroid) p s : 1. c e n t r o i d 为聚类时被选作中心的 b o u n d i n g b o x ps:1.centroid为聚类时被选作中心的bounding\ box ps:1.centroid为聚类时被选作中心的bounding box 2. b o x 为其他的 b o u n d i n g b o x 2.box为其他的bounding\ box 2.box为其他的bounding box
5个红色框代表VOC 2007数据集集中对象的平均尺寸和位置。
在训练集边界框上针对各种 k 值运行k-means 聚类,并绘制具有最近质心的平均 IOU,但作者没有使用欧几里德距离,而是使用边界框和质心之间的 IOU,公式如上。
作者权衡了模型复杂度和高召回率(Recall),选择 k = 5 (也就是选择了5个不同大小的Anchor Box来进行定位预测)作为模型复杂性和高召回率(Recall),如上图。
作者采用5个不同大小的 Anchor Box (Cluster IOU 5),Avg IOU 是61,比不使用聚类方法的9种 Anchor Box 的 Avg IOU高一些。若选择 Cluster IOU 9,Avg IOU更显著提高。
我们对锚点的offset(偏移量)进行预测。然而,如果它不受约束,我们的预测将再次随机化。因此YOLOv2此次预测 5 个参数( t x 、 t y 、 t w 、 t h t_{x}、t_{y} 、t_{w}、t_{h} tx、ty、tw、th和 t o t_{o} to ,并应用 sigmoid( σ \sigma σ) 函数来限制其可能的偏移范围,即 ( 0 , 1 ) (0,1) (0,1)之间。
YOLO9000 是在 YOLOv2 的基础上提出的一种可以检测超过9000个类别的模型,其主要贡献点在于提出了一种分类和检测的联合训练策略。
目标检测 label 的成本比分类数据集高很多(物体类别、框出物体在图片中的位置),因此分类数据集比检测数据集的数量多很多。
而边界框的预测又不依赖于类别检测,因此 YOLO 可以在分类和检测数据集上的联合训练。
联合训练策略方式: 对于testing data(检测数据集),用来学习预测物体的边界框 (bounding box)、置信度 (confidence) 以及物体(class)分类,而对于分类数据集仅用来学习(class)分类,但这样一来便可以大大扩充模型所能检测的物体种类。
训练方式: 首先在检测数据集上训练一定的epoch,待预测框的 loss 基本稳定后,再联合分类数据集、检测数据集进行交替训练。同时为了分类、检测数据量平衡,作者对 COCO 数据集进行了上采样,使得 COCO、ImageNet 数据总数的比例为 4:1。
联合数据集训练遇到的问题: 类别之间不一定是互斥关系,例如人与女生。所以作者提出了一种层级分类方法 (Hierarchical classification),根据类别之间的从属关系建立一种树结构word Tree。
正如我们所看到的,所有的类都在根(physical object)下。作者在 WordTree 上训练了 Darknet-19 模型。作者从 WordTree 中提取了 1000 类 ImageNet 数据集,并将所有中间节点添加到其中,从而将标签空间从 1000 扩展到 1369,并将其称为WordTree1k。现在,darknet-19 的输出层大小变为 1369 而不是 1000。
Word Tree 的根节点为 physical object,每个节点的子节点都是属于同一个子类,在进行 softmax 时,不对所有类别进行,而是对同一层级的类别进行操作。如上图,对同一个颜色 (同一层级) 的类别进行 softmax。
在进行预测时,会从根结点向下遍历,每一层级选取机率最高的子节点,并计算该节点至根节点的所有条件机率之积。当该条件机率之积小于某个阈值时停止,以当前节点表示预测的类别。计算公式如下:
预测输出为confidence: Pr(physical object)、bounding box位置、一个树状机率图。最终,通过联合训练策略,YOLO9000 可以快速的检测出超过 9000个类别的物体,总值 mAP 为19.7%。