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

news2024/12/23 23:32:57

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预测值
  • 三、损失值计算
  • 参考文章

一、RPN真值详解

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

在这里插入图片描述

  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物体检测实战》

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

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

相关文章

手把手教你实现el-table实现跨表格禁用选项,以及禁用选择后,对应的全选按钮也要禁用任何操作

哈喽 大家好啊 今天我要实现不能跨表格选择&#xff0c;如果我选择了其中一个表格的选项后&#xff0c;那么其他的表格选项则被禁用 然后我选择了其中一个表格行&#xff0c;我其他的表格选项则应该被禁用 实现代码&#xff1a; 其中关键属性&#xff1a; selectable仅对 typ…

如何保障企业网络安全

随着信息技术的迅速发展&#xff0c;网络已经渗透到了我们生活的方方面面。企业对网络的依赖程度也越来越高&#xff0c;网络安全问题已经成为了企业面临的一个重要挑战。那么&#xff0c;在这个风险重重的网络世界里&#xff0c;我们如何充分利用现有技术保障企业网络安全呢&a…

智能指针——C++

智能指针相较于普通指针的区别&#xff0c;就是智能指针可以不用主动释放内存空间&#xff0c;系统会自动释放&#xff0c;避免了内存泄漏。 1、unique_ptr&#xff1a;独占指针 需包含的头文件&#xff1a;#include <memory> unique_ptr 三种定义方式 先定义一个类 …

learn_C_deep_5 (温故知新、sigend char a = -128的深度理解、unsigned int类型的写法规范)

目录 温故知新 理解"unsigned int a -10;" 如何理解大小端 大小端的概念 大小端是如何影响数据存储的 sigend char a -128的深度理解 10000000为什么是-128&#xff0c;而不是-0 代码练习 unsigned int类型的写法规范 温故知新 理解"unsigned int a…

python数据结构与算法-动态规划(最长公共子序列)

一、最长公共子序列问题 1、问题概念 一个序列的子序列是在该序列中删去若干元素后得 到的序列。 例如&#xff1a;"ABCD”和“BDF”都是“ABCDEFG”的子序列。 最长公共子序列(LCS) 问题: 给定两个序列X和Y&#xff0c;求X和Y长度最大的公共子字列。 例:X"ABBCBDE”…

【ABAQUS Python二次开发】 debug : ini解析ERROR:没有实例属性‘__getintem__’

我的主页&#xff1a; 技术邻&#xff1a;小铭的ABAQUS学习的技术邻主页博客园 : HF_SO4的主页哔哩哔哩&#xff1a;小铭的ABAQUS学习的个人空间csdn&#xff1a;qgm1702 博客园文章链接&#xff1a; https://www.cnblogs.com/aksoam/p/17287136.html abaqus python 搭配ini…

古埃及:金字塔

文章目录 I 建造金字塔1.1 切割巨石1.2 开凿巨石1.3 摞石1.4 大金字塔的入口呈三角形 see also I 建造金字塔 在生活中&#xff0c;事实是正确的&#xff0c;如果理论解释不了现实&#xff0c;需要更正理论。 1.1 切割巨石 建筑材料巨石的切割&#xff1a;把石英砂粘在了铜锯…

记一次Macbook pro电池修复

记一次Macbook pro电池修复 mac版本 A1708 问题描述 Macbook更换新电池后&#xff0c;在项头栏中&#xff0c;没有显示电池图标&#xff0c;系统设置里面也找不到电池图标。这样开机还得连着电源线 ~ ^~ 原因分析&#xff1a; 有可能是电池排线坏了。 解决方案&#xff1a…

【C/C++】C++11 线程库重大历史意义

文章目录 C11 线程库重大意义【C11 中最重要的特性&#xff1a;就是对线程进行支持】API 比较C11 线程库APILinux/Win 系统线程库 API代码示例 Demo C11 线程库重大意义【C11 中最重要的特性&#xff1a;就是对线程进行支持】 C11 线程库解决了历史多线程跨平台问题&#xff0…

C++语法(20)---- 模拟红黑树

C语法&#xff08;19&#xff09;---- 模拟AVL树_哈里沃克的博客-CSDN博客https://blog.csdn.net/m0_63488627/article/details/130229501?spm1001.2014.3001.5501 目录 1.红黑树介绍 2.模拟实现 1.枚举红黑颜色 2.节点的定义 3.树类框架 4.插入 5.检查 3.代码实现 1…

