Yolov2:这么好的 anchor 我也要~

YOLO9000: Better, Faster, Stronger Joseph 2016

Abstract

  • 首先,肯定是从准确率和速度两方面优化上一版的 Yolo,使用全新的方法或者借鉴其他前人的工作。
  • 得到的 Yolov2 得益于新的训练方式和多尺度训练,能够接收不同 size 的输入,且能够在速度和准确率之间无缝权衡
  • 最后,提出了联合训练分类和检测数据的方法,就是用这种方法,训练的 Yolo9000,能够检测到 9000 个类别。。

Introduction

作者其实还在上一版 Yolo 基础上继续发力。第一版 Yolo 解决了 One-stage 和速度的问题,这一版为了通用目的更是挑战检测范围广泛的类别(达 9000)。检测数据集有几千到几十万图片,带有几十到几百个标签;而分类数据集有数以百万计的图片,带有数万或几十万个标签。

作者很期待检测数据集数量能够与分类数据集比拼,但是标注检测数据的成本实在过高,所以无法短时间内实现。因此,提出了一种层级概念的方法来利用现有的分类数据集来扩充检测数据集,因为有层级概念,所以能够将不同的数据集集合在一起。

为了使用上面扩充后的检测数据集,要对应使用新的联合训练方法,使得能够在分类和检测数据集上一起联合训练。通过这个方法,可以使用标注过的检测数据集 COCO 来训练精确地 BoundingBox,使用分类数据集 ImageNet 扩充词汇表和鲁棒性。

Better 准确率

这部分主要将从 Yolov1 到 Yolov2 的准确度方面的优化,加了很多小的方法,并且列了个表来对比性能的提升。先整体看一下,后面会再逐一地说一下每个小改进的细节。整体来看,大部分的方法都可以带来性能的提升,除了直接使用全卷积网络 + anchor 那里。

想了想还是再回顾一下 Yolov1 的一些不足吧,这样看这部分会更有针对性。从结果上来看,Yolov1 对于物体位置信息给的不够准确,还有就是小物体检测得很费劲;从原因上来看,loss 有比较大的问题,还有就是 S × S 这个对 BoundingBox 的空间约束

所以,接下来看下面这些方法的时候,可以对照一下是在重点解决 Yolov1 的哪些问题。

在这里插入图片描述

Batch Normalization / 通用 / + 2%

BN 原本的初心是加速训练,也就是放宽对初始值的限制,尽快让训练过程收敛,当然同时也有正则化的作用,减少过拟合,有了 BN 可以去掉 dropout。这里对所有的卷积层都加了 BN mAP 提高了 2%。

High Resolution Classifier / 通用 / + 4%

提高输入数据的分辨率,对提高 mAP 有效果,毕竟网络中间有很多降采样,初始输入越小,误差越大。最早 AlexNet 开始用的是 224 × 224,;Yolo 第一版也是先训的 224 × 224 然后升到 448 × 448。对于这里的优化,先是在 448 × 448 尺度上微调了 10 个 epoch 分类网络,然后再在检测任务上微调了网络。这里的优化,提升了 4% 的 mAP。

Convolutional with Anchor Boxes / anchor 拿来 - 0.3%

这里就比较逗了,作者把 Faster R-CNN 的 anchor 拿来了,但是好像直接“拿来主义”没有那么那么好用,直接拿来用有点水土不服。(后面部分有优化和调整)

作者认为 anchor 算是 hand-picked priors(“瞎弄的”23333)。Faster R-CNN 预测位置是用的 offset,作者觉得这样比较简单,更方便网络学习。然后把自己的 Yolo 改了一下来适应 anchor 的机制,去了一个 pooling 层,改了输入尺寸变成 416 × 416,然后总 stride 是 32,最后得到 13 × 13 的 feature map(这里还精心计算的要奇数的特征图)。为了 anchor S × S 的划分也不要了,所以也没有空间独立约束了(只是原本的空间约束哦,Yolo 作者在这里偶尔还叫特征图 13 × 13 的每个点叫 grid cell)。原本 Yolov1 预测 98 个框(S × S × B = 7 × 7 × 2)现在都超过一千个(S × S × 9 = 13 × 13 × 9 = 1521)了。

但是结果并没有特别特别惊艳,有舍有得吧。操作前 mAP 69.5%,recall 是 81%;操作后 mAP 69.2%(还降低了),recall 是 88%。虽然 mAP 降低了,但其实也没低多少;同时 recall 变高了挺多完全是好事儿,说明 Yolo 最初的大思路可以有进步空间,还没有到瓶颈。

然后接下来两个 trick 就是针对 Yolo 用 anchor 效果不好的问题:
(1)anchor 不好,是手选的,改成 k-means 根据数据集算;
(2)关于 Faster R-CNN 中预测 x 和 y 的问题,也进行了修改。

Dimension Clusters / 本土化 anchor / +5%(和下面一起)

