R-FCN 简介

一背景

在目标识别领域,长久以来存在两个矛盾:
分类网络的位置不敏感性:对于分类任务而言,我们希望随着某个目标在图片中不断的移动,我的网络仍然可以准确的将你区分为对应的类别。
实验表明,深的全卷积网络能够具备这个特性,如ResNet-101等。
检测网络的位置敏感性:对于检测任务而言,我们希望可以准确的输出目标所在的位置值。也就是随着某个目标的移动,我的网络希望能够和它一起移动,仍然能够准确的检测到它,即目标位置的移动很敏感。需要计算对应的偏差值,需要计算我的预测和GT的重合率等。但是,深的全卷积网路不具备这样的一个特征。

分类网络的位置不敏感性和检测网络的位置敏感性的一个矛盾问题,R-FCN提出了Position-sensitive score maps。

二 算法步骤

R-FCN 简介_第1张图片
如图所示,我们先来分析一下R-FCN算法的整个运行步骤,使得我们对整个算法有一个宏观的理解,接下来再对不同的细节进行详细的分析。

  1. 首先,我们选择一张需要处理的图片,并对这张图片进行相应的预处理操作;
  2. 接着,我们将预处理后的图片送入一个预训练好的分类网络中(这里使用了ResNet-101网络的Conv4之前的网络),固定其对应的网络参数;
  3. 接着,在预训练网络的最后一个卷积层获得的feature map上存在3个分支,第1个分支就是在该feature map上面进行RPN操作,获得相应的ROI;第2个分支就是在该feature map上获得一个K*K*(C+1)维的位置敏感得分映射(position-sensitive score map),用来进行分类;第3个分支就是在该feature map上获得一个4*K*K维的位置敏感得分映射,用来进行回归;
  4. 最后,在K*K*(C+1)维的位置敏感得分映射和4*K*K维的位置敏感得分映射上面分别执行位置敏感的ROI池化操作(Position-Sensitive Rol Pooling,这里使用的是平均池化操作),获得对应的类别和位置信息。

这样,我们就可以在测试图片中获得我们想要的类别信息和位置信息啦。

3 核心内容

3.1Position-Sensitive Score Map

R-FCN会在共享卷积层的最后一层网络上接上一个卷积层,而该卷积层就是位置敏感得分图position-sensitive score map,该map是一层卷积层,它的height和width和共享卷积层的一样(即具有同样的感受野),但是它的通道个数为K*K*(C+1) 。其中C表示物体类别种数,再加上1个背景类别,所以共有(C+1)类,而每个类别都有 K*K个score maps。现在我们只针对其中的一个类别来进行说明,假设我们的目标属于人这个类别,那么其有 K*K 个score maps,每一个score map表示原始图像中的哪些位置含有人的某个部位,该score map会在含有对应的人体的某个部位的位置有高的响应值,也就是说每一个score map都是用来描述人体的其中一个部位出现在该score map的何处,而在出现的地方就有高响应值”。既然是这样,那么我们只要将RoI的各个子区域对应到属于人的每一个score map上然后获取它的响应值就好了。但是要注意的是,由于一个score map都是只属于一个类别的一个部位的,所以RoI的第 i个子区域一定要到第i张score map上去寻找对应区域的响应值,因为RoI的第i个子区域需要的部位和第i张score map关注的部位是对应的。那么现在该RoI的K*K个子区域都已经分别在属于人的K*K个score maps上找到其响应值了,那么如果这些响应值都很高,那么就证明该RoI是人。

3.2 Position-Sensitive Rol Pooling

ROl的K*K个子区域在各个类别的score maps上每个子区域的响应值,就是通过位置敏感Rol池化操作(Position-sensitive RoI pooling)找到的,其字面意思是池化操作是位置敏感的。
R-FCN 简介_第2张图片
通过RPN提取出来的RoI区域,其是包含了x,y,w,h的4个值,也就是说不同的RoI区域能够对应到score map的不同位置上,而一个RoI会被划分成K*K个bins(也就是子区域。每个子区域bin的长宽分别是 h/k 和 w/k ),每个bin都对应到score map上的某一个区域。既然该RoI的每个bin都对应到score map上的某一个子区域,那么池化操作就是在该bin对应的score map上的子区域执行,且执行的是平均池化。在前面已经讲了,第i个bin应该在第i个score map上寻找响应值,那么也就是在第i个score map上的第i个bin对应的位置上进行平均池化操作。由于有(C+1)个类别,所以每个类别都要进行相同方式的池化操作。
那么对于每个类别,该类别的K*K个值都表示该RoI属于该类别的响应值,那么将这K*K个数相加就得到该类别的score,那么一共有(C+1)个scores,那么在这(C+1)个数上面使用简单的softmax函数就可以得到各个类别的概率了(注意,这里不需要使softmax分类器了,只需要使用简答的softmax函数,因为这里就是通过简单的比大小来判断最终的类别的)。

3.4. Position-Sensitive Regression解析

即在ResNet的共享卷积层的最后一层上面连接一个与position-sensitive score map并行的score maps,该score maps用来进行regression操作,我们将其命名为regression score map,而该regression score map的维度应当是 4*K*K ,然后经过Position-sensitive RoI pooling操作后,每一个RoI就能得到4个值作为该RoI的x,y,w,h的偏移量了,其思路和分类完全相同
R-FCN 简介_第3张图片

四、总结

总的来讲,和Faster R-CNN相比,R-FCN具有更快的运行速度(2.5倍以上),稍微提高了一点检测精度,在速度和准确率之间进行了折中,提出position-sensitive score map来解决检。

参考:https://blog.csdn.net/WZZ18191171661/article/details/79481135

你可能感兴趣的:(深度学习)