论文名称:《SOLOv2: Dynamic, Faster and Stronger》
论文链接:https://arxiv.org/abs/2003.10152
参考代码:http://github.com/WXinlong/SOLO (v1已开源~)
目录
综述
SOLO v2遵循了SOLO的优雅、简单的设计,并且针对mask的检测效果和运行效率做了两个改进:(1)mask learning:能够更好地学习到mask(2)mask NMS:提出了matrix nms,大大减少了前向推理的时间。 最终,SOLOv2相比SOLOv1,AP提升1.9%的同时速度快了33%,light-weight 版本的SOLVv2能够在COCO上达到31.3FPS,37.1%AP。除此之外,SOLO v2还在目标检测和全景分割任务中表现上佳,证实了SOLO的思路有用在更多视觉任务的潜力。
SOLO v1回顾
整体思路
SOLO的核心思想是:将分割问题转化为位置分类问题,从而做到不需要anchor,不需要normalization,不需要bounding box detections的实例分割。具体做法是:将图片划分成S×S的网格,如果物体的中心(质心)落在了某个网格中,那么该网格就有了两个任务:(1)Category Branch 负责预测该物体语义类别(2)Mask Branch 负责预测该物体的instance mask。这就对应了网络的两个分支。同时,SOLO在骨干网络后面使用了FPN,用来应对尺寸。FPN的每一层后都接上述两个并行的分支,进行类别和位置的预测,每个分支的网格数目也相应不同,小的实例对应更多的的网格。
Category Branch负责预测物体的语义类别,每个网格预测类别S×S×C,这部分跟YOLO是类似的。
重点看一下Mask Branch,每个正样本(有类别输出的网格)都会输出对应类别的instance mask,这里的通道channel和网格的对应关系是:第k个通道负责预测出第(i,j)个网格的instance mask,k = i*S+j。因此输出维度是H×W×(S^2) 。这样的话就有了一一对应的语义类别和class-agnostic的instance mask。
操作流程(附源代码)
SOLO的两个分支光看论文可能会比较迷糊,还好作者昨天开源了源代码,通过代码可以更加清晰地了解head部分的操作流程。总结如下:
(1)首先经过backbone网络和FPN,得到不同层级的图像特征;
(2)对于Category分支,首先将FPN最高层的特征从H×W×256对齐至S×S×256(256为特征通道数),然后经过一系列卷积(7个3×3卷积)提取特征,最后再经过一个3×3卷积将输出对齐到S×S×C(C为预测类别-1);
# cate branch
for i, cate_layer in enumerate(self.cate_convs):
if i == self.cate_down_pos:
seg_nu