好了,到这里 Yolov2 就开始针对 anchor 整活儿了,要走一条不太一样的 anchor 之路。不再使用 hand-picked 的 anchor 了,而是使用 k-means 在训练数据集的 BoundingBox 上聚类得到 anchor,这样比 hand-picked(“瞎弄的”)要好用。

然后 anchor 本身的含义并不包括位置(本身就是定好 feature map 位置之后应用 k 个 anchor的),而是面积和宽高比例信息/或者是宽高的尺寸(只要等价就可以)。然后如果直接用欧式距离来计算 k-means 中的距离,同样会造成大小框误差被无差别对待(不合理,同样的误差大小对于大小框的影响是不同的)。

所以这里 k-means 的质心 centroid 仅仅包含 anchor 的本身信息,并不携带 BoundingBox “中心坐标”等信息。所以要想从训练数据集中的 BoundingBox 聚类得到 anchor,也只能隐去中心坐标信息,只用宽高信息。

根据实验,k-means 聚类设定 5 类即可获得不错的效果。

Direct Location Prediction / loss 更合理化 / +5%(和下面一起)

这里主要是 Yolo 对 anchor 的另一项本土化工作。作者认为,Faster R-CNN 中 RPN 模块采用变换的方式预测 BoundingBox 的中心坐标,(我感觉这里写错了吧,按照 Faster R-CNN 不是减号应该是加号啊)。
在这里插入图片描述
但是这么做的问题是,在随机初始化模型开始训练的初始阶段,模型的稳定性非常不好。那是因为 t x t_x tx 的变化会对 ( x , y ) (x,y) (x,y) 带来比较大的扰动,甚至任何一个 anchor 对应的 BoundingBox 能落在图像中的任意位置。

Yolo 对此的改动是,不像 Faster R-CNN 预测 BoundingBox 对于 anchor 的 offset,而是沿袭 Yolov1 直接预测关于 grid cell (这里应该没有 grid cell 才对,但是 Yolo 作者好像把 feature map 上的点当作 Yolov1 中的 grid cell 了)的相对位置。使用 logistic 激活函数来约束网络的预测落在 0~1 之间。

这个网络在每个 gird cell 预测 5 个 BoundingBox,相当于 anchor 数量取 5。每个 BoundingBox 信息有 5 个变量,分别是 t x t_x tx t y t_y ty t w t_w tw t h t_h th t o t_o to(这里这个 t o t_o to 应该是对应 v1 中 confidence 的概念,也就是是否包含物体以及有多好)。如果 cell 相对图像左上角的 offset 是 ( c x , c y ) (c_x, c_y) (cx,cy),anchor 的宽高是 p w p_w pw p h p_h ph,那么
在这里插入图片描述
对应的示意图如下:
在这里插入图片描述

这么做的好处是对位置预测进行了约束,在网络训练初期会更稳定并容易训练。而我为啥小标题说 loss 更合理,是因为 Yolov1 的 loss 中关于这部分的设计很尴尬,直接预测的 BoundingBox 中心欧式距离,还有被逼无奈的宽高平方根(仍然不够合理)。所以这么设计肯定会引进 anchor 的同时,让 loss 变得更合理,

Fine-Grained Features / 细粒度特征 / +1%

虽然到此 Yolo 是在 13 × 13 feature map 上进行检测,但是如果能够获取更细粒度的特征,将会更好地检测小物体。Faster R-CNN 和 SSD 是通过在不同分辨率的 feature maps 上训练获取不同尺度特征的。而 Yolo 又是找简单替代方式,直接借鉴 ResNet 的 passthrough layer 拿到 26 × 26 的特征图。然后这 26 × 26 × 512 的特征图直接分块重组成 13 × 13 × 1024,这样就可以和增加前的 13 × 13 直接 concat 了。

Multi-Scale Training

训练过程中赋予的,每 10 轮就重新选择一个分辨率,因为整个模型现在只有卷积和池化层了,所以其实对输入尺寸并不是严格要求的。因为整个网络的总 stride 是 32,所以只要输入分辨率选择 32 的整倍数就可以, { 320 , 352 , . . . , 608 } \{320, 352, ..., 608\} {320,352,...,608}

因为这个训练策略,所以使得 Yolov2 可以在运行速度和精度上无缝迂回。和其他网络的对比如下图,Yolo 作者一向喜欢对比图把自己的 Yolo 放在较优的那个角落上2333。
在这里插入图片描述

Further Experiments

Faster 速度

这部分主要是针对 Yolo 在速度方面的优化。

Darknet-19

Yolo 作者嫌弃 VGG,说 VGG-16 很强,但是 needlessly complex。所以,他搞了个新的 Darknet-19 来替代 VGG-16,性能只略逊色一点点,但是参数量大大减小了(从 30 billion 到 8 billion 左右),所以运行速度也就大幅提升了。

Darknet-19 就像名字一样,有 19 个卷积层,其他几乎就是 pooling 层,还会用到 avg pooling 和 1 × 1 卷积,可以看下作者网站的参数和论文里面的参数,输入尺寸不一样略有不同:
在这里插入图片描述
在这里插入图片描述

