导读

实例分割领域21年的SOTA,整个模型结构设计总述为以下:

1)设计了类似于Cascade Mask R-CNN的多阶段迭代优化的bbox和mask预测头;

2)基于query的实例分割方法,延续了DETR(首次将Transformer成功整合为检测pipline中心构建块的目标检测框架模型)中的随机初始化N个object queries和匈牙利匹配损失函数、transformer的Mutil-head attention模块,提出了动态掩码头模块;

这里先解释第一点:多阶段优化

实例分割领域的使用多阶段优化迭代主要解决一个问题:Mismatch

Mismatch问题以两阶段的R-CNN为例子,我知道两阶段实例分割训练阶段大概流程为:输入图像-->backbone(一些卷积操作等等得到特征图)-->feature map --> Region Proposal Netword(RPN) --> Proposal --> Roi pooling/Roi Align(流程如下图所示),在这个得到proposal的时候,会计算proposal和GT的IOU,这时会有一个人为设定的阈值IOU,通过阈值将proposal分为正、负样本(一般为1:3),之后这些proposal送入到ROI Pooling/Roi Align中进行分类和回归;而在测试阶段,输入图像-->backbone-->feature map-->RPN-->proposal到proposal这一步无法采样,因为没有GT,只能将所有的proposal当做正样本进入ROI Pooling,这样导致的问题是:训练阶段的proposal被采样过,而inference没被采样过,输入ROI pooling/RoI Align的分布不一样,后者未经过筛选,质量更差,用前者训练的detector来测试后者的proposal,肯定不对;此外如果提高IOU阈值,1)满足阈值的Proposal更少,造成过拟合;2)training阶段的proposal减少,而inference不变,更加剧了“1)”。

因此,Cascade RCNN给出的方法是:多阶段(用一个stage的输出去训练下一个stage),例如,有一个IOU为0.65的proposal,有3个detector(0.6/0.7/0.8),这里的一个固有实验现象是:proposal经过detector后,IOU会提高,那这样,0.65的proposal经过0.6的detector后,IOU-->0.75,再经过0.7的detector又提高到0.85,再-->0.8的IOU,detector-->0.95,这样proposal的质量更高,而且因为阈值逐级上升,不会有多的样本筛选掉;

第二点结合模型结构来了解;

模型结构

1)Backbone:queryinst的backbone由ResNet50+FPN输出C2,C3,C4,C5四个分辨率的特征;

2)queries:这里延用了DETR中随机初始化N个object queries,采用nn.Embedding初始化N个object的queryinst bbox和queries features,并将初始化的bbox解码为原始尺寸的bbox表达,(bbox解码有中心点+高宽改为左上、右下角点表示);

3)bbox和cls预测:以第一阶段为例子,

  • xFPN表示FPN输出的多分辨率特征图,bt-1表示上一阶段的bbox的预测,Pbox在这表示ROI Align,xboxt表示得到的7*7的bbox feature;
  • qt-1是上一阶段的object query,MSAt是transformer中的Mutil-head self-attention,得到的q*t-1是transformer query;
  • DynConvboxt是动态卷积,输出的qt和xbox*t分别是增强的bbox feature和object query;
  • Bt代表有FFN构成的bbox预测分支,bt为这一阶段的预测结果;

4)最主要创新点:Dynconvbox和DynConvmask

这里有queryinst的动态掩码头示意图:



与以往不同的是,增添了一个DynConvmaskt模块,这样将query和mask feature 建立了联系,看下面公式:



看懂了第“3)”部分的公式,这部分也自然容易看懂,这里最重要的是,经过ROI Align的mask feature和query同时经过了动态卷积,

  • 那这样在训练期间,每个掩码信息不仅传回Xmaskt,还会流回mask,这样使得mask和query之间建立了联系,训练完成后,掩码预测的信息存在query中;
  • 在推理阶段,前5个stage丢弃所有的动态掩码头,仅在最后阶段使用,query隐式地携带了多阶段信息进行掩码预测(query+Xmaskt经过Dynconvtmask得到mask)

总结

  1. queryinst集成了Cascade Mask R-CNN的多阶段迭代优化和DETR的object queries和匈牙利匹配损失函数、transformer的Mutil-head attention模块,构建了一个基于query的实例分割框架,它由基于query的对象检查器和并行监督驱动的六个动态掩码头组成;
  2. 关键点是提出了Dynconvtmask模块,将query和mask信息建立了联系,同时利用不同阶段的query中固有的一对一对应关系提升了检查精度,即每个单独的的query在每个阶段均用来预测同样的目标;

    3.多头自注意力

