大家好,我是 Jack。
近年来的实例分割可以分为两类:
一类是 two-stage 的方法,即“先检测后分割”的方法,首先定位到目标物体的边框,然后在边框内分割目标物体,典型的代表是 Mask R-CNN;
另一类是 one-stage 的方法,这里面又细分为两个流派,一个是 anchor-based,另一个是 anchor-free。
今天个给大家讲解一个,基于 anchor-base 的实力分割算法 YOLACT。

一、论文简介

YOLACT: Real-time Instance Segmentation

1、简介

  • 论文针对实例分割任务提出了一种简单,全卷积模型;
  • 这个模型在COCO数据集用一块Titan Xp完成了29.8mAP和33.5fps的实时分割效果;
  • 将任务分为两个平行的子任务。产生prototype masks和预测mask coefficients;
    • prototype masks
      卷积层:在提取空间相关信息上效果显著。
    • mask coefficients
      全连接层:在获取语义向量上效果显著。
  • 利用矩阵计算对NMS进行加速。

2、模型结构

Yolact
  • Feature Backbone

    此模块主要是利用卷积神经网络做特征提取,然后将提取到的特征输入到特征金字塔网络中。
  • Feature Pyraimd

    利用此模块获取深度更深的特征图,且含有多个不同尺度的特征图。
  • Protonet

    此模块通过卷积和上采样获得Prototypes,Prototypes是多张mask的,mask中的亮(值大)的区域就是目标区域。最终通过线性组合生成的mask来获取每个实例的mask。
  • Prediction Head

    本文在RetinaNet的基础上多回归了一个mask系数,输出预测框Bbox,类别信息conf以及掩码系数。利用此系数与Protonet中的mask线性组合。Yolact利用特征金字塔中的特征图(5个尺度)每个特征图的每个点都生成3个目标框
  • NMS 由于目标框数量较多,利用非极大抑制进行目标框筛选。
  • Masks Assembly

    利用Prediction Head模块的mask系数与Protonet中的多张mask进行线性组合,每个目标得到一张mask。
  • Crop&Threshold

    利用Prediction Head中未被过滤掉目标的预测框Bbox以及类别信息对Masks Assembly中输出的mask进行截取Crop操作,再经阈值处理得到最终的mask。

二、COCO数据集解析

COCO的官网 :
https://cocodataset.org/
COCO API :
https://github.com/cocodataset/cocoapi

1、简介

图像包括91类目标, 328,000影像和2,500,000个label。目前为止有语义分割的最大数据集,提供的类别有80 类, 有超过33 万张图片,其中20 万张有标注,整个数据集中个体的数目超过150 万个。

2、 pycocotools工具

COCO官方给的数据集解析工具

三、FPN

原文:feature pyramid networks for object detection

1、特征金字塔

FPN
  1. 图像金字塔(图像处理)
    • 将图像做成不同的scale -> 测试增强(TTA)
  2. 基础CNN结构(单层特征图)
    • 可做分类器
  3. 多尺度特征融合
    • 从不同层抽取不同尺度特征做预测 --> SSD(single shot detector)
  4. 特征金字塔网络
    • 与3相比,增加了通过高层特征进行上采样和底层特征进行自顶向下的连接,然后再预测,大幅提升了对小物体的检测效果 --> Retinanet

2、组成

backbone(以resnet为例):

输入:batchsize,3,550,550

conv1 -> batchsize,64,275,275

c2:-> batchsize,64,138,138 -> batchsize,256,138,138

c3:->batchsize,128,69,69 -> batchsize,512,69,69

c4:->batchsize,256,35,35 -> batchsize,1024,35,35

c5:->batchsize,512,18,18 -> batchsize,2048,18,18
FPN:

  • 上采样:双线性插值
  • 下采样:卷积(步长为2)
    p7(256,5,5) :通过p6下采样
    p6(256,9,9) :通过p5下采样
    p5(256,18,18) : c5通过两次卷积通道数变为256
    p4(256,35,35) : c4通过两次卷积通道数变为256 + c5上采样
    p3(256,69,69) : c3通过两次卷积通道数变为256 + c4上采样

四、Prototype

protonet:预测k个prototype masks(通过FCN生成k个通道的)如下图protonet:

  • 越深的backbone features获得更鲁棒的masks。->利用特征金字塔网络(FPN)作为backbone
  • 高分辨率的prototypes结果有更好的masks且在较小的对象上表现出更好的性能。->上采样到原图的1/4增高分辨率
  • 此处用FPN的p3作为protonet输入通过卷积和双线性插值获得一个mask热度图(bs, 138, 138, 32)

五、mask coefficients

1、Head Architecture

FPN得到了5种不同尺度的特征图,分别预测dict_keys(['loc', 'conf', 'mask', 'priors'])
  • 'loc':每个anchorbox的预测偏移量,形状为(1,19248,)
  • 'conf':每个anchorbox的类别预测,形状为(1,19248,num_class)
  • 'mask':就是论文中指出的mask系数,形状为(1,9248,2)
  • 'priors':预设的anchorbox的坐标,形状为(19248,4)

2、fast_NMS

非极大抑制
利用conf降序排序(移除conf太小且IoU太大的检测框)
fast_NMS:利用矩阵进行加速

六、Masks Assembly

线性组合protonet -> 每个目标(item)都有mask(热图形式), confident(包含类别信息和概率), bbox(通过loc和priors获得
然后根据回归出的检测框(bbox)对mask进行截取,根据所在目标框的mask进行阈值处理转化为掩码形式(是,否)。
·················END·················
继续阅读
阅读原文