Faster R-CNN: Two-Stage 目标检测算法
一、原理
Faster R-CNN = RPN+Fast R-CNN
1)CNNA+RPN 粗略地挑选出候选框推荐给到Fast R-CNN,这里只挑选不分类
2)CNNB+Fast R-CNN进行精确地分类和边界回归,两者的共享单元为CNN(CNN A=CNN B),Feature map。因为Feature map由CNN得到,所以平时只说共享单元为Feature map。
粗略地挑选出候选框
注:这里用原图表示了特征图,feature map和原图的关系为:
feature map是由原图下采样得到的,所以feature map中的一点就相当于原图中的一部分感受野
精确分类和边界回归
二、主干网络的执行思路
步骤:
1)Faster R-CNN一般会把输入图片的短边固定成600
2)Faster R-CNNK可以采用多种特征提取网络backbone,常用的有VGG,Resnet,Xception等等,本文采用的是Resnet网络。
ResNet50:
ResNet50有两个基本的块,分别名为Conv Block和Identity Block,其中Conv Block输入和输出的维度是不一样的,所以不能连续串联,它的作用是改变网络的维度;Identity Block输入维度和输出维度相同,可以串联,用于加深网络的。
Conv Block的结构如下:
Identity Block的结构如下:
这两个都是残差网络结构。
Faster-RCNN的主干特征提取网络部分只包含了长宽压缩了四次的内容,第五次压缩后的内容在ROI中使用。即Faster-RCNN在主干特征提取网络所用的网络层如图所示。
以输入的图片为600x600为例,shape变化如下:
3)粗略选取候选框(Proposal regions)
获得的公用特征层在图像中就是Feature Map,其有两个应用,一个是和ROIPooling结合使用、另一个是进行一次3x3的卷积后,进行一个18通道的1x1卷积,还有一个36通道的1x1卷积。
在Faster-RCNN中,num_priors也就是先验框的数量就是9,所以两个1x1卷积的结果实际上也就是:
9 x 4的卷积的结果会对这些先验框指针对原图坐标进行调整,获得一个新的框,使其接近ground truth。
9 x 2的卷积 用于预测 公用特征层上 每一个网格点上 每一个预测框内部是否包含了物体。
当我们输入的图片的shape是600x600x3的时候,公用特征层的shape就是38x38x1024,相当于把输入进来的图像分割成38x38的网格,然后每个网格(共享特征层的网格)存在9个先验框,这些先验框有不同的大小,在图像上密密麻麻。
https://www.cnblogs.com/Terrypython/p/10584384.html
为什么是18,36通道?
首先我们知道有H x W个结果,我们随机取一点,它跟原图肯定是有个一一映射关系的,由于原图和特征图大小不同,所以特征图上的一个点对应原图肯定是一个框,然而这个框很小,比如说8 x 8,这里8是指原图和特征图的比例,所以这个并不是我们想要的框,那我们不妨把框的左上角或者框的中心作为锚点(Anchor),然后想象出一堆框,具体多少,聪明的读者肯定已经猜到,K个,这也就是图中所说的K anchor boxes(由锚点产生的K个框);换句话说,H x W个点,每个点对应原图有K个框,那么就有H x W x k个框默默的在原图上,那RPN的结果其实就是判断这些框是不是物体以及他们的偏移;那么K个框到底有多大,长宽比是多少?这里是预先设定好的,共有9种组合,所以k等于9,最后我们的结果是针对这9种组合的,所以有H x W x 9个结果,也就是18个分数和36个坐标;