实例分割

实例分割(instance segmentation)的难点在于:
需要同时检测出目标的位置并且对目标进行分割,所以这就需要融合目标检测(框出目标的位置)以及语义分割(对像素进行分类,分割出目 标)方法。

实例分割–Mask R-CNN

Mask R-CNN可算作是Faster R-CNN的升级版。

Faster R-CNN广泛用于对象检测。对于给定图像,它会给图中每个对象加上类别标签与边界框坐标。 Mask R-CNN框架是以Faster R-CNN为基础而架构的。因此,针对给定图像, Mask R-CNN不仅会 给每个对象添加类标签与边界框坐标,还会返回其对象掩膜。

实例分割 榜单 实例分割代码_深度学习

Mask R-CNN的抽象架构:

实例分割 榜单 实例分割代码_机器学习_02


Mask R-CNN在进行目标检测的同时进行实例分割,取得了出色的效果

实例分割 榜单 实例分割代码_机器学习_03

Faster R-CNN与 Mask R-CNN

Mask-RCNN 大体框架还是 Faster-RCNN 的框架,可以说在基础特征网络之后又加入了全连接的分割 子网,由原来的两个任务(分类+回归)变为了三个任务(分类+回归+分割)。Mask R-CNN 是一个 两阶段的框架,第一个阶段扫描图像并生成提议(proposals,即有可能包含一个目标的区域),第二 阶段分类提议并生成边界框和掩码。

实例分割 榜单 实例分割代码_计算机视觉_04


与Faster RCNN的区别:

1)使用ResNet网络

2)将 Roi Pooling 层替换成了 RoiAlign;

3)添加并列的 Mask 层;

4)引入FPN

Mask R-CNN流程

实例分割 榜单 实例分割代码_实例分割 榜单_05


Mask R-CNN 流程:

  1. 输入一幅你想处理的图片,然后进行对应的预处理操作,获得预处理后的图片;
  2. 将其输入到一个预训练好的神经网络中(ResNet等)获得对应的feature map;
  3. 对这个feature map中的每一点设定预定个的ROI,从而获得多个候选ROI;
  4. 将这些候选的ROI送入RPN网络进行二值分类(positive或negative)和BB回归,过滤掉一部分候 选的ROI(截止到目前,Mask和Faster完全相同);
  5. 对这些剩下的ROI进行ROIAlign操作(ROIAlign为Mask R-CNN创新点1,比ROIPooling有长足进 步);
  6. 最后,对这些ROI进行分类(N类别分类)、BB回归和MASK生成(在每一个ROI里面进行FCN操作) (引入FCN生成Mask是创新点2,使得此网络可以进行分割型任务)。

• backbone:Mask-RCNN使用 Resnet101作为主干特征提取网络, 对应着图像中的CNN部分。(当然 也可以使用别的CNN网络)

• 在进行特征提取后,利用长宽压缩了 两次、三次、四次、五次的特征层来 进行特征金字塔结构的构造。

实例分割 榜单 实例分割代码_深度学习_06

Mask R-CNN:Resnet101

1.Resnet 中 Conv Block和Identity Block的结构:

其中Conv Block输入和输出的维度是不一样的,所以不能连续串联,它的作用是改变网络的维度; Identity Block输入维度和输出维度相同,可以串联,用于加深网络

实例分割 榜单 实例分割代码_卷积_07

特征金字塔-Feature Pyramid Networks(FPN)

• 目标检测任务和语义分割任务里面常常需要检测小目标。但是当小目标比较小时,可能在原 图里面只有几十个像素点。

• 对于深度卷积网络,从一个特征层卷积到另一个特征层,无论步长是1还是2还是更多,卷积 核都要遍布整个图片进行卷积,大的目标所占的像素点比小目标多,所以大的目标被经过卷 积核的次数远比小的目标多,所以在下一个特征层里,会更多的反应大目标的特点。

• 特别是在步长大于等于2的情况下,大目标的特点更容易得到保留,小目标的特征点容易被跳 过。

• 因此,经过很多层的卷积之后,小目标的特点会越来越少。

实例分割 榜单 实例分割代码_实例分割 榜单_08


特征图(feature map)用蓝色轮廓表示, 较粗的轮廓表示语义上更强的特征图。

a. 使用图像金字塔构建特征金字塔。 特征是根据每个不同大小比例的图 像独立计算的,每计算一次特征都 需要resize一下图片大小,耗时, 速度很慢。

b. 检测系统都在采用的为了更快地检 测而使用的单尺度特征检测。

c. 由卷积计算的金字塔特征层次来进 行目标位置预测,但底层feature map特征表达能力不足。

d. 特征金字塔网络(FPN)和b,c一样快, 但更准确。FPN的提出是为了实现更好的feature maps融合,一般的网络都是直接使用最后一层的feature maps,虽然最后一层的 feature maps 语义强,但是位置和分辨率都比较低,容易 检测不到比较小的物体。FPN的功能就是融合了底层到高层 的feature maps ,从而充分的利用了提取到的各个阶段的 特征(ResNet中的C2-C5)。

实例分割 榜单 实例分割代码_深度学习_09


2. 特征金字塔FPN的构建

• 特征金字塔FPN的构建是为了实现特征多 尺度的融合,在Mask R-CNN当中,我们取出在主干特征提取网络中长宽压缩了两次 C2、三次C3、四次C4、五次C5的结果来进 行特征金字塔结构的构造。

• P2-P5是将来用于预测物体的bbox,box- regression,mask的。

• P2-P6是用于训练RPN的,即P6只用于RPN 网络中。

实例分割 榜单 实例分割代码_深度学习_10

Mask R-CNN:Roi-Align

3.Roi-Align

