前言

yolact是第一个在COCO 数据集上做到实时的实例分割模型(大于30FPS),其将问题划分成两个平行的分支,一个分支由特征金字塔的P3层,经过Protonet预测mask,另一个分支通过P3-P7特征层预测类别、包围框以及mask的系数coefficient。另外还提出了比NMS更快的方法Fast NMS

深度学习---实例分割网络yolact_ai

一、网络结构

Yolcat网络结构如下,图片经过特征提取网络(ResNet-101 + FPN),得到P3至P7特征层,对每个特征层中的每个点都生成对应的Anchor,P3特征经过擅长生成空间相关掩码的conv层来生成初始掩膜,P3至P7经过ProtoNet后预测每一个Anchor对应的类别、位置偏移信息并使用擅长生成语义向量的fc层生成掩膜系数,最终融合初始掩膜掩膜系数得到真实的掩膜mask。

深度学习---实例分割网络yolact_网络_02

两个分支

一个分支由P3层经过ProtoNet预测初始掩膜mask,ProtoNet结构如下图,在论文中P3层的大小为69 * 69,最终生成原始掩膜mask的大小为138*138, k=32表示mask的个数。

深度学习---实例分割网络yolact_网络_03

一个分支预测类别、包围框及mask的系数,其中K表示掩膜系数的个数(k=32),a表示每个特征点对应的Anchor个数(论文中a=3),预测后每一个Anchor都有一个对应的类别class、位置偏移量box、以及k个掩膜系数。

深度学习---实例分割网络yolact_ai_04

二、相关细节

1. Anchor如何获取?

对每一个特征层(P3—P7)的每一个特征点都依据给定的尺寸和比率得到相应的Anchor信息(c_x, c_y, w, h)。
以代码中参数为例: P3—P7层的大小分别为69 * 69, 35 * 35 ,18 * 18, 9 * 9, 5 * 5,对应指定的Anchor尺寸分别为:24,48,96,192,384。指定每个特征点形成3个Anchor,其缩放比例分别为1.0, 0.5,2.0。
那最终生成的Anchor数量为19248个。
其中P3层产生:69 * 69 * 3 = 14283个Anchor,依次类推: P4: 3675个Anchor, P5: 972个Anchor, P6: 243个Anchor, P7:75个Anchor, 一共生成19248个Anchor。

Anchor的中心点以及宽高由每一层对应的尺寸和特征层的大小计算得到。

深度学习---实例分割网络yolact_深度学习_05

2. 最终mask如何得到?

ProtoNet预测mask维度为H * W * K(论文中K=32),另一个分支预测的每个实例对应有K个系数coefficient,那两者相乘的结果经过Sigmoid激活函数得到H*W的掩膜mask,
每个mask再利用对应的box进行裁剪那就得到了最终的mask。这里换种理解方式就是事先存在K个原始掩膜,然后每一个掩膜都对应有一个权重系数c,最终的mask是他们的加权求和值
注意:代码实际处理过程中,不会对所有19248个实例进行相乘,而是经过阈值筛选后的前N个实例。

3. Fast NMS 相比于NMS改进点在哪方面?

每个Anchor得到box偏移量后可以得到最终的ROI区域,这么多Anchor中存在重叠部分,通常采用NMS来进行过滤。

  • 对于每一类,按照置信度从高到底排列,然后互相计算IOU,得到一个IOU矩阵,依据对称性只保留右上角的值
  • 计算每一列最大的值I_max
  • 如果I_max大于给定阈值,则剔除该ROI区域

如下图所示

深度学习---实例分割网络yolact_语言模型_06


其中置信度值C1>C2>C3>C4>C5,表格中的数字表示两两之间的IOU,那首先保留最大置信度最大的C1,从C2开始每一列最大值分别为(0.8, 0.8, 0.6, 0.3)

假设给定的阈值为0.5,那C2, C3和C4都将被剔除,那最终保留的是C1和C5。

论文中也提到速度相比于可以提升11.8 ms但 mAP精度会损失0.1, 这是因为Fast NMS可能会多删除一些ROI,比如上表中的C3,依据NMS,保留C1后,C2会被先删除,那最终C3和C5都会被保留。

其他实例分割方法

  • SOLO系列
    其也是两个分支,一个预测mask,一个预测网格类别(中心点落在哪个网格就属于哪类)
  • Mask RCNN
    先检测 后分割
    在Faster RCNN上提出Rooling Align(相对Rooling pool)并添加Mask分支和关键点分支(可选)