- YOLO9000: Better, Faster, Stronger论文地址
- PaperwithCode在目标检测的排名
- GIthub仓库地址,100Kstar
- 《YOLO1》论文精读:第一次实现端到端的目标检测
- YOLO1论文最新由Facebook AI发表于2016年5月,截止现在2024年10月,引用数是52854次。
- YOLO2由华盛顿大学研究机构于2016年12月发布,截止2024年10月,引用数是23157次。
文章目录
- 核心内容(省流版阅读这里即可)
- 1. YOLO9000 的介绍
- 2. YOLOv2 的改进
- 3. 多尺度训练方法
- 4. 联合训练方法
- 5. YOLO9000 的性能
- 1. YOLO1的缺陷-63.4mAP
- 2. 优化措施-起点是63.4mAP
- 2.1. 增加Batch Normalization层,提升2%mAP
- 2.2. 使用448输入分辨率,提升4%mAP
- 2.3. 使用Anchor Boxes,recall提升7%
- 2.4. 通过聚类得到先验锚点边界框,提升1%mAP
- 2.5. 使用预测坐标位置的方式,提升5%mAP
- 2.6. 增加细粒度特征,提升1%mAP
- 2.7. 多尺度训练,提升1%mAP
- 3. 使用Darknet-19网络结构
- 4. 以分类任务进行训练
- 5. 为了目标检测而训练
- 6. 联合训练方法
- 6.1. Hierarchical classification层次分类
核心内容(省流版阅读这里即可)
这篇论文介绍了YOLO9000,这是一种先进的实时目标检测系统,能够检测超过9000个不同的物体类别。接下来逐步解析这篇论文的核心内容:
1. YOLO9000 的介绍
- 目标检测系统:YOLO9000 是一种先进的实时目标检测系统,能够检测超过9000个不同的物体类别。
2. YOLOv2 的改进
- YOLO 检测方法的改进:首先,文章介绍了对YOLO检测方法的各种改进,包括新颖的改进和借鉴先前工作的改进。
- YOLOv2 的表现:改进后的模型称为 YOLOv2,在标准的检测任务(如 PASCAL VOC 和 COCO)上达到了最先进的水平。
3. 多尺度训练方法
- 多尺度训练:使用了一种新的多尺度训练方法,使得同一个 YOLOv2 模型可以在不同的输入尺寸下运行,提供了速度和准确率之间的灵活权衡。
- 性能指标:
- 在67 FPS时,YOLOv2 在 VOC 2007 数据集上获得了 76.8 mAP 的成绩。
- 在40 FPS时,YOLOv2 在 VOC 2007 数据集上获得了 78.6 mAP 的成绩,优于当时最先进的方法如 Faster R-CNN(使用 ResNet)和 SSD,同时仍然保持较高的运行速度。
4. 联合训练方法
- 联合训练:提出了一种联合训练方法,用于同时进行目标检测和分类的训练。
- YOLO9000 的训练:使用这种联合训练方法,在 COCO 检测数据集和 ImageNet 分类数据集上同时训练 YOLO9000。
5. YOLO9000 的性能
- 检测数据不足的情况:这种联合训练使得 YOLO9000 即使在某些类别没有标注的检测数据时也能做出预测。
- 性能验证:在 ImageNet 检测任务上验证了这种方法。尽管只有44个类别的检测数据,YOLO9000 在 ImageNet 检测验证集上获得了 19.7 mAP 的成绩。
- 在 COCO 数据集中未包含的 156 个类别上,YOLO9000 获得了 16.0 mAP 的成绩。
- 检测范围:YOLO9000 不仅仅能够检测200个类别,它能够预测超过9000个不同的物体类别,并且仍然能在实时条件下运行。
1. YOLO1的缺陷-63.4mAP
YOLO对边界框预测施加了强大的空间约束,因为每个网格单元格只能预测两个边界框,并且只能有一个类。这个空间约束限制了我们的模型可以预测的附近物体的数量。我们的模型在预测成群出现的小物体时出现了瓶颈困境,比如鸟群,人群、牛群等。
由于我们的模型学会了从数据中预测边界框,所以模型很难或者无法检测在训练数据中没有出现过的类别对象,或者很难检测跟训练数据的检测对象长宽比不同检测对象。
我们的模型还使用了相对粗糙的特征来预测边界框,因为我们的架构从输入图像中有多个降采样层。
最后,当我们训练一个目标检测的损失函数时,我们的损失函数处理小边界框与大边界框中的损失是相同的。一个大盒子里的小错误通常是良性的,但一个小盒子里的小错误对损失有更大的影响。我们的主要错误来源是不正确的损失函数。
缺陷总结为四点如下:
- 检测类别数不足
- 类别种数无法扩展
- 网络结构简单
- 损失函数不好
2. 优化措施-起点是63.4mAP
这篇论文几个单词的解释,需要达成共识:
- Anchor Boxes,翻译成锚点边界框,简称锚盒
- centroids,翻译成聚类出来的锚点边界框,简称质心
- Ground Truth:在机器学习中,“ground truth”指的是真实的数据标签或者是实际的结果。对于物体检测任务来说,ground truth通常包含了物体的位置(边界框坐标)以及物体的类别
相对SOTA的检测模型,YOLO存在各种缺点。YOLO与Fast R-CNN对比分析表明,YOLO产生了大量的定位错误。另外,与基于proposal-based的方法相比,YOLO的召回率相对较低。因此,我们主要关注在提高分类精度的同时提高召回率和定位准确性。
计算机视觉一般倾向于更大、更深层次的网络。更好的性能通常取决于训练更大的网络或将多个模型集成在一起。然而,对于YOLOv2,我们想要一个更准确的检测模型,并且希望模型推理速度很快。我们没有扩大网络,而是简化了网络,然后使模型更容易学习。我们从过去的工作的各种想法与我们自己的创新点相结合,以提高YOLO的表现。对结果的总结见表2。
上表中,大多数列出的优化措施都导致了mAP的显著增加。有两个例外是切换到带有anchor boxes的完全卷积网络和使用新的网络。切换到锚盒式方法在不改变mAP的情况下增加了召回率,但是使用新的网络减少33%计算量。
2.1. 增加Batch Normalization层,提升2%mAP
批处理归一化显著提高了收敛性,同时减少了对其他形式的正则化的需要。通过在YOLO中的所有卷积层上添加Batch Normalization,我们在mAP中得到了2%以上的改进。批处理规范化也有助于规范化模型。通过批处理归一化,我们可以在不进行过拟合的情况下从模型中去除dropout。
2.2. 使用448输入分辨率,提升4%mAP
所有最先进的检测方法都使用在ImageNet上预先训练过的分类器。从AlexNet开始,大多数分类模型的输入图像大小是256×256。原始的YOLO在224×224处训练分类器网络,但是将检测时的分辨率提高到448x448。
对于YOLOv2,我们首先在ImageNet上以10个epoch的全448×448分辨率微调分类网络,使其在更高分辨率的输入上检查工作可以更好地完成。然后,我们会根据检测结果对整个网络进行微调。这种高分辨率的分类网络使我们增加了近4%的mAP。
2.3. 使用Anchor Boxes,recall提升7%
YOLO1直接使用卷积特征提取器上的全连接层来预测边界框的坐标。但是对于RNN,它不是直接预测坐标,R-CNN使用手工挑选的先验(先验就是Anchor Boxes)预测边界框。R-CNN仅使用卷积层的region proposal network预测Anchor Boxes的偏移量和置信度。由于预测层是卷积的,所以RPN可以预测一个特征图中的每个位置的这些偏移量。预测偏移量而不是坐标,简化了问题,并使网络更容易学习。
我们从YOLO1中删除全连接层,并使用Anchor Boxes来预测边界框。首先,我们消除了一个池化层,以使网络的卷积层的输出具有更高的分辨率。我们还缩小了网络,以操作416个输入图像,而不是448个×448。我们这样做是因为我们想要在特征图中有奇数个位置,这样就有一个中心单元格。物体,特别是大型物体,往往会占据图像的中心,所以在中心有一个位置来预测这些物体,而不是附近的四个位置。YOLO的卷积层对图像降采样32倍,所以通过使用416的输入图像,我们得到了一个13×13的输出特征图。
当我们使用Anchor Boxes时,我们可以将类的预测与空间位置解耦,不再预测每个Anchor Boxes的类和坐标。YOLO2跟YOLO1一样,仍然是预测真实标签边界框和预测边界框的IOU(就是坐标),类预测预测在有Object的情况下该类的条件概率。
使用锚盒,我们的精度略有下降。YOLO只预测每张图像98个盒子,但使用锚盒,我们的模型预测了超过1000个。在没有锚盒的情况下,我们的中间模型得到69.5 mAP,召回率为81%。使用锚盒,我们的模型得到69.2 mAP,召回率为88%。尽管mAP减少了,但召回率的增加意味着我们的模型有更大的改进空间。
2.4. 通过聚类得到先验锚点边界框,提升1%mAP
当使用锚盒时,我们遇到了两个问题。首先,盒子的尺寸是手工挑选的。网络可以学会适当地调整锚盒,但如果我们为网络选择更好的先验,我们可以使网络更容易学会预测良好的检测结果。
跟手动选择Anchor Boxes不同,我们使用训练集的标签边界框进行K-means聚类去寻找合适的长宽比的Anchor Boxes。如果我们使用具有欧几里得距离的标准K-means,那么大的盒子比小的盒子产生更多的误差。然而,我们真正想要的是能够生成好的IOU分数的先验Anchor Boxes,这与锚盒的大小无关。因此,对于我们的距离度量,我们使用:
我们使用不同的K值来运行k-means,并绘制具有最近质心的平均IOU,见图2。我们选择k = 5作为模型复杂度和高召回率之间的一个很好的权衡。聚类的锚点边界框与手工挑选的锚定边界框有显著的不同。短而宽的锚点边界框少了,高而薄的锚点边界框多了。
图二:在VOC和COCO上的聚类锚点边界框。我们标签边界框的维度上运行k-means聚类,以获得我们的模型的良好先验锚点边界框。左图显示了我们得到的关于k的各种选择的平均IOU。我们发现k = 5对召回率和模型的复杂性给出了一个很好的权衡。右图显示了VOC和COCO的相对质心(即锚点边界框)。两组先验都倾向于更薄、更高的盒子,而COCO比VOC的尺寸变化更大。
表1:表明当先验锚点边界框数量为9的时候,聚类可以带来显著的提升。
2.5. 使用预测坐标位置的方式,提升5%mAP
当在YOLO中使用锚点边界框时,我们会遇到第二个问题:模型不稳定性,特别是在早期迭代中。大多数的不稳定性来自于预测盒子的(x,y)位置。在region proposal networks中,网络预测值tx和ty,则(x,y)中心坐标计算为:
xa,ya,wa,ha表示的是先验锚点边界框的中心点坐标、宽度和高度。即,当tx = 1时,表示使先验锚点边界框的中心点向右移动,移动的长度就是先验锚点边界框的宽度,而tx =−1则向左移动。
这个公式不好,需要改进。因为这个公式是不受约束的,因此任务锚盒都可以在图像中的任何位置出现,所以在随机初始化时,该模型需要很长时间来稳定以预测合理的偏移。
在这里,我们不再预测偏移量,而是遵循YOLO1的方法,预测相对于网格单元格位置的位置坐标。这就将ground truth限制在0到1之间。我们使用逻辑激活来限制网络的预测落在这个范围内。
该网络在输出特征图中预测了每个单元格上的5个边界框。该网络预测了每个边界框的tx、ty、tw、th和to的5个值。如果单元格偏离图像的左上角(cx,cy),并且先验锚点边界框具有宽度和高度pw,ph,则真实的边界框坐标和宽高,以及置信度的转换计算公式如下:
由于我们约束了位置预测,参数化更容易学习,使网络更加稳定。使用K-means聚类之后的先验锚点边界框并直接预测边界框中心位置比YOLO的版本提高了近5%。
上面公式的形象解释如下:
2.6. 增加细粒度特征,提升1%mAP
YOLO1预测了7x7特征图上的检测结果,YOLO2预测了13x13特征图上的检测结果,这个改变使得YOLO2足够满足大型检测对象的检测工作。但是对于更小的检测对象,YOLO2需要更加细粒度的特征。我们添加了一个passthrough layer,通过它可以直接得到前面的26x26大小的特征图,它是更加细颗粒度的特征图,可以用来检测更小的检测目标对象。
passthrough layer原理是通过将相邻特征叠加到不同的通道中,如2x2x512,将所有通道拼接到一起,就变成了1x1x2048。没有做任何其它的映射。YOLO2中将26×26×512特征图变成13×13×2048特征图。我们的检测器运行在这个细颗粒的13×13×2048特性图之上,因此它可以访问细粒度的特性。这使得性能略微提高了1%。
2.7. 多尺度训练,提升1%mAP
原始的YOLO使用的输入分辨率为448×448。但是在YOLO2中,随着先验锚点边界框的加入,我们将分辨率更改为416×416。不过,由于我们的模型只使用卷积层和池化层,因此可以动态地调整大小。我们希望YOLOv2能够在不同大小的图像上都可以运行。
我们不是固定输入图像的大小,而是每隔几次iteration就改变一次输入图像的大小。训练时,我们每10次iteration随机选择一个新的图像尺寸。由于我们的模型的样本下降了32倍,我们从以下32的倍数中提取: {320,352,…,608}。因此,最小的选项是320×320,最大的选项是608×608。我们将网络的输入大小调整到这个shape,并继续进行训练。由于下采样因子固定为32,所以当输入尺寸为320×320时,特征图的大小将是10×10;而当输入尺寸为608×608时,特征图的大小将是19×19。计算损失的方式是不变的。
这种机制迫使网络学习如何对各种输入维度进行良好的预测。这意味着同一个网络可以预测不同分辨率下的检测。该网络在较小的尺寸下运行得更快,因此YOLOv2在速度和准确性之间提供了一个简单的权衡。
在低分辨率下,YOLOv2作为一种廉价、相当精确的检测器。在288×288,跟Fast R-CNN的mAP一样的情况下,可以达到90FPS的运行速度。这使得它非常适合更小的gpu,高帧率视频,或多个视频流。
在高分辨率下,YOLOv2是一个最先进的探测器,在VOC 2007上有78.6 mAP,同时仍然以高于实时速度运行。见表3
表3显示:YOLOv2比以前的检测方法更快、更准确。它还可以在不同的分辨率下运行,以便在速度和准确性之间进行权衡。每个YOLOv2版本实际上都是相同的训练模型,具有相同的权重,只是以不同的图像大小进行检测评估。
3. 使用Darknet-19网络结构
Darknet-19.我们提出了一个新的分类模型作为YOLOv2的基础。与VGG模型类似,我们主要使用3×3过滤器,并在每个池化步骤后将通道数加倍。我们使用全局平均池来进行预测,以及1×1卷积层来压缩3×3卷积层之间的特征表示。我们使用批处理归一化来稳定训练,加速收敛速度。我们最终的模型,称为Darknet-19,有19个卷积层和5个最大池化层。完整的描述见表6。Darknet-19只需要55.8亿次操作来处理一幅图像,但在ImageNet上达到了72.9%的top-1准确度,和91.2%的top-5准确度。
4. 以分类任务进行训练
在ImageNet 1000分类数据集中,使用随机梯度下降,训练160个epoch,开始学习率是0.1,多项式率衰减为4,权重衰减0.0005和动量0.9。在训练过程中,我们使用标准的数据增强技巧,包括随机裁剪、旋转、色调、饱和度和曝光频移。
如上所述,在我们对224×224的图像进行初始训练后,我们将我们的网络调整为更大的尺寸,448。对于这种微调,我们使用上述参数进行训练,但只训练了10个epoch,并从10−3的学习速率开始。在这个更高的分辨率下,我们的网络达到了76.5%的top-1准确度和93.3%top-5准确度。
5. 为了目标检测而训练
我们对COCO和VOC采用相同的目标检测训练策略。
我们修改Darknet-19,删除最后一个卷积层,然后添加三个3×3卷积层,卷积核通道数是1024,最后接上一个1×1卷积层,卷积核的通道数就是输出数量。对于VOC,我们预测有5个边界框,每个边界框有5个坐标,每个边界框有20个类,通道数是125个。我们还添加了一个passthrough layer,以便我们的模型可以使用细粒度特征。
我们训练网络160个epoch,开始学习速率为10−3,在60和90个epoch除以10。
我们使用的权重衰减为0.0005,动量为0.9。我们使用类似的YOLO和SSD的数据增强与随机裁剪,颜色变化等。我们对COCO和VOC采用相同的训练策略。
6. 联合训练方法
我们提出了一种联合训练分类和检测数据的机制方法。我们的方法使用带有目标检测标签的图像来学习特定的信息,如边界框坐标和置信度,以及如何分类常见的物体。
它使用只带有类标签的图像来扩展它可以检测到的类别的数量。
在训练过程中,我们使用了来自检测和分类数据集的图像。当我们的网络看到一个标记为检测的图像时,我们可以基于完整的YOLOv2损失函数反向传播。当它看到一个分类图像时,我们只反向传播架构中分类特定部分的损失。
这种方法提出了一些挑战。检测数据集只有常见的对象和一般的标签,如“狗”或“船”。分类数据集有更广泛和更深层次的标签范围。ImageNet有100多个品种的狗,包括“Norfolk terrier狗”、“Yorkshire terrier狗”和“Bedlington terrier狗”。如果我们想在两个数据集上进行训练,我们需要一种连贯的方法来合并这些标签。
大多数分类方法在所有可能的类别中使用softmax层来计算最终的概率分布。使用softmax的前提是假定这些类是互斥的。这给合并数据集带来了问题,例如,您不可以使用这个模型合并ImageNet和COCO数据集,因为“诺福克梗”和“狗”这类并不是相互排斥的。
我们可以使用一个多标签模型来构造不假设互斥的数据集。这种方法颠覆了我们所知道的关于数据的所有结构,例如,所有的COCO类都是相互排斥的。
6.1. Hierarchical classification层次分类
ImageNet标签是从WordNet中提取的,这是一个构建概念及其如何关联的语言数据库。在WordNet中,“Norfolk terrier”和“Yorkshire terrier”都是“terrier”的子种类,“terrier”也是“猎犬”,也是“狗”,也是“犬”,等等。大多数分类方法都假设标签是一个扁平的结构,但是对于想构造的数据集,结构正是我们所需要的。
WordNet的结构是有向图,而不是树,因为语言是复杂的。例如,“狗”既是一种“犬类”,也是一种“家畜”,它们都是WordNet中的Synsets。我们没有使用完整的图结构,而是通过从ImageNet中的概念构建一个层次树来简化问题。
Synsets 是一组具有相似意义的词语的集合,将同义词组织在一起,形成语义上的单元,便于理解和操作词语之间的关系。
为了构建这棵树,我们检查了ImageNet中的视觉名词,并查看了它们通过WordNet图到根节点的路径,在本例中是“physical object”。许多Synsets在图中只有一条路径,所以我们首先将所有这些路径添加到树中。然后,我们迭代地检查我们剩下的概念,并添加尽可能少的增长树的路径。因此,如果一个概念有两条到根的路径,其中一条路径会给我们的树添加三条边,而另一条只会添加一条边,我们就选择较短的路径。
最终的结果是WordTree,一个视觉概念的层次模型。为了使用WordTree进行分类,我们预测每个节点上的该Synsets的每个下缀义词的概率的条件概率。例如,在“小猎犬”的节点上,我们预测到:
如果我们想计算一个特定节点的绝对概率,我们只需沿着穿过树的路径走到根节点,然后乘以条件概率。如果我们想知道诺福克梗的图片,我们计算:
出于分类的目的,我们假设图像包含一个对象:Pr(physical object) = 1。
为了验证这种方法,我们在使用1000类ImageNet构建的文字树上训练Darknet-19模型。为了构建WordTree1k数据集,我们添加了所有的中间节点,从而将标签空间从1000扩展到1369。在训练过程中,我们传播Ground Truth标记树,这样如果一个图像被标记为“诺福克梗”,它也被标记为“狗”和“哺乳动物”,等等。为了计算条件概率,我们的模型预测了一个包含1369个值的向量,并且我们计算了所有具有相同概念的下位词的系统集的softmax,见图5。