Faster RCNN系列3——RPN的真值详解与损失值计算

这篇具有很好参考价值的文章主要介绍了Faster RCNN系列3——RPN的真值详解与损失值计算。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

Faster RCNN系列:

Faster RCNN系列1——Anchor生成过程
Faster RCNN系列2——RPN的真值与预测值概述
Faster RCNN系列3——RPN的真值详解与损失值计算
Faster RCNN系列4——生成Proposal与RoI
Faster RCNN系列5——RoI Pooling与全连接层

一、RPN真值详解

  RPN的真值分为类别真值偏移量真值,即每一个Anchor是否对应着真实物体,以及每一个Anchor对应物体的真实偏移值,这两种真值的具体求解过程如下图所示:

Faster RCNN系列3——RPN的真值详解与损失值计算

  1. Anchor生成

  Anchor生成的具体过程可参考Faster RCNN系列——Anchor生成过程,可生成 37 × 50 × 9 = 16650 37×50×9=16650 37×50×9=16650个Anchors,这种方法对于靠近图像边缘的点来说,可能生成超出图像范围的Anchor,需要把这部分超过图像范围的Anchor过滤掉。

def forward(self, input):
	# 利用NumPy首先得到原图上的中心点坐标,并利用contiguous保证内存连续
	shifts = torch. from_numpy(np.vstack((shift_x.ravel(), shift__y.ravel(),
										  shift_x.rave1(), shift_y.rave1())).transpose())
	shifts = shifts.contiguous().type_as(rpn_cls_score) .float ()
	# 调用基础Anchor生成所有Anchors
	self.anchors = self.anchors.type_as(gt_boxes)
	all_ anchors = self. anchors.view(1, A, 4) + shifts.view(K, 1, 4)
	# 保留边框内的Anchors
	inds_inside = torch.nonzero(keep).view(-1)
	anchors = all_ anchors[inds_inside, :]
  1. 类别真值求解

  类别真值求解的详细过程可参考Faster RCNN系列——RPN的真值与预测值概述中类别真值的部分,需要注意的是,求解过程中的三个步骤的顺序不能变动,原因:

  • 保证一个Anchor既符合正样本,也符合负样本时,才会被赋予正样本。

  • 为了保证召回率,允许一个标签对应多个Anchor,不允许一个Anchor对应多个标签。

def forward(self, input):
	# 生成标签向量,对应每一个Anchor的状态,1为正,0为负,初始化为-1
	labels = gt_boxes.new(batch_size, inds_inside.size(0)).fill_(-1)
	# 生成IoU矩阵,每一行代表一个Anchor, 每一列代表一个标签
	overlaps = bbox_overlaps_batch(anchors, gt_boxes)
	# 对每一行求最大值,返回的第一个为最大值,第二个为最大值的位置
	max_overlaps, argmax_overlaps = torch.max(overlaps, 2)
	# 对每一列取最大值,返回的是每一个标签对应的IoU最大值
	gt_max_overlaps, _ = torch.max(overlaps, 1)
	# 如果一个Anchor最大的IoU小于0.3, 视为负样本
	labels[max_overlaps < 0.3] = 0
	#与所有Anchors的最大IoU为0的标签要过滤掉
	gt_ max_overlaps[gt_max_overlaps==0] = 1e-5
	# 将与标签有最大IoU的Anchor赋予正样本
	keep = torch.sum(overlaps.eq(gt_max_overlaps.view(batch_size, 1, -1).expand_as(overlaps)), 2)
	if torch.sum(keep)>0:
		labels[keep>0] = 1
	#  如果一个 Anchor最大的IoU大于0.7,视为正样本
	labels[max_overlaps >= 0.7] = 1
  1. Anchor的筛选

  由于Anchor的总数量接近于2万,并且大部分Anchor的标签都是背景,如果都计算损失的话则正、负样本失去了均衡,不利于网络的收敛。因此,RPN默认选择256个Anchors进行损失的计算,其中最多不超过128个的正样本。如果数量超过了限定值,则进行随机选取。当然,这里的256与128都可以根据实际情况进行调整,而不是固定死的。

def forward(self, input):
	......
	for i in range(batch_size):
	#如果正样本数量太多,则进行下采样随机选取
		if sum_fg[i] > 128 :
			fg_inds = torch.nonzero(labels[i] == 1).view(-1)
			rand_num = torch.from_numpy(np.random.permutation
			(fg_ inds.size(0))).type_as(gt_boxes).long()
			disable_inds = fg_inds[rand_num[:fg_inds.size(0)-num_fg]]
			labels[i][disable_inds] = -1
			# 负样本同上
			......
  1. 偏移量真值求解

  偏移量真值的求解过程可参考Faster RCNN系列——RPN的真值与预测值概述中偏移量真值的部分。

  得到偏移量的真值后,将其保存在bbox_ targets 中。与此同时,还需要求解两个权值矩阵bbox_inside_weights 和bbox_outside_weights,前者是用来设置正样本回归的权重,正样本设置为1,负样本设置为0,因为负样本对应的是背景,不需要进行回归;后者的作用则是平衡RPN分类损失与回归损失的权重,在此设置为1/256。