Training for classification

训练过程也是先在 ImageNet 上训练分类任务,其实这部分应该在 Yolov1 就开始了,但是 Yolov1 里面没有重点讲这些。

Training for detection

训练完分类任务之后再修改模型用于检测任务,去掉最后一个卷积层,增加一个 kernel 数量为 1024 的 3 × 3 卷积层,再跟一个 1 × 1 卷积层变为需要的检测数量。比如,如果是 VOC 数据集,预测5 个框,每个框 5 个数 20 个类,所以就是 5 × (5 + 25) = 125 个。还加了 passthrough layer 所以能够利用前面说的细粒度特征。

至此,Yolov2 已经完成,也经过了准确度和速度两方面的优化。接下来主要是在 Yolov2 的基础上做的 stronger。主要是联合分类数据和检测数据,得到一个能够检测 9000+ 类别的检测器。

Stronger Yolo9000

本部分亮点就是联合分类和检测数据训练,从分工上来看,就是检测数据用来学习 BoundingBox 和 是否存在物体,分类数据用来扩充检测类别。

训练的时候,分类数据和检测数据是混在一起的,遇到检测数据,就照着 Yolov2 的套路来更新梯度;如果遇到分类数据,就只回传关于类别的 loss 部分。

Hierarchical Classification

但是还是会遇到一个问题,检测数据里面的标注信息一般都干巴巴的,比如就“狗”;分类数据集里面就丰富好玩多了,有“金毛”、“哈士奇”、“萨摩耶”。你说这些标签混在一起符合“互斥”吗?明显不符合啊,那它不互斥,回头你生成概率到底怎么处理和解释啊。

所以作者这里借用了 WordNet,它本身算是个图谱,比较复杂,因为语言本身就比较复杂,所以会有环,没有树那么简单。作者就是根据数据集中出现的概念情况,参考着 WordNet 造了个简单点儿的 WordTree,来表征概念之间的层级关系。这样每个概念都是树中的一个节点,都有自身从根节点下来的唯一路径。

如果用上这个 WordTree 做分类,预测每个节点的条件概率就好,比如节点“tettier”,
在这里插入图片描述
如果想获得 absolute probability,就把路径上的条件概率相乘就好了。而且这里分类时,是默认图上一定是有物体的,毕竟数据集里你都给人家贴标签了呀,所以 P r ( p h y s i c a l o b j e c t ) = 1 Pr(physical object) = 1 Pr(physicalobject)=1

为了验证刚刚说的这个层级方法,训练了 Darknet-19,加上中间概念节点从 1000 类变成了 1369 类。训练的时候,如果某个图片的标签是节点 A 对应的概念,那么这个图片同时也被赋予了从根节点到节点 A 路径上的所有概念作为标签,也就是比如“金毛”同时会获得“狗”、“哺乳动物”的标签。这么做的好处是,有时候识别出来“狗”了,但是没人出来具体哪种狗,那至少还会输出个“狗”的预测结果(就跟做题不管会不会先写个“解”字23333)。

然后使用 WordTree 和直接在 ImageNet 上使用 softmax 的区别如下:
在这里插入图片描述
ImageNet 直接就用一个 softmax 来分整个 1000 类;而使用 WordNet 的话,可以使用多个 softmax,有相关联系的概念会使用一个 softmax 生成概率。

好了,既然在分类任务上做了测试了,现在就要把它用在训练检测任务上了。但是检测任务中,不能在预先设定是否存在物体的概率直接为 1 了,得按照检测的规矩来,是否存在物体仍然得预测概率。用上这个 WordTree,检测预测的是 BoundingBox 的信息和概率树。然后从这个树根节点向下遍历,找到 confidence 最高的那个 path,或者是达到某些阈值停下。

Dataset Combination with WordTree

使用 WordTree 可以合并不同的数据集,以 COCO 检测和 ImageNet 分类为例,会得到这样的 WordTree。

在这里插入图片描述

Joint Classification and detection

说到最后联合训练了,COCO 数据集增多了采样,最后 ImageNet : COCO 大概 4:1。
训练过程中,如果是检测数据,就依照 Yolov2 训练,如果是分类数据,就参考着 WordTree 只传标签对应概念节点及以上的 loss。(at or above)

训练完之后,拿着 Yolo9000 去 ImageNet 检测数据集上测了一下。需要注意的是,ImageNet 检测数据集和 COCO 检测数据集只有 44 类是重合的,也就是说 ImageNet 检测数据集中的很多类别 Yolo9000 都没见过,即使如此,也有 19.7% 的mAP。

然后发现 Yolo9000 预测动物挺好,预测衣物类的很难,这跟 COCO 数据集动物比较丰富有关系。

Conclusion

Yolov2 这篇整体亮点比较多,有自身使用 anchor 的方式来提升 mAP,以及 Darknet-19 来提升速度。最后还有层级 WordTree 的方法联合分类和检测数据。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值