标题:Max-DeepLab:使用掩模Transformer进行端到端全景分割
作者:Huiyu Wang,Yukun Zhu,Hartwig Adam,Alan Yuille,Liang-Chieh Chen
机构:Johns Hopkins University ,Google Research
论文地址:https://arxiv.org/abs/2012.00759
项目地址:暂未开源代码
文章方法很大程度上简化了依赖于子任务和手动设计的组件(例如,bbox检测,NMS,thing-stuff合并)的现有方式。
相比之下,本文的MaX-DeepLab可通过Mask Transformers直接预测带有类别标签的Mask,并通过二分法匹配以全景质量启发的损失(panoptic quality inspired loss via bipartite matching. )进行训练。
网络具体设计是Mask Transformers采用双路径架构,除了CNN路径外,还引入了全局memory路径,从而允许与任何CNN层直接通信。
结果:在COCO数据集上,相比之前的的box-free策略的方式,提升了7.1%PQ。此外,MaX-DeepLab就可以在COCO test-dev上达到最新的51.3%PQ。
之前的方式: 将全景分割任务分成子任务分支,采用多种分开设计的模型。这些方法在单独的分支效果都还可以,但是处理复杂的全景分割任务时,效果就不那么好了。
总结起来,之前的方式两类:基于box的,和box free的。box free 的主要以上图b、c为例,缺陷在于难以处理高度不规则的目标和挨得过近的目标。
本文方法:受DETR的启发,我们的模型通过一个Mask Transformer直接预测了一组不重叠的mask及其对应的语义标签。 输出masks和labels使用全景质量(PQ)样式的目标进行了优化。我们将两个类别标记的mask之间的相似性度量定义为它们的mask相似度与class类别相似度的乘积。然后训练模型的目标是最大化groud truth mask和预测的mask的相似性(通过二分法匹配)。
总结Contribution
表示形式
将每个像素点label的形式表示为:(mi,ci)。mi属于{0,1},ci则属于某一语义类别。这样,就能将所有的thing和stuff一致性表示,并且相互分离。(mi=0/1表示前后景,也就是thing和sutff)。这样就不用有合并thing和stuff的步骤了。
问题:不同instance 对象怎么确定的?
推理阶段
ci就是网络输出的类别概率,通过一个max操作就能取得概率最大的类别作为预测类别。像素赋予maskID。
PQ loss
Dice系数是,根据Lee Raymond Dice [1]命名,是一种集合相似度变量函数,通常是计算两个样本的相似度(值范围为[0,1])。参考https://www.aiuai.cn/aifarm1159.html
Mask matching:
采用bipartite matching来实现预测和label的的匹配。文章采用的匈牙利算法。取前N个最好的匹配结果作为计算loss 的匹配positive mask。
作者这里提到:
But in our case, assigning multi- ple predicted masks to one ground truth mask is problematic too, because multiple masks cannot possibly be optimized to fit a single ground truth mask at the same time
那为什么还是这么做的呢?直觉上,应该就分配一个匹配度最高的不是吗??
loss的具体形式
上面已经提过了,优化目标转化为最大化预测mask和label的相似度度量(匹配上的mask)。
即:
但是作者在实际用的时候,通过应用梯度的乘积规则,然后将概率^p更改为对数概率log ˆp,将Opos PQ重写为两个常见的损失项。因为 从pˆ到logˆp的变化与常见的交叉熵损失一致,并在实践中更好地缩放梯度以进行优化。
最后,作者还考虑那些negative (unmatched) masks的损失,作为正则项,最终的损失函数如下:
看到这里其实整篇文章端对端的设计思路很清晰了。
具体详细结构
额外的(辅助)损失函数
文章提到,除了上面说的PQstyle相似性损失,加入附加损失是对训练有帮助的。
包括:
实例判别损失:帮助实例特征聚类
首先对groud truth mask降采样到1/4大小,进行特征编码,然后对编码的特征进行实例判别。
像素mask-ID交叉熵损失:分类每个像素到对应的N个mask
语义分割损失:加入了语义分割头(同Panoptic-Deeplab论文中)
这部分主要是对:1、不同尺度的输入大小对结果的影响;2、Dual-path transformer结构设计中attention模块的选择设计以及Dual-path transformer模块的深度选取;3、不同损失函数的效果
做了一些实验选取了最优搭配。
结果就是很diao!
有一个问题:
mask-ID prediction结果不是特别高,实验大概有10%的错误率。像素mask-ID交叉熵损失是否有改进空间?
其实看着结构很清楚,但是里面的内容还有很多疑问:
回头再看吧
又看了一遍论文,论文的mask生成和语义类别是类似于SOLO的方法。但是论文里面讲得很模糊…应该是预测的N个(常数)不同mask放在不同的通道维度上,对应的语义类别分支也是N维(C个类别),然后一一对应。
所以这样的话,不同的对象(stuffs和things)是自然而然的分离的,id当然可以直接以mask所在的第i通道作为mask内的所有像素的id。
这个公式。没有看太懂,有看懂的兄弟姐妹评论告诉我一下。
文章浏览阅读775次,点赞15次,收藏9次。该工程源代码实现了通过ddr3的axi_dma进行PL和PS端的数据交互,并支持PS端通过gpio控制axi_dma读写模块的使能,以及通过axi_lite寄存器配置dma的读写地址范围和数据长度。功能:实现PL和PS端通过ddr3的axi_dma读和写进行数据交互,PS端可通过gpio控制axi_dma读写模块的使能,PS端可通过axi_lite寄存器配置dma的读和写的地址范围或数据长度,PL端的dma写完成后通过中断信号通知PS端。用户可通过该例程比较快速的搭建自己的更丰富的应用,节省您的开发周期。
文章浏览阅读2.2k次。auto redis = Redis("tcp://[email protected]:6379/0?keep_alive=true"); redis.hset("LogonServer", "1","192.168.8.105:8600"); auto v = redis.hget("LogonServer","1"); redis.save();_c++ 读写redis
文章浏览阅读172次。编写一个函数,交换指定字典的key和value。 例如:dict1={'a':1, 'b':2, 'c':3} --> dict1={1:'a', 2:'b', 3:'c'} def change_1(dic): """ 交换字典的键和值并打印 :param dic: 指定的字典 :return: 交换键和值后的字典 """ dic1 = dict([(value,key) for key,value in dic.items()]).._、、、:能丨氵‘、、、 、串↑、∴、、∴ 、、
文章浏览阅读1.7k次。针对multicombox 的研究前言由于Qt仅仅提供多选下拉框只能选择单项项目,要实现多选项选择,因此需要自己设计和编码,针对multicombox 的研究如下,总结网上及自己实际经验,汇总如下:(1)下拉listview设置左边为样式A为“fusion”样式,在ubuntu下的样式似乎就是这个,它的特点是下拉列表会把文字框和箭头盖住。右边样式B为“windowsvista”样式,它是win10下Qt的默认样式,其特点是下拉列表会显示在文字框和箭头下方,所以不会盖住文字框和箭头。 那么如何在不改变_qcombox点击多选
文章浏览阅读2k次,点赞5次,收藏3次。1 本人是Win10 1909+Ubuntu20.04单硬盘双系统台式机用户,近期老是发现Ubuntu20.04里面AX200无线网卡不支持,右上角没有wifi图标,蓝牙是正常的。有线网卡正常。以前按照这位老兄的教程装过没问题https://zhangyiming748.github.io/2019/12/05/useAX200OnUbuntu/刚开始是以为UBuntu自动更新的锅,但是现在再次重装几次还是不行 ,查看驱动目录文件没问题2 另外发现一个问题在Ubuntu里面无法对NTFS分区写入文件,_win10 乌班图双系统,乌班图没有wifi选项
文章浏览阅读193次。最近国内某大型互联网公司依靠其数据优势成功上市,可见数据的重要性,而数据和存储密不可分,您真的知道自己需要更高性能存储吗?在当今数据爆发式增长的时代,数据已经成为很多行业最重要的资源,没有之一。数据左右着很多新兴企业的命脉,收集数据、分析数据和应用数据的循环已经变为企业发展的根本,依靠数据创造更大的价值,并持续的加强和优化数据管理流程,让数据型驱动的行业不断进化。常规的存储只能满足数据保存的基本需求,或者顺带一些基本的数据混合管理,而要真正挖掘数据的价值,采用高性能..._tstor
文章浏览阅读1.8k次。不多说,直接上码 本人测试成功,可以解决Springmvc返回为String的乱码问题<mvc:annotation-driven > <!-- 消息转换器 --> <mvc:message-converters register-defaults="true"> <bean class="org.spri..._springmvc return string乱码
文章浏览阅读1.5k次。每次给服务器装完系统,总是无法将网口和配置文件对应,笨办法一个一个试,有的服务器可以用ifdown、ifup来观察网卡指示灯,但是这个方法只对一部分服务器有效。下面两种方法可以快速对应:方法一:使用ethtool(在服务器旁)如果在服务器旁边则可通过以下命令进行测试:ethtool -p eth0此时eth0文件对应的网口就会闪烁。(eth0文件就是 /etc/sysconfig/network-scripts/ 目录下以 ifcfg- 开头的文件名的后半部分)方法二:使用mii-tool(不_cannot identify nic
文章浏览阅读284次。Python调用C/C++动态链接库的需求在自动化测试过程中,难免会遇到语言混合使用的情况,这不,我们也遇到了。初步决定采用Robot Framework作为自动化测试框架后,其支持Java和Python,而Python作为主流的语言,怎么能放弃使用它的机会^_^。 然而产品采用是古老90年代开发的C/S结构,因为古老,当时也没有考虑到对产品的测试进行自动化,Client端并没有预留CLI(Com..._pythond 动态库
文章浏览阅读956次,点赞9次,收藏8次。由于篇幅限制,小编在此截出几张知识讲解的图解《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!也去过华为、OPPO等大厂,18年进入阿里一直到现在。**深知大多数Java工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
文章浏览阅读4.4k次。vue通过style或者class改变样式的实例代码通过style改变样式通过className改变样式v-bind:class="{ active: isActive, 'text-danger': hasError }">data: {isActive: true,hasError: false}.active{...}.text-danger{...}PS:下面看下Vue的一些样式(..._通过class 赋值给样式
文章浏览阅读1w次,点赞6次,收藏59次。先碎碎念一下,最近在学习springboot项目,在b站跟着up主研究如何写一个简易的博客来着,后来发现可以直接简易的搭建一个博客(都不用写代码,直接有现成的。。。)倒腾的一晚上,终于搭好了,虽然搭建博客都是拿现成的,但是有一个自己的博客还是很开心的。这个博客是基于halo博客+Sakura主题博客搭建参考up主的视频搭建一个简易的博客本文默认读者有一台云服务器以及了解相关linux知识第一步因为halo博客需要的环境为jdk11,所以第一步就是安装jdk啦配置jdk 11yum ins_博客搭建