目标检测6--R-FCN中的Position-Sensitive RoI Pooling


欢迎访问个人网络日志🌹🌹知行空间🌹🌹


1.介绍

论文: Region-based Fully Convolutional Networks

代码: R-FCN

本论文作者同9.Deformable CNN,是清华大学的代季峰等于2016年05月份发表的。

这篇文章中作者提出了R-FCN,Region Based Fully Convolutional Network,2016年的时候对标的还是Region BasedFast/Faster R-CNN算法。R-FCN是一种全卷积的网络结构,几乎所有的计算对于整张图像都是共享的,因此结果相比更为准确,计算更为高效。在这篇文章中作者提出了Position-Sensitive评分图以解决分类问题中对象的平移不变性和目标检测问题中的位置敏感性。

2.Position-Sensitive Score Map 和 Position-Sensitive RoI Pooling

R-FCN的整体架构:

在这里插入图片描述

可以看到网络总体结构和Faster R-CNN十分相似,都是由RPNRoI组成,明显的不同是图中Feature Maps被赋予了不同颜色,其被称之为Position-Sensitive Score Maps,具体含义如下面介绍。

在这里插入图片描述

如上图,Position-Sensitive Score Maps的通道数为 k 2 ( C + 1 ) k^2(C+1) k2(C+1),其中C是检测对象的类别,+1表示的是背景类, k k k表示的是RoI Pooling后得到的feature map的宽高,正如上图中所注释的,Position-Sensition Score Map上每个通道(一种颜色)所表示的是RoI所分的 k × k k\times k k×k区域中的一个区域属于C+1类别的概率,这相当于把对象按部位拆成了 k 2 k^2 k2类别,分别判断某个部位所属的类别和位置。如下图检测human类别时,k=3Position-Sensititve Score Maps中可以理解为:

在这里插入图片描述

Position-Sensitive Score Map上做RoI Pooling时,输出 k × k k\times k k×k大小的feature map中的每一部分,分别取自Position-Sensitive Score Map的对应C+1个通道上,并非取自所有通道,在以上Position-Sensitive RoI Pooling图中用不同的颜色表示,因此Pooling后输出的feature map的大小为kxkx(C+1)

将一个大小为 w × h w\times h w×hRoI分成 k × k k\times k k×k个网格,则每个网格的大小近似取整为 w k × h k \frac{w}{k}\times\frac{h}{k} kw×kh,第 ( i , j ) (i,j) (i,j)个网格( 0 ≤ i , j ≤ k 0\le i,j \le k 0i,jk)对应的池化操作只发生在的特征图通道 [ ( i × k + j ) × ( C + 1 ) , ( i × k + j + 1 ) × ( C + 1 ) ) [(i\times k+j)\times(C+1),(i\times k+j+1)\times(C+1)) [(i×k+j)×(C+1),(i×k+j+1)×(C+1))范围的特征图上,Position-Sensitive RoI Pooling的公式化表示为:

r c ( i , j ∣ Θ ) = ∑ ( x , y ) ∈ b i n ( i , j ) z i , j , c ( x + x 0 , y + y 0 ∣ Θ ) / n r_c(i,j|\Theta) = \sum_{(x,y)\in bin(i,j)}z_{i,j,c}(x+x_0,y+y_0|\Theta) /n rc(i,j∣Θ)=(x,y)bin(i,j)zi,j,c(x+x0,y+y0∣Θ)/n

其中 Θ \Theta Θ表示的是网络的可学习参数, c ∈ ( C + 1 ) c\in(C+1) c(C+1)表示的是类别中的一种, r c r_c rcRoI Pooling的结果, z i , j , c z_{i,j,c} zi,j,cPosition-Sensative Score Map上通道 ( i × k + j ) × ( C + 1 ) + c (i\times k+j)\times(C+1)+c (i×k+j)×(C+1)+c的特征图,nRoI一个网格对应的Position-Sensative Score Map像素个数。

虽然网络结构中定义了这种操作,但是在网络训练时并没有进行有监督的训练,因此不禁让人怀疑最后网络的学习结果是否能反映出RoI不同部分的评分大小呢,在论文中作者给出了可视化的效果,说明了训练后Position-Sensitive RoI Pooling的有效性,图中右侧RoI Pool所得的结果中,评分越低颜色越深