def forward(self, input):
	......
	# 选择每一个Anchor对应最大Iou的标签进行偏移计算
	bbox_targets = _compute_targets_batch(anchors, gt_ boxes.view(-1, 5)[argmax_overlaps.view(-1), :].view(batch_size, -1, 5))
	#设置两个权重向量
	bbox_inside_weights[labels==1] = 1
	num_examples = torch.sum(labels[i] >=0)
	bbox_outside_weights[labels == 1] = 1.0 / examples.item()
	bbox_outside_weights[labels == 0]=1.0 / examples.item()

二、RPN预测值

  RPN的预测值分为类别预测值偏移量预测值,计算过程可参考Faster RCNN系列——RPN的真值与预测值概述,通过卷积神经网络的分类分支求得类别预测值、通过回归分支求得偏移量预测值。

三、损失值计算

  有了类别真值偏移量真值类别预测值偏移量预测值,就可以计算RPN网络的损失函数了。RPN网络的损失函数包含类别损失和回归损失,公式如下:

L ( P i , t i ) = 1 N c l s ∑ L c l s ( p i , p i ∗ ) + λ 1 N r e g ∑ p i ∗ L r e g ( t i , t i ∗ ) L(P_{i},t_{i})=\frac{1}{N_{cls}}\sum L_{cls}(p_{i},p_{i}^{*})+\lambda \frac{1}{N_{reg}}\sum p_{i}^{*}L_{reg}(t_{i},t_{i}^{*}) L(Pi,ti)=Ncls1Lcls(pi,pi)+λNreg1piLreg(ti,ti)

   ∑ L c l s ( p i , p i ∗ ) \sum L_{cls}(p_{i},p_{i}^{*}) Lcls(pi,pi)表示筛选出的256个Anchor的类别损失, p i p_{i} pi为每一个Anchor的类别真值, p i ∗ p_{i}^{*} pi为每一个Anchor的类别预测值。这里的类别只有前景和背景之分,为二分类,因此类别损失函数 L c l s L_{cls} Lcls使用交叉熵损失函数,公式如下:

L c l s ( p i , p i ∗ ) = − ∑ p i l o g p i ∗ L_{cls}(p_{i},p_{i}^{*})=-\sum p_{i}logp_{i}^{*} Lcls(pi,pi)=pilogpi

   ∑ p i ∗ L r e g ( t i , t i ∗ ) \sum p_{i}^{*}L_{reg}(t_{i},t_{i}^{*}) piLreg(ti,ti)表示回归损失, t i t_{i} ti为每一个Anchor的偏移量真值, t i ∗ t_{i}^{*} ti为每一个Anchor的偏移量预测值。这里的 p i ∗ p_{i}^{*} pi对应上文中的bbox_inside_weights,用来筛选正负样本,这里的 λ 1 N r e g \lambda \frac{1}{N_{reg}} λNreg1对应上文中的bbox_outside_weights,用来平衡类别损失和回归损失。回归损失函数 L r e g L_{reg} Lreg使用 s m o o t h L 1 smooth_{L1} smoothL1函数,公式如下:

L r e g ( t i , t i ∗ ) = ∑ i ∈ x , y , w , h s m o o t h L 1 ( t i , t i ∗ ) L_{reg}(t_{i},t_{i}^{*})=\sum_{i\in x,y,w,h} smooth_{L1}(t_{i},t_{i}^{*}) Lreg(ti,ti)=ix,y,w,hsmoothL1(ti,ti)

