Tic商业评论

关注微信公众号【站长自定义模块】,定时推送前沿、专业、深度的商业资讯。

 找回密码
 立即注册

QQ登录

只需一步,快速开始

微信登录

微信扫码,快速开始

  • QQ空间
  • 回复
  • 收藏

基于区域的全卷积网络(R-FCN)在目标检测中的应用

lijingle 目标检测 2021-12-11 16:06 1213人围观

直觉
让我们假设我们只有一个特征图检测右眼的脸。我们能用它来定位脸部吗?应该能。因为右眼应该在面部图片的左上角,所以我们可以很容易地用它来定位脸部。

通过右眼的位置,我们就知道脸应该在哪里。


然而,特征图很少给出如此精确的答案。但是,如果我们有专门用于检测左眼、鼻子或嘴巴的其他特征图,我们就可以将信息组合在一起,从而使人脸检测更加容易和准确。为了推广这一解决方案,我们创建了9个基于区域的特征映射,每个映射分别检测左上角、中中、右上、左中、…。或者物体的右下角区域。通过对这些特征映射的投票进行组合,我们确定了物体的类别和位置。


Motivations
基于R-CNN的检测器,如fast R-CNN或faster R-CNN,分两个阶段进行目标检测.
  • 生成 region proposals (ROIs),
  • 从ROIs中进行分类和定位(边界框)预测。

Fast R-CNN和Faster R-CNN流程概括如下:
 
feature_maps = process(image)

ROIs = region_proposal(feature_maps)

for ROI in ROIs

        patch = roi_pooling(feature_maps, ROI)

        class_scores, box = detector(patch)

        class_probabilities = softmax(class_scores) 
Fast R-cnn从整个图像中计算一次特征映射.然后,它直接从特征图中导出proposals (Rois)。对于每一个ROI,不需要更多的特征提取。这大大减少了这一过程的时间,因为大约有2000 Rois。同样的逻辑,R-FCN通过减少每个ROI所需的工作量来提高速度。基于区域的特征映射独立于ROI,可以在每个ROI之外进行计算。剩下的工作,简单得多,因此R-FCN比Fast R-CNN或Faster R-CNN更快。下面是用于比较的R-FCN伪代码。
 
feature_maps = process(image)

ROIs = region_proposal(feature_maps)         

score_maps = compute_score_map(feature_maps)

for ROI in ROIs

        V = region_roi_pool(score_maps, ROI)     

        class_scores, box = average(V)                   # Much simpler!

        class_probabilities = softmax(class_scores)  



R-FCN
关于细节部分,假设一个5×5的特征映射M,里面有一个正方形的对象。我们将正方形物体等分为3×3区域。现在,我们从M创建一个新的特征映射,仅检测正方形的左上角(TL)。新的特征图看起来像下面右边的那张。只有黄色网格单元[2,2]被激活。

从左侧创建一个新的特征图,以检测物体的左上角。

因为我们把正方形划分为9个部分(左上角tr,上中tm,右上tr,中左cf,…)。(右下角BR),我们创建了9个特征映射,每个特征映射检测对象的相应区域。这些特征映射被称为 position-sensitive score maps,因为每个map 检测对象的一个子区域(scores)。


假设下面的红色矩形是ROI选出。我们将其划分为3×3区域,并询问每个区域包含对象的对应部分的可能性。例如,左上角ROI区域包含左眼的可能性有多大.我们将结果存储到右图中的3×3投票数组中。

将ROI应用到特征图上,以输出3x3数组

这种将分数映射和ROIS映射到投票数组的过程称为position-sensitive ROI-pool,这与Fast R-CNN中的ROI pool 非常相似。
下表如下:
我们取左上角ROI区域,
将其映射到左上角 score map上(上中图)。
我们计算由左上角ROI(蓝色矩形)为界的左上角得分图的平均分数。蓝色矩形内约40%有0激活,60%有100%激活,即平均0.6。所以我们检测到左上角物体的可能性是0.6。
我们将结果(0.6)存储到array[0][0]中。
我们用中上的ROI来重做,但是现在用中高分图。
计算结果为0.55,并存储在array[0][1]中。此值表示我们检测到顶部-中间对象的可能性。

在计算position-sensitive ROI pool的所有值之后,class score是其所有元素的平均值。

假设我们有C类要检测。我们将其扩展到C+1类,因此我们为背景(非对象)添加了一个新类。每个类别都有自己的3×3分数图,因此总共有(C+1)×3×3分数图。使用它自己的一组分数图,我们预测每个类的类别分数。然后,我们对这些分数应用一个softmax 最大值来计算每个类的概率。

让我们看看一个真实的例子。下面,我们有9个分数图来检测婴儿的左上角到右下角区域。在最上面的图表中,ROI与地面真相很好地一致。中间列中的黄色矩形表示对应于特定分数图的ROI子区域。在每一张地图的黄色实心框内,激活度都很高。因此,投票数组中的分数很高,并且检测到了一个婴儿。在第二个图表中,ROI不对齐。得分地图是相同的,但相应的位置的ROI子区域(实心黄色)被移动。整体激活是低的,我们不会分类这个ROI包含一个婴儿。

下面是R-FCN的网络流.我们不把ROI划分为3×3区域和3×3 ROI池,而是将它们推广为k×k,即需要k×k×(C+1)记分图。因此,R-FCN引入特征映射,应用卷积生成深度为k×k×(C+1)的position-sensitive ROI pool图.对于每个ROI,我们应用position-sensitive ROI pool来生成k×k投票数组.我们对数组进行平均,并使用Softmax对对象进行分类。

以下是R-FCN的数据流。



边界框回归
利用卷积建立k×k×(C+1)score图进行分类。要执行边界框回归,其机制几乎是相同的。我们使用另一个卷积从相同的特征映射创建一个4×k×k映射。我们应用基于位置的ROI pool来计算一个k×k数组,每个元素都包含一个边界框。最后的预测是这些元素的平均值。

结果
Faster R-CNN++和R-FCN都使用ResNet-101进行特征提取.(R-FCN采用多尺度训练。)
R-FCN比Faster R-CNN快20倍



路过

雷人

握手

鲜花

鸡蛋
原作者: lijingle
我有话说......

TA还没有介绍自己。

电话咨询: 135xxxxxxx
关注微信