在这里插入图片描述

最后再补上,在2017年作者提出的Deformable RoI Pooling也对Position-Sensitive RoI Pooling做了改进。

3.源码

源码地址:Deformable-ConvNets/rfcn/operator_cxx/psroi_pooling.cu

/** 这里值得注意的是与论文上表述不同,代码实现中score map的channel不是pooled_width * pooled_height * (C+1)
* 而是 group_size * group_size * (C + 1)
* 而且score_map 特征图channel方向数据的平列方式是(C+1)x(group_size*group_size)而非,(group_size*group_size) x(C+1)
*/
template <typename DType>
__global__ void PSROIPoolForwardKernel(
  const int count,
  const DType* bottom_data,
  const DType spatial_scale,
  const int channels,
  const int height, const int width,
  const int pooled_height, const int pooled_width,
  const DType* bottom_rois,
  const int output_dim,
  const int group_size,
  DType* top_data,
  DType* mapping_channel) {
  CUDA_KERNEL_LOOP(index, count) {
    // The output is in order (n, ctop, ph, pw)
    int pw = index % pooled_width;
    int ph = (index / pooled_width) % pooled_height;
    int ctop = (index / pooled_width / pooled_height) % output_dim;
    int n = index / pooled_width / pooled_height / output_dim;

    // [start, end) interval for spatial sampling
    const DType* offset_bottom_rois = bottom_rois + n * 5;
    int roi_batch_ind = offset_bottom_rois[0];
    DType roi_start_w = static_cast<DType>(round(offset_bottom_rois[1])) * spatial_scale;
    DType roi_start_h = static_cast<DType>(round(offset_bottom_rois[2])) * spatial_scale;
    DType roi_end_w = static_cast<DType>(round(offset_bottom_rois[3]) + 1.) * spatial_scale;
    DType roi_end_h = static_cast<DType>(round(offset_bottom_rois[4]) + 1.) * spatial_scale;

    // Force too small ROIs to be 1x1
    DType roi_width = max(roi_end_w - roi_start_w, 0.1); //avoid 0
    DType roi_height = max(roi_end_h - roi_start_h, 0.1);

    // Compute w and h at bottom
    DType bin_size_h = roi_height / static_cast<DType>(pooled_height);
    DType bin_size_w = roi_width / static_cast<DType>(pooled_width);

    int hstart = floor(static_cast<DType>(ph) * bin_size_h
                        + roi_start_h);
    int wstart = floor(static_cast<DType>(pw)* bin_size_w
                        + roi_start_w);
    int hend = ceil(static_cast<DType>(ph + 1) * bin_size_h
                      + roi_start_h);
    int wend = ceil(static_cast<DType>(pw + 1) * bin_size_w
                      + roi_start_w);
    // Add roi offsets and clip to input boundaries
    hstart = min(max(hstart, 0), height);
    hend = min(max(hend, 0), height);
    wstart = min(max(wstart, 0),width);
    wend = min(max(wend, 0), width);
    bool is_empty = (hend <= hstart) || (wend <= wstart);

    int gw = floor(static_cast<DType>(pw)* group_size / pooled_width);
    int gh = floor(static_cast<DType>(ph)* group_size / pooled_height);
    gw = min(max(gw, 0), group_size - 1);
    gh = min(max(gh, 0), group_size - 1);
    int c = (ctop*group_size + gh)*group_size + gw;

    const DType* offset_bottom_data = bottom_data + (roi_batch_ind * channels + c) * height * width;
    DType out_sum = 0;
    for (int h = hstart; h < hend; ++h){
      for (int w = wstart; w < wend; ++w){
        int bottom_index = h*width + w;
        out_sum += offset_bottom_data[bottom_index];
      }
    }

    DType bin_area = (hend - hstart)*(wend - wstart);
    top_data[index] = is_empty? (DType)0. : out_sum/bin_area;
    mapping_channel[index] = c;
  }
}


欢迎访问个人网络日志🌹🌹知行空间🌹🌹


参考资料