论文日记五:QueryInst的更多相关文章

  1. oracle入坑日记<五>数据表

    1   数据表 1.1.数据表是存放数据字段信息的地方:在Oracle,数据表拥有者单位是用户,同时数据表属于表空间.如: 登录my_user用户在orcl表空间下创建的表就是 my_user用户在o ...

  2. 【社交系统研发日记五】ThinkSNS+如何计算字符显示长度?

    今天我们来聊一下可能很多人都会头疼的东西:显示长度. 需求是这样的,在字符的显示上,两个英文单词才占一个中文或者其他语言的显示长度.如下: 上面排的是两个英文字母,一个汉字,一个Emoji.你会发现, ...

  3. Python学习日记(五) 编码基础

    初始编码 ASCII最开始为7位,一共128字符.最后确定8位,一共256个字符,最左边的为拓展位,为以后的开发做准备. ASCII码的最左边的一位为0. 基本换算:8位(bit) = 1字节(byt ...

  4. oracle入坑日记<六>自增列创建和清除(含序列和触发器的基础用法)

    0   前言 用过 SQLserver 和 MySQL 的自增列(auto_increment),然而 Oracle 在建表设置列时却没有自增列. 查阅资料后发现 Oracle 的自增列需要手动编写. ...

  5. oracle入坑日记<四>表空间

    1   表空间是什么 1.1.数据表看做的货品,表空间就是存放货品的仓库.SQLserver 用户可以把表空间看做 SQLserver 中的数据库. 1.2.引用[日记二]的总结来解释表空间. 一个数 ...

  6. oracle入坑日记<三>用户详解(角色理解)

    1   用户是什么 1.1.权限管理是Oracle的精华,不同用户登录到同一数据库中,可能看到不同数量的表,拥有不同的权限.Oracle 的权限分为系统权限和数据对象权限,共一百多种.如果把Oracl ...

  7. oracle入坑日记<二>认识oracle(含sqlplus基础使用)

    1.SID(数据库实例) 1.1. oracle安装的时候有一项叫[全局数据库名]的填写项,这个就是oracle的SID也是数据库的唯一标识符: 1.2.一个oracle数据库有且只有一个SID(一般 ...

  8. oracle入坑日记<一> 安装

    学习日记系列(前辈/大神勿喷) 一.下载 下载地址:http://www.oracle.com/technetwork/cn/database/enterprise-edition/downloads ...

  9. 《Multi-Agent Actor-Critic for Mixed Cooperative-Competitive Environments》论文解读

    MADDPG原文链接 OpenAI bog DDPG链接 目录 一.摘要 二.效果展示 三.方法细节 问题分析 具体方法 伪代码 网络结构 四.实验结果 五.总结 附录 Proposition 1 一 ...

  10. 2015.12.20-2015.12.25 大论文迭代 A

    进一步充实大论文内容.结构,完善一遍大论文 12.20周天,完成论文第五章总结部分,和第一章的修改 12.21周一,完成论文第二章的修改充实 12.22周二,完成论文第三章的修改充实 12.23周三, ...

随机推荐

  1. 简单记录一下从网上找到的python的渗透方面的第三方库

    python的hacker三方库 Scapy, Scapy3k:发送,嗅探和剖析并伪造网络数据包,可以做交互式应用或单纯的作为库来使用 pypcap, Pcapy and pylibpcap:几个不同 ...

  2. web自动化06-键盘操作

    键盘操作 1.说明: 1). 模拟键盘上一些按键或者组合键的输入 如:Ctrl+C .Ctrl+V: 2). Selenium中把键盘的按键都封装在Keys类中 2. Keys类 导包:from se ...

  3. Java(if选择、switch选择、循环)

    1.if 选择结构 //语法 if(表达式){ //语句:(表达式为真) }else{ //语句:(表达式为假) } --------------------------------------- 例 ...

  4. WC2021及学长分享题目

    部分题目见洛谷题单 动态更新. 标 * 为想做的题. hdhd: CF1214G Feeling Good CF1305F Kuroni and the Punishment AGC016F Game ...

  5. docker镜像的原理

    docker镜像的原理 docker镜像是由特殊的文件系统叠加而成 最低端是bootfs,并使用宿主机的bootfs 第二层是root文件系统rootfs,称之为base image 再往上是可叠加的 ...

  6. 什么是Sparse by default for crates.io

    当 Rust crate 发布到 crates.io 上时,可以启用"Sparse by default"特性,这意味着默认情况下,crate 不会包含所有依赖项在上传到 crat ...

  7. 如何在 Python 中实现遗传算法

    前言 遗传算法是一种模拟自然进化过程与机制来搜索最优解的方法,它由美国 John Holland 教授于20世纪70年代提出.遗传算法的主要思想来源于达尔文生物进化论和孟德尔的群体遗传学说,通过数学的 ...

  8. Falcon 登陆 Hugging Face 生态

    引言 Falcon 是由位于阿布扎比的 技术创新研究院 (Technology Innovation Institute,TII) 创建的一系列的新语言模型,其基于 Apache 2.0 许可发布. ...

  9. Unity 制作KinematicCharacterController

    本篇博客为游戏开发记录,博主只是想自己做个移动组件给自己做游戏用,此间产生的一些经验也做一个分享. 简介 为了在3D世界中自由的控制我们的角色,引擎一般会提供一些基础的移动组件,上层用户做提供一些每帧 ...

  10. .NET表达式树

    IQueryable/IQueryable 和表达式树 IQueryable有两个组件 Expression:当前查询的组件的与语言和数据源无关的表示形式,以表达式树的形式表示. Provider:L ...