FasterRCNN源码解析(六)——RPN(中)Proposal的获取

2023-10-14 15:10

本文主要是介绍FasterRCNN源码解析(六)——RPN(中)Proposal的获取,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

FasterRCNN源码解析(六)——RPN(中)Proposal的获取

利用生成的anchos以及RPNHead模块得到的预测分数以及目标边界框回归参数,获取proposal,然后再经过一系列算法滤除部分proposal,得到我们RPN模块输出的proposal。

文章目录

  • FasterRCNN源码解析(六)——RPN(中)Proposal的获取
  • 一、RegionProposalNetwork
  • 二、self.filter_proposals


一、RegionProposalNetwork

怎样去实例化RPN模型呢?

rpn = RegionProposalNetwork(rpn_anchor_generator, rpn_head, # FasterRCNN源码解析(五)所提到的rpn_fg_iou_thresh, rpn_bg_iou_thresh, # rpn计算损失时,采集正负样本设置的阈值   , 在其之间直接舍去rpn_batch_size_per_image, rpn_positive_fraction, # 前者是rpn在计算损失时采用正负样本的总个数, 后者是正样本占用于计算损失所有样本rpn_pre_nms_top_n, rpn_post_nms_top_n, rpn_nms_thresh )

rpn_anchor_generator, rpn_head, : FasterRCNN源码解析(五)所提到的
rpn_fg_iou_thresh, rpn_bg_iou_thresh, : rpn计算损失时,采集正负样本设置的阈值 , 在其之间直接舍去
rpn_batch_size_per_image, rpn_positive_fraction,: 前者是rpn在计算损失时采用正负样本的总个数, 后者是正样本占用于计算损失所有样本
rpn_pre_nms_top_n,:在nms处理之前 针对每个预测特征层所保留的目标个数
rpn_post_nms_top_n,:在nms处理之后所剩余的目标个数 即RPN输出的proposal的目标个数
rpn_nms_thresh :nms处理时 所指定的一个阈值

二、self.filter_proposals

其作用为筛除小boxes框,nms处理,根据预测概率获取前post_nms_top_n个目标
传入的参数有
proposals: 预测的bbox坐标
objectness: 预测的目标概率
image_shapes: batch中每张图片的size信息
num_anchors_per_level: 每个预测特征层上预测anchors的数目
主要步骤有:

  1. 获取图片数量

  2. 对objectness变量进行resape处理,使其变为 b a t c h ∗ 预 测 的 数 值 个 数 batch*预测的数值个数 batch在这里插入图片描述

  3. 使用levels变量记录分隔不同预测特征层的索引信息(有多层预测特征层会生成多个tensor,每层tensor用该层的索引进行填充,然后进行拼接操作)目的是为了区分不同的特征层的anchor在这里插入图片描述在这里插入图片描述在这里插入图片描述

  4. 将我们的tensor(levels变量)在第一个维度上进行复制,复制batch_size分在这里插入图片描述

  5. 获取每张预测特征图上预测概率排前pre_nms_top_n的anchors索引值
    最后输出为:(每张图片只剩下8768个proposal了)
    在这里插入图片描述

  6. 根据每个预测特征层预测概率排前pre_nms_top_n的anchors索引值获取相应概率信息
    在这里插入图片描述
    在这里插入图片描述

  7. 预测概率排前pre_nms_top_n的anchors索引值获取相应bbox坐标信息
    在这里插入图片描述

  8. 遍历每张图片的相关预测信息(滤除小目标,进行nms处理,按照我们目标类别分数进行排序输出的,取前top_n个boxes和 scores)

在这里插入图片描述
在这里插入图片描述

    def filter_proposals(self, proposals, objectness, image_shapes, num_anchors_per_level):# type: (Tensor, Tensor, List[Tuple[int, int]], List[int]) -> Tuple[List[Tensor], List[Tensor]]"""筛除小boxes框,nms处理,根据预测概率获取前post_nms_top_n个目标Args:proposals: 预测的bbox坐标objectness: 预测的目标概率image_shapes: batch中每张图片的size信息num_anchors_per_level: 每个预测特征层上预测anchors的数目Returns:"""num_images = proposals.shape[0]device = proposals.device# do not backprop throught objectnessobjectness = objectness.detach()objectness = objectness.reshape(num_images, -1)# Returns a tensor of size size filled with fill_value# levels负责记录分隔不同预测特征层上的anchors索引信息levels = [torch.full((n, ), idx, dtype=torch.int64, device=device)for idx, n in enumerate(num_anchors_per_level)]levels = torch.cat(levels, 0)# Expand this tensor to the same size as objectnesslevels = levels.reshape(1, -1).expand_as(objectness)# select top_n boxes independently per level before applying nms# 获取每张预测特征图上预测概率排前pre_nms_top_n的anchors索引值top_n_idx = self._get_top_n_idx(objectness, num_anchors_per_level)image_range = torch.arange(num_images, device=device)batch_idx = image_range[:, None]  # [batch_size, 1]# 根据每个预测特征层预测概率排前pre_nms_top_n的anchors索引值获取相应概率信息objectness = objectness[batch_idx, top_n_idx]levels = levels[batch_idx, top_n_idx]# 预测概率排前pre_nms_top_n的anchors索引值获取相应bbox坐标信息proposals = proposals[batch_idx, top_n_idx]final_boxes = []final_scores = []# 遍历每张图像的相关预测信息for boxes, scores, lvl, img_shape in zip(proposals, objectness, levels, image_shapes):# 调整预测的boxes信息,将越界的坐标调整到图片边界上boxes = box_ops.clip_boxes_to_image(boxes, img_shape)# 返回boxes满足宽,高都大于min_size的索引keep = box_ops.remove_small_boxes(boxes, self.min_size)boxes, scores, lvl = boxes[keep], scores[keep], lvl[keep]# non-maximum suppression, independently done per levelkeep = box_ops.batched_nms(boxes, scores, lvl, self.nms_thresh)# keep only topk scoring predictionskeep = keep[: self.post_nms_top_n()]boxes, scores = boxes[keep], scores[keep]final_boxes.append(boxes)final_scores.append(scores)return final_boxes, final_scores

这篇关于FasterRCNN源码解析(六)——RPN(中)Proposal的获取的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/211321

相关文章

Python获取中国节假日数据记录入JSON文件

《Python获取中国节假日数据记录入JSON文件》项目系统内置的日历应用为了提升用户体验,特别设置了在调休日期显示“休”的UI图标功能,那么问题是这些调休数据从哪里来呢?我尝试一种更为智能的方法:P... 目录节假日数据获取存入jsON文件节假日数据读取封装完整代码项目系统内置的日历应用为了提升用户体验,

微信公众号脚本-获取热搜自动新建草稿并发布文章

《微信公众号脚本-获取热搜自动新建草稿并发布文章》本来想写一个自动化发布微信公众号的小绿书的脚本,但是微信公众号官网没有小绿书的接口,那就写一个获取热搜微信普通文章的脚本吧,:本文主要介绍微信公众... 目录介绍思路前期准备环境要求获取接口token获取热搜获取热搜数据下载热搜图片给图片加上标题文字上传图片

使用Jackson进行JSON生成与解析的新手指南

《使用Jackson进行JSON生成与解析的新手指南》这篇文章主要为大家详细介绍了如何使用Jackson进行JSON生成与解析处理,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录1. 核心依赖2. 基础用法2.1 对象转 jsON(序列化)2.2 JSON 转对象(反序列化)3.

Springboot @Autowired和@Resource的区别解析

《Springboot@Autowired和@Resource的区别解析》@Resource是JDK提供的注解,只是Spring在实现上提供了这个注解的功能支持,本文给大家介绍Springboot@... 目录【一】定义【1】@Autowired【2】@Resource【二】区别【1】包含的属性不同【2】@

SpringCloud动态配置注解@RefreshScope与@Component的深度解析

《SpringCloud动态配置注解@RefreshScope与@Component的深度解析》在现代微服务架构中,动态配置管理是一个关键需求,本文将为大家介绍SpringCloud中相关的注解@Re... 目录引言1. @RefreshScope 的作用与原理1.1 什么是 @RefreshScope1.

Java并发编程必备之Synchronized关键字深入解析

《Java并发编程必备之Synchronized关键字深入解析》本文我们深入探索了Java中的Synchronized关键字,包括其互斥性和可重入性的特性,文章详细介绍了Synchronized的三种... 目录一、前言二、Synchronized关键字2.1 Synchronized的特性1. 互斥2.

Python实现无痛修改第三方库源码的方法详解

《Python实现无痛修改第三方库源码的方法详解》很多时候,我们下载的第三方库是不会有需求不满足的情况,但也有极少的情况,第三方库没有兼顾到需求,本文将介绍几个修改源码的操作,大家可以根据需求进行选择... 目录需求不符合模拟示例 1. 修改源文件2. 继承修改3. 猴子补丁4. 追踪局部变量需求不符合很

Java的IO模型、Netty原理解析

《Java的IO模型、Netty原理解析》Java的I/O是以流的方式进行数据输入输出的,Java的类库涉及很多领域的IO内容:标准的输入输出,文件的操作、网络上的数据传输流、字符串流、对象流等,这篇... 目录1.什么是IO2.同步与异步、阻塞与非阻塞3.三种IO模型BIO(blocking I/O)NI

Python 中的异步与同步深度解析(实践记录)

《Python中的异步与同步深度解析(实践记录)》在Python编程世界里,异步和同步的概念是理解程序执行流程和性能优化的关键,这篇文章将带你深入了解它们的差异,以及阻塞和非阻塞的特性,同时通过实际... 目录python中的异步与同步:深度解析与实践异步与同步的定义异步同步阻塞与非阻塞的概念阻塞非阻塞同步

使用Python实现获取网页指定内容

《使用Python实现获取网页指定内容》在当今互联网时代,网页数据抓取是一项非常重要的技能,本文将带你从零开始学习如何使用Python获取网页中的指定内容,希望对大家有所帮助... 目录引言1. 网页抓取的基本概念2. python中的网页抓取库3. 安装必要的库4. 发送HTTP请求并获取网页内容5. 解