论文:https://arxiv.org/abs/1904.02689
代码:https://github.com/dbolya/yolact
Yolact
是2019年出的第一个达到实时的开创性实例分割网络,19年底也更新到了Yolact++
。去年只是用它跑了自己的数据,但一直没有深入学习这个模型,这次好好学习下。
Yolact将总任务划分为两个并行的子任务实现的:(1)生成prototype mask集合;(2)预测每个pre-instance mask系数。之后将mask系数与原始mask线性结合得到实例分割掩膜。文章发现这个过程并不需要重新池化操作(两阶段方法),因而可以生成高质量的掩膜,此外网络对于一些异常情况也能够较好处理。在传统NMS算法的基础上提出了Fast NMS(速度快了12ms),只带来了很小的性能损失。
直接看效果,如图:
由图可以看到,Yolact的map虽然率逊于Mask-RCNN,但是它的速度真正达到了实时,高达30FPS。
3. YOLACT
这篇文章的方法是在现有的一阶段检测网络的基础上添加一个掩膜分支,就像Mask R-CNN在Faster R-CNN基础上做的一样,区别是没有了特征池化操作。这里将整个任务划分为了两个并行的子任务:
1)prototype mask分支,使用FCN的网络结构去生成prototype mask,这个过程中并不会涉及到单个实例(单个实例是在检测结果上corp之后得到的);
2)目标检测分支,该分支对每个anchor去预测mask的系数,从而得到图像中实例的位置。
最后,对于在NMS中幸存的每个实例,我们通过线性组合这两个分支的工作为该实例构造一个掩码。
Yolact整个结构如下图所示:
3.1. Prototype Generation
原型生成分支(Protonet
)会预测产生 k 个prototype mask
,作者将 protonet 当做FCN,其最后一层具有k个通道(每个prototype mask
一个,k个通道对应k个prototype mask
),并将其附加到主干特征层(请参见图3)。
protonet的作用有些类似语义分割模型,不同之处在于protonet部分的训练不单独设置loss,只在整个网络最后输出的mask上进行监督,即该部分的损失被整合于最终掩膜损失。
作者对protonet的设计考虑两点:
- 深的backbone中获取protonet可以产生更稳当的mask;
- 高分辨率的原型mask有利于提高分割精度和对小目标的效果
因此,作者使用了FPN作为backbone(因为它最大的特征层是最深的,本文例子是P3,见图2),同时上采样到原图尺寸的1/4以改善对小目标的分割效果。
3.2. Mask Coefficients
典型的基于锚的目标检测器的预测头中有两个分支:一个分支预测c类置信度,另一个分支预测4个边界框回归器。对于mask Coefficients
预测,作者并行添加第三分支预测k个mask Coefficients
。 因此,每个anchors不是产生(4 + c)个值,而是预测(4+C+k)个值。如下图:
另外作者认为,为了能够通过线性组合来得到最终想要的mask,能够从最终的mask中减去原型mask是很重要的。换言之就是,mask系数必须有正有负。所以,在mask系数预测时使用了tanh函数进行非线性激活,因为tanh函数的值域是(-1,1)。
3.3. Mask Assembly
为了产生实例mask,作者将prototype分支和Mask Coefficients分支的工作结合在一起,将生成的prototype mask与mask coefficient进行线性操作,之后使用sigmoid激活函数。 以生成最终的mask。
其中P是prototype mask的h×w×k矩阵,C是n×k矩阵,代表有n个通过NMS和阈值过滤的实例,每个实例对应有k个mask系数。相乘得到h * w * n,即最终预测得到n个mask。
- Loss
模型loss由三部分组成,分类损失L_cls
,定位的损失函数L_box
,分割的损失函数L_mask
,它们各自的权重分别是1,1.5,6.125
。分类损失和定位损失的定义与SSD(Ssd: Single shot multibox detector. In ECCV, 2016
)中的损失定义相同,mask损失为预测mask和ground truth mask的逐像素二进制交叉熵(BCE)。
其中M为预测mask,M_gt为真实mask。
- Cropping Masks
在推理过程中使用预测的边界框裁剪最终mask。 在训练过程中,我们改用真实的bbox框进行裁剪,并通过除以对应ground truth框面积来平衡loss尺度,以保留prototype中的小对象。
4. Backbone Detector
对于我们的骨干检测器,我们优先考虑速度和功能丰富性,因为预测这些原型和系数是一项艰巨的任务,需要良好的功能才能做好。 因此,我们的骨干探测器的设计紧随RetinaNet [27],并且设计上着重于速度。
- YOLACT Detector
我们使用带有FPN
[26]的ResNet-101
[19]作为默认功能主干,默认输入图像尺寸为550×550
。
Yolact
不保留纵横比以使每个图像获得一致的评估时间。 像RetinaNet
一样,Yolact通过不生成P2以及不生成P6和P7作为从P5(不是C5)开始的连续3×3 stride 为2的卷积层来修改FPN
,并在每个上放置3个长宽比为[1,1 / 2,2]的anchors
。P3的anchors的面积为24像素平方,并且每个后续图层的大小都是前一个的比例的两倍(结果为比例[24、48、96、192、384]
)。对于每个Pi附加的预测头,三个分支共享一个3×3卷积,然后每个分支并行获得自己的3×3卷积层。 与RetinaNet
相比,Yolact
的预测头设计(见图4)更轻巧,更快。
Yolact
将smooth L1
损失应用于训练box回归器,并以与SSD [30]相同的方式对box回归坐标进行编码。 为了训练类别预测,Yolact
使用带有c个正向标记和1个背景标记的softmax
交叉熵,使用OHEM方式选取训练样本,正负样本比例设为1:3。
注意一点,没有像RetinaNet一样采用focal loss
5. Other Improvements
提出Fast-NMS
,与NMS相比,在损失轻微精度的情况下,大幅提升效率。
算法流程
- 对每一个类别ci,取top-n个候选目标,并按得分降序排列;
- 计算一个c×n×n的IOU矩阵,其中每个n×n矩阵表示对该类n个候选框,两两之间的IOU;
- 因为自己与自己的IOU=1,IOU(A,B)=IOU(B,A),所以对上一步得到的IOU矩阵进行一次处理。具体做法是将每一个通道,的对角线元素和下三角部分置为0;
- 去除与得分高的候选框重叠比例较大的框,具体做法是对上一步得到的矩阵,按列取最大值,然后对取完最大值的矩阵按阈值划分,只留下小于指定阈值的部分,即为Fast NMS过滤的结果。
Fast-NMS效果展示如下:
结果
Yolact得到的mask质量比Mask-RCNN还要高,这里得益于高分辨率的分割mask,138∗138,和没有经过pooling操作的原始特征用于生成分割掩膜,这里相比Mask R-CNN在95% IoU阈值条件下超过其0.6,这就说明了pooling操作对于分割来说是具有负面影响的。
下图是在COCO数据集上的性能对比,可以看出,Yolact达到了30FPS左右,一个开创性的实例分割网络!
参考:
https://blog.csdn.net/sinat_37532065/article/details/89415374#3.1%20%E5%8E%9F%E5%9E%8B%E7%94%9F%E6%88%90
https://blog.csdn.net/m_buddy/article/details/90761192