PointRend的原理与代码解读

2023-10-28 15:50
文章标签 代码 原理 解读 pointrend

本文主要是介绍PointRend的原理与代码解读,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

PointRend的提出是为了解决实例分割精度不高的问题,当然也可以应用到语义分割上。PointRend是如何解决分割结果精细度不高的问题呢?下面回顾一下语义分割领域最经典的FCN模型。

FCN语义分割思想:对原始图像经过不断的卷积和池化,得到高语义低分辨率特征,然后进行分类,分类后直接上采样(线性插值类算法)到与图像大小一致的结果,这样必然会导致分割结果很粗糙,尤其是边界部分误差很大。

(代码层面上实现,有一种是原始图像经过卷积池化后,上采样到原始图像大小后再进行像素级的分类预测)

后面大部分的语义分割模型都是基于FCN框架衍生,并在最后上采样部分做了修改,如UNet,deeplabV3+,PSPNet分类预测后上采样的倍数都不一样。

PointRend核心思想:语义分割经过多次池化降采样后,直接预测分类结果,而不是上采样到跟原图像同样尺寸。在粗糙的分割结果中选择分割精度不高的点,然后在这些点上结合粗糙和精细的特征训练MLP模型,对这些点进行重新预测,在训练阶段用重新预测的结果替换原来预测的粗糙结果进行loss计算。推理阶段重新预测的结果替换原来预测的粗糙结果。

训练阶段:

以deeplabv3+为例,输入影像经过特征提取backbone(如RestNet)后,选取layer2和layer4层特征,其中layer4层经过deeplabv3+的ASPP后,直接预测分类结果,称为corase分类结果。layer2称为精细特征fine。然后在corase分类结果中选择分类结果不是非常确定的点(数目为输入影像高度的16分之一),然后根据这些不确定点的坐标分别在corase分类结果特征和layer2特征上采集相应的特征,最后把特征cat后送入mlp进行训练,得到新的预测结果,叫rend。

损失:分为2个,一个是corase分类结果直接上采样后与gt对比得到的seg loss;另一个是rend预测结果与根据不确定点坐标在gt上采样得到的结果进行计算得到的points loss。

ASPP

推理阶段:

以deeplabv3+为例,输入影像经过特征提取backbone(如RestNet)后,选取layer2和layer4层特征,其中layer4层经过deeplabv3+的ASPP后,直接预测分类结果,称为corase分类结果。layer2称为精细特征fine。然后对corase分类结果进行2倍上采样,再在上面进行点采样(文章8096个points);接着再在layer2层采样,然后把2种采样特征cat起来,放入mlp进行预测,预测结果代替2倍上采样后的corase分类结果;

一直迭代下去,直到操作到原始图像尺寸大小为止。

注意点:训练和推理的不确定点的采样策略不一样

代码理解:

函数def point_sample(input, point_coords, **kwargs)调用了F. grid_sample函数进行采样。

def grid_sample(
    input: Tensor,
    grid: Tensor,
    mode: str = "bilinear",
    padding_mode: str = "zeros",
    align_corners: Optional[bool] = None,
)

官方说明:

Given an input and a flow-field grid, computes the output using input values and pixel locations from grid.

个人理解:

简单来说就是,提供一个input的Tensor以及一个对应的flow-field网格(比如光流,体素流等),然后根据grid中每个位置提供的坐标信息(这里指input中pixel的坐标),将input中对应位置的像素值填充到grid指定的位置,得到最终的输出。​

 

这篇关于PointRend的原理与代码解读的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



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

相关文章

SpringBoot中四种AOP实战应用场景及代码实现

《SpringBoot中四种AOP实战应用场景及代码实现》面向切面编程(AOP)是Spring框架的核心功能之一,它通过预编译和运行期动态代理实现程序功能的统一维护,在SpringBoot应用中,AO... 目录引言场景一:日志记录与性能监控业务需求实现方案使用示例扩展:MDC实现请求跟踪场景二:权限控制与

redis中使用lua脚本的原理与基本使用详解

《redis中使用lua脚本的原理与基本使用详解》在Redis中使用Lua脚本可以实现原子性操作、减少网络开销以及提高执行效率,下面小编就来和大家详细介绍一下在redis中使用lua脚本的原理... 目录Redis 执行 Lua 脚本的原理基本使用方法使用EVAL命令执行 Lua 脚本使用EVALSHA命令

Java Spring 中 @PostConstruct 注解使用原理及常见场景

《JavaSpring中@PostConstruct注解使用原理及常见场景》在JavaSpring中,@PostConstruct注解是一个非常实用的功能,它允许开发者在Spring容器完全初... 目录一、@PostConstruct 注解概述二、@PostConstruct 注解的基本使用2.1 基本代

SpringBoot中配置文件的加载顺序解读

《SpringBoot中配置文件的加载顺序解读》:本文主要介绍SpringBoot中配置文件的加载顺序,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录SpringBoot配置文件的加载顺序1、命令⾏参数2、Java系统属性3、操作系统环境变量5、项目【外部】的ap

Golang HashMap实现原理解析

《GolangHashMap实现原理解析》HashMap是一种基于哈希表实现的键值对存储结构,它通过哈希函数将键映射到数组的索引位置,支持高效的插入、查找和删除操作,:本文主要介绍GolangH... 目录HashMap是一种基于哈希表实现的键值对存储结构,它通过哈希函数将键映射到数组的索引位置,支持

利用Python调试串口的示例代码

《利用Python调试串口的示例代码》在嵌入式开发、物联网设备调试过程中,串口通信是最基础的调试手段本文将带你用Python+ttkbootstrap打造一款高颜值、多功能的串口调试助手,需要的可以了... 目录概述:为什么需要专业的串口调试工具项目架构设计1.1 技术栈选型1.2 关键类说明1.3 线程模

Python Transformers库(NLP处理库)案例代码讲解

《PythonTransformers库(NLP处理库)案例代码讲解》本文介绍transformers库的全面讲解,包含基础知识、高级用法、案例代码及学习路径,内容经过组织,适合不同阶段的学习者,对... 目录一、基础知识1. Transformers 库简介2. 安装与环境配置3. 快速上手示例二、核心模

Java的栈与队列实现代码解析

《Java的栈与队列实现代码解析》栈是常见的线性数据结构,栈的特点是以先进后出的形式,后进先出,先进后出,分为栈底和栈顶,栈应用于内存的分配,表达式求值,存储临时的数据和方法的调用等,本文给大家介绍J... 目录栈的概念(Stack)栈的实现代码队列(Queue)模拟实现队列(双链表实现)循环队列(循环数组

Mysql用户授权(GRANT)语法及示例解读

《Mysql用户授权(GRANT)语法及示例解读》:本文主要介绍Mysql用户授权(GRANT)语法及示例,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录mysql用户授权(GRANT)语法授予用户权限语法GRANT语句中的<权限类型>的使用WITH GRANT

使用Java将DOCX文档解析为Markdown文档的代码实现

《使用Java将DOCX文档解析为Markdown文档的代码实现》在现代文档处理中,Markdown(MD)因其简洁的语法和良好的可读性,逐渐成为开发者、技术写作者和内容创作者的首选格式,然而,许多文... 目录引言1. 工具和库介绍2. 安装依赖库3. 使用Apache POI解析DOCX文档4. 将解析