Mask-RCNN中提出了一个新的思想就是RoIAlign,其实RoIAlign就是在RoI pooling上稍微改动过 来的,但是为什么在模型中不继续使用RoI pooling呢?

实例分割 榜单 实例分割代码_卷积_11


在RoI pooling中出现了两次的取整,虽然在feature maps上取整看起来只是小数级别的数,但是当 把feature map还原到原图上时就会出现很大的偏差,比如第一次的取整是舍去了0.78(665/32=20.78),还原到原图时是20*32=640,第一次取整就存在了25个像素点的偏差,在第二 次的取整后的偏差更加的大。对于分类和物体检测来说可能这不是一个很大的误差,但是对于实例分割而言,这是一个非常大的偏差,因为mask出现没对齐的话在视觉上是很明显的。而RoIAlign 的提出就是为了解决这个不对齐问题。

实例分割 榜单 实例分割代码_机器学习_12


RoIAlign的思想其实很简单,就是取消了取整的这种粗暴做法,而是通过双线性插值来得到固定四 个点坐标的像素值,从而使得不连续的操作变得连续起来,返回到原图的时候误差也就更加的小。 它充分的利用了原图中虚拟点(比如20.56这个浮点数。像素位置都是整数值,没有浮点值)四周 的四个真实存在的像素值来共同决定目标图中的一个像素值,即可以将20.56这个虚拟的位置点对 应的像素值估计出来。

实例分割 榜单 实例分割代码_计算机视觉_13


• 蓝色的虚线框表示卷积后获得的feature map,黑色实线框表示ROI feature。

• 最后需要输出的大小是2x2,那么我们就利用双线性插值来估计这些蓝点(虚拟坐标点,又称双线 性插值的网格点)处所对应的像素值,最后得到相应的输出。

• 然后在每一个橘红色的区域里面进行max pooling或者average pooling操作,获得最终2x2的输出结果。我们的整个过程中没有用到量化操作,没有引入误差,即原图中的像素和feature map中的 像素是完全对齐的,没有偏差,这不仅会提高检测的精度,同时也会有利于实例分割。

Mask R-CNN:分割掩膜

4. 分割掩膜

基于交并比值获得感兴趣区域(ROI)后,给已有框架加上一个掩膜分支,每个囊括特定对象的区域都会被赋予一个掩膜。每个区域都会被赋予一个m×n掩膜,并按比例放大以便推断。

实例分割 榜单 实例分割代码_深度学习_14


mask语义分割信息的获取

在之前的步骤中,我们获得了预测框,我们把这个预测框作为mask模型的区域截取部分,利用这个预测框对mask模型中用到的公用特征层进行截取。

截取后,利用mask模型再对像素点进行分类,获得语义分割结果。

mask分支采用FCN对每个RoI产生一个Kmm的输出,即K个分辨率为mm的二值的掩膜,K为分类物体的种类数目。
K
mm二值mask结构解释:最终的FCN输出一个K层的mask,每一层为一类。用0.5作为阈值进行二值化,产生背景和前景的分割Mask。

实例分割 榜单 实例分割代码_实例分割 榜单_15


对于预测的二值掩膜输出,我们对每个像素点应用sigmoid函数(或softmax等),整体损失定义为平均二值交叉损失熵。引入预测K个输出的机制,允许每个类都生成独立的掩膜,避免类间竞争。这样做解耦了掩膜和种类预测。

实例分割 榜单 实例分割代码_机器学习_16


Mask R-CNN的损失函数为:

实例分割 榜单 实例分割代码_计算机视觉_17


Lmask 使得网络能够输出每一类的 mask,且不会有不同类别 mask 间的竞争:
• 分类网络分支预测 object 类别标签,以选择输出 mask。对每一个ROI,如果检测得到的ROI属于哪 一个分类,就只使用哪一个分支的交叉熵误差作为误差值进行计算。
• 举例说明:分类有3类(猫,狗,人),检测得到当前ROI属于“人”这一类,那么所使用的Lmask为 “人”这一分支的mask,即每个class类别对应一个mask可以有效避免类间竞争(其他class不贡献Loss)
• 对每一个像素应用sigmoid,然后取RoI上所有像素的交叉熵的平均值作为Lmask。
**最后网络输出为14
14或者28*28大小的mask,如何与原图目标对应?**

需要一个后处理,将模型预测的mask通过resize得到与proposal中目标相同大小的mask。

实例分割 榜单 实例分割代码_机器学习_18

Mask R-CNN—总结

主要改进点:

  1. 基础网络的增强,ResNeXt-101+FPN的组合可以说是现在特征学习的王牌了;
  2. 分割 loss 的改进, 二值交叉熵会使得每一类的 mask 不相互竞争,而不是和其他类别的 mask 比较 ;
  3. ROIAlign解决不对齐的问题,就是对 feature map 的插值。直接的ROIPooling的那种量化操作会使得 得到的mask与实际物体位置有一个微小偏移,是工程上更好的实现方式。

Mask R-CNN:COCO数据集

MS COCO的全称是Microsoft Common Objects in Context,起源于微软于2014年出资标注的 Microsoft COCO数据集,与ImageNet竞赛一样,被视为是计算机视觉领域最受关注和最权威的 比赛之一。
COCO数据集是一个大型的、丰富的物体检测,分割和字幕数据集。这个数据集以scene understanding为目标,主要从复杂的日常场景中截取图像中的目标,通过精确的segmentation 进行位置的标定。
包括:

  1. 对象分割;
  2. 在上下文中可识别;
  3. 超像素分割;
  4. 330K图像(> 200K标记);
  5. 150万个对象实例;
  6. 80个对象类别;
  7. 91个类别;
  8. 每张图片5个字幕;
  9. 有关键点的250,000人;

代码实现

在资源中