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

news2024/10/1 15:28:25

文章目录

    • 1.介绍
    • 2.Position-Sensitive Score Map 和 Position-Sensitive RoI Pooling
    • 3.源码
    • 参考资料


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


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;
  }
}


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


参考资料

  • 1.https://zhuanlan.zhihu.com/p/30867916

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/348307.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

电子组装流水线MES系统实行条码质量追溯

在电子制造行业&#xff0c;保证生产过程的稳定性与对制造关键能力的改善与提升&#xff0c;是大多数制造企业的管理重心&#xff0c;而缺乏有效的方法与手段。MES系统即制造执行系统&#xff0c;是企业信息集成的纽带&#xff0c;企业实施敏捷制造战略&#xff0c;实现车间生产…

C++学习记录——십 STL初级认识、标准库string类

文章目录1、什么是STL2、STL简介3、什么是string类4、string类的常用接口说明1、常见构造函数2、容量操作3、迭代器4、其他的标准库的string类关于string类的内容&#xff0c;可以在cplusplus.com查看到。 1、什么是STL STL是C标准库的重要组成部分&#xff0c;不仅是一个可复…

指 针

1.指针指针的作用: 可以通过指针间接访问内存&#xff08;可以通过指针的保存一个地址&#xff08;指针--地址&#xff09;&#xff09;内存编号是从0开始记录的&#xff0c;一般用十六进制数字表示。可以利用指针变量保存地址指针变量的定义和使用指针变是定义语法: 数据类型 …

【MFC】模拟采集系统——图形按钮(18)

左边可以简单地使用一个组框&#xff0c;贴上背景图。当然&#xff0c;也可以使用新的对话框。 图形按钮类 1、类向导-》添加类-》选择MFC-》填入新类名称-》选择父类为 CButton 2、添加消息响应函数和虚函数&#xff1a; 消息响应mouse leave (离开&#xff09; mouse move …

CSS3 animation-fill-mode详解

CSS3 animation-fill-mode详解 定义 animation-fill-mode 属性规定当动画不播放时&#xff08;当动画完成时&#xff0c;或当动画有一个延迟未开始播放时&#xff09;&#xff0c;要应用到元素的样式。 默认情况下&#xff0c;CSS 动画在第一个关键帧播放完之前不会影响元素&…

各CCFA类核心期刊的信息汇总与评价总结(科技领域)

CCF中文期刊投稿选择之篇章二:各CCFA类核心期刊的信息汇总与评价总结上一篇章总结一部分期刊的介绍自动化学报相关信息的介绍有关录用比、审稿速度及费用的相关数据收集相关学术论坛上网友的评价与讨论期刊年度出版概况与学术热点动态&#xff08;知网&#xff09;计算机学报相…

2023年可供学习的 10 大 SaaS 知识库工具!

客户迫切希望快速找到所需的信息。在软件行业尤其如此&#xff0c;因为软件行业节奏很快&#xff0c;公司经常销售学习曲线陡峭的产品。为了减缓流失率并提高盈利能力&#xff0c;SaaS 公司正在转向知识库&#xff0c;以帮助他们让客户了解情况。什么是知识库&#xff1f;您可以…

设计模式之代理模式详解和应用

目录1 代理模式定义2 代理模式的应用场景3 代理模式的通用写法4 从静态代理到动态代理5 静态模式在业务中的应用6 动态代理在业务中的应用7 手写JDK动态代理实现原理7.1 JDK动态代理的实现原理7.2 CGLib动态代理容易踩的坑8 CGLib代理调用API及原理分析9 CGLib和JDK动态代理对比…

JVM - 高效并发

目录 Java内存模型和内存间的交互操作 Java内存模型 内存间的交互操作 内存间交互操作的规则 volatile特性 多线程中的可见性 volatile 指令重排原理和规则 指令重排 指令重排的基本规则 多线程中的有序性 线程安全处理 锁优化 锁优化之自旋锁与自适应自旋 锁优…

jvisualvm工具使用

jdk自带的工具jvisualvm&#xff0c;可以分析java内存使用情况&#xff0c;jvm相关的信息。 1、设置jvm启动参数 设置jvm参数**-Xms20m -Xmx20m -XX:PrintGCDetails** 最小和最大堆内存&#xff0c;打印gc详情 2、测试代码 TestScheduleClassGc package com.core.schedule;…