s m o o t h L 1 ( x ) = { 0.5 x 2 i f ∣ x ∣ < 1 ∣ x ∣ − 0.5 o t h e r w i s e smooth_{L1}(x) = \left\{\begin{matrix} 0.5x^{2} & if|x|<1 & \\ |x|-0.5 & otherwise & \end{matrix}\right. smoothL1(x)={0.5x2x0.5ifx<1otherwise

参考文章

《深度学习之Pytorch物体检测实战》文章来源地址https://www.toymoban.com/news/detail-421873.html

到了这里,关于Faster RCNN系列3——RPN的真值详解与损失值计算的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【YOLOv8/YOLOv7/YOLOv5/YOLOv4/Faster-rcnn系列算法改进NO.64】即插即用新的注意力机制RFAConv

     前言 作为当前先进的深度学习目标检测算法YOLOv8,已经集合了大量的trick,但是还是有提高和改进的空间,针对具体应用场景下的检测难点,可以不同的改进方法。此后的系列文章,将重点对YOLOv8的如何改进进行详细的介绍,目的是为了给那些搞科研的同学需要创新点或者

    2024年02月02日
    浏览(73)
  • 目标检测——Faster RCNN

    Faster RCNN是由 R-CNN、Fast R-CNN 改进而来,是非常经典的目标检测的两阶段网络。 此篇博客是我通过学习以下优秀博客归纳整理而得: 一文读懂Faster RCNN - 知乎 Faster R-CNN详解和网络模型搭建 - 知乎 Faster R-CNN:详解目标检测的实现过程 - 郭耀华 - 博客园 yolov5与Faster-RCNN 训练过程

    2024年02月06日
    浏览(61)
  • Faster RCNN在pycharm中运行

    参考B站up主:霹雳吧啦Wz git clone https://github.com/WZMIAOMIAO/deep-learning-for-image-processing 首先找到faster_rcnn ├── backbone: 特征提取网络,可以根据自己的要求选择 ├── network_files: Faster R-CNN网络(包括Fast R-CNN以及RPN等模块) ├── train_utils: 训练验证相关模块(包括cocotools) ├

    2024年02月03日
    浏览(50)
  • YOLOv8/YOLOv7/YOLOv5/YOLOv4/Faster-rcnn系列算法改进【NO.69】针对遥感图像目标检测中的小目标进行改进CATnet(ContextAggregation模块)

    前言 作为当前先进的深度学习目标检测算法YOLOv8,已经集合了大量的trick,但是还是有提高和改进的空间,针对具体应用场景下的检测难点,可以不同的改进方法。此后的系列文章,将重点对YOLOv8的如何改进进行详细的介绍,目的是为了给那些搞科研的同学需要创新点或者搞

    2024年02月11日
    浏览(60)
  • 基于Faster rcnn pytorch的遥感图像检测

    代码:https://github.com/jwyang/faster-rcnn.pytorch/tree/pytorch-1.0 使用RSOD遥感数据集,VOC的数据格式如下: RSOD是一个开放的目标检测数据集,用于遥感图像中的目标检测。数据集包含飞机,油箱,运动场和立交桥,以PASCAL VOC数据集的格式进行标注。 数据集包括4个文件夹,每个文件夹

    2024年02月06日
    浏览(47)
  • Faster-RCNN环境搭配及运行教程

    最近正在学习Faster-RCNN,环境历经一天时间终于成功安装,借此记录下整体安装过程 本教程是Windows 10 + Python35 + CUDA 10.0 + cudnn 7.4.1.5 + tensorflow-gpu 1.13.2环境的配置过程 所使用的软件包括 名称 版本 CUDA 10.0 CUDNN 7.4.1.5 Anaconda3 4.2.0 Pycharm 2019.3.5 整体过程中所需要的软件包我都放在

    2024年02月04日
    浏览(60)
  • 目标检测算法:Faster-RCNN论文解读

    前言 ​ 其实网上已经有很多很好的解读各种论文的文章了,但是我决定自己也写一写,当然,我的主要目的就是帮助自己梳理、深入理解论文,因为写文章,你必须把你所写的东西表达清楚而正确,我认为这是一种很好的锻炼,当然如果可以帮助到网友,也是很开心的事情

    2024年02月08日
    浏览(53)
  • Faster RCNN训练自己的数据集【傻瓜式教程】

    本文采用的源码是:https://github.com/dBeker/Faster-RCNN-TensorFlow-Python3 由于本文是小白教程,光写几个环境怕有人配置不好或者配置版本搞乱。Faster RCNN配置环境比较复杂。我在这直接贴图我的环境版本图: 先安装tensorflow-gpu,然后依次安装cython、opencv-python、easydict、Pillow、matplot

    2024年02月02日
    浏览(44)
  • GIS之深度学习10:运行Faster RCNN算法

    (未完成,待补充) 获取Faster RCNN源码 (开源的很多,论文里也有,在这里不多赘述) 替换自己的数据集(图片+标签文件) (需要使用labeling生成标签文件) 打开终端,进入gpupytorch环境 运行voc_annotation.py文件生成与训练文件  结果所示: 运行:train.py文件  终端/编码器运

    2024年03月13日
    浏览(75)
  • 深度学习目标检测项目实战(六)-基于Faster rcnn pytorch的遥感图像检测

    代码:https://github.com/jwyang/faster-rcnn.pytorch/tree/pytorch-1.0 使用RSOD遥感数据集,VOC的数据格式如下: RSOD是一个开放的目标检测数据集,用于遥感图像中的目标检测。数据集包含飞机,油箱,运动场和立交桥,以PASCAL VOC数据集的格式进行标注。 数据集包括4个文件夹,每个文件夹

    2024年02月06日
    浏览(71)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包