YOLO9000: Better, Faster, Stronger
Joseph Redmon, Ali Farhadi
CVPR, 2017
论文获取地址
YOLOv2 与 YOLO9000 的算法内核相同,区别在于它们的训练方式不同。YOLOv2 使用 COCO 数据集训练,训练后的模型可以识别 80 个类别;而 YOLO9000 使用 COCO+ImageNet 数据集联合训练,训练后的模型可以识别 9000 个类别。论文中展示了 YOLO9000 的检测效果图,可以看到图片中的人被分为了 leader、American、skin-diver、athlete。
YOLOv2 的论文标题就是更好,更快,更强。在 YOLOv1 发表之后,计算机视觉领域出现了很多 trick,例如批归一化、多尺度训练等。v2 也尝试借鉴了 R-CNN 体系中的 anchor box,所有的改进提升,下面逐一介绍。
Batch Normalization(批归一化):
在检测系列的网络结构中,BN 逐渐变成了标配。在 YOLOv2 的每个卷积层中加入了 BN 之后,mAP 提升了 2 个点,并且去除了 Dropout。
High Resolution Classifier(分类网络高分辨率预训练):
在 YOLOv1 中,网络的 backbone 部分会在 ImageNet 数据集上进行预训练,训练时输入图像的分辨率为 224*224。在 v2 中,将分类网络在输入图片分辨率为 448*448 的 ImageNet 数据集上训练 10 个 epoch,再使用检测数据集(如COCO)进行微调。高分辨率预训练使 mAP 提高了大约 4%。
Convolutional with Anchor Boxes(Anchor Box 替换全连接层):
YOLOv1 中提到,每个格点预测两个矩形框,在计算 loss 时只让与 ground truth 最接近的框产生 loss 值,而另一个框不做修正。这样规定之后,作者发现两个框在物体的大小、长宽比、类别上逐渐有了分工。在 v2 中,神经网络不对预测框宽高的绝对值进行预测,而是预测与 Anchor 框的偏差(offset),每个格点指定 n 个 Anchor 框。在训练时,最接近 ground truth 的框产生 loss,其余框不产生 loss。在引入 Anchor Box 操作后,mAP 由 69.5 下降至 69.2。原因在于每个格点预测的物体变多之后,召回率大幅上升,准确率有所下降,总体 mAP 略有下降。
v2 中移除了 v1 最后的两个全连接层,全连接层计算量大、耗时久。文中没有详细描述全连接层的替换方案,这里笔者猜测是利用 1*1 的卷积层代替(仅是猜测),具体的网络结构原文中没有提及,官方代码也被 YOLOv3 替代了。v2 主要是各种 trick 引入后的效果验证,建议不必纠结于 v2 的网络结构。
Dimension Clusters(Anchor Box 的宽高由聚类产生):
这里算是作者的一个创新点。Faster R-CNN 中的 9 个 Anchor Box 的宽高都是事先设定好的,一共设定三种尺寸的矩形框,每种尺寸有三种宽高比(1:1,2:1,1:2)。而在 v2 中,Anchor Box 的宽高不通过人工设定,而是将训练数据集中的矩形框全部拿出来,用 k-means 聚类得到先验框的宽和高。例如使用 5 个Anchor Box,那么 k-means 聚类的类别中心个数就设置成 5。加入了聚类操作,并引入 Anchor Box 之后,mAP 有所提升。
Direct location prediction(绝对位置预测):
YOLO 中的位置预测方法很清晰,就是相对于左上角的格点坐标预测偏移量。这里 Direct 的具体含义,应该是和其他算法框架对比后得到的。比如其他流行的位置预测公式如下(原文中是减号,应该是加号,无伤大雅):
x = ( t x ∗ w a ) + x a y = ( t y ∗ h a ) + y a x = (t_x * w_a) + x_a\ \ \ \ \ \ \ \ \ \ y = (t_y * h_a) + y_a x=(tx∗wa)+xa y=(ty∗ha)+ya
神经网络预测 t x , t y t_x,\ t_y tx, ty,而 t x , t y t_x,\ t_y tx, ty 需要与先验框的宽高相乘才能得到相较于 x a , y a x_a,\ y_a xa, ya 的位置偏移值。在 v2 中,位置预测公式如下:
b x = σ ( t x ) + c x b y = σ ( t y ) + c y b_x = \sigma (t_x) + c_x\ \ \ \ \ \ \ \ \ \ b_y = \sigma (t_y) + c_y bx=σ(tx)+cx by=σ(ty)+cy b w = p w e t w b h = p h e t h b_w = p_we^{t_w}\ \ \ \ \ \ \ \ \ \ b_h = p_he^{t_h} bw=pwetw bh=pheth
YOLO 的天然优势就是格点的坐标可以作为参照点,此时 t x , t y t_x,\ t_y tx, ty 通过一个激活函数直接产生偏移位置数值,与矩形框的宽高独立开,变得更加直接。
Fine-Grained Features(细粒度特征):
当 26*26 的特征图经过卷积、池化变为 13*13 的特征图后,作者认为损失了很多的细粒度特征,导致对小尺寸物体的识别效果不佳,所以在此处加入了 passthrough 层。
如上图所示,passthrough 层就是将 26*26*1 的特征图变成 13*13*4 的特征图,在这一操作中不损失细粒度特征。有人说 passthrough 层分成四份的具体细节,并不是用两刀将其切成四块,而是在每个 2*2 的小区域上都选择左上角块。其实这里怎么切都一样,在之后 1*1 的卷积层中,不过是加法交换律的操作。
Multi-Scale Training(多尺度训练):
很关键的一点是 YOLOv2 中只有卷积层与池化层,所以对于网络的输入大小并没有限制,整个网络的下采样倍数为 32,只要输入的特征图尺寸为 32 的倍数即可,如果网络中有全连接层,就不是这样了,因此 YOLOv2 可以使用不同尺寸的输入图片进行训练。
作者使用的训练方法是在每 10 个 batch 之后,就将图片 resize 成 {320, 352, …, 608} 中的一种。不同的输入会造成产生的格点数不同,比如输入图片的尺寸为 320*320,那么输出格点为 10*10,如果每个格点的先验框个数设置为 5,那么总共输出 500 个预测结果;如果输入图片大小为 608*608,那么输出格点就为 19*19,共 1805 个预测结果。
在引入了多尺度训练方法后,迫使卷积核学习不同尺寸的特征,当输入设置为 544*544 甚至更大时,YOLOv2 的 mAP 就已经超过了其他的物体检测算法。
Darknet-19:
v2 中作者提出了新的分类网络架构——Darknet-19,该架构的网络参数相较于 VGG-16 更少,在 ImageNet 上仍然可以达到 top-1: 72.9% 以及 top-5: 91.2% 的精度。
YOLOv2 的精度与性能:
各种 trick 的添加效果如下,除了 Anchor Boxes,其他 trick 都带来了一定的增益。
YOLOv2 与其他算法的对比如下:
Joint classification and detection:
如果说整个 YOLOv2 的 Better 部分都没有什么大的创新点,那么这里的分类与检测联合训练,就是 YOLOv2 的一大亮点,因为这一个技巧,YOLOv2 才成为了 YOLO9000。
如之前所说,物体分类是对整张图片打标签,比如这张图片中含有人,那么这张图片的标签就是人;另一张图片中的物体为狗,则图片标签就是狗。而物体检测不仅对物体的类别进行预测,同时需要框出物体在图片中的位置。ImageNet 是物体分类中最著名的数据集,物体类别有上万个;而物体检测的数据集,例如 COCO,只有 80 个类别,因为物体检测、分割的打标签成本比物体分类的打标签成本要高很多。所以在这里,作者提出了分类、检测训练集联合训练的方案。
联合训练方法的思路简单清晰,YOLOv2 中物体的矩形框生成不依赖于物体类别预测,二者独立同时进行。当输入的是检测数据集时,标注信息包含物体的类别和位置,那么对整个 loss 函数进行计算,进行反向传播;当输入图片只包含分类信息时,loss 函数只计算分类部分,其余部分 loss 为零。当然,一般的训练策略是,先在检测数据集上训练一定的 epoch,待预测框的 loss 基本稳定后,再联合分类数据集与检测数据集进行交替训练,同时为了分类与检测数据量的平衡,作者对 COCO 数据集进行了上采样,使得 COCO 数据总数与 ImageNet 大致相同。
联合分类与检测数据集,不同于将网络的 backbone 在 ImageNet 上进行预训练,预训练只能提高卷积核的鲁棒性,而分类与检测数据集联合训练可以扩充识别物体的种类。例如,在检测物体数据集中有类别人,当网络有了一定的找出人的位置的能力后,可以通过分类数据集添加细分类别:男人、女人、小孩、成人、运动员等。这里会遇到一个问题,类别之间并不一定是互斥关系,可能是包含(如人与男人)、相交(如运动员与男人)等关系,那么在网络中,该怎么对类别进行预测和训练呢?
Dataset combination with WordTree:
在文中,作者使用 WordTree 解决了 ImageNet 与 COCO 之间的类别问题。
用树结构来表示物体之间的从属关系非常合适。第一个大类为物体,物体之下有动物、人工制品、自然物体等,动物中又有更具体的分类。在类别中,不对所有的类别进行 softmax 操作,而是对同一层级的类别进行 softmax。
如图中所示,对同一颜色的位置进行 softmax 操作,使得同一颜色中只有一个类别预测分值最大。在预测时,从树的根节点开始向下检索,每次选取预测分值最高的子节点,直到所有选择的节点预测分值连乘后小于某一阈值时停止。在训练时,如果标签为人,那么只对人这个节点以及其所有的父节点进行 loss 计算,而其子节点如男人、女人、小孩等,不进行 loss 计算。
最后的结果是,YOLOv2 可以识别超过 9000 个物体,作者美其名曰 YOLO9000。当然原文中也提到,只有当父节点在检测集中出现过,子节点的预测才会有效。如果子节点是裤子、T恤、裙子等,而父节点衣服在检测集中没有出现过,那么整条预测类别支路就几乎都是检测失效的状态。
YOLOv2 将同期业界的很多深度学习技巧结合进来,将 YOLO 的性能与精度又提升了一个层次。YOLO9000 的物体检测分类技巧可以很好的被运用到工程中,并不需要对所有的物体都进行费时费力的检测标注,而是同时利用分类标签与检测标签达到同样的效果,从而减轻了标注成本与时间。