RPN详解

article/2025/10/11 16:39:30

RPN

       这里写图片描述 

思路:

1、先通过conv层+pooling层+relu层,可以是vgg,得到feature maps。

2、在feature maps上提取对应的图。在第一步基础上,先通过rpn生成region proposals。通过softmax判断anchors(9个框),是foreground还是background,再通过bounding box regression 进行修正anchors,也就是进一步确定proposals。

3、目的是为了得到proposals feature maps,提取框的特征图,这一步是为了下面的分类做准备,也就是先得到框图在分类。这一步先通过上面得到的proposals,和roi pooling,提取proposals feature maps。

4、分类。用proposals feature maps和一开始的proposals判断类别。

1、一个图片从由p*q大小,变为m*n大小(600*1000),进入网络,经过13个conv,13个relu,4个pooling。得到feature maps(40*60*256)。

2、先经过3*3conv,经过1*1conv,分成foreground和background,上面一条线是通过softmax分类anchor,获得foreground和background,下面计算anchor的boundingboxregression偏移情况。然后计算出来proposals。

3、roi pooling,用proposals从最一开始的feature maps,通过全连接和softmax,分类。

步骤:

1、卷积层

    包括conv,relu,pooling。以vgg16为例,13个conv参数为kernelsize为3*3,pad为1,4个pooling为2*2,stride为2,一个图形进去网络出来后大小为m/16 ,n/16的feature maps。

2、region proposal networks(RPN)

  • 上面一层目的是为了完成分类anchors(9个框),以获得foreground和background,目的是留着foreground。
  • 下面是对anchors进行bounding box regression,为了得到精准的参数,可以帮助后面得到精准的proposal。
  • 最后proposal是为了整合上面两个步骤得到proposal。

     从第一层说,进入3*3前图形是m/16 ,n/16的feature maps,进行3*3卷积应该是为了更好融合每个点周围的信息,每个点都有9个anchors,如下所示:每个点都有256-d,每个点都要对框分fore和back,为2个维度,所以为2k,k为9个框,所以每个点输出为W*H*18。同理回归是需要四个值定框,分别为左上右下,4个维度,所以为4k,为W*H*36。虽然文章里面有些到,但是其实在程序里面没有这样的内容,找不到所谓的框和所谓框的四个维度。

     proposals layer 3个输入,一个是分类器结果foreground,一个是anchor回归结果reg,还有一个是im-info,就是把图像进行了缩减后,进行proposal layer。

1、先再生成anchor,对做reg回归。

2、按照输入foreground softmax scores对anchor排序。目的找到最优anchor(2000个)。

3、通过feat_stride和im_info,把anchor映射回原图。

4、nms。

5、按照nms由大到小排序foreground anchors。提取top作为结果输出proposal(256个)。

from:https://blog.csdn.net/N_Sapientia/article/details/81487968


 

这里介绍一下分类层中的两个reshape操作:

   对于cls层,使用1*1的卷积操作输出了18(9个anchor*2类fg/bg)个通道的feature map,大小不变。而对于regression层,也使用1*1的卷积层输出了36(4*9个anchor)个通道的feature map,大小不变。 

   对于cls层后又接了一个reshape层,其实只是为了便于softmax分类,这就要从caffe的实现形式说起了。在caffe基本数据结构blob中以如下形式保存数据:blob=[batch_size, channel,height,width]

   对应至上面的保存bg/fg anchors的矩阵,其在caffe blob中的存储形式为[1, 2*9, H, W]。而在softmax分类时需要进行fg/bg二分类,所以reshape layer会将其变为[1, 2, 9*H, W]大小,即单独“腾空”出来一个维度以便softmax分类,之后再reshape回复原状。

                         

从中其实我们也能发现,对于rpn每个点的18个输出通道,前9个为背景的预测分数,而后9个为前景的预测分数。

   对于regression,不需要这样的操作,那么他的36个通道是不是也是如上面18个通道那样呢?即第一个9通道为dx,第二个为dy,第三个为dw,第五个是dh。还是我们比较容易想到的那种,即第一个通道是第一个盒子的回归量(dx1,dy1,dw1,dh1),第二个为(dx2,dy2,dw,2,dh2).....。待后面查看对应的bbox_targets就知道了