<think>好的,用户想了解R-FCN的工作原理。我需要先回忆一下R-FCN的基本概念和相关知识。R-FCN全称是Region-based Fully Convolutional Networks,是一种用于目标检测的模型。它结合了Faster R-CNN和全卷积网络的特点,旨在提高检测速度和准确率。 首先,我应该从目标检测的背景说起。传统的Faster R-CNN在生成候选区域后,需要对每个区域进行独立的分类和回归,这会导致重复计算,影响速度。而R-FCN通过全卷积网络来减少计算量,提升效率。 接下来,R-FCN的关键点在于位置敏感得分图(position-sensitive score maps)。这些得分图将物体的不同部分信息编码到不同的通道中,这样在ROI Pooling时,可以聚合这些信息得到最终的分类和回归结果。这种方法减少了每个ROI的计算量,因为大部分计算在共享的卷积层中完成,而不是每个区域都单独处理。 然后需要解释R-FCN的结构。它通常由共享的卷积层生成特征图,然后生成位置敏感得分图。ROI Pooling层会根据候选区域的位置从得分图中提取特征,并进行投票,得到分类和边界框回归的结果。这里需要强调全卷积的设计,避免了全连接层,从而提升速度。 可能还需要对比Faster R-CNN,指出R-FCN的优势,比如更快的速度,同时保持较高的准确率。此外,位置敏感得分图的设计使得模型能够更好地捕捉物体的空间信息,这对于检测不同姿态的物体尤为重要。 用户提供的引用中有提到全卷积网络(FCN)用于像素级分类,这可能与R-FCN中的全卷积部分有关联。需要说明R-FCN如何利用类似的思想,但应用于目标检测任务,通过区域建议和位置敏感机制来适应检测需求。 最后,确保回答结构清晰,分点解释关键组件和工作原理,同时引用相关的参考文献,比如位置敏感得分图的概念可能来自原始论文,需要正确标注引用。还要注意使用正确的中文术语和LaTeX格式,比如数学符号或公式需要用$...$包裹。</think>### R-FCN目标检测工作原理分步解析 R-FCN(Region-based Fully Convolutional Network)是微软研究院提出的高效目标检测框架,其核心创新在于$位置敏感得分图$(position-sensitive score maps)的设计[^1]。主要工作原理可分为以下四个关键步骤: 1. **全卷积特征提取** - 使用ResNet等卷积网络提取共享特征图(如$C5$层) - 所有计算保持在卷积层,避免全连接层的参数冗余 - 最后一层卷积输出$k^2(C+1)$通道的位置敏感得分图($k=3$或$k=7$) $$ FeatureMap \in \mathbb{R}^{H×W×[k^2(C+1)]} $$ 2. **位置敏感ROI池化** - 对每个候选区域(ROI)执行特殊池化操作 - 将$k×k$空间网格对应到特征图的$k^2$个通道组 - 每个空间单元仅从其对应的通道组提取特征值 3. **投票机制** - 池化后的$k×k$特征图进行跨通道平均池化 - 生成最终的$(C+1)$维类别概率分布 - 边界框回归使用相同机制,但特征通道独立设计 ```python # 伪代码示例:位置敏感池化 def position_sensitive_roi_pool(feature_map, roi): k = 3 # 空间网格尺寸 c = 21 # 类别数 group_size = k*k*(c+1) pooled = [] for i in range(k*k): channel_group = feature_map[:, :, i*(c+1):(i+1)*(c+1)] pooled.append(roi_pool(channel_group, roi)) return average(pooled) ``` 4. **端到端训练** - 分类损失使用交叉熵损失 - 回归损失采用平滑L1损失 - 通过可微分的ROI池化实现梯度反向传播 与Faster R-CNN的关键区别在于:R-FCN将计算量最大的卷积操作保持在共享特征图上,而每个ROI只需进行轻量级的池化操作。这种设计使R-FCN在保持高精度的同时,推理速度提升2.5-20倍。 : R-FCNposition-sensitive机制通过空间编码保留目标位置信息,类似语义分割中的位置敏感特征映射 [^2]: 全卷积结构与FCN的像素级预测思想一脉相承,但通过区域建议机制适应检测任务需求
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值