You Only Look Once: Unified, Real-Time Object Detection,2016
文章目录
开始之前,我要先笑一下。
YOLO 作者“彩虹小马哥”很有自己的风格,还有点可爱。当初看 v3 论文半夜躺在床上笑得我有点肚子疼。但是之后说要退出计算机视觉领域的工作,因为这些技术被用在了军事和侵犯隐私上面,到这里我还觉得他很纯粹且激进。但是后来甚至看到他有涉及我们国家的宗教和政治问题,emmm 算了,这一点不予置评了,就只看论文好啦~。
Abstract
- 前人在物体检测方面的工作都是重用分类来实现检测;而 Yolo 要把物体检测任务视作为关于空间分离的 BoundingBox 和相关 class probability 的回归问题。(空间分离就是因为它划分全图为 S × S 个 grid 了,且在某个 gird 上只预测较少的 B 个框)
- Yolo 直接从原图预测 BoundingBox 和 class probability,也就是一个 evaluation,而不是两个。可以实现端到端的检测。
- Yolo 很快,可以 45 帧每秒,轻量版更是可以 150 帧每秒左右。
- 作者认为 Yolo 学习到了非常泛化的表征,所以在正常自然图片上训练之后,在艺术类作品中执行预测,比其他方法的效果要好。
- 缺点:BoundingBox 定位会有点误差,没有那么精确,还有最致命的,小物体经常检测不到。小物体检测,也是 Yolo 系列一直以来的瓶颈,到 v3 有被大大改善,但是仍然不能让很多胖友满意。
Introduction
人类视觉可以通过一瞥就能知道视野中物体的类别、位置以及多个物体之间的相对关系。这个能力在很多任务上非常重要,比如自动驾驶等。目前物体检测方面的工作都是两个阶段,在图像对应的不同位置和大小比例上重用了分类来做检测。
来看 Yolo 作者怎么评价 R-CNN 系列的,他杀疯了:
(1)两个阶段。先生成 potential 的 BoundingBox 再对这些 BoundingBox 做分类。
(2)还没完。做完上面分类之后还要加后处理 post-processing 来 refine BoundingBox、消除重叠的BoundingBox,还要重新给 BoundingBox 打分。
(3)由于以上原因,各个阶段可能要分开训练,慢且难优化。
然后就开始介绍 Yolo 让人耳目一新的地方:
(1)简单简单还是简单。一个简单的卷积网络而已,直接从图像像素到 BoundingBox 以及 class probability。
(2)因为简单,所以快。Yolo 把物体检测任务看做是回归问题,一个阶段就完成所有工作。
(3)Yolo 对全图的上下文信息利用得比较好,相反 Fast R-CNN 就不能看到那么多上下文信息,所以 Yolo 在假阳性上表现比 Fast R-CNN 要好,也就是在背景上预测 positive 的错误率更小。
(4)Yolo 学习到了很泛化的表征,所以迁移到艺术作品中做检测的效果,比其他工作表现更好。
看这示意图,一共就三步:几乎约等于要把大象放冰箱一共分几步的灵魂质问……
(1)resize 到 448 × 448 —— 开冰箱门;
(2)执行 CNN —— 放大象;
(3)NMS —— 关门。
然后作者也交代了 Yolo 当时的缺陷:
框的精确度有待提升 + 小物体总是漏检啊/(ㄒoㄒ)/~~
Unified Detection
在预测每个 BoundingBox 时使用的都是全图的 feature,在预测框的时候并不区分类别,也就是在预测 BoundingBox 时只关注是不是有物体存在。
Yolo 把输入图像分割成 S × S 个 grid。如果某个物体的中心落在了某个小格子里,这个小格子就 responsible for 检测这个物体。每个小格子会预测 B 个BoundingBox 以及 confidence(每个 BoundingBox 都有对应的 confidence)。这个 confidence 反映了这个框包含物体的概率以及这个框的准确度。所以这个 confidence 承担了两部分工作的,包含物体的概率和准确率,作者使用 P r ( O b j e c t ) ∗ I o U p r e d t r u t h Pr(Object) * IoU^{truth}_{pred} Pr(Object)∗IoUpredtruth 来作为 confidence。如果不包含物体 P r ( O b j e c t ) Pr(Object) Pr(Object) 就是 0,否则就是 IoU(如果包含物体就直接是 1 × IoU吗?好像是的)。
所以,中间小结一下,每个 BoundingBox 对应 5 个变量, x x x, y y y, w w w, h h h,confidence。
- x x x, y y y 表示 box 相对这个小格子边界的坐标;
- w w w, h h h 表示相对于全图的宽高;
- confidence 表示预测框和任何 gt box 之间的 IoU。
上面这部分主要是围绕框的位置和置信度信息的,类别还没讨论的,Yolo 不是要同时完成 BoundingBox 以及类别任务嘛。所以接下来就看下 Yolo 如何处理类别预测。
每个小格子(对,是小格子,不是小格子产生的 B 个框)预测 C 个条件类别概率 P r ( C l a s s i ∣ O b j e c t ) Pr(Class_i | Object) Pr(Classi∣Object),条件是是这个小格子包含物体。
每个框对应特定类别的 score 就得到了。这个 score 也是携带了两部分信息:这个框包含某个特定类别的概率 + 这个框和 gt 框之间有多合适 (IoU)。
P r ( C l a s s i ∣ O b j e c t ) ∗ P r ( O b j e c t ) ∗ I o U p r e d t r u t h = P r ( C l a s s i ) ∗ I o U p r e d t r u t h Pr(Class_i | Object) * Pr(Object) * IoU^{truth}_{pred} = Pr(Class_i ) * IoU^{truth}_{pred} Pr(Classi∣Object)∗Pr(Object)∗IoUpredtruth=Pr(Classi)∗IoUpredtruth
对于数据集 PASCAL VOC 数据集,S = 7,B = 2, C = 20,最后的预测是 S × S × (B × 5 + C)= 7 × 7 × 30 的张量。
Network Design
卷积神经网络,卷积层负责提取特征,全连接层输出概率和坐标。
Yolo 的网络设计受到 GoogLeNet 启发,有 24 个卷积层接 2 个全连接层。但是并没有使用 Inception 模块,而是使用 1 × 1 卷积降维跟一个 3 × 3 卷积层。整个网络结构如下图,看看这图,真的超级多的 1 × 1 和 3 × 3 啊。
还有一个 fast 版本的 Yolo,仅仅使用 9 个卷积层(是个狠人),且每层的卷积核数量也变少了。训练和测试参数 fast 版本和 标准版本一致。
Training
卷积层是在 ImageNet 1000 类数据集上预训练的。预训练过程中,使用上图中的前 20 个卷积层加平均池化和全连接层。训练一周。使用 Darknet framework 来做所有的训练和推断(小马哥的 DarkNet 也是别具一番风格 23333)。
然后 convert 上面获得的分类模型用来做检测,到目前为止训练获得了 20 个卷积层,然后在此基础上增加层,增加了 4 个卷积层和 2 个全连接层,达到最后标准 yolo 模型的样子。检测通常需要比较精确的位置信息,所以把输入的 size 从 224 × 224 变成了 448 × 448。
最后一层预测分类概率信息和 BoundingBox 坐标信息。BoundingBox 的宽高信息是归一化的,范围是 0 ~ 1,BoundingBox 的 x 和 y 坐标也是相对某一个特定的 grid cell 的 offset,所以也是 0 ~ 1。
最后一层使用线性激活,其他所有层使用 leaky relu
optimizer 使用 sum-squared error (SSE,误差平方和)优化模型输出,原因是 SSE 简单(粗暴)。不过同时也存在一些问题:SSE 不能完美地和我们最大化平均精度的目标相契合。
SSE 问题(后面作者自己也有总结):
(1)无差别对待位置误差和分类误差;
(2)无差别对待 grid 是否包含物体(很多 grid 并不包含任何物体,所以这种 grid 的 confidence 会趋近于 0,所以梯度会变大。这样模型不够稳定,训练过程容易很早地就发散了。);
(3)无差别对待尺寸不一的 BoundingBox(同样的误差大小对于大 box 和小 box 的影响是不同的)。
SSE 解决方式:
(1)增加了 BoundingBox 坐标的 loss ,
λ
c
o
o
r
d
=
5
\lambda_{coord} = 5
λcoord=5;
(2)降低不含有物体的 confidence loss,
λ
n
o
o
b
j
=
0.5
\lambda_{noobj} = 0.5
λnoobj=0.5;
(3)用了 BoundingBox 的宽高的 square root,而不是直接使用宽高。
Yolo 对每个 grid cell 都有多个 BoundingBox(应该就是前文说的 B 个吧,Yolo 取的 B = 2)。训练过程中,作者只想分配一个 BoundingBox predictor 来 responsible for 每个物体。和 gt IoU 最高的 predictor responsible for 这个物体。这样各个 predictor 之间就有独立性了,各自会学到特定的 size,ratio 或者 class,能够提高整体的召回率。
训练 loss 看起来有点细碎,如下图:
一共 5 行:
(1)第一行,BoundingBox 位置信息中的中心坐标,当预测 gird cell i 中存在第 j 个 BoundingBox 预测框存在,前面有坐标系数
λ
c
o
o
r
d
\lambda_{coord}
λcoord;
(2)同第一行,但是是关于 BoundingBox 的宽和高,前面也说了,因为 SSE 对待大框和小框的误差是无差别的,所以为了减小这种不合理效应,作者使用的宽高的平方根;
至此,前面两项都是关于 coord 的,且都是在 “gird cell i 中存在第 j 个 BoundingBox 预测框存在”的前提条件下。
(3)这里是关于 confidence 的,且是对存在物体的;
(4)同第三行,但是是针对不存在物体的情况,有系数
λ
n
o
o
b
j
\lambda_{noobj}
λnoobj;
(5)前面都是 BoundingBox 的位置信息以及有没有 BoundingBox 和 BoundingBox 和 gt 一致性怎么样,现在最后一条是关于 BoundingBox 对应的物体类别的,只能是包含物体的才能计算这一项,不包含物体的这一项不参与计算。所以相当于前面说的条件概率,也就是在有物体的前提条件下属于某个类别的概率。
有使用 dropout 和 data augmentation,augmentation 中有随机 scaling 和 位移,随机调整曝光和饱和度。
Inference
快快快。
grid 这个机制的设定决定了 BoundingBox 之间是在空间分离的,经常会出现某个 grid 很明显的对应一个物体,并且一个物体只预测一个 BoundingBox。但是某写比较大的或者靠近多个 grid 边界的物体可以通过多个 cell 来预测。NMS 可以用来消除多重预测。
Limitations of YOLO
到了自我批评环节了。
成也 grid,败也 grid。正是因为 gird 的机制,使得 Yolo 对 BoundingBox 有着非常强的空间约束。这种空间约束限制了那些靠的比较近、比较小的物体的检测。
再者,Yolo 在预测 BoundingBox 方面主要从数据学习(这里应该是对比 anchor 机制吧,anchor 机制算最基本的初始化了,无论怎么样都会照顾各种 size 和 ratio 的,而 Yolo 相比来说,就只能从数据中学了。)。所以,在遇到新的数据,或者有着不常见的宽高比、结构的情况下,很难预测得很好。因为 Yolo 使用的降采样层比较多,所以 BoundingBox 的定位上风格比较 coarse,很难做到细致的预测。
loss 方面也是有点糊弄,它无差别对待大小框的误差,所以在 BoundingBox 定位上误差较大。
Comparison to Other Detection Systems
Deformable parts models
Other Fast Detectors
Deep MultiBox
OverFeat
MultiGrasp
Experiments
Comparison to Other Real-Time Systems
VOC 2007 Error Analysis
Combing Fast R-CNN and YOLO
VOC 2012 Results
Generalizability: Person Detection in Artwork
这一点我比较感兴趣,在艺术品上做检测。但是,这里好像并不能体现 Yolo 的长处?这些特征应该算主要是 ImageNet 预训练的时候学的吧?所以我觉得 Yolo 在这方面的长处应该是它保留了这些特征,毕竟它不是可以全图嘛,上下文信息获取得比较好。
Real-Time Detection in the Wild
Conclusion
好了,无论如何 Yolo 作为 One-stage 的开山之作,有突破也还有很多不足,后面作者都有慢慢更新补足。