正如图上所示,我们还需要准备一个层rpn-data。

layer {name: 'rpn-data'type: 'Python'bottom: 'rpn_cls_score'bottom: 'gt_boxes'bottom: 'im_info'bottom: 'data'top: 'rpn_labels'top: 'rpn_bbox_targets'top: 'rpn_bbox_inside_weights'top: 'rpn_bbox_outside_weights'python_param {module: 'rpn.anchor_target_layer'layer: 'AnchorTargetLayer'param_str: "'feat_stride': 16"}
}

这一层输入四个量:data,gt_boxes,im_info,rpn_cls_score,其中前三个是我们在前面说过的,

data:         1*3*600*1000 
gt_boxes: N*5,                   N为groundtruth box的个数,每一行为(x1, y1, x2, y2, cls) ,而且这里的gt_box是经过缩放的。
im_info: 1*3                   (h,w,scale) 

rpn_cls_score是cls层输出的18通道,shape可以看成是1*18*H*W.  

输出为4个量:

rpn_labels : (1, 1, 9 * height, width)

rpn_bbox_targets(回归目标): (1, 36,height, width)

rpn_bbox_inside_weights(内权重):(1, 36,height, width)

rpn_bbox_outside_weights(外权重):(1, 36,height, width)

通俗地来讲,这一层产生了具体的anchor坐标,并与groundtruth box进行了重叠度计算,输出了kabel与回归目标。

       regression可以利用rpn_bbox_pred,rpn_bbox_targets,rpn_bbox_inside_weights,rpn_bbox_outside_weights计算SmoothL1Loss,输出rpn_loss_bbox。

回到我们之前有一个问题rpn_bbox_pred的shape怎么构造的。其实从rpn_bbox_targets的生成过程中可以推断出应该采用后一种,即第一个盒子的回归量(dx1,dy1,dw1,dh1),第二个为(dx2,dy2,dw,2,dh2).....,这样顺序着来。

from:https://blog.csdn.net/alibabazhouyu/article/details/80875383

RPN结构流程图:

                  

Note:

  1. 只有在train时,cls+reg才能得到强监督信息(来源于ground truth)。即ground truth会告诉cls+reg结构,哪些才是真的前景,从而引导cls+reg结构学得正确区分前后景的能力;在测试阶段,就要靠cls+reg自力更生了。
  2. 在train阶段,会输出约2000个proposal,但只会抽取其中256个proposal来训练RPN的cls+reg结构;到了测试阶段,则直接输出最高score的300个proposal。此时由于没有了监督信息,所有RPN**并不知道这些proposal是否为前景**,整个过程只是惯性地推送一波无tag的proposal给后面的Fast R-CNN。

1、在 RPN头部 ,通过以下结构生成 anchor(其实就是一堆有编号有坐标的bbox);  

2、在 RPN中部, 分类分支(cls) 和 边框回归分支(bbox reg) 分别对这堆anchor进行计算。Note: two stage型的检测算法在RPN 之后 还会进行 再一次 的 分类任务 和 边框回归任务,以进一步提升检测精度;

3、在 RPN末端,通过对 两个分支的结果进行汇总,来实现对anchor的 初步筛除(先剔除越界的anchor,再根据cls结果通过NMS去重)和 初步偏移(根据bbox reg结果),此时输出的都改头换面叫 Proposal 。


损失函数_add_losses

faster rcnn包括两个损失:rpn网络的损失+rcnn网络的损失。其中每个损失又包括分类损失和回归损失。分类损失使用的是交叉熵,回归损失使用的是smooth L1 loss。

其中rpn_cross_entropy和rpn_loss_box是RPN网络的两个损失,cls_score和bbox_pred是rcnn网络的两个损失。前两个损失用于判断archor是否是ground truth(二分类);后两个损失的batchsize是256。

将rpn_label(1,?,?,2)中不是-1的index取出来,之后将rpn_cls_score(1,?,?,2)及rpn_label中对应于index的取出,计算sparse_softmax_cross_entropy_with_logits,得到rpn_cross_entropy。

