全名
YOLO9000:Better, Faster, Stronger
源码
http://pjreddie.com/yolo9000/
1.Introduction
我们提出一种新方法来利用已有的大量分类数据,并利用它来扩展现有检测系统的范围。
我们的方法使用对象分类的分层视图,允许我们将不同的数据集组合在一起。我们还提出了一种联合训练算法,允许我们在检测和分类数据上训练目标检测器。我们的方法利用标记的检测图像来学习精确定位目标,同时使用分类图像来增加其词汇量和鲁棒性。
首先,我们对现有的YOLO探测系统进行了改进,生产出了一种最先进的实时探测器YOLO v2。然后,我们使用我们的数据集组合方法和联合训练算法对来自ImageNet的9000多个类以及来自COCO的检测数据进行了训练。
2. Better
YOLO v2想要一个更精确、速度更快的探测器。YOLO v2简化网络,使表示法更易于学习。
与最先进的检测系统相比,YOLO的缺点:
- YOLO与Fast R-CNN的误差分析表明,YOLO会产生大量的定位错误。
- 与基于区域建议的方法相比,YOLO的召回率相对较低。
Batch Normalization.
- Batch normalization 在收敛性方面有显著的改进,同时消除了对其他形式的正则化的需要。
- 通过在YOLO中所有的卷积层上添加Batch normalization,我们得到了超过2%的mAP改进。
- Batch normalization 还有助于对模型进行规范化。
- 通过 Batch normalization,我们可以在不进行过拟合的情况下从模型中删除dropout。
High Resolution Classifier.
YOLO v2首先在ImageNet上以448×448的分辨率对分类网络进行10个epochs的微调(epoch解释)。这使网络可以更好地调整它的滤波器,从而能够在高分辨率输入下工作。然后在检测时对结果网络进行微调。这个高分辨率的分类网络提高了将近4%的mAP。
Convolutional With Anchor Boxes.
YOLO使用卷积特征提取器顶部的全连接层预测边界框的坐标,而不是使用Faster R-CNN所使用的手动挑选先验框。
我们从YOLO中移除全连接层,并使用anchor boxes来预测边界框。首先,消除一个池化层,使网络的卷积层的输出具有更高的分辨率。我们还缩小了网络操作的输入图像416,而不是448×448。我们这样做是因为我们想要在我们的feature map中有奇数个位置,所以只有一个中心单元格。物体,尤其是大的物体,往往占据图像的中心,所以最好在中心有一个单独的位置来预测这些物体。YOLO的卷积层将图像采样率降低了32倍,因此通过使用416的输入图像,我们得到了13×13的输出特征图。
当移动到anchor boxes时,我们还将类预测机制与空间位置解耦,转而预测每个anchor box的类和客观性。在YOLO之后,对象性预测仍然对 ground truth 和所提议的box的IOU进行预测,而类预测则预测给定一个对象的类的条件概率。
用 anchor boxes ,我们的准确性下降了一点。YOLO只预测了每幅图像的98个盒子,而我们的模型预测了1000多个。在没有 anchor boxes 的情况下,我们的中间模型在召回率为81%情况下mAP为69.5%。通过anchor boxes,我们的模型获得了69.2 mAP,召回率为88%。即使mAP减少了,召回率的增加意味着我们的模型有更多的改进空间。
Dimension Clusters(引入聚类策略).
在与YOLO一起使用anchor boxes时,我们会遇到两个问题。
问题一:
Faster R-CNN中盒子的尺寸是手工挑选的,然后网络可以学会适当地调整方框。但如果我们为网络选择更好的先验,我们可以使网络更容易学会预测良好的检测。我们不是手工选择先验,而是在训练集的边界盒上运行k-means集群来自动地找到好的先验。我们不使用欧式距离的标准k-means,因为较大的盒子比较小的盒子产生更多的误差。然而,我们真正想要的是能形成良好的IOU分数的先验。因此,对于距离度量,我们使用:
d(box,centroid)=1-IOU(box,centroid)
我们对不同的k值运行k-means,并绘制最接近质心的平均IOU,参见图1。我们选择k=5作为模型复杂性和高召回率之间的良好折衷。可以发现短而宽的盒子较少,而又高又细的盒子更多。
我们将集群策略的平均IOU与表1中手工挑选的锚盒的平均IOU进行了比较。仅仅5种boxes的召回率就和Faster R-CNN的9种相当,平均IOU为61.0,而表1中手工挑选的锚盒的平均IOU为60.9。如果我们使用9个质心,我们会看到一个更高的平均IOU。这表明使用k-Means来生成我们的边界框开始时模型具有更好的表示,并且使任务更容易学习。
图1:Clustering box dimensions on VOC and COCO.
Box Generation # Avg IOU Cluster SSE 5 58.7 Cluster IOU 5 61.0 Anchor Boxes 9 60.9 Cluster IOU 9 67.2 表1
Direct location prediction.
问题二:
模型不稳定,特别是在早期迭代期间。大多数不稳定性来自于对盒子(x, y)位置的预测。
在区域建议网络中,网络预测tx和ty值,(x, y)中心坐标计算为:
x = (tx * wa) - xa
y = (ty * ha) - ya
例如,如果预测tx= 1,则将盒子向右移动 anchor box 的宽度,如果预测tx= - 1,则将盒子向左移动相同的宽度。
上面的公式不会受到约束,所以任何 anchor box 都可以在图像中的任意点结束,不管预测的 anchor box 的位置是什么。这就导致了在随机初始化的情况下,模型需要很长时间才能稳定地预测出合理的偏移量。也就是说假如对tx和ty取值范围没有限制,那么在任意cell,预测出的box可以在整张图片的任意位置,导致模型需要很长时间才能收敛。
代替预测偏移量,我们采用YOLO方法,预测相对于网格单元位置的位置坐标。也即 ground truth 限定在0和1之间。我们使用 logistic 激活来限制网络的预测落在这个范围内。
在输出特征图中,网络预测每个单元的5个边界框。该网络预测每个边界框的5个坐标,分别是tx、ty、tw、th和to。如果单元格从图像左上角偏移(cx, cy),边界框先验有宽度和高度pw, ph,则预测对应:
由于我们对位置预测进行了约束,使得参数化更容易学习,使网络更加稳定。与使用 anchor boxes 的版本相比,使用聚类策略和直接预测包围框中心位置可以将YOLO提高近5%。
我们预测盒子的宽度和高度是由聚类中心的偏移量决定的。我们使用 sigmoid函数 来预测盒子的中心坐标相对于滤波器的位置。
Fine-Grained Features.(细粒度特征)
YOLO v2的输入图片大小为416*416,经过5次 maxpooling 之后得到13*13大小的特征图,并以此特征图采用卷积做预测。虽然这对于大对象来说已经足够,但是对于小物体还需要更精细的特征图(Fine-Grained Features)。Faster R-CNN和SSD都在网络中的各种 Feature map 上运行他们的提案网络,以获得一系列的分辨率。我们采取了一种不同的方法,简单地添加了一个 passthrough 图层,YOLO v2所利用的Fine-Grained Features是26*26大小的特征图(最后一个maxpooling层的输入)。
passthrough 层与 ResNet 网络的 shortcut 类似,以前面更高分辨率的特征图为输入,然后将其连接到后面的低分辨率特征图上。前面的特征图维度是后面的特征图的2倍,passthrough 层抽取前面层的每个2*2的局部区域,然后将其转化为channel维度,对于26*26*512的特征图,经 passthrough 层处理之后就变成了13*13*2048的新特征图。这样就可以与后面的13*13*1024特征图连接在一起形成13*13*3072的特征图,然后在此特征图基础上卷积做预测。
Multi-Scale Training.
原始的YOLO使用448×448的输入分辨率。加上 anchor boxes,我们将分辨率改为416×416。但是,由于我们的模型只使用卷积层和池化层,因此可以动态调整其大小。我们希望YOLO v2能够健壮地运行在不同大小的图像上,因此我们将其训练到模型中。
我们每隔几次迭代就改变网络,而不是固定输入图像的大小。我们的网络每10批随机选择一个新的图像尺寸大小。由于使用了下采样参数是32,所以不同的尺寸大小也选择为32的倍数{320,352…,608},因此,最小的是320×320,最大的是608×608。网络会自动改变尺寸,并继续训练的过程。
这种方法可以让网络学会很好地预测各种输入维度。这意味着同一网络可以预测不同分辨率的检测。网络在输入图片尺寸比较小的时候跑的比较快,输入图片尺寸比较大的时候精度高,因此YOLOv2可以很容易地在速度和准确性之间进行权衡。对比见下:
3.Faster
YOLO框架使用基于GoogLeNet架构的自定义网络。该网络比VGG-16更快,仅使用85.2亿次前向传播操作。它的精度略逊于VGG16。
Darknet-19.
我们提出了一个新的分类模型作为YOLO v2的基础。与VGG模型类似,我们主要使用3×3的过滤波器,并在每个池化步骤后加倍通道数。在对Network in Network(NIN)研究的基础上,我们使用全局平均池化进行预测,并使用1×1滤波器来压缩3×3卷积之间的特征表示。我们使用 batch normalization 来稳定训练,加快收敛,并使模型正则化。
我们最终的模型名为 Darknet-19 ,有19个卷积层和5个最大池化层。DarkNet-19只需要55.8亿次操作即可处理图像,但在ImageNet上达到72.9%的TOP-1准确率和91.2%的TOP-5准确率。
Training for classification.
我们在标准ImageNet 1000类分类数据集上对网络进行 160个epochs 的训练,使用的是 starting learning rate of 0.1 的随机梯度下降法;多项式速率衰减, 幂为4 ; weight decay of 0.0005 和 momentum of 0.9 ,使用的是Darknet神经网络框架。在训练中,我们使用标准的数据增强技巧,包括随机的作物、旋转、色相、饱和度和曝光变化。
如上所述,在我们最初的224×224图像训练之后,我们将网络调整到更大的尺寸448。对于这个微调,我们使用上面的参数进行训练,但是只有10个epochs,并且以10−3的学习率开始。在这个高分辨率下,我们的网络达到了 top-1的76.5%和top-5的93.3%的精度。
Training for detection.
我们通过删除最后一个卷积层,改为添加三个3×3卷积层,每个都有1024个滤波器,然后是最后一个具有检测所需输出数的1×1卷积层,从而修改了该网络以进行检测。对于VOC,我们预测有5个盒子,每个盒子有5个坐标,每个盒子有20个类,所以有125个滤波器。我们还从最后的3×3×512层到倒数第二卷积层增加了一个passthrough layer ,这样我们的模型就可以使用细粒度特征。
我们用10−3的starting learning rate 对网络进行了160个epochs的训练,在60和90个epochs将其除以10。
我们使用0.0005的weight decay和0.9%的momentum 。我们使用与YOLO和SSD类似的数据增强,包括随机裁剪、颜色偏移等。我们在COCO和VOC上使用相同的训练策略。
4. Stronger
提出了一种分类与检测数据联合训练的机制。我们的方法使用标记为检测的图像来学习特定于检测的信息。它使用只有类标签的图像来扩展它可以检测到的类别的数量。
在训练中,我们混合来自检测和分类数据集的图像。当我们的网络看到用于检测的标记图像时,我们可以基于完整的YOLO v2损失函数进行反向传播。当它看到一个分类图像时,我们只是从体系结构的分类特定部分计算反向传播损失。
这种方法提出了一些挑战。检测数据集只有通用对象和通用标签,如“狗”或“船”。分类数据集有更广泛和更深的标签范围。ImageNet有100多个品种的狗。如果我们想训练这两个数据集,我们需要一个连贯的方式来合并这些标签。
大多数分类方法在所有可能的类别中使用Softmax层来计算最终的概率分布。使用softmax假设这些类是互斥的。这为组合数据集带来了问题,例如,您不希望使用此模型组合ImageNet和COCO,因为“Norfolk terrier”和“dog”类不是互斥的。
相反,我们可以使用一个多标签模型来组合数据集,而不假设互斥。这种方法忽略了我们所知道的关于数据的所有结构,例如,所有的COCO类都是互斥的。
Hierarchical classification(层级分类).
ImageNet标签是从WordNet中提取的,WordNet是一个语言数据库,用于构建概念及其如何关联。在WordNet中,“诺福克梗”和“约克郡梗”都是“梗”的下义词,梗是“猎犬”的一种。大多数分类方法都采用标签的扁平化结构,但对于组合数据集来说,这种结构正是我们所需要的。
Wordnet的结构是有向图,而不是树,因为语言很复杂。例如,“dog”既是“canine”的一种,也是“domestic animal”的一种,两者在WordNet中都是同步的。我们没有使用完整的图结构,而是通过从ImageNet中的概念构建层次树来简化问题。
为了构建此树,我们检查ImageNet中的可视名词,并查看它们通过WordNet图到达根节点的路径,在本例中为“物理对象”。许多同义词集在图中只有一条路径,因此我们首先将所有这些路径添加到树中。然后,我们迭代地检查剩下的概念,并添加使树增长尽可能少的路径。因此,如果一个概念有两条到根的路径,并且一条路径会向我们的树添加三条边,而另一条路径只会添加一条边,那么我们会选择较短的路径。
最终的结果是WordTree,这是视觉概念的分层模型。为了使用WordTree进行分类,我们在每个节点预测给定该同义词集的每个下位词的概率的条件概率。例如,在“梗”节点,我们预测:
如果我们想要计算特定节点的绝对概率,我们只需沿着路径通过树到达根节点,然后乘以条件概率。 因此,如果我们想知道一张图片是否是诺福克梗的,我们需要计算:
出于分类目的,我们假设图像包含一个对象:Pr(physical object) = 1。
为了验证此方法,我们在使用1000类ImageNet构建的WordTree上训练Darknet-19模型。为了构建WordTree1k,我们添加了所有中间节点,从而将标签空间从1000扩展到1369。在训练期间,我们在树上传播 ground truth 标签,这样,如果一个图像被贴上“诺福克梗”的标签,它也会被贴上“狗”和“哺乳动物”的标签,依此类推。为了计算条件概率,我们的模型预测1369个值的向量,并计算作为同一概念的下位词的所有同义词的Softmax,请参见图5。
Dataset combination with WordTree.
我们可以使用WordTree以合理的方式将多个数据集组合在一起。我们只需将数据集中的类别映射到树中的同义词集。图6显示了使用WordTree组合来自ImageNet和CoCo的标签的示例。Wordnet非常多样化,所以我们可以对大多数数据集使用此技术。
Joint classification and detection(联合分类检测).
使用新的数据集,我们训练了YOLO9000。我们使用基本的YOLOv2架构,但是只有3个先验而不是5个先验来限制输出大小。当我们的网络看到检测图像时,我们像往常一样反向传播损失。对于分类损失,我们只反向传播标签相应级别或以上的损失。
当它看到分类图像时,我们只会反向传播分类损失。这样我们就可以简单地找到预测该类概率最高的边界框,并且我们只在其预测树上计算损失。我们还假设预测的框与 ground truth 重叠至少0.3 IOU,并且我们基于这一假设反向传播客观性损失。
通过这种联合训练,YOLO9000学习使用COCO中的检测数据在图像中查找对象,并学习使用ImageNet中的数据对各种各样的对象进行分类。