【Yolo精读+实践+魔改系列】Yolov2论文超详细精讲(翻译+笔记)
前言
上一篇我们已经精读了 YOLOv1,还在B站整了个视频讲解,想复习的同学可以翻翻。 今天要聊的是传说中的 YOLOv2,也就是那篇名字很社会的论文:YOLO9000: Better, Faster, Stronger。 (是的,作者还是那个狠人,继续在自己的老作品上疯狂升级。)
简单回顾一下:YOLOv1的缺点嘛,主要是——网格太死板。一个网格只认一个物体,两个对象挤在一个格子里?不好意思,只能猜一个,另一个直接打包寄走。 为了不再翻车,YOLOv2进行了大刀阔斧的改进:
-
结构上,换上了更加能打的 Darknet-19 作为主干网络,还引入了特征融合,专门去挖掘那些细到掉渣的小特征;
-
训练上,也不摆了,直接用上了 高分辨率分类器 和 多尺度训练,让模型在各种尺寸下都能稳得一匹。
总之,这一代的YOLO,不只是“更快更强”,而是开启了全新的外挂模式! 来,一起盘一盘YOLOv2到底有多能打吧!
视频讲解:B站 智算学术 (会有一两天的延迟)
项目主页:YOLO: Real-Time Object Detection
论文链接:[1612.08242] YOLO9000: Better, Faster, Stronger
代码链接:https://github.com/longcw/yolo2-pytorch
500篇经典深度学习论文+视频+论文写作工具+模块缝合 请关注公众号:智算学术 领取
前景回顾
【Yolo精读+实践+魔改系列】Yolov1论文超详细精讲(翻译+笔记
目录
前言
前景回顾
Abstract—摘要
一、 Introduction—引言
二、 Better—更好
2.1 Batch Normalization—批量归一化
2.2 High Resolution Classifier—高分辨率分类器
2.3 Convolutional With Anchor Boxes—带有Anchor Boxes的卷积
2.4 Dimension Clusters—维度聚类(K-means聚类确定Anchor初始值)
2.5 Direct location prediction—直接的位置预测
2.6 Fine-Grained Features—细粒度的特征
编辑
2.7 Multi-Scale Training—多尺度的训练
2.8 Further Experiments—进一步的实验
三、Faster—更快
3.2 Training for classification—分类的训练
3.3 Training for detection—检测的训练
四、Stronger—更强(YOLO9000部分)
4.1 Hierarchical classification—分层分类
4.2 Dataset combination with WordTree—用WordTree组合数据集
4.3 Joint classification and detection—联合分类和检测
五、Conclusion—结论
Abstract—摘要
翻译
我们介绍的 YOLO9000 是最先进的实时物体检测系统,可检测 9000 多个物体类别。首先,我们对 YOLO 检测方法提出了各种改进建议,其中既有新颖之处,也有借鉴先前研究成果的地方。改进后的模型 YOLOv2 在标准检测任务(如 PASCAL VOC 和 COCO)中处于一流水平。利用新颖的多尺度训练方法,同一 YOLOv2 模型可在不同大小的环境中运行,从而在速度和准确性之间轻松做出权衡。在 67 FPS 下,YOLOv2 在 VOC 2007 上获得了 76.8 mAP。在 40 FPS 时,YOLOv2 可获得 78.6 mAP,超过了最先进的方法,如使用 ResNet 和 SSD 的 Faster RCNN,同时运行速度也明显更快。最后,我们提出了一种联合训练物体检测和分类的方法。利用这种方法,我们在 COCO 检测数据集和 ImageNet 分类数据集上同时训练 YOLO9000。通过联合训练,YOLO9000 可以预测没有标记检测数据的物体类别的检测结果。我们在 ImageNet 检测任务中验证了我们的方法。尽管只有 200 个类别中 44 个类别的检测数据,但 YOLO9000 在 ImageNet 检测验证集上获得了 19.7 mAP。在 COCO 以外的 156 个类别中,YOLO9000 的检测结果为 16.0 mAP。但是,YOLO 能检测的类别不止 200 种;它能预测 9000 多种不同对象类别的检测结果。而且它仍然是实时运行的。
精读
YOLO9000:先进的实时物体检测系统,支持检测9000+物体类别。
相比于yoloV1的改进点
-
训练策略改进:多尺度训练策略,可以适应不同尺寸的object,也不会过度的依赖某一个尺寸,不会出现过拟合
-
提出了一种联合训练物体检测和分类的方法:YOLOv2通过共享特征提取层和使用联合损失函数,在同一训练过程中同时优化物体检测和分类任务
性能提升:
-
在 VOC 2007 数据集上,67 FPS时获得 76.8 mAP,40 FPS时达到 78.6 mAP。
-
超越 Faster RCNN (ResNet) 和 SSD,且速度更快。
-
模型能对没有标注检测数据的类别进行预测
-
在 ImageNet检测任务上,获得 19.7 mAP,并对 COCO以外的156个类别获得 16.0 mAP
一、 Introduction—引言
翻译
通用对象检测应该快速、准确,并能识别各种各样的对象。自从引入神经网络以来,检测框架变得越来越快速和准确。然而,大多数检测方法仍然局限于一小部分物体。与分类和标记等其他任务的数据集相比,当前的物体检测数据集非常有限。最常见的检测数据集包含数千到数十万张图像,以及数十到数百个标签 [3] [10] [2]。分类数据集则包含数百万张图片和数万或数十万个类别 [20] [2]。我们希望检测能达到物体分类的水平。然而,为检测而标记图像的成本远高于为分类或标记而标记图像的成本(标记通常由用户免费提供)。因此,在不久的将来,我们不太可能看到与分类数据集同等规模的检测数据集。我们提出了一种新方法来利用我们已有的大量分类数据,并用它来扩展当前检测系统的范围。我们的方法采用了物体分类的分层视图,允许我们将不同的数据集结合在一起。我们还提出了一种联合训练算法,允许我们在检测和分类数据上训练物体检测器。我们的方法利用标记的检测图像来学习如何精确定位物体,同时利用分类图像来增加其词汇量和鲁棒性。利用这种方法,我们训练了 YOLO9000,这是一种实时物体检测器,可以检测出 9000 多种不同的物体类别。首先,我们对基础 YOLO 检测系统进行了改进,推出了 YOLOv2,这是一款最先进的实时检测器。然后,我们使用数据集组合方法和联合训练算法,对 ImageNet 的 9000 多个类别以及 COCO 的检测数据进行模型训练。我们的所有代码和预训练模型都可在 http://pjreddie.com/yolo9000/ 上在线获取。
精读
挑战:现有物体检测数据集有限,无法与分类数据集相比。
方法:提出了利用分类数据来扩展物体检测的方法,并提出了分层视图来结合不同的数据集。
通过这种层次化的视图,模型不仅能识别物体,还能理解这些物体之间的关系。比如,如果模型学会了识别“哺乳动物”,它也能够识别其他类似的物体类别
联合训练:开发了一个联合训练算法,同时利用检测图像和分类图像进行训练。
YOLO9000:基于YOLOv2的改进,YOLO9000能够实时检测9000+物体类别。
数据集:使用了ImageNet和COCO数据集进行联合训练。
二、 Better—更好
2.1 Batch Normalization—批量归一化
翻译
与最先进的检测系统相比,YOLO 存在多种缺陷。对 YOLO 与快速 R-CNN 的误差分析表明,YOLO 存在大量定位误差。此外,与基于区域建议的方法相比,YOLO 的召回率相对较低。因此,我们主要关注在保持分类准确性的同时提高召回率和定位率。计算机视觉通常倾向于使用更大、更深的网络 [6] [18] [17]。更好的性能往往取决于训练更大的网络或将多个模型组合在一起。然而,对于 YOLOv2,我们希望能有一个更精确的检测器,同时速度仍然很快。我们没有扩大网络规模,而是简化了网络,使其表示更易于学习。我们将过去工作中的各种想法与我们自己的新概念结合起来,以提高 YOLO 的性能。结果汇总见表 2。批量规范化。批量归一化可显著提高收敛性,同时无需其他形式的正则化[7]。通过在 YOLO 的所有卷积层上添加批量归一化,我们的 mAP 提高了 2% 以上。批量归一化还有助于对模型进行正则化。通过批量归一化,我们可以在不过度拟合的情况下消除模型中的丢弃。
精读
为了降低YOLOv1存在的定位误差和召回率相对较低的问题,这里使用了BN批量归一化(Batch Normalization)来提高收敛性,提高mAP精度,也有助于对模型进行正则化。
正则化(Regularization)是指在机器学习和深度学习中,添加一些额外的约束或惩罚项,以减少模型的复杂性,防止模型在训练数据上过度拟合,从而提高模型的泛化能力。简单来说,正则化帮助模型更好地在新数据上进行预测,而不是仅仅记住训练数据。
重新认识BN
解决的痛点:
在神经网络结构中,上一层的数据作为这一层的输入,数据分布在层与层之间是互相变化的,随着神经网络的加深
在反向传播过程中就会出现梯度消失或者梯度爆炸问题,也难以更加收敛。
BN原理
在全连接阶段:在全连接的数据形式是MxD(M个样本,d个特征)
其中,ϵ 是防止除零的小常数,γ和 β 是可学习的参数,控制输出的尺度和偏移。当使得数据符合(0,1)的高斯分布后,但是实际数据不可能完全符合高斯分布,所以用γ和 β来做数据分布的微调
在卷积阶段:
输入数据类型表示【N,C,H,W】经过3个卷积核后,生成3个通道的tensor,对生成的每个通道进行批量归一化(本质是一个卷积核提取一种特征,生成一个通道,所以本质是对每一个特征进行BN,和在全连接的本质是一致的)
在推理阶段,没有了数据集怎么办呢?
方法一:
均值使用训练阶段的全局均值,方差使用无偏方差。
这是无偏方差的推导公式
方法二:
在推理过程中采用指数滑动平均EMA来求得最终的方差和均值 (这样的好处不用存储整个神经网络的方差和均值,只需要存储最终计算得到的均值和方差就可以了)
效果
BN目前仍然是一个黑盒,论文中有一定的理论推导,但是普遍还是通过对比提升来验证BN的效果。原作者给出的效果如下图:
上图可见BN的两大收益:
-
收敛速率增加
-
可以达到更好的精度
在目标检测算法中,BN已经成为了标配。比如Yolov3引入了BN后,mAP提升了两个百分点。在更多实验中可以看到,BN同时起到了正则化作用,防止模型在训练集上过拟合,通常有BN的网络不再需要Dropout层。
参考论文链接:[Batch Normalization: Accelerating Deep Network Training by Reducing Internal Covariate Shift]
2.2 High Resolution Classifier—高分辨率分类器
翻译
所有最先进的检测方法都使用在 ImageNet 上预先训练好的分类器 [16]。从 AlexNet 开始,大多数分类器都在小于 256 × 256 的输入图像上运行 [8]。最初的 YOLO 以 224 × 224 的分辨率训练分类器网络,并将检测分辨率提高到 448。这意味着网络必须同时切换到学习对象检测,并适应新的输入分辨率。对于 YOLOv2,我们首先在 ImageNet 上以完整的 448 × 448 分辨率对分类网络进行 10 次微调。这样,网络就有时间调整其过滤器,以便在更高分辨率的输入上更好地工作。然后,我们在检测时对由此产生的网络进行微调。这种高分辨率分类网络使我们的 mAP 提高了近 4%。
精读
yolov1的不足
yolov1在imageNet上采用224x224进行预训练,然后迁移学习到目标检测网络,在用448x448进行训练,对于尺寸的改变会损失精度
V2的改进
v2直接在预训练中输入的就是448×448的尺寸,微调的时候也是448 × 448。
后面改为了416x416,是因为object往往在图像的中央位置会落在输出的14x14的网格的网格线上,所以改为416x416后经过网络输出13x13的tensor,这样大概率会是object的中心点落在网格内
效果
使mAP增加了近4%
2.3 Convolutional With Anchor Boxes—带有Anchor Boxes的卷积
翻译
YOLO 在卷积特征提取器之上使用全连接层直接预测边界框的坐标。Faster R-CNN 不直接预测坐标,而是使用手工挑选的先验来预测边界框[15]。Faster R-CNN 中的区域建议网络(RPN)仅使用卷积层来预测锚点框的偏移和可信度。由于预测层是卷积层,因此 RPN 可以预测特征图中每个位置的偏移量。预测偏移量而不是坐标简化了问题,使网络更容易学习。我们删除了 YOLO 中的全连接层,并使用锚点框来预测边界框。首先,我们取消了一个汇集层,使网络卷积层的输出分辨率更高。我们还缩小了网络,使其能在 416 幅而非 448×448 幅输入图像上运行。之所以这样做,是因为我们希望特征图中的位置数量为奇数,这样就有了一个中心单元。物体,尤其是大型物体,往往会占据图像的中心位置,因此最好在中心位置设置一个位置来预测这些物体,而不是在附近设置四个位置。YOLO 的卷积层会对图像进行 32 倍的下采样,因此使用 416 的输入图像,我们可以得到 13 × 13 的输出特征图。当我们移动到锚点框时,我们也将类别预测机制与空间位置解耦,转而预测每个锚点框的类别和对象性。按照 YOLO 方法,对象性预测仍然是预测地面实况和所提议的锚点框的 IOU,而类别预测则是预测在有对象的情况下该类别的条件概率。使用锚文本框后,准确率略有下降。YOLO 只预测了每幅图像中的 98 个方框,但使用锚方框后,我们的模型预测了一千多个方框。在不使用锚点框的情况下,我们的中间模型获得了 69.5 mAP,召回率为 81%。使用锚点框后,我们的模型获得了 69.2 mAP,召回率为 88%。尽管 mAP 有所下降,但召回率的提高意味着我们的模型还有更大的改进空间。
精读
YOLO vs Faster R-CNN
-
YOLO:在卷积特征提取器后接全连接层,直接预测边界框的坐标。
-
Faster R-CNN:不直接预测坐标,而是基于手工挑选的锚点框(先验框),通过卷积层预测锚点的偏移量和可信度,简化了学习难度。
YOLO的改进
-
去除全连接层,改为使用锚点框预测边界框。
-
去掉一个池化层,提升特征图的分辨率。
-
缩小输入尺寸:从 448×448 改为 416×416,使输出特征图是 13×13(奇数尺寸),方便中心位置预测大物体。
-
类别预测解耦:每个锚点框单独预测类别和对象性。
性能变化
-
引入锚点框后,准确率(mAP)略降(从69.5%降到69.2%)。
-
召回率提高(从81%提升到88%)。
-
预测的边界框数量由原来的98个增加到一千多个。
**precision:** 预测框中包含目标的比例。**recall:** 真正目标被检测出来的比例。简言之,recall表示得找全,precision表示得找准
Anchor Box (先验框)
先验框如上图,狗的图像的中心点是红点,那么红点所在的格子负责预测这个狗,根据红点作为中心点生成Anchor Box,如图(绿 橙 蓝)框,为什么先验框大小不同,物体形状不同,根据k-means算法计算得出先验框
为什么输入图像从 448×448 改为 416×416
448x448 输入,输出为14x14的tensor,物体往往在图像的中心点,刚好在网格线上,所以改为416x416后会使object落在网格中的概率变大,提高检测精度
YoloV2的Feature Map
在YOLOv2中,类别概率是属于box的,每个box对应一个类别概率,而不是由cell决定,因此这边每个box对应25个预测值。每个grid cell携带的是 25 × 5 =125个信息,25是 xywh+置信度+分类数,5就是5个Anchor。
2.4 Dimension Clusters—维度聚类(K-means聚类确定Anchor初始值)
翻译
在与 YOLO 一起使用锚点框时,我们会遇到两个问题。首先,锚点框的尺寸是人工挑选的。网络可以通过学习来适当调整方框,但如果我们一开始就为网络选择更好的先验值,就能让网络更容易学会预测良好的检测结果。我们不需要手工选择先验值,而是在训练集边界框上运行 k-means 聚类,自动找到好的先验值。如果我们使用标准的欧氏距离 k-means,较大的方框会比较小的方框产生更多的误差。然而,我们真正需要的是能带来良好 IOU 分数的先验值,这与方框的大小无关。因此,我们使用以下距离度量
d(box, centroid) = 1 − IOU(box, centroid)
我们在不同的 k 值下运行 k-means,并绘制出最接近中心点的平均 IOU,见图 2。我们选择 k = 5 作为模型复杂性和高召回率之间的良好权衡。聚类中心点与手工挑选的锚框有明显不同。短而宽的方框较少,高而细的方框较多。我们在表 1 中比较了我们的聚类策略和手工挑选的锚点的平均 IOU 与最接近先验的比较。在只有 5 个先验时,中心点的表现与 9 个锚点相似,平均 IOU 为 61.0,而 9 个锚点为 60.9。如果使用 9 个中心点,平均 IOU 则要高得多。这表明,使用 k-means 来生成边界框可以让模型有更好的表现,也更容易学习。
精读
yolov2 对Anchor Box的改进点
改进一:锚点框的尺寸由是人工挑选,改为在训练集边界框上运行 k-means 聚类,自动找到好的先验值
改进二:聚出来的中心偏向大框,小框的锚点选得不好,使用iou来衡量,距离度量为d=1−IOU
左图显示的是我们在选择不同 k 时得到的平均 IOU。我们发现,k = 5 在召回率与模型的复杂度之间取得了很好的平衡。右图显示了 VOC 和 COCO 的相对中心点。两组先验都偏向于更瘦更高的方框,而 COCO 的尺寸变化比 VOC 更大。
2.5 Direct location prediction—直接的位置预测
翻译
在使用锚箱和 YOLO 时,我们会遇到第二个问题:模型不稳定,尤其是在早期迭代时。大部分不稳定性来自于预测锚点盒的 (x, y) 位置。在区域建议网络中,网络预测值 tx 和 ty 以及 (x, y) 中心坐标的计算公式为
例如,tx = 1 的预测值将使方框向右移动锚点方框的宽度,而 tx = -1 的预测值将使方框向左移动相同的宽度。这种计算方法不受约束,因此任何锚点框都可以在图像中的任何位置出现,而与预测框的位置无关。在随机初始化的情况下,模型需要很长时间才能稳定到预测合理的偏移量。我们采用 YOLO 方法,预测相对于网格单元位置的位置坐标,而不是预测偏移量。我们使用逻辑激活来限制网络的预测值在此范围内。网络预测输出特征图中每个单元的 5 个边界框。网络会为每个边界框预测 5 个坐标:tx、ty、tw、th 和 to。如果单元格与图像左上角的偏移量为 (cx,cy),且边界框的宽度和高度为 pw,ph,则预测结果对应于:
由于我们对位置预测进行了限制,因此参数化更容易学习,从而使网络更加稳定。与使用锚点框的版本相比,使用维度集群和直接预测边界框中心位置可将 YOLO 提高近 5%。
精读
问题:在 YOLO 使用锚框时,模型在训练早期很不稳定,主要是因为预测的锚框 (x, y) 位置没有限制,随机初始化后,框可以飘到图像任何地方,导致收敛慢。
RPN的做法(Faster R-CNN里):
-
预测 tx,ty 偏移量。
-
tx=1 意味着向右移动一个锚框宽度,tx=−1向左移一个宽度。
-
这种方式不受位置限制,训练初期容易出问题。
YOLOv2的改进:
-
不预测偏移量,而是直接预测相对于网格单元的位置。
-
使用sigmoid激活函数,把 tx,ty 限制在 0~1之间。
-
最终位置 = (网格位置 (cx,cy)+ sigmoid(tx,ty)),这样预测点始终在当前网格附近,不会乱跑。
预测内容:每个单元格预测5个参数:tx,ty,tw,th,to(宽、高、位置、置信度)。
结果:
-
位置受限后,训练更稳定、收敛更快。
-
再加上前面说的k-means找好锚框,YOLO整体性能提升了接近5%的mAP。
图中蓝色的中心点只能在它所在的格子里面移动,那么对应的锚框也就只能小幅范围的移动
2.6 Fine-Grained Features—细粒度的特征
翻译
这种修改后的 YOLO 可在 13 × 13 的特征图上预测探测结果。虽然这对于大型物体来说已经足够,但在定位较小物体时,它可能会受益于更精细的特征。Faster R-CNN 和 SSD 都在网络中的不同特征图上运行其建议网络,以获得一系列分辨率。我们采用了一种不同的方法,即简单地添加一个直通层,将先前层中的特征以 26 × 26 的分辨率进行处理。直通层通过将相邻特征堆叠到不同通道而非空间位置,将高分辨率特征与低分辨率特征连接起来,类似于 ResNet 中的身份映射。这样,26 × 26 × 512 的特征图就变成了 13 × 13 × 2048 的特征图,可以与原始特征图连接起来。我们的检测器运行在这个扩展的特征图之上,因此可以访问细粒度特征。这样,性能略微提高了 1%。
精读
特征融合
为了提升小物体检测能力,YOLO没有像Faster R-CNN和SSD那样直接在不同尺度特征图上检测,而是采用了直通层(Passthrough layer)的方式:
-
将26×26分辨率的高层特征图中的相邻特征堆叠到通道维度上(而不是改变空间大小)。
-
这样,26×26×512特征图变成13×13×2048的特征图。
-
再与原来13×13的特征图合并,让检测器可以同时利用粗粒度和细粒度信息。
-
效果:模型性能提升了约1%。
简单说,就是通过直通层把细粒度特征带到了最终预测层,改善了小物体检测,同时结构也很简洁。
直通层(passthrough layer)
在 YOLOv2 中,网络会从 Darknet-19 中提取最后一个最大池化层之前的特征图,此时的尺寸是 26×26×512。通过改变tensor的形状为13x13x2048的尺寸后与主干网络输出的 13×13×1024 特征图进行通道方向上的拼接,形成最终的 13×13×3072 特征图,之后基于这些融合的特征进行目标检测预测。
在第一步中是如何进行变换呢? 如下图所示进行变换 (26x26x512---->13x13x2048)
2.7 Multi-Scale Training—多尺度的训练
翻译
最初的 YOLO 使用 448 × 448 的输入分辨率。增加锚点框后,我们将分辨率改为 416×416。不过,由于我们的模型只使用卷积层和池化层,因此可以即时调整大小。我们希望 YOLOv2 能够在不同尺寸的图像上稳健运行,因此我们在模型中训练了这一点。我们没有固定输入图像的大小,而是每迭代几次就改变网络一次。每 10 次迭代,我们的网络会随机选择一个新的图像尺寸。由于我们的模型以 32 的系数进行降采样,因此我们从以下 32 的倍数中选择:{320, 352, ..., 608}。因此,最小的选项是 320 × 320,最大的是 608 × 608。我们将网络的大小调整到这个维度,然后继续训练。这种机制迫使网络学会在各种输入维度上进行良好的预测。这意味着同一个网络可以预测不同分辨率下的检测结果。网络在较小的尺寸下运行速度更快,因此 YOLOv2 可以在速度和准确性之间轻松做出权衡。在低分辨率下,YOLOv2 是一种廉价、相当精确的检测器。在 288 × 288 分辨率下,它的运行速度超过 90 FPS,mAP 几乎与快速 R-CNN 不相上下。这使它成为较小 GPU、高帧率视频或多视频流的理想选择。在高分辨率下,YOLOv2 是最先进的检测器,在 VOC 2007 上的 mAP 为 78.6,同时运行速度仍高于实时速度。有关 YOLOv2 与 VOC 2007 上其他框架的比较,请参见表 3。图 4
精读
YOLO 最初输入分辨率为 448×448,YOLOv2 改为 416×416,以适应锚框机制。
网络仅使用卷积层和池化层,因此输入图像尺寸可以灵活调整,无需修改结构。
YOLOv2 引入多尺度训练:不是固定图像尺寸,而是每 10 次迭代随机更换一次输入大小。
输入尺寸从 {320, 352, ..., 608} 中随机选取,这些尺寸都是 32 的倍数,满足网络下采样结构。
模型在训练时被强制适应多种尺寸,以增强在不同图像大小下的预测稳定性和鲁棒性。
同一个 YOLOv2 模型可以用于不同分辨率的图像检测任务。
分辨率越低,模型运行速度越快,可用于高帧率视频、小 GPU 或多视频流等资源受限场景。
在 288×288 分辨率下,YOLOv2 可达 90 FPS,mAP 接近 Fast R-CNN。
在高分辨率(如 608×608)下,YOLOv2 在 VOC2007 上达到 78.6 mAP,且仍保持实时性能。
2.8 Further Experiments—进一步的实验
翻译
我们训练 YOLOv2 对 2012 年 VOC 进行检测。表 4 显示了 YOLOv2 与其他最先进检测系统的性能对比。YOLOv2 实现了 73.4 mAP,运行速度远远超过其他竞争方法。我们还在 COCO 上进行了训练,并在表 5 中与其他方法进行了比较。在 VOC 指标(IOU = .5)上,YOLOv2 获得了 44.0 mAP,与 SSD 和 Faster R-CNN 不相上下。
精读
表 4 显示了 YOLOv2 与其他最先进检测系统的性能对比。YOLOv2 实现了 73.4 mAP,运行速度远远超过其他竞争方法
在 VOC 指标(IOU = .5)上,YOLOv2 获得了 44.0 mAP,与 SSD 和 Faster R-CNN 不相上下
三、Faster—更快
翻译
我们希望检测准确,但也希望检测快速。大多数检测应用,如机器人或自动驾驶汽车,都依赖于低延迟预测。为了最大限度地提高性能,我们设计的 YOLOv2 从一开始就非常快。大多数检测框架都依赖 VGG-16 作为基础特征提取器[17]。VGG-16 是一个功能强大、准确的分类网络,但它的复杂性却毋庸置疑。VGG-16 的卷积层需要 306.9 亿次浮点运算,才能在 224 × 224 分辨率下对单幅图像进行一次处理。YOLO 框架使用的是基于 Googlenet 架构的定制网络[19]。该网络的速度比 VGG-16 更快,一次前向扫描仅需 85.2 亿次运算。不过,它的准确度略逊于 VGG16。在 224 × 224 的单作物、前五名准确率中,YOLO 的自定义模型在 ImageNet 中的准确率为 88.0%,而 VGG-16 的准确率为 90.0%。
darknet-19。我们提出了一个新的分类模型,作为 YOLOv2 的基础。我们的模型借鉴了先前的网络设计工作以及该领域的常识。与 VGG 模型类似,我们主要使用 3 × 3 过滤器,并在每个池化步骤后将通道数量增加一倍[17]。根据网络中的网络(NIN)的研究成果,我们使用全局平均池进行预测,并使用 1 × 1 过滤器来压缩 3 × 3 卷积之间的特征表示[9]。我们使用批量归一化来稳定训练,加快收敛速度,并对模型进行正则化[7]。我们的最终模型名为 Darknet-19,有 19 个卷积层和 5 个 maxpooling 层。完整描述见表 6。Darknet-19 处理一幅图像只需要 55.8 亿次运算,但在 ImageNet 上却达到了 72.9% 的前 1 级准确率和 91.2% 的前 5 级准确率。
精读
速度与准确性的权衡
-
YOLOv2 设计强调实时性,目标是在保持准确率的前提下提升检测速度。
-
适用于低延迟场景,如自动驾驶和机器人系统。
特征提取网络的选择与优化
-
VGG-16:传统检测网络常用的特征提取器,精度高(ImageNet Top-5 准确率 90.0%),但计算量大(306.9 亿次运算)。
-
YOLO自定义网络(基于GoogLeNet):较快(85.2 亿次运算),但精度略低(88.0% Top-5)。
Darknet-19:YOLOv2的基础网络
-
结构简洁高效,共 19个卷积层 + 5个 maxpooling 层。
-
每次池化后通道数翻倍,保持语义丰富性。
-
主要使用 3×3 卷积核,结合 1×1 卷积 实现特征压缩。
-
借鉴 NIN(Network in Network),使用 全局平均池化 进行分类预测。
-
使用 Batch Normalization 加速收敛、提高稳定性和正则化效果。
性能指标
-
计算量:Darknet-19 每张图像仅需 55.8 亿次运算,低于之前的模型。
-
准确率:ImageNet Top-1 为 72.9%,Top-5 为 91.2%,在速度和精度之间取得良好平衡。
3.2 Training for classification—分类的训练
翻译
我们使用 Darknet 神经网络框架[13],以 0.1 的起始学习率、4 次幂的多项式速率衰减、0.0005 的权重衰减和 0.9 的动量,在标准 ImageNet 1000 类分类数据集上对网络进行了 160 个历元的训练。在训练过程中,我们使用了标准的数据增强技巧,包括随机裁剪、旋转以及色调、饱和度和曝光度的变化。如上所述,在 224 × 224 尺寸的图像上进行初始训练后,我们将在 448 尺寸的图像上对网络进行微调。在微调时,我们使用上述参数进行训练,但只训练 10 次,学习率为 10-3。在这一更高分辨率下,我们的网络达到了 76.5% 的前 1 级准确率和 93.3% 的前 5 级准确率。
精读
训练框架与数据集
-
使用 Darknet 框架。
-
在 ImageNet 1000类分类数据集上进行训练。
训练参数(初始阶段,224×224 分辨率)
-
学习率:初始为 0.1,使用 4次幂的多项式衰减策略。
-
动量:0.9
-
权重衰减:0.0005
-
训练周期:160 个 epoch
-
数据增强:随机裁剪、旋转、色调/饱和度/曝光度调整。
高分辨率微调(448×448)
-
在初始训练后,切换到 448×448 图像分辨率进行微调。
-
微调训练 10 个 epoch,学习率为 1e-3,保持其它参数不变。
性能表现
-
高分辨率训练后,网络在 ImageNet 上达成:
-
Top-1 准确率:76.5%
-
Top-5 准确率:93.3%
-
3.3 Training for detection—检测的训练
翻译
我们对该网络进行了修改,去掉了最后一个卷积层,取而代之的是增加了三个 3 × 3 卷积层,每个卷积层有 1024 个滤波器,最后一个卷积层为 1 × 1,其输出为检测所需的数量。对于 VOC,我们预测 5 个方框,每个方框有 5 个坐标,每个方框有 20 个类别,因此有 125 个滤波器。我们还从最后的 3 × 3 × 512 层添加了一个直通层到倒数第二个卷积层,这样我们的模型就可以使用细粒度特征。我们使用 0.0005 的权重衰减和 0.9 的动量对网络进行 160 个历时的训练,起始学习率为 10-3,在 60 和 90 个历时时将学习率除以 10。我们使用了与 YOLO 和 SSD 类似的数据增强方法,包括随机裁剪、颜色偏移等。我们对 COCO 和 VOC 采用相同的训练策略。
精读
网络结构修改
-
去除原始模型最后一个卷积层。
-
增加三个 3×3 卷积层(每层1024个通道) 和一个 1×1 卷积层,用于输出检测结果。
-
对于 VOC 任务:预测 5个边界框 ×(5个坐标 + 20个类别)= 125 个输出通道。
使用直通层(Passthrough Layer)
-
将最后的 3×3×512 卷积层 的输出连接(concat)到倒数第二个卷积层,引入细粒度特征,提升小目标检测能力。
训练设置
-
训练轮数:共训练 160 个 epoch。
-
动量:0.9
-
权重衰减:0.0005
-
学习率策略:初始学习率为 1e-3,分别在第 60 和 90 个 epoch 时除以 10。
数据增强策略
-
借鉴 YOLO 和 SSD,使用 随机裁剪、颜色扰动等方式增强训练数据。
训练数据
-
COCO 和 VOC 使用 相同的训练策略。
四、Stronger—更强(YOLO9000部分)
翻译
我们提出了一种对分类和检测数据进行联合训练的机制。我们的方法使用带有检测标签的图像来学习特定的检测信息,如边界框坐标预测和对象性,以及如何对常见对象进行分类。我们的方法只使用带有类别标签的图像来扩大检测类别的数量。在训练过程中,我们会混合使用检测和分类数据集中的图像。当我们的网络看到一张贴有检测标签的图像时,我们可以根据完整的 YOLOv2 损失函数进行反向传播。当看到分类图像时,我们只反向传播架构中分类特定部分的损失。这种方法面临一些挑战。检测数据集只有常见对象和一般标签,如 “狗 ”或 “船”。而分类数据集的标签范围更广、更深。ImageNet 有一百多个狗的品种,包括 “诺福克梗”、“约克郡梗 ”和 “贝灵顿梗”。如果我们想在这两个数据集上进行训练,就需要一种连贯的方法来合并这些标签。大多数分类方法都会在所有可能的类别中使用软最大层来计算最终的概率分布。使用软最大值会假定类别是相互排斥的。这就给合并数据集带来了问题,例如,您不会希望使用这种模型合并 ImageNet 和 COCO,因为 “诺福克梗 ”和 “狗 ”这两个类别并不互斥。相反,我们可以使用一个多标签模型来组合数据集,它不假定相互排斥。这种方法忽略了我们已知的所有数据结构,例如 COCO 的所有类别都是互斥的。
精读
提出联合训练机制 同时使用分类数据和检测数据来训练一个检测模型,从而提升检测类别的广度与识别能力。
训练方式
-
检测图像:使用完整的 YOLOv2 损失函数(包含边界框、目标性、分类等)进行训练。
-
分类图像:只反向传播分类部分的损失,不涉及边框预测等。
数据集标签差异带来的挑战
-
检测数据集(如 COCO):标签较为粗略,如“狗”、“船”。
-
分类数据集(如 ImageNet):标签更细,如各种狗的品种(“诺福克梗”、“贝灵顿梗”等)。
传统 softmax 层的局限
-
假设所有类别是互斥的,不适合合并细粒度(ImageNet)和粗粒度(COCO)类别。
解决方法:多标签模型
-
采用多标签分类机制代替 softmax,不假设类别互斥,更适合合并多层级标签的不同数据集。
问题遗留
-
多标签模型虽然解决了类别冲突,但忽略了互斥信息(例如 COCO 类别间是互斥的),这也是一个局限。
4.1 Hierarchical classification—分层分类
翻译
ImageNet 的标签来源于 WordNet,这是一个构造概念及其关系的语言数据库[12]。在 WordNet 中,“诺福克梗”和“约克郡梗”都是“梗”的下位词,而“梗”是“猎犬”的一种,“猎犬”又是“狗”的一种,“狗”是“犬科动物”等等。大多数分类方法都假设标签是平的结构,但对于合并数据集而言,我们恰恰需要结构。WordNet 是一个有向图而不是树状结构,因为语言是复杂的。例如,“狗”既是“犬科动物”的一种,也是“家养动物”的一种,而这两者在 WordNet 中都是同义词集(synsets)。我们没有使用完整的图结构,而是通过 ImageNet 中的概念构建了一棵层级树来简化问题。为了构建这棵树,我们检查了 ImageNet 中的视觉名词,并查看它们通向根节点“physical object”的路径。许多同义词集只有一条路径通向根节点,所以我们首先将这些路径加入树中。然后我们迭代地检查剩下的概念,并添加使树增长最少的路径。例如,如果某个概念有两条路径通向根节点,其中一条路径会使树增加三条边,另一条只增加一条边,我们选择较短的路径。
最终的结果是 WordTree,一个视觉概念的层级模型。为了使用 WordTree 进行分类,我们在每个节点上预测条件概率,即该同义词集的每个下位词在该同义词集出现的条件下的概率。例如,在“terrier”节点上,我们预测:
Pr(Norfolk terrier|terrier) Pr(Yorkshire terrier|terrier) Pr(Bedlington terrier|terrier) ...
如果我们想计算某个节点的绝对概率,我们只需沿着树的路径回溯到根节点,并将条件概率相乘。例如,若我们想知道一张图片是否是“诺福克梗”,我们计算:
Pr(Norfolk terrier) = Pr(Norfolk terrier|terrier) ∗ Pr(terrier|hunting dog) ∗ ... ∗ Pr(mammal|animal) ∗ Pr(animal|physical object)
在分类任务中我们假设图像中包含某个物体:Pr(physical object) = 1。为了验证这一方法,我们在使用 1000 类 ImageNet 构建的 WordTree 上训练了 Darknet-19 模型。为了构建 WordTree1k,我们加入了所有中间节点,将标签空间从 1000 扩展到 1369。在训练过程中,我们将真实标签沿树上传播,所以如果一张图像被标记为“诺福克梗”,它也会被标记为“狗”、“哺乳动物”等。为了计算条件概率,我们的模型预测一个长度为 1369 的向量,并对属于同一概念的所有下位词集计算 softmax,如图 5 所示。使用之前相同的训练参数,我们的层级 Darknet-19 实现了 71.9% 的 top-1 准确率和 90.4% 的 top-5 准确率。尽管增加了 369 个额外概念,并要求网络预测树状结构,其准确率仅略微下降。
以这种方式进行分类还有一些好处。当遇到新的或未知的对象类别时,性能会优雅地退化。例如,如果网络看到一张狗的图片但不确定是哪种狗,它仍会以较高置信度预测“狗”,但在下位词之间的置信度会较低。这种结构同样适用于检测任务。此时,我们不再假设每张图片中都包含物体,而是使用 YOLOv2 的目标性预测器来给出 Pr(physical object) 的值。检测器预测边界框和概率树。我们沿树向下遍历,在每个分支处选择置信度最高的路径,直到达到某个阈值,然后预测该对象类别。
精读
构建 WordTree:将 ImageNet 标签按 WordNet 的层级结构构造成树状模型。
多级分类:每个节点预测其子类的条件概率,最终类别概率为路径上概率的乘积。
训练方法:标签向上传播,模型输出 1369 类,局部 softmax 实现多标签预测。
准确率表现:新增概念后准确率仅小幅下降(top-1: 71.9%,top-5: 90.4%)。
优势:对未知类别表现鲁棒,能预测到较高层次类别。
检测应用:结合 YOLOv2,可输出物体框并沿树结构确定类别。
4.2 Dataset combination with WordTree—用WordTree组合数据集
翻译 用WordTree组合数据集。我们可以使用WordTree以合理的方式将多个数据集组合在一起。我们只需将数据集中的类别映射到树上的同位素。图6显示了一个使用WordTree来结合ImageNet和COCO的标签的例子。WordNet是非常多样化的,所以我们可以将这种技术用于大多数数据集。 精读
使用 WordTree 可以将多个数据集(如 ImageNet 和 COCO)在语义上合理地结合,通过将不同数据集中的类别映射到 WordTree 上的同义词节点,从而实现统一的标签结构。
4.3 Joint classification and detection—联合分类和检测
翻译
现在我们可以使用 WordTree 组合数据集,因此我们可以在分类和检测上训练联合模型。我们希望训练一个超大规模的检测器,因此我们使用 COCO 检测数据集和完整 ImageNet 发布版中的前 9000 个类别来创建我们的组合数据集。我们还需要评估我们的方法,因此我们添加了 ImageNet 检测挑战中尚未包含的所有类别。该数据集对应的 WordTree 共有 9418 个类别。ImageNet 是一个更大的数据集,因此我们通过对 COCO 进行过采样来平衡数据集,使得 ImageNet 的规模仅比 COCO 大 4 倍。
使用这个数据集我们训练 YOLO9000。我们使用基础的 YOLOv2 架构,但将先验框数量从 5 个减少为 3 个,以限制输出大小。当我们的网络看到检测图像时,我们按常规进行损失的反向传播。对于分类损失,我们只在标签对应的级别及以上反向传播损失。例如,如果标签是 “dog”,我们不会将误差分配给树中更深层的预测,如 “German Shepherd” 或 “Golden Retriever”,因为我们没有这些信息。当它看到分类图像时,我们只反向传播分类损失。为此,我们只需找到对该类别预测概率最高的边界框,然后仅在该边界框的预测树上计算损失。我们还假设该预测框与真实标签的 IOU 至少为 0.3,并基于此假设反向传播 objectness 损失。
通过这种联合训练,YOLO9000 学会了使用 COCO 中的检测数据来定位图像中的对象,并使用 ImageNet 数据对各种对象进行分类。我们在 ImageNet 检测任务上评估 YOLO9000。ImageNet 的检测任务与 COCO 共享 44 个对象类别,这意味着 YOLO9000 对大多数测试图像只见过分类数据而没有见过检测数据。YOLO9000 总体上获得了 19.7 的 mAP,对于它从未见过标注检测数据的 156 个不重叠对象类别,其 mAP 为 16.0。这个 mAP 高于 DPM 所达到的结果,但 YOLO9000 是在不同的数据集上进行训练的,仅使用了部分监督。它还能够同时以实时方式检测其他 9000 个对象类别。
当我们分析 YOLO9000 在 ImageNet 上的性能时,我们发现它能很好地学习新的动物种类,但在学习服装和设备类别时表现较差。新的动物更容易学习是因为 objectness 预测能很好地从 COCO 中的动物泛化。然而,COCO 中没有任何类型服装的边界框标注,只有人的标注,因此 YOLO9000 难以建模像 “sunglasses” 或 “swimming trunks” 这样的类别。
精读
YOLO9000的联合训练方式: YOLO9000基于YOLOv2的结构进行构建,将原先的5个Anchor Box数量缩减为3个。每个Anchor Box需要输出4个边界框参数(x, y, w, h)、1个置信度分数,以及针对9418个类别的分类概率,总共是9423个值。由于每个网格预测3个Anchor Box,因此每个网格输出的总维度为3×9423=28269。在训练阶段,若输入图像来自检测数据集(如COCO),则采用完整的YOLOv2损失函数进行训练;而当输入图像来自纯分类数据集(如ImageNet)时,仅计算分类相关的损失来更新模型参数。
YOLO9000的预测方式: YOLO9000依托WordTree这种层级结构来进行分类推理。在该结构中,所有子节点属于同一上位类别,因此每一组子节点会分别进行一次softmax操作,从而获得局部条件概率。若要得到某一具体类别的最终预测概率,则需从根节点出发,沿着该类别路径依次相乘路径上的条件概率。最终,YOLO9000会同时输出边界框、置信度以及在树结构上的类别预测概率,模型会顺着置信度最大的路径向下遍历,直到置信度低于某个阈值,所到达的节点即为预测出的目标类别。
五、Conclusion—结论
翻译
我们提出了 YOLOv2 和 YOLO9000 这两个实时检测系统。YOLOv2 是当前最先进的检测系统,在多个检测数据集上都比其他系统更快。同时,它可以在多种图像尺寸下运行,以在速度和精度之间提供平滑的权衡。YOLO9000 是一个能够检测9000多类物体的实时框架,通过联合优化检测和分类任务来实现。我们使用 WordTree 来结合来自不同来源的数据,并使用联合优化技术在 ImageNet 和 COCO 上同时进行训练。YOLO9000 在缩小检测和分类任务之间的数据集规模差距方面迈出了坚实的一步。
我们的方法中有许多技术在目标检测以外的领域也具有广泛的适用性。我们对 ImageNet 的 WordTree 表示提供了一个更丰富、更详细的图像分类输出空间。基于层次分类的数据集整合方法在分类和分割任务中都可能具有应用价值。像多尺度训练这样的训练技术也可能对各种视觉任务带来帮助。
在未来的工作中,我们希望使用类似的技术来实现弱监督的图像分割。同时,我们计划通过更强大的匹配策略,在训练过程中为分类数据分配弱标签,从而提升检测效果。计算机视觉领域拥有大量的标注数据,我们将继续探索如何整合不同来源和结构的数据,以构建更强大的视觉模型。
精读
YOLOv2 是一个先进的实时目标检测系统,在多个数据集上表现出色,速度快、可在不同图像尺寸下运行,实现速度与精度的平衡。
YOLO9000 能在实时条件下检测超过9000种物体类别,采用联合训练方式同时优化分类与检测任务。
使用 WordTree 将来自 COCO 和 ImageNet 的数据进行整合,使得模型能同时学习分类信息和检测信息。
YOLO9000 有助于 弥合检测与分类之间的数据集规模差距,提升模型的泛化能力。
提出的技术(如 WordTree 表示、多尺度训练) 具有较强的通用性,可扩展到分类、分割等其他视觉任务。
未来计划包括:
-
应用类似技术实现 弱监督图像分割;
-
采用更强的标签匹配策略 提升检测效果;
-
持续探索 多数据源融合建模 的方法。