计算rpn_bbox_pred(1,?,?,36)和rpn_bbox_targets(1,?,?,36)的_smooth_l1_loss,得到rpn_loss_box。

rpn_bbox_targets= bbox_targets = _compute_targets(anchors, gt_boxes[argmax_overlaps, :])  # 通过archors和archors对应的正样本计算坐标的偏移

计算cls_score(256*21)和label(256个正样本和负样本对应的真实的类别)的sparse_softmax_cross_entropy_with_logits:cross_entropy。

labels, rois, roi_scores, bbox_targets, bbox_inside_weights = _sample_rois(all_rois, all_scores, gt_boxes, fg_rois_per_image, rois_per_image, _num_classes) # 选择256个archors

计算bbox_pred(256*84)和bbox_targets(256*84)的_smooth_l1_loss:loss_box。

最终将上面四个loss相加,得到总的loss(还需要加上regularization_loss)。

至此,损失构造完毕。

 
def _add_losses(self, sigma_rpn=3.0):with tf.variable_scope('LOSS_' + self._tag) as scope:rpn_cls_score = tf.reshape(self._predictions['rpn_cls_score_reshape'], [-1, 2])  # 每个archors是正样本还是负样本rpn_label = tf.reshape(self._anchor_targets['rpn_labels'], [-1])  # 特征图中每个位置对应的是正样本、负样本还是不关注(去除了边界在图像外面的archors)rpn_select = tf.where(tf.not_equal(rpn_label, -1))    # 不关注的archor到的索引rpn_cls_score = tf.reshape(tf.gather(rpn_cls_score, rpn_select), [-1, 2])    # 去除不关注的archorrpn_label = tf.reshape(tf.gather(rpn_label, rpn_select), [-1])        # 去除不关注的labelrpn_cross_entropy = tf.reduce_mean(tf.nn.sparse_softmax_cross_entropy_with_logits(logits=rpn_cls_score, labels=rpn_label))  # rpn二分类的损失rpn_bbox_pred = self._predictions['rpn_bbox_pred']  #  每个位置的9个archors回归位置偏移rpn_bbox_targets = self._anchor_targets['rpn_bbox_targets']   # 特征图中每个位置和对应的正样本的坐标偏移(很多为0)rpn_bbox_inside_weights = self._anchor_targets['rpn_bbox_inside_weights']  # 正样本的权重为1(去除负样本和不关注的样本,均为0)rpn_bbox_outside_weights = self._anchor_targets['rpn_bbox_outside_weights']   #   正样本和负样本(不包括不关注的样本)归一化的权重rpn_loss_box = self._smooth_l1_loss(rpn_bbox_pred, rpn_bbox_targets, rpn_bbox_inside_weights, rpn_bbox_outside_weights, sigma=sigma_rpn, dim=[1, 2, 3])cls_score = self._predictions["cls_score"]  # 用于rcnn分类的256个archors的特征label = tf.reshape(self._proposal_targets["labels"], [-1])   # 正样本和负样本对应的真实的类别cross_entropy = tf.reduce_mean(tf.nn.sparse_softmax_cross_entropy_with_logits(logits=cls_score, labels=label))   # rcnn分类的损失bbox_pred = self._predictions['bbox_pred']   # RCNN, bbox lossbbox_targets = self._proposal_targets['bbox_targets']    # 256*(4*21)的矩阵,只有为正样本时,对应类别的坐标才不为0,其他类别的坐标全为0bbox_inside_weights = self._proposal_targets['bbox_inside_weights']  # 256*(4*21)的矩阵,正样本时,对应类别四个坐标的权重为1,其他全为0bbox_outside_weights = self._proposal_targets['bbox_outside_weights']   # 256*(4*21)的矩阵,正样本时,对应类别四个坐标的权重为1,其他全为0loss_box = self._smooth_l1_loss(bbox_pred, bbox_targets, bbox_inside_weights, bbox_outside_weights)self._losses['cross_entropy'] = cross_entropyself._losses['loss_box'] = loss_boxself._losses['rpn_cross_entropy'] = rpn_cross_entropyself._losses['rpn_loss_box'] = rpn_loss_boxloss = cross_entropy + loss_box + rpn_cross_entropy + rpn_loss_box  # 总共的损失regularization_loss = tf.add_n(tf.losses.get_regularization_losses(), 'regu')self._losses['total_loss'] = loss + regularization_lossself._event_summaries.update(self._losses)return loss

 

 


