论文阅读CondInst《Conditional Convolutions for Instance Segmentation》

论文链接:http://xxx.itp.ac.cn/pdf/2003.05664v3

CondInst是ECCV20上的一篇关于实例分割的文章,个人感觉和YOLACT的思路有相似之处(CondInst最后的处理更加直接简洁)。作者将全卷积网络应用在实例分割的task上,通过采用动态生成的conditional convolution,解决了之前全卷积网络在实例分割上不work的问题。

涉及的问题

作者首先分析了经典的Mask RCNN的问题:(1)由于采用bbox先做框定,所以对于一些不规则的instance,bbox中会掺杂大量的背景信息或者其他实例的杂讯;(2)由于要区分前景和背景信息,因此mask head需要足够大的感受野来编码上下文信息,所以就导致了较多卷积层的堆叠,造成了计算的复杂;(3)ROI操作需要将不同尺寸的区域统一到相同区域,因此对于面积较大的instance,会损失很多精度。

随后作者又分析了FCN的问题:FCN在语义分割等领域已经非常出色,虽然语义分割和实例分割很相似,但FCN在实例分割上依旧不太work(远比不上ROI系列的算法)。究其原因,是因为FCN很难区分一张图像中有相同特征的实例,而实例分割要求我们将所有的实例区分开来;而ROI算法就可以将不同的instance裁剪出来,再逐一进行mask的预测。所以实例分割需要两类信息:(1)appearance:每一个目标的外观特征,即属于什么类别;(2)location:如果一张img有多个同类物体,要通过位置信息区分出他们的不同。

CondInst

所以作者提出了CondInst,可以看作是一个instance-aware的FCN。受动态卷积的启发,CondInst的网络参数是根据instance的不同而变化的,而这个网络参数的作用是编码一些instance的特征(例如位置、形状或者外观信息)。因此根据不同实例对应的conditional mask,把他们分配到整个特征图上,就可以避免ROI操作,从而直接得到每一个instance的mask。
在这里插入图片描述
如上图所示,一张img上有K个实例,就需要动态地生成K个mask head,每一个head在他们的filter中都含有目标实例的一些特征,因此不同的mask作用到特征图时,只会根据各自编码特征,去响应拥有特征的实例所对应的pixel。进而得到不同instance的mask。

Architecture

下图为CondInst的模型图:

在这里插入图片描述

backbone采用ResNet50,采用FPN结构。下面的mask branch是P3经过卷积得到的特征图, F m a s k F_{mask} Fmask,其维度C=8,然后又经过一个类似于coordconv的操作,加上了两个维度的position信息,得到了 F ~ m a s k \widetilde{F}_{mask} F mask,维度为8+2=10。上面的部分针对不同尺度的特征图(P3-P7),得到分类向量 p x , y p_{x,y} px,y,以及controller里面的参数 θ x , y \theta_{x,y} θx,y。这个controller是本文的核心, θ x , y \theta_{x,y} θx,y表示位置为(x,y)的参数向量,它的维度由mask FCN head的参数决定(所有的kernal和bias),这里是169(因为有三个1*1的卷积层,所以总的参数量是 ( 10 ∗ 8 + 8 ) + ( 8 ∗ 8 + 8 ) + ( 8 ∗ 1 + 1 ) = 169 (10*8+8)+(8*8+8)+(8*1+1)=169 (108+8)+(88+8)+(81+1)=169)。每一个位置(x,y)对应一个instance,而每一个instance对应一个不同的 θ x , y \theta_{x,y} θx,y,这个 θ x , y \theta_{x,y} θx,y的参数assign到mask FCN head的三层参数之中,相当于编码了某特定实例的特征。所以特征图 F ~ m a s k \widetilde{F}_{mask} F mask在经过不同的mask FCN head以后,就会根据filter的不同,响应得到不同的intsance的mask。

