Faster R-CNN
继RCNN,Fast R-CNN后于2015年提出,主要用区域生成网络(RPN)代替了Fast R-CNN的Selective Search方法。下面讲下一下Faster R-CNN所涉及到的所有步骤及涉及到的其他思想。特征提取网络以VGG-16为例。
一、概述
目标识别需要完成两个任务,定位和分类。分类已经有很久的历史了,长久以来都是用特征提取然后逻辑回归,这点毋庸置疑。而如何定位目标(目标分割)才是整个目标识别算法中的核心。例如R-CNN采用的是经典的图像处理方法,Selective Search,通过一些颜色纹理等特征来达到目标分割的任务,但是这样太耗时间,果然被抛弃。Fast R-CNN并没有修改定位这部分,只是将定位后的检测算法通过卷积网络一步实现,达到提升速度的效果,这里后面会详谈。而Faster R-CNN则直接用深度学习的方法实现目标分割,这一下大大提高了定位的速度,且减少了待检测块的数量,成为2015年目标识别领域最好的算法(state-of-the-art)。尽管Faster R-CNN,速度已经很快,但要达到实时检测仍然有些不够,特别是对于类似自动驾驶的场景。2016年,YOLO(You Only Look Once:Unified, Real-Time Object Detection)算法被提出,速度有质的提升,采用的方法当然与Faster R-CNN有所不同。YOLO算法是通过将图片分成 n * n大小的栅格,然后对于每个栅格,识别网络同时给出位置坐标和类别概率,一步到位速度当然有提升,但带来的缺陷就是一个栅格只能检测一个物体,且定位有一定误差。后面的YOLO版本在吸取一些先进的思想后有比较大的提高,甚至在精确度上超过Faster R-CNN。
二、特征提取网络
卷积 + 池化 + 激活 向来是卷积神经网络的标配,VGG网络也不例外。RPN网络和Fast R-RCNN网络公共结构如下:
image → conv3-64 → conv3-64 →pool2 → conv3-128 →conv3-128 → pool2 → conv3-256 → conv3-256 → conv3-256 → pool2 → conv3-512 → conv3-512 →conv3-512 →pool2→conv3-512 → conv3-512→ conv3-512
VGG网络特点是只用3*3大小的卷积核
三、 RPN网络
滑动窗口
初始图像经过特征提取网络得出特征图(feature),要想识别出图片所有可能存在的物体,穷举法必然是我们的第一反应。而对应于图片识别的穷举法便是滑动窗口了,顾名思义,就像滑动的窗口一样一步一步探测窗口内是否含有物体。可是对特征图滑窗可以真的映射到原图片吗?答案是肯定的,正是因为如此Fast RCNN才能达到比较高的速度。具体如何实现可以参考(OverFeat: Integrated recognition , localization and detection using convolutional networks)。仅仅有窗口并不够,我们要的是物体的具体坐标,而窗口只能给出大致的位置,或者说该物体的局部位置,于是有了锚箱(anchor box)的想法。对于每个窗口,有k个锚箱与之对应。论文中给出的锚箱有9个,三种面积{ 1282,2562,5122 128 2 , 256 2 , 512 2 } * 三种比例{ 1:1,1:2,2:1 1 : 1 , 1 : 2 , 2 : 1 }。对于每个锚箱,有6个输出向量,2个变量代表是目标和不是目标的概率,另外4个是关于坐标的预测。既然每个锚箱都有了具体的位置,为什么还要对坐标进行具体预测呢?实质上锚箱只能给出模糊的位置,所以每个锚箱对应到具体的物体还需要添加偏移量。具体公式
tx=(x−xa)/wa,ty=(y−ya)/ha,tw=log(w/wa),th=log(h/ha) t x = ( x − x a ) / w a , t y = ( y − y a ) / h a , t w = l o g ( w / w a ) , t h = l o g ( h / h a )
t∗x=(x∗−xa)/wa,t∗y=(y∗−ya)/ha,t∗w=log(w∗/wa),t∗h=log(h∗/ha) t x ∗ = ( x ∗ − x a ) / w a , t y ∗ = ( y ∗ − y a ) / h a , t w ∗ = l o g ( w ∗ / w a ) , t h ∗ = l o g ( h ∗ / h a )x,y,w,h 分别表示预测值;
xa,ya,ha,wa x a , y a , h a , w a 表示Anchor Boxes;
t∗x,t∗y,t∗w,t∗h t x ∗ , t y ∗ , t w ∗ , t h ∗ 表示真实物体位置
感受野
对于特征图中的每个点,对应原图片中的面积大小,称之为感受野。这里有一个疑惑,感受野的大小(已经计算经过VGG网络的特征图,感受野为228)竟然可以小于锚箱的大小,不能理解。
这里给出相关计算公式
nout=⌊nout+2p−k⌋/s+1 n o u t = ⌊ n o u t + 2 p − k ⌋ / s + 1
jout=jin∗s j o u t = j i n ∗ s
rout=rin+(k−1)∗jin r o u t = r i n + ( k − 1 ) ∗ j i n
startout=startin+((k−1)/2−p)∗jin s t a r t o u t = s t a r t i n + ( ( k − 1 ) / 2 − p ) ∗ j i n
n表示特征点个数,j表示特征点数的距离,r表示感受野,start有效表示开始点(考虑paddle)
具体网络
feature(conv3-512) → → conv3-512 → → conv1-18,conv1-36(18为9 * 2类别预测,36为9 * 4位置预测)
损失函数
L(pi,ti)=1Ncls∑iLcls(pi,p∗i)+λ1Nreg∑ip∗iLreg(ti,t∗i) L ( p i , t i ) = 1 N c l s ∑ i L c l s ( p i , p i ∗ ) + λ 1 N r e g ∑ i p i ∗ L r e g ( t i , t i ∗ )
Lcls=−(p∗ilogpi+(1−p∗i)log(1−pi)) L c l s = − ( p i ∗ log p i + ( 1 − p i ∗ ) log ( 1 − p i ) )
Lreg(ti,t∗i)=smoothL1(ti−t∗i) L r e g ( t i , t i ∗ ) = s m o o t h L 1 ( t i − t i ∗ )
smoothL1(x)={0.5x2,|x|−0.5if |x|<1otherwise. s m o o t h L 1 ( x ) = { 0.5 x 2 , if | x | < 1 | x | − 0.5 otherwise.
四、Fast R-CNN
RPN网络预测物体位置,然后将位置信息传给Fast R-CNN检测网络,提取给定位置后的特征图信息进行分类,并进行位置精修得出最后的结果
ROI层
RPN预测的物体大小不一,意味着给出的特征图的向量维数不一致。然而对于后面的全连接层必须保证维数一致。因此这里借鉴了SPPNET的思想,进行了MaxPooling。对于任意特征图m * n,固定输出为7 * 7矩阵。即进行卷积核大小为m/7 * n/7的MaxPooling。
具体网络
feature(conv3-512),RPNproposal → → ROI(7*7*512) → → FC(4096) → → FC(4096) → → (SVD)FC21,(SVD)FC84