http://chatgpt.dhexx.cn/article/TjpPYgwe.shtml

相关文章

RPN 解析

RPN全称是Region Proposal Network,Region Proposal的中文意思是“区域选取”,也就是“提取候选框”的意思,所以RPN就是用来提取候选框的网络; 1. RPN的意义 RPN第一次出现在世人眼中是在Faster RCNN这个结构中,专门用来提取候选框,在RCNN和Fast RCNN等物体检测架构中,…

RPN(区域生成网络)

RPN全称是Region Proposal Network,Region Proposal的中文意思是“区域选取”,也就是“提取候选框”的意思,所以RPN就是用来提取候选框的网络。 1. RPN的意义 RPN第一次出现在世人眼中是在Faster RCNN这个结构中,专门用来提取候选…

RPN简介

RPN全称是Region Proposal Network,Region Proposal的中文意思是“区域选取”,也就是“提取候选框”的意思,所以RPN就是用来提取候选框的网络 文章目录 前言 一、RPN是什么? 二、计算RPN的输入特征图 三、生成Anchors 总结 前言 …

深度学习之 RPN(RegionProposal Network)- 区域候选网络

anchor boxes基本概念与作用: feature map 上的一个点可以映射回输入图片上的一个点,以特征图上这个点为中心,预先人为设定 k 个 boxes,这些 boxes 就称为在这个点上生成的 k 个 anchor boxes(所有anchor boxes的中心点坐标是一样…

基于51单片机蓝牙小车

文章目录 接线电机控制模块接线(需要额外电源)单片机接线 实物图代码相关目录树.c文件main.cSerial.c(不会参考我写的串口文章)CarTurn.c(车的相关操作)delay.c .h文件reg51.h(keil软件自带&…

51单片机 | 红外遥控实验

文章目录 一、红外遥控介绍1.红外线简介2.红外遥控的原理2.1 红外发射装置2.2 红外接收设备二、硬件设计三、软件设计1.红外初始化函数2.红外解码函数3.主函数四、实验现象这一节来介绍一种无线通信技术–红外遥控通信。我们开发板标配了一个一体化红外接收头和红外遥控器,我们…

基于51单片机手机电话拨号盘模拟proteus仿真

功能简介: 1.采用4X4矩阵键盘实现号码输入,并在LCD液晶上显示 2.按下enter键,显示calling…,并且蜂鸣器模拟电话拨号发声 3.按下*键,退格,按下#键,清楚电话号码 4.拨号过程中,长按#取…

51单片机 | 串口通信实验

文章目录 一、通信的基本概念1.串行通信与并行通信2. 异步通信与同步通信3.单工、半双工与全双工通信4.通信速率二、51单片机串口介绍1.串口通信介绍2.串口相关寄存器3.串口工作方式3.1 方式03.2 方式13.3 方式2和方式34.串口的使用方法三、硬件设计四、软件设计五、实验现象这…

keil c51+protues 实现简单密码锁

原理图 源码&#xff1a; 矩阵键盘key.c #include<reg51.h>sbit key1P1^0; sbit key2P1^1; sbit key3P1^2; sbit key4P1^3; sbit key5P1^4; sbit key6P1^5; sbit key7P1^6; sbit key8P1^7; sbit key9P3^0;void delay(unsigned int m){unsigned int n,k0;for(k0;k<…

51单片机智能小车蓝牙

材料&#xff1a; &#xff08;1&#xff09;51单片机开发板 &#xff08;2&#xff09;l298n电机驱动模块1个 &#xff08;3&#xff09;四个电机 &#xff08;4&#xff09;JDY-31蓝牙模块 一、组装 (1)L298N电机驱动模块与开发板接线如下图&#xff1a; (2)蓝牙接线&a…

51单片机通过ESP8266模块与手机进行通讯(单片机)

本文章内容已经弃用&#xff0c;最新内容请参考ESP8266系列ESP-01S模块的配置使用&#xff08;51单片机&#xff09; Step1:配置ESP8266 通过USB转TTL模块把ESP8266模块和电脑连接起来&#xff0c;如图 把ESP8266模块的VCC,GND,CH_PD,UTXD,URXD口分别接USB转TTL模块的3.3v,地,3…

C51单片机用esp8266点亮led灯(含源码)

大家好&#xff0c;我是一个单片机新手&#xff0c;也是一个兴趣者&#xff0c;我以前想用c51单片机用esp8266模块的热点控制led小灯的&#xff0c;实验&#xff0c;可是网上的资料很少&#xff0c;所以今天来给新生&#xff0c;老手也好&#xff0c;想出一个教程&#xff0c;希…

C51---PWM 脉冲宽度调制

1.PWM:脉冲宽度调制,它是通过一系列脉冲宽度进行调制&#xff0c;等效出所需要的波形&#xff08;包含形状以及幅值&#xff09;。对模拟信号电平进行数字编码。也就是说通过调节占空比的变化来调节信号、能量等的变化&#xff0c;占空比就是指在一个周期内&#xff0c;信号处于…

基于51单片机的手机电话拨号盘模拟proteus仿真

功能&#xff1a; 0.本项目采用STC89C52作为单片机系统的控制MCU 1.采用4X4矩阵键盘实现号码输入&#xff0c;并在LCD液晶上显示 2.按下enter键&#xff0c;显示calling…&#xff0c;并且蜂鸣器模拟电话拨号发声 3.按下*键&#xff0c;退格&#xff0c;按下#键&#xff0c;清楚…

基于51单片机的简易自动灌溉系统

基于51单片机的简易自动灌溉系统如下图所示。 系统的主要构成 主控核心&#xff1a;AT89C51. 显示器&#xff1a;LCD1602. 输入设备&#xff1a;独立按键&#xff08;4个&#xff09;. 水泵控制&#xff1a;继电器控制. 外部数据存储&#xff1a;EEPROM. 温湿度传感器&am…

51单片机期末课程作业之蓝牙、操控、测速、里程小车

文章底部附源码 课程设计报告 学 科&#xff1a; 单片机原理及应用 项 目&#xff1a; 里程记录仪 学 院&#xff1a; 专业、年级&#xff1a; 指导老师&#xff1a; 摘要 设计首先实现对…

【超详细】C51单片机与HC-05蓝牙模块实现手机点灯

此文记录HC05蓝牙模块在C51单片机上的学习历程 文章目录 一、硬件连接(1)配置模式下接线(2)正常模式下接线 二、配置模式操作三、正常模式四、使用蓝牙通过蓝牙调试app点灯1.单片机代码烧录与蓝牙连接2.蓝牙调试app配置 一、硬件连接 HC05一共有6个引脚&#xff0c;此实验一般…

【单片机】C51中的I2C操作-Proteus+Keil4+C语言实现

51单片机中I2C读写操作 开发板&#xff1a;普中51-单核-A2&#xff1b; I2C器件-EEPROM&#xff1a;AT24C02、FM24C02(仿真EEPROM); 仿真软件&#xff1a;proteus&#xff1b; 开发环境&#xff1a;Keil4&#xff1b; 参考资料&#xff1a;开发板所附视频&#xff1b; 如有错误…

51单片机 智能小车

主函数中extern char speed 是在整个工程中与别处的speed共用一个内存 sprintf字串格式化命令&#xff0c;主要功能是把格式化的数据写入某个字符串中。 一、小车组装、用面包板供电、单片机也可以用面包板供电&#xff0c;必须共地、分文件&#xff08;模块化编程&#xff09…

C51单片机 SIM900A 手机给门禁解锁 智能家居 【C程序代码已开源,更新至Ver4.0】...

为何要实施这个项目? 一般小区楼下,每幢都会有一个门禁系统, 可以使用钥匙打开门禁, 有的可以使用刷卡打开门禁, 有的可以使用密码打开门禁, 但是,长期下来,因为小区人多,锁的钥匙孔会被捅坏,物业修起来也很怠慢 使用密码按键解锁门禁,按键也会失灵 每家都会安装一个…