LeetCode 82. 删除排序链表中的重复元素 II

原题链接 难度&#xff1a;middle\color{orange}{middle}middle 题目描述 给定一个已排序的链表的头 headheadhead &#xff0c; 删除原始链表中所有重复数字的节点&#xff0c;只留下不同的数字 。返回 已排序的链表 。 示例 1&#xff1a; 输入&#xff1a;head [1,2,3,…

ASML逆袭史:人、资金、技术,缺一不可

前言 近年来&#xff0c;由于众所周知的原因&#xff0c;荷兰ASML&#xff08;阿斯麦&#xff09;公司的先进半导体制造设备——光刻机&#xff0c;进入普通大众视野&#xff0c;成为人们茶余饭后谈论的焦点话题之一。 1月底&#xff0c;“美日荷三方谈判达成协议&#xff0c;可…

Selenium自动化测试Python二:WebDriver基础

欢迎阅读WebDriver基础讲义。本篇讲义将会重点介绍Selenium WebDriver的环境搭建和基本使用方法。 WebDriver环境搭建 Selenium WebDriver 又称为 Selenium2。 Selenium 1 WebDriver Selenium 2 WebDriver是主流Web应用自动化测试框架&#xff0c;具有清晰面向对象 API&…

SAP ABAP 输出结果带有空格

方法一&#xff1a; 字段内容前增加空格&#xff0c;需使用全角空格&#xff0c;使用半角空格时&#xff0c;ALV显示无效&#xff0c;空格无法显示&#xff0c; 全角与半角的切换方法&#xff1a;shift空格切换&#xff0c; 如下的标记部分&#xff0c;要想通过ALV显示空格&…

mfc140u.dll丢失的解决方法,mfc140u.dll文件修复

mfc140u.dll丢失的解决方法&#xff0c;其实要解决这个问题一点都不难&#xff0c;我们主要知道是什么原因造成的&#xff0c;那么就可以轻松的解决。 一.mfc140u.dll是什么 "MFC140u.dll"是一个Windows动态链接库文件&#xff0c;它是Microsoft Visual C 2015运行…

TortoiseSVN的使用

基本概念 版本库 SVN保持数据的地方&#xff0c;所有的文件都保存在这个库中&#xff0c;Tortoise访问的就是远程服务器上的Subversion版本库。 工作拷贝 就是工作副本&#xff0c;可将版本库的文件拷贝到本地中&#xff0c;可以任意修改&#xff0c; 不会影响版本库。在你…

责任链模式(Chain of Responsibility Pattern)

意图&#xff1a;避免请求发送者与接收者耦合在一起&#xff0c;让多个对象都有可能接收请求&#xff0c;将这些对象连接成一条链&#xff0c;并且沿着这条链传递请求&#xff0c;直到有对象处理它为止。 主要解决&#xff1a;职责链上的处理者负责处理请求&#xff0c;客户只…

常用调试golang的bug以及性能问题的实践方法

文章目录如何分析程序运行时间和CPU利用率情况1.shell内置time指令/usr/bin/time指令如何分析golang程序的内存使用情况&#xff1f;1.内存占用情况查看如何分析golang程序的CPU性能情况1.性能分析注意事项2.CPU性能分析A.Web界面查看B.使用pprof工具查看如何分析程序运行时间和…

PHP(12)文件上传

PHP&#xff08;12&#xff09;文件上传一、文件上传原理二、表单写法三、预定义变量 $_FILES四、移动临时文件五、多文件上传1. 同名表单2. 不同名表单六、多文件处理1. 同名文件2. 不同名文件七、封装文件上传函数一、文件上传原理 文件从客户机上传至服务器指定目录。 步骤…

Redhat7.6升级openssh(超详细)

一、准备工作 从官网下载新版的openssh-7.9p1.tar.gz 准备rhel-server-7.6-x86_64-dvd.iso用于使用yum安装依赖 二、具体升级步骤 1.查看系统版本 [rootredhat ~]# cat /etc/redhat-release Red Hat Enterprise Linux Server release 7.6 (Maipo) 2.查看openssh现有版本 …