SOLO:一种新的端到端实例分割方案?
论文地址、
代码地址
1.SOLO(v1)简介
实例分割是给出每个目标对应的mask,与语义分割的区别是,在语义分割里面只需要区分这个点是“猫”还是“狗”,实例分割里面是要判断这个是猫1还是猫2,即对同一类别的不同目标需要进行细分。所以在实例分割里面常用的两种方法为(1)top-down:先根据检测,然后在每个检测框里面进行分割 (2)bottom-up先分割,然后通过后处理来处理同一类别的不同实例,常采用聚类处理。
SOLO中的思路非常清奇,抛除了之前bottom-up和top-down的做法,首先,先思考一下怎么去区分一张图里面的不同实例呢?数据数据统计上作者统计了不同实例之间的距离和尺寸大小。发现98.3% 的的目标对距离>30,剩下的1.7%中的目标对中尺寸差距差1.5倍,从数据角度上看,两个实例要么尺寸不同要么距离较远。如何让网络去区分这个事情呢,下面就介绍下论文的思路,以及每一个branch的输出是什么?Target是什么?Loss是什么?后处理等等
2.思路介绍
2.1 尺寸上的解决方案:
其中尺寸可以通过FPN进行区分,这个也是比较常见的FPN用法,即在训练的时候不同尺寸的目标在不同的FPN层上计算LOSS,这样可以避免冲突.
2.2距离上的解决方案:
距离上网络输出一个S*S的网格,表示了目标的位置类别,具体来说比如有80个类别,那么这个FeatureMap的输出大小为(B,80,H,W)。即如果这个实例的中心落在哪个网格,哪个网格的Label就为1,损失函数采用了FocalLoss
2.3分割上的输出
分割上的输出和一般分割一样,输出FeatureMap的大小为(B,S*S,H,W)。target的生成方案如下:如果这个实例落在第2行第3列的网格中,那么在分割上他的target只会在2S+3的Channel生成target并计算Loss,损失函数采用的是Dice Loss。
3.细节介绍
理解了category_branch的设计思路已经是SOLO的精髓了,但是还有一些细节需要注意,这个是我写文章的一种思路,先把主要核心的拿出来,理解文章的出发点,方案设计,然后再谈细节,因为细节部分大部分都是作者的优化策略,按照这样的思路去阅读论文去总结我觉得帮助更大,在实际工作中也会有更多的启发
3.1category_branch改进:中心点采样
基础的思路整体上应该能得到一个好的结果,但是我们知道让网络去学习一个点的分类和回归一般都是比较困难的,CenterSample是被广泛采用的一种思路,所以在SOLO中也用了这样的方案,除了中心点以外,在中心点附近也取3个点作为正样本计算Loss。
3.1mask_branch改进:CoordConv
CoordConv这篇文章我也看了,比较有意思,让网路学习坐标这个问题确实值得探讨,从SOLO的实验中可以看到加入了坐标特征之后的更好,最终的结果也有比较好的效果.注意这个坐标特征需要归一化到[-1,1]之间的。
你以为这就完了?????
明显,mask分支中S*S的结果太大了,假设你40x40的grid那得1600的Channel数呢,这样的结果就算有用,应用价值也不大,因此论文提出了一个DecoupleSOLO的方案。
这个Decouple的方案就是分成了两个Branch,X_branch和Y_branch,最后相乘的结果作为Mask,这样的话网络输出就由1600->160,真的大大减少了显存占用。
4.实验结果
5.总结
这是一篇非常好的文章,很佩服这个level的人能够从实际的需求出发,思考,先是结合之前的经验进行分析,统计数据分布上的差异性,并据此进行建模,设计一个预测不同实例位置并FPN分层的方案来完成实例分割。并分析此方案的不足之处,结合前人的一些经验和成果,加入FocalLoss, DiceLoss,CenterSample, CoordConv等方案来不断完善,并且最后提出的DecoupleSOLO的方案也非常亮眼,不可多得的好文章,值得学习!SOLO v2也正在总结,更多精彩的内容在后面~
如果这篇文章对你有帮助,请点赞喜欢收藏关注一波奥~~~
6.友情链接
FCOS解读、Retina解读
理解MMDetection架构——Runner
理解MMDetection架构——Registry
理解MMDetction架构——Hook
|