Object Detection, 顾名思义就是从图像中检测出目标对象, 具体而言是找到对象的位置, 常见的数据集是 PASCAL VOC 系列 2010 年 - 2012 年, Object Detection 进展缓慢, 在 DPM 之后没有大的进展, 直到 CVPR2014,RBG 大神 (Ross Girshick) 把当时爆火的 CNN 结合到 Detection 中, 将 PASCAL VOC 上的准确率提高到 53.7%, 本文为你解读 RBG 的 CVPR2014 paper:
- Rich feature hierarchies
- for accurate object detection and semantic segmentation Key insights
可以用 CNN 对图片局部区域做识别, 从而判断这个局部是不是目标对象
在标记数据稀缺的情况下, 可以用其他数据集预训练, 再对模型进行 fine tune
RCNN Overview
输入图片
通过 selective search 给出 2k 个推荐区域(region proposal)
检测问题的一个特点是, 我们不仅需要知道一张图片中是否包含目标对象, 而且需要知道目标对象所处位置, 有几种方式, 一种是回归图中检测框的位置[38], 但是准确率很低, 一种是用滑动窗口的方法将图片切割成很多小块, 再对小块做分析, 但是对于 CNN 来说, 每经过一层 pooling, 感受野就会变小, RCNN 采用了一个五层卷积的结构, 要求输入至少是 195x195 的尺寸, 用滑窗不能保证这个输入大小
Selective search 是一种比较好的数据筛选方式, 首先对图像进行过分割切成很多很多小块, 然后根据小块之间的颜色直方图梯度直方图面积和位置等基本特征, 把相近的相邻对象进行拼接, 从而选出画面中有一定语义的区域关于 Selective Search 的更多信息可以查阅这篇论文: Recognition using Regions(CVPR2009)
将每个推荐区域传入 CNN 提取特征
为每个类训练一个 SVM, 用 SVM 判断推荐区域属于哪个类
用 NMS 对同个类的 region proposals 进行合并
用 bounding box regressor 对预测位置进行精细的修正, 进一步提高精度
非极大值抑制 (NMS) 顾名思义就是抑制不是极大值的元素, 搜索局部的极大值这个局部代表的是一个邻域, 邻域有两个参数可变, 一是邻域的维数, 二是邻域的大小这里不讨论通用的 NMS 算法, 而是用于在目标检测中用于提取分数最高的窗口的例如在行人检测中, 滑动窗口经提取特征, 经分类器分类识别后, 每个窗口都会得到一个分数但是滑动窗口会导致很多窗口与其他窗口存在包含或者大部分交叉的情况这时就需要用到 NMS 来选取那些邻域里分数最高(是行人的概率最大), 并且抑制那些分数低的窗口(转自知乎专栏: 晓雷的机器学习笔记)
训练
从上面的 Overview 可以看出, 需要训练的主要有两个部分, 各个类共用的 CNN 和各个类单独的 SVM
Network Structure
RCNN 试了两种 CNN 框架, 一种是 Hinton 他们在 NIPS2012 上发表的 AlexNet:ImageNet Classification with Deep Convolutional Neural Networks
这是一个五层卷积 + 三层全连接的结构, 输入是 224x224 的图片, 输出是 1000 维 one-hot 的类别,
一种是 VGG16(Very Deep Convolu-
tional Networks for Large-Scale Image Recognition)
这是两个网络的检测结果:
VGG16 精度更高一些, 但是计算量比较大, 实时性不如 AlexNet, 方便起见我们下面都以 AlexNet 为基础进行分析
Supervised Pretraining
首先用 ImageNet 预训练, 输入图片, 输出为这张图片包含的目标对象的类别, 而不涉及具体位置, 因为 ImageNet 中没有 bounding box 信息训练到 AlexNet 能够在分类任务上达到 Hinton 他们的精度之后, 开始用检测数据做 Fine tune
Domain Specific Fine Tuning
直接用 ImageNet 预训练得到的 CNN 在 PASCAL VOC 上表现肯定是不如人意的, 接下来, 用 PASCAL VOC 的检测数据进行 fine tune 因为 VOC 有 20 个分类, 在 ILSVR2013 的检测任务中, 最后有 200 个分类, 而 ImageNet 有 1000 个分类, 首先要把最后的全连接分类层替换成目标任务输出个数 + 1(加一个背景类)的全连接层输入数据用的是 Selective Search 得到的 Region Proposals 对应的 bounding box,
在这里的 Fine tune 中, 需要判定 Region Proposal 属于哪种目标分类, 在 VOC 的训练集中, 有 bounding box 和对应的分类标注, RBG 他们是检查每个 Region Proposal 与训练集中 bounding box 的重叠率, 如果 Region Proposal 和 bounding box 重叠率大于阈值(经过实验, 选了 0.5), 则认为这个 Region Proposal 的分类为 bounding box 对应的分类, 并且用这个对应的 bounding box 作为 Fine tune 的输入
但是这些输入大小不一, 需要调整到目标输入尺寸 224x224, 在附录 A 中讨论了很多的预处理方法,
A. 原图
B. 等比例缩放, 空缺部分用原图填充
C. 等比例缩放, 空缺部分填充 bounding box 均值
D. 不等比例缩放到 224x224
实验结果表明 B 的效果最好, 但实际上还有很多的预处理方法可以用, 比如空缺部分用区域重复
训练时, 采用 0.001 的初始学习率(是上一步预训练的 1/10), 采用 mini-batch SGD, 每个 batch 有 32 个正样本(各种类混在一起),96 个负样本进行训练
Object category classifiers
每个类对应一个 Linear SVM 二分类器(恩, 很简单的一个 SVM, 没有复杂的 kernel), 输入是 CNN 倒数第二层的输出, 是一个长度为 4096 的向量, SVM 根据这个特征向量和标签进行学习, 调整权重, 学习到特征向量中哪些变量对当前这个类的区分最为有效
训练 SVM 的数据和 Fine tuning 训练 CNN 的数据有所不同, 直接使用将 PASCAL VOC 训练集中的正样本, 将与 bounding box 重叠率小于 0.3 的 Region Proposals 作为背景(负样本), 这个重叠率也是调参比较出来的; 另一方面, 由于负样本极多, 论文采用了 hard mining 技术筛选出了难分类负样本进行训练不过这样的话, SVM 和 CNN 的正负样本定义就不同了, SVM 的正样本会少很多(那些重叠率大于 0.5 的 bounding box 就没用上了)
附录 B 中解释, 其实一开始 RBG 他们是用 SVM 的正负样本定义来 Fine tune CNN 的, 发现效果很差 SVM 可以在小样本上就达到比较好的效果, 但 CNN 不行, 所以需要用上更多的数据来 Fine tune, 重叠率大于 0.5 的 Region Proposals 的数据作为正样本, 可以带来 30 倍的数据, 但是加入这些不精准的数据的代价是, 检测时位置不够准确了(因为位置有些偏差的样本也被当做了正样本)
于是会有一个很自然的想法, 如果有很多的精确数据, 是不是可以直接用 CNN 加 softmax 输出 21 个分类, 不用 SVM 做分类? RBG 他们直接在这个分类方式上 fine tune, 发现这样做的准确率也很高(50.9%), 但是不如用 SVM 做分类的结果(54.2%), 一方面是因为正样本不够精确, 另一方面是因为负样本没有经过 hard mining, 但至少证明, 是有可能直接通过训练 CNN 来达到比较好的检测效果的, 可以加快训练速度, 并且也更加简洁优雅
Bounding-box regression
这部分是在附录 C 展开阐述的 (CVPR 篇幅限制) 首先, 为每个类训练一个 bounding box regressor, 类似 DPM 中的 bounding box regression, 每个类的 regressor 可以为每个图输出一个响应图, 代表图中各个部分对这个类的响应度 DPM 中的 Regressor 则是用图像的几何特征 (HOG) 计算的; 不同于 DPM,RCNN-BB 中这种响应度 (activation) 是用 CNN 来计算的, 输入也有所不同, DPM 输入是原图, 输出是响应图(从而得到 bbox 的位置),RCNN-BB 的 Regressor 输入是 Region Proposals 的位置和原图, 输出是 bounding box 的位置
定义一个 region proposal 的位置为 P=(Px, Py, Pw, Ph),x,y 为 region prosal 的中心点, w,h 为 region proposal 的宽高, 对应的 bounding box 的位置为 G=(Gx,Gy,Gw,Gh),Regressor 的训练目标就是学习一个 P->G 的映射, 将这个映射拆解为四个部分:
其中, dx(P),dy(P), dw(P), dh(P)是四个线性函数, 输入为 P 经过前面说的 fine tune 过的 CNN 后得到的 pool5 特征, 输出为一个实数
训练就是解一个最优化问题, 求出四个 w 向量, 使得预测的 G 和真实的 G 相差最小, 用差平方之和代表距离, 化简后的形式为:
其中,
跟前边的四个映射是对应的,
同时加上了对 w 的 l2 正则约束, 抑制过拟合
训练得到四个映射关系后, 测试时用这四个映射就能够对预测的 Region Proposals 位置做精细的修正, 提升检测框的位置准确率了
至此, 整个训练和测试过程就介绍完毕了
玄学时间
在论文中还打开 RCNN 中卷积层分析它们的功能, 在 AlexNet 的论文中, Hinton 已经用可视化的方式为我们展示了第一层卷积描述的是对象的轮廓和颜色, 但后面的层因为已经不能表示成图像, 所以不能直接可视化, RBG 的方法是, 输入一张图片的各个区域, 看 pool5(最后一层卷积层的 max pooling 输出)中每个单元的响应度, 将响应程度高的区域框出来:
pool5 的 feature map 大小为 6x6x256, 图中每行的 16 张图代表一个 unit 响应度最高的 16 张图, 将每张图响应度较高的区域用白色框框出来了, 这里只挑了 6 个 unit 进行展示 (所以只有 6 行) 一个 unit 是 6x6x256 的张量中的一个实数, 这个数越大, 意味着对输入的响应越高
可以看到不同的 unit 有不同的分工, 第一行的 unit 对 person 响应度比较高, 第二行的 unit 对 dog 和 dot array(点阵)的响应度比较高, 可以从这个角度出发, 用每个 unit 充当单独的一种 object detector
附录 D 中还有更多的可视化结果
之所以说是玄学是因为, 虽然这种可视化一定程度上体现了 CNN 学习到的东西, 但是仍然没有说明白为什么是这个单元学习到这种信息
Summary
RCNN 第一次把 CNN 结合 Region proposal 用到了 detection 任务中, 取得了很好的效果, 在这篇论文里, 还体现了很多视觉深度学习的流行技巧, 比如 Pretrain,Fine tune, 传统方法与深度学习结合(分割 + 检测, CNN+SVM,Bounding box regression), 可以说是相当值得一读的好 paper 了
来源: https://www.cnblogs.com/hellocwh/p/8431802.html