前面所说的RCNN作为最早的目标检测网络,具有一些问题,其对每一个ROI都做一遍卷积(费时);对于感兴趣区域的筛选也费时;随后FastR-CNN、Faster-CNN给出了解决方案。之后学者又去思考后面的全连接层能不能去掉,或者不让每一个感兴趣区域都走一遍全连接,这也很费时间啊!(我们了解在图像分类中,人们都很讨厌全连接层,参数量太大),为此R-FCN出现了!
1回顾
回顾R-CNN系列的方案都是在解决一个计算量计算时间的问题,R-CNN存在一些问题,SPP-net提出金字塔池化层,将卷积放在前面,实现了一张图卷积一次就行,降低了大量时间!Fast R-CNN提出了ROI池化,引入并行的多任务损失函数,也提高了效率!到了Faster R-CNN认为区域建议网络也可以环程卷积网络,提出了RPN网络~~。本篇文章介绍下一个迭代版本R-FCN将后面的全连接层分类层也换成卷积网络!
2位置敏感性的理解
写着一部分看了好多文章都没看懂,查了好多资料总结到如下,之后有新的理解会加上,如果朋友们有好的文章解释可以推荐给我。
首先,对于图片分类问题,我们用比较深的卷积网络比较好,当网络比较深的时候,分类问题对于位置的敏感性就较差,因为一张图片通过一个深的网络到了后面再到全连接层,位置的变动对于后面特征的影响比较小了,所以它的识别还是会准确,这就是位置不敏感,平移不变性。
然而对于定位问题,我们需要得到它的定位,网络过于深的化就会造成我们定位不准确,平移不变!所以构造一个浅的网络可能对于分类来说比较好。
再来看个Faster R-CNN + ResNet-101结构的例子。这个是参考文献3给出的,如果在Faster R-CNN中没有ROI层,直接对整个feature map进行分类和位置的回归,由于ResNet的结构较深,平移可变性较差,检测出来的坐标会极度不准确。具体网络可以自己查一下!
如果在ResNet中间(conv4与conv5间)加个ROI层结果就不一样了,此时到了第四卷积层才给框选区域,坐标还是有的,此时分类器离得比较近了,分类器对于位置的敏感程度比较低了!也就是平移可变性!ROI层提取出的proposal中,有的对应前景label,有的对应背景label,proposal位置的偏移就有可能造成分类器(前景和背景分类)的不同。偏移后原来的前景很有可能变成了背景,原来的背景很有可能变成了前景,换句话说分类loss对proposal的位置是敏感的,这种情况ROI层给深层网络带来了平移可变性。
如果把ROI加到ResNet的最后一层(图1 conv5后)结果又是怎样呢?conv5的第一个卷积stride是2,造成conv5输出的feature map更小,这时proposal的一个小偏移在conv5输出上很有可能都感知不到,即proposal对应的label没有改变,此时识别出来的位置准确度会很差。
作者在考虑前人的实验后,想着把ROI向后靠一下是不是就能把全连接层也共享了!实则会导致位置的准确度降低的!所以考虑这些因素,他提出了位置敏感卷积网络。
3位置敏感卷积层网络
下图为R-FCN网络(这里说明一下,下面应该是还有一个回归!),其中红色部分是修改后的分类器,我们可以看出前面卷积之后得到featuremap之后有一部分向上去做RPN网络了,这个和FasterR-CNN一样。另一路去做分类了~~这里你会看到它写的是conv卷积,对没错,我们用一个卷积得到一个具有深度为K*K*(C+1)的特征。C+1代表类别,C个类别加一个背景。K是啥意思?这个K*K我们表示它属于某个类别上左、上中、上右…的可能性。下图中每个颜色块代表一个方位,一共3*3=9个方位,每个方位其实是包含C+1个的。再通俗点黄色层其实不是一层有C+1个层,分别代表它属于每个类别左上角的概率!
然后它不是有很多ROI,它用ROI套住一个区域,对于第一类,他需要从这9个大层中对应这个类的小层得到一个平均结果,然后把这9个数组合投票~看他是不是这个类。
看下面这个图,每个大层有C+1个,然后对ROI抽取后得到饼图,有C+1个类所以是C+1层,再求一个得分得到C+1的向量。
那么这时需要解决两个问题:
First 对于一个ROI如何抽成一个点
Second 投票怎么投?
好,接下来说这个问题。
First 对于一个ROI如何抽成一个点
这里它直接采取平均值的方法,所有像素值的平均值来代表一个值。
Second 投票怎么投?
对于投票,他也是计算的这K*K个值的平均值。哈哈!
4位置敏感回归
前面分类有了,那么回归位置呢?思路是一样的!前面分类是卷积为K*K*(C+1),回归的话就是四个参数啊,左上角右上角坐标!,那就是K*K*4,其他的就和上面一样了。
即在ResNet的共享卷积层的最后一层上面连接一个与position-sensitive score map并行的score maps,该score maps用来进行regression操作,我们将其命名为regression score map,而该regression score map的维度应当是 4KK ,然后经过Position-sensitive RoI pooling操作后,每一个RoI就能得到4个值作为该RoI的x,y,w,h的偏移量了,其思路和分类完全相同。
5损失的定义
然后就是怎么去定义这个损失,只有定义好损失,网络才能按照作者的设想去跑啊!,看下面这个图(图都是从小象课堂的PPT上截取的,感谢!)。
先主要说一下分类损失,得到上面的投票,C+1的向量对这个值softmax归一化,其实就是都去指数幂次,然后把正确的做分子,这样看正确类别分类的得分是否够大,不大的话,呵呵损失就大,那么网络训练就回去矫正,那么为了让损失小,就得让这个类别的得分高,那么就得让前面的位置敏感卷积层的得分高~这样从理论上应该是能实现的。
6可视化结果
论文中给出了其可视化的结果,如下图所示,可以看出,当这个ROI选对了,那么对于人这个类别,它得出的9个方位图在中间,我们可以看出左上角其实不太属于人,看中间那个图高亮的区域少;中间部位其实肯定属于人了,我们看出第五个格子几乎全部高亮,以此类推可以分析其他格子,最后计算每个格子的平均得到右图,可以看出其值比较高,属于人类。
图2哪个区域选歪了之后就不一样了得分低一点,也很好分析!
7实验效果
作者首先做了一个实验去测试一下不同的位置敏感池化单元尺寸对结果的影响,可以看出1*1的尺寸,也就是对于一个ROI不分块,失败!3*3也就是分成左上左中左下九份效果还可以,7*7的效果最好。
之后又做了对比试验,与之前的网络做了对比。可以看出效果得到了现主的提升,在保证效果的同时,时间更短!
8参考文献
[1]小象学堂课程PPT
[2]R-FCN详解
https://blog.csdn.net/WZZ18191171661/article/details/79481135
[3]解答关于R-FCN的所有疑惑(原创)
https://www.jianshu.com/p/409fd61db9db