Yolov1:两步并成一步走~

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(ClassiObject),条件是是这个小格子包含物体。

每个框对应特定类别的 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(ClassiObject)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 的开山之作,有突破也还有很多不足,后面作者都有慢慢更新补足。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值