写在前面:
本文参考了Faster R-CNN Explained
Faster-RCNN算法精读
发表的paper
请先看我提到的这三篇,如果还不明白,或者感觉明白的不透彻,再看下面的内容。
- 当深度学习对于分类问题取得成功时,人们希望把它应用到检测问题中。最直接的思路就是:把所有可能有物体的区域拿出来跑深度学习的分类模型(RCNN)。这是可行的,唯一的问题就是计算量太大。object proposal 会产生很多候选区域,每个区域再跑分类。
- (Fast-RCNN)做的主要改进为:不是直接在原图上进行object proposal 而是先卷积(保留原图的位置信息),在feature map上在进行 object proposal。 相当于是共享了一部分卷积的运算。
- object proposal 有很多算法,大多都是非卷积神经网络的。比如:遍历(Exhaustive search) 分割(segmentation)selective search for object recognition
- 而Faster RCNN 中提出的 Region Proposal Net 用卷积神经网络实现了 object proposal
问题:能直接用卷积神经网络实现检测吗?
naive idea:比如输入就是图片,而图片的label 有5个参数,第一个是类别,后四个参数是物体的box的坐标(x,y,w,h)
假如网络的学习能力足够强,数据量足够大,网络未必不能实现同时找位置且分类。
但现实情况是:网络的学习能力没有那么强(以图片为输入,以5个参数计算loss function,模型很难收敛),数据量也不够大,不能基本显示所有可能的情况。(举例: 检测猫: 你的数据集,应该有不同种类,不同大小,不同位置的图片) 假设图片大小为n×n 猫的种类有100种,可能的大小加可能的位置数量级n*n*n
尽管这个naive idea 不具有可操作性,但是却给我们提供了一个很好的思路:假设已知图片中物体的大致位置(x,y,w,h),那么在(x,y,w,h)和(x0,y0,w0,h0)很接近的情况下,再 做regression 是不是就可行一些了?
重点: 如何理解 RPN。
RPN 用卷积网络实现了给出物体大致位置的方法。
有连个关键点需要理解。
卷积其实是一种提取信息的方法, 比如一张100*100的图,三个颜色通道,一共30000个参数每个参数的取值在 0到255,一张图所包含的信息是巨大的,如果我们只希望知道这张图到底是不是显示了一只猫,我们只想得到一个二值信息。卷积神经网络的工作就是从复杂的信息中提取出我们想要的简单的信息。那卷积是如何做到这一点的呢? 直观的想 一个3*3的kernel 其实是获取了9个像素点的信息的,这样一层层的卷积其实不断凝练了一张图中的信息。
receptive field(接收域)。 定义为:The receptive field is defined as the region in the input space that a particular CNN’s feature is looking at (i.e. be affected by) A guide to receptive field arithmetic for Convolutional Neural Networks
举个例子,假设卷积的padding(步长)为1, 一张100*100的图经过一次卷积5*5 形成的feature map中的一个像素其实包含了原图的25个像素的信息,再经过一次卷积(kernel 2*2) 生成的feature map 中的一个像素其实包含了原图 36个像素的信息。这是 的feature map 中一个像素的 receptive field 的大小其实是 对应原图36个像素。
理解了这两个概念就可以理解RPN到底是怎么回事了,
anchor 在原图中对应的是一块区域比如36个像素,但是在形成的feature map中对应的一个像素, 而这个像素中的数值就可以用来表示原图中对应的36个像素的区域内是否有物体。有物体(foreground)就是1, 如果是背景(background)就是0,介于0 到1 之间的数,表明物体在这个区域中所占的比例。feature map 中每个像素都对应原图中的一块区域,那么整个feature map 其实就是以区域(sliding window)0为单位,把原图扫描了一遍。 卷积的过程完美对应 potential object region proposal 的过程。
同时,在分类问题中,一张图,到最后一般会生成 几十张feature map. 每一张feature map 叫做一个 filter。 在 RPN 中, filter 对应不同的anchor。 在原始文献中提到的 9个 anchor (三个scale, 三个 ratio) 对应 9 个 filter 也就是九张feature map。
到这里基本就是 RPN的精髓了, 其实一共是18张,9*2 这里的2 代表foreground 和 background。 通过 卷积我们实现了 object proposal的过程, 然后 在最后一个卷积层后加两个 box regression 头, 和 classification 头, 就可以训练 RPN 网络了。 最后把一张图输入到训练好的RPN中, 它应该告诉你有那些可能的区域是大概率有物体。在这些区域中进一步跑分类模型就可以确定区域中的物体到底是什么了。
本文中忽略的很多操作细节都可以在头三篇文章中找到这里不再赘述。
补充:
RCNN 系列都属于 two stage detector ( region proposal and classification)
YOLO SSD 以及最新的 retinanet 都是one stage detector。 其实基本思想和RPN 是类似。就是用CNN 来进行 object proposal 然后分类。 懂了我上面说的,应该也可以看懂 one stage detector。