【开发经验】spring事件监听机制关心的同步、异步、事务问题

文章目录 spring发布订阅示例同步核心源码分析如何配置异步事务问题 观察者模式又称为发布订阅模式&#xff0c;定义为&#xff1a;对象间的一种一对多的依赖关系&#xff0c;当一个对象的状态发生改变时&#xff0c;所有依赖它的对象都得到通知并被自动更新。 如下图所示&…

【Go】六、并发编程

文章目录 并发编程1、并发介绍2、Goroutine3、runtime包 3、Channel3.1、channel相关信息 4、Goroutine池&#xff08;❌&#xff09;5、定时器6、select多路复用7、并发安全和锁8、Sync9、原子操作&#xff08;atomic包&#xff09; 并发编程 1、并发介绍 1、进程和线程 ​…

心塞,被面试官在朋友圈吐槽了

​前阵子一个后辈小学弟向我诉苦&#xff0c;说自己在参加某大厂测试的时候被面试官怼得哑口无言&#xff0c;场面让他一度十分尴尬。 印象最深的就是下面几个问题&#xff1a; 自动化测试中&#xff0c;如何解决Case依赖&#xff1f;你们公司业务中&#xff0c;自动化和手工分…

“五一”预订量创5年新高!如何制定营销活动引爆门店客流?

作为疫情3年经济复苏后&#xff0c;2023年的第一个长假&#xff0c;今年“五一”的消费需求将全面集中释放&#xff0c;带动全国各地线下实体生意全面复苏。 根据官方平台发布的数据显示&#xff0c;今年五一的旅游订单比疫情前的2019年增长了200%&#xff0c;是近5年预订量最多…

Spring Security 整体架构

Spring Security 整体架构 整体架构 在的架构设计中&#xff0c;认证 和 授权 是分开的&#xff0c;无论使用什么样的认证方式。都不会影响授权&#xff0c;这是两个独立的存在&#xff0c;这种独立带来的好处之一&#xff0c;就是可以非常方便地整合一些外部的解决方案。 认…

(数字图像处理MATLAB+Python)第五章图像增强-第三节:基于照度反射模型的图像增强

文章目录 一&#xff1a;基于同态滤波的增强&#xff08;1&#xff09;概述&#xff08;2&#xff09;程序 二&#xff1a;Retinex理论&#xff08;1&#xff09;Retinex理论概述&#xff08;1&#xff09;SSR&#xff08;单尺度Retinex 算法&#xff09;&#xff08;2&#xf…

Oracle的学习心得和知识总结(二十二)|Oracle数据库Real Application Testing之Database Replay实操(二)

目录结构 注&#xff1a;提前言明 本文借鉴了以下博主、书籍或网站的内容&#xff0c;其列表如下&#xff1a; 1、参考书籍&#xff1a;《Oracle Database SQL Language Reference》 2、参考书籍&#xff1a;《PostgreSQL中文手册》 3、EDB Postgres Advanced Server User Gui…

操作系统概述及Linux基本指令(1)

目录 一. 操作系统 1.1 什么是操作系统 1.2 操作系统的核心工作 二. Linux的基本指令 2.1 ls指令 -- 打印文件名 2.2 pwd指令 -- 显示路径 2.3 cd指令 -- 进入特定目录 2.4 touch指令 -- 创建普通文件 2.5 mkdir指令 -- 创建路径 2.6 rmdir/rm指令 -- 删除路径或普通…

【GeoDjango框架解析】空间方法的ORM查询

原文作者&#xff1a;我辈理想 版权声明&#xff1a;文章原创&#xff0c;转载时请务必加上原文超链接、作者信息和本声明。 Django数据操作-ORM 第一章 【Django开发入门】ORM的增删改查和批量操作 第二章 【Django开发入门】ORM查询分页以及返回Json格式 文章目录 Django数据…

中国人民大学与加拿大女王大学金融硕士——在职读研该如何平衡学习与工作呢

边工作边考研&#xff0c;对于所有人来说都是个不小的挑战&#xff0c;每年都有大量在职生因为焦躁、压力而中途离场。学习时间碎片化&#xff0c;复习进度特别容易被工作上的事情所打断&#xff0c;再想“重新启动”就会很难。想要节省备考时间建议你读免联考的中外合作办学项…