当然整体的框架遵从FCOS,包括正负例的选取,centerness筛除掉不好的框等操作,而且作者这里并没有吧bbox head删除,因为他在做NMS的时候效果还是要好一些的,最起码速度要比基于mask的NMS快。

Loss

CondInst的损失函数包含两部分,如下所示:
在这里插入图片描述
其中第一部分的loss同FCOS,第二部分为额外的mask部分的loss,其表达形式如下所示:
在这里插入图片描述
mask部分采用Dice Loss,作用是用来平衡正负样本的数量。 c x , y ∗ c_{x,y}^{*} cx,y表示GT类别,等于0表示背景,大于0表示前景; N p o s N_{pos} Npos表示正例数目; M x , y ∗ M_{x,y}^{*} Mx,y表示GT mask。而MaskHead()表示 F ~ m a s k \widetilde{F}_{mask} F mask经过 θ x , y \theta_{x,y} θx,y分配的mask FCN head后得到的预测的mask。

Inference

给定一个img作为输入,得到分类向量 p x , y p_{x,y} px,y,bbox预测 t x , y t_{x,y} tx,y,centerness得分,以及参数 θ x , y \theta_{x,y} θx,y。首先根据FCOS的规则,根据类别score,NMS等操作,假设筛选到最后只剩下K个要预测的instance,这是把那K个位置所对应的 θ x , y \theta_{x,y} θx,y分别加载到mask FCN head中,让 F ~ m a s k \widetilde{F}_{mask} F mask分别通过这K个head,最后分别得到K个不同的instance所对应的mask,再将其整合即可。可以看出,mask head参数量很少,因此Inference的时间也相对较快。

实验结果

与几个经典的方法的比较,CondInst精度是很高的。
在这里插入图片描述

关于 F m a s k F_{mask} Fmask维度C的讨论,发现C=8最好,且C=2时精度也只损失了0.3,这是CondInst这个算法速度很快的原因之一。
在这里插入图片描述

其他还有一些消融实验,这里就不贴结果了,有兴趣的可以去查阅一下论文。

总结

总而言之,CondInst摒弃了ROI方法,因此也消除了ROI方法的三个弊病。CondInst引入动态生成卷积核的模式,为每一个不同的instance产生不同的mask head,从而在特征图正向传播时,这些不同的mask head会根据自身编码的特征,提取出不同instance的mask,从而实现实例分割的task。

  • 3
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
这个警告是由ESLint的规则`no-unneeded-ternary`引起的,它表示在默认赋值时使用条件表达式是不必要的。 在上面的代码示例中,可以看到在`filterItems`方法中使用了条件表达式来处理空字符串的情况。然而,根据该警告,使用条件表达式是不必要的,因为我们可以直接使用简单的赋值操作来实现相同的效果。 要解决这个警告,你可以将条件表达式改为简单的赋值操作。 下面是修改后的代码示例: ```vue <template> <div> <q-select v-model="selectedItem" :options="filteredItems" option-label="label" option-value="value" :filter="filterItems" input-debounce="300" placeholder="Search" /> </div> </template> <script> export default { data() { return { selectedItem: '', items: [ { label: 'Option 1', value: 'option1' }, { label: 'Option 2', value: 'option2' }, { label: 'Option 3', value: 'option3' }, // 其他选项... ], filteredItems: [] }; }, methods: { filterItems(val, update) { if (val === '') { update(() => { this.filteredItems = []; }); } else { const lowercaseVal = val.toLowerCase(); this.filteredItems = this.items.filter(item => item.label.toLowerCase().includes(lowercaseVal) ); } } } }; </script> ``` 在修改后的代码中,我们移除了条件表达式,并直接在`if`语句的分支中进行赋值操作。这样可以避免不必要的条件表达式。 通过这种方式,我们可以消除ESLint警告,并且代码逻辑仍然保持一致。 希望这个解决方案对你有所帮助!如果还有其他问题,请随时提问。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值