从two stages的RCNN系列再到one stage的SSD和YOLO,基于深度学习的目标检测算法在这波深度学习浪潮中迎来春天。我相信在后面的5年10年,无论是速度和精度,目标检测会有更大的发展。
本篇总结Faster RCNN中一些较难理解的point,相信大部分人在学习过程中耗费了较大时间精力,且网上有很多信息并无详细说明。本篇需要有RCNN和Fast RCNN的基础。
主要参考:雪柳花明http://www.360doc.com/content/17/0303/14/10408243_633634497.shtml
从RCNN开始,这一系列就是以region proposal为切入点,对其进行一些处理,然后得到类别和位置信息,到Faster RCNN,这个思路还是一样,只是对获取region proposal的方式进行转变,以及在输出类别和位置信息上进行简化。下面三个问题就是这样一个过程:
1、RCNN解决的是,“为什么不用CNN做classification呢?”
2、Fast R-CNN解决的是,“为什么不一起输出bounding box和label呢?
3、Faster R-CNN解决的是,“为什么还要用selective search呢?”
不用selective search,所以Faster RCNN最主要point是在Fast RCNN中加入了RPN这个模块,代替selective search来获取region proposal。
- RPN输入:经过卷积后得到的feature map,这里假设是ZF网络,最后的feature map是13*13*256,即有256个通道。
- RPN输出:每个region proposal(anchor)作为前景还是背景的概率值及其anchor相对于Ground Truth的位置偏移量(测试时通过这个偏移量和anchor在原图中的坐标即可计算出预测的框的坐标)。
- 我们知道对于13*13*256特征图会有一个3*3的窗口在上面滑动,由此也确定出需要的anchors。从代码上看这里用3*3的窗口滑动其实是3*3*256*256的卷积核,即256个3*3*256的卷积核对特征图进行卷积(stride = 1,padding = 1),将会得到12*12*256维数据。
- 锚点,很多资料上说是滑动窗口中心点,那相当于feature map上的每一点,我理解是feature map上每一点映射回原图区域的中心点,这个点就是相应的一组anchors的中心,一组anchors就是很多资料上说的不同宽高比以及同一个宽高比的不同尺度,一共有9个anchor。并且anchors的坐标是在原图上的坐标,即我们缩放后输入网络的原始图像,并不是在特征图上。
- 得到的12*12*256维数据分别输入cls层和loc层。cls层是18个神经元(9个anchor,每个anchor有两种可能),即用18个1*1*256卷积核(1*1*256*18)进行卷积,得到18个输出。同样loc层就是用36个1*1*256卷积核进行卷积,得到36个输出(每个anchor有4个值)。
- anchors的作用:1、在确定anchor作为正样本还是负样本时,需要anchor的坐标来计算IOU值。2、在训练时,需要anchor的坐标计算其相对于GT的偏移量。3、在测试时,利用anchor的坐标和已知的偏移量推算预测框的坐标。
- 训练RPN网络,使用的损失函数是smooth L1 loss+softmaxloss,和后面Fast RCNN一样。RPN经过回归与分类得到了准确性更高的region proposal,且数量大量减少(原来要2000个,经过RPN后降低到300个左右,且召回率下降不大),这个结果作为fast rcnn的输入,输入fast rcnn的ROI层。