yolov2在yolov1的基础上使用yolov1类似的方法,增加了多尺度训练,实现了在速度和精确度上的平衡。
由于目标检测数据集的数量有限,标注耗费人工,因此没有较大规模的数据集,yolov2着手解决这一问题。提出了一种训练方式可以使分类数据集扩展到目标检测任务上,另外所提出的模型可以同时进行目标检测任务和分类任务。利用目标检测数据集学习精确定位,利用分类数据集来学习更多类别并增加鲁棒性。
yolov1虽然发文时候说很厉害,但作者在本文中又说出了他的诸多缺点,相较于region proposal-based的方法、召回率(recall)较低;相较于Faster-RCNN定位不够准确。
相较于Yolo,YoloV2添加了如上表所示的结构:
(1)batch norm :在各个卷积层后添加了BN层,有利于模型的收敛,并且防止过拟合
(2)High Resolution Classifier : 在YoloV1中采用的是224*224分辨率的输入,小分辨率虽然提高效率但降低了检测效果,YoloV2在前10epoch使用了448*448的分辨率作为模型输入。这为模型提供时间调整以应对高分辨率图像
(3)Convolultional With Anchor Boxes : 在YoloV1中使用的是全卷积去预测bounding box 出现的位置,而在Faster R-CNN中,使用了anchor box(先验框),而仅仅使用卷积层去预测正确的bounding box与anchor box的偏移量。这样的操作相较于YoloV1,模型需要学习的东西更少,也就有了更高的准确度。在YoloV2中,模型学习了这种方式。首先移除了一个pooling layer来增加输出feature 的分辨率,将输入图片的分辨率转换为由448*448为416*416。(目的是为了在后续操作时(图像分辨率缩小32倍),将分辨率转换为奇数(13*13),这种就有了一个单独的中心格子)而为什么想要一个单独的中心格?作者认为一般大目标的物体通常位于网格中心,接下来移动anchor box 并从中得到位置信息和类别信息,其中位置信息的预测仍旧与YoloV1相同:box与GT的IOU,类别预测为某个类别的概率。上图可见,使用anchor box ,在准确率上mAP由69.5%->69.2%,但在recall上由81%->88%。
(4)Dimension Cluster :使用anchor box ,仍旧存在问题:模型的效果取决于anchor box的选择,选择的越好,效果越精确,为了提高泛化性,在训练数据集上使用k-means 聚类获得的priors取代手工选择的anchor box。作者首先使用欧式距离的k-means聚类进行实验,发现大的box相较于小的box出现了更多的错误,这不是我们所想要的(目标是实现priors可以使最终的结局具有更高的IOU),因此使用的距离函数为:
经过实验发现:
如上图所示,当k-means聚类为5时,模型在复杂度和IOU上得到了平衡,同时得到的priors box多为细长的box。
实验发现,仅仅使用k=5的聚类方法就可以实现9个anchor box所能达到的准确度,可见聚类方法相较于手工选取的anchor box 是更好的选择。
(5)Direct location prediction : 使用anchor box 所带来的第二个问题就是模型的不稳定性,尤其实在训练的前期难以收敛,作者提出的应对方法是使用相对坐标,即相对于图片的坐标(都是0 to 1之间)这样就避免了anchor box 随机初始化所导致的无限大的情况出现,增强模型的稳定性,实际上就是变相的归一化
(6)Fine-Grained Feature:精细特征对小目标的识别有帮助,因此在前期获取了26*26*512的Feature map 与 13 * 13 * 2048 Feature map融合
(7)Multi-Scale Trainin:初始的输入图片的size为448*448,为了增加anchor box 变为了416*416。为了增强模型的鲁棒性,在每一epoch,将不会固定输入图片的size。在每10个epoch,随机输入一个不同大小的图片(必须保证是32的倍数,以为最后要缩小到416/32 的大小)这样的训练方式使得模型可以对不同大小的图片具有鲁棒性。使得图片具有更高的速度和准确性,如下图所示。
(8)Darknet-19:为了提高速度,本文使用了一个分类模型作为base。该模型具有19个卷积层和5个最大池化层,如下图所示。
网络训练方式:
(1)分类任务:首先在分类数据集上训练160epoch,输入大小为224*224,接下来微调网络,将输入修改为448*448,训练10epoch,大分辨率输入可获取更好的结果。
(2)目标检测任务:将分类网络的最后一层删除,并增加三个3*3卷积层和一个1*1卷积层最终得到我们需要的输出大小(取决于数据集),例如对于VOC数据集,我们需要预测5个box,每个box5个坐标(x,y,w,h,score),20个类别,因此需要125。另外从最后的3 × 3 × 512层到倒数第二个卷积层添加了一个直通层,以便我们的模型可以使用细粒度特征。
分类和检测联合训练:
提出了一种基于分类和检测数据的联合训练机制.我们的方法使用标记为检测的图像来学习检测特定的信息,如边界框坐标预测和对象性,以及如何对常见对象进行分类。它使用只带有类标签的图像来扩展它可以检测到的类别数。
在训练过程中,我们混合来自检测和分类数据集的图像。当我们的网络看到标记为检测的图像时,我们可以基于完整的YOLOv2损失函数进行反向传播。当它看到分类图像时,我们只从架构的分类特定部分反向传播损失。
这种联合训练出现一种问题是在目标检测数据集中类别信息不如分类数据集的类别信息详细(比如目标检测数据集中的类别:dog ; 分类数据集:“Norfolk terrier” ,“Yorkshire terrier”)常规的分类方式是直接在最后一层使用一个softmax来计算类别的可能性,这种方式默认他们之间是互斥的(如果是dog,就不能是“Norfolk terrier” ,这显然是不正确的,因为“Norfolk terrier”也是dog的一种)为了解决这一问题,本文使用了分层分类的方法,简单来说利用wordtree 实现分层操作,就是如果这个object被识别为“Norfolk terrier”,那么他也将带有“dog”与“animal”的标签。如下图所示,我们首先利用一个总的softmax函数预测“body”的概率P1,接下来在“body”内部再使用softmax函数预测“head”的概率,最后整体相乘。
尽管增加了369个额外的概念,并让我们的网络预测一个树结构,但我们的准确性只会略有下降。以这种方式执行分类也有一些好处。对于新的或未知的对象类别,性能会适度降低。例如,如果网络看到一张狗的照片,但不确定它是什么类型的狗,它仍然会以高置信度预测“狗”,但在下位词中的置信度较低。
在目标检测中,这种概率也是类似的,依旧是预测一个树结构,然后在树的每一层选取最高概率的路径,最终得到它的具体类别。
这种构建wordtree的方式可以联合多种数据集:
这种方式在实验后发现,模型对动物可以很好的判别其种类和类别,但在衣服上效果较差,仅能判别为“人”。