本文介绍 SiamesMask与DeepMask实例分割与视频跟踪的研读

实例分割

实例分割是比i目标检测更进一步的工作,但是更加困难,就数学原理上讲,目标检测可能更难一些,实例分割如果从实现上来看是更加容易的。现在越来越多的方法不会采用逐帧进行预测的方式进行分割,而是采用视频跟踪的方式。这种方式似乎更加合理。

Mask视频跟踪

现在也有一些诸如MaskRCNN的方法来进行实例分割,但是从速度上来讲,这种方法很难应用于实时的场景。但是为了走通整个过程没有必要研究一些初始化的方法。比如DeepMask, 这个方法比较早,但是比较简单,适合开汤坡度。就让我这个老医生来看看它内部到底是如何运行的吧。

DeepMask

在这个session里面,我们将拆解DeepMask的结构,并且尝试用pytorch来实现它。另外,我们将进一步的用从coco来训练它。最终看看结果如何。follow me up!

首先让我们来看一下DeepMask的网络结构:

1552631762514

这个虽然是网络的结构,但是前置的这个网络可以忽略,主要看看如何构建的误差计算,以及loss损失函数的设计。

但是基本上可以看出来,这个网络分为了两个分支,一个是segmentation的分支,一个是score的分支。二者共同为整个网络贡献最终的结果输出。再就是这个loss损失函数:

1552631890484

这个论文的原来的地址在:https://arxiv.org/pdf/1506.06204.pdf

这应该是分割最简单的结构了。好了,信息基本上全了,接下来我们要进行网络的编写和训练了。

Video Segmentation: A Unifying Approach - SiamMask

这个提出了一个视频跟踪存在的普遍问题,以前视频跟踪是通过预测下一帧的每一个像素是否属于target,从而产生一个跟踪的mask,这个计算量可想而知是非常巨大的。通常需要数秒种来达到效果。即便是最快的方法也无法做大实时。因此SiamMask的方法被提出来了。这个网络主要进行了三个任务:

  • 计算target object和multi candidate也就是网络预测的一些候选区域的相似度,这个候选区域来自与sliding window (这个地方似乎可以加速);
  • 得到的区域是很粗糙的,为了精修,继续采用一个RPN来进行位置回归,也就是说这个步骤会生成bounding box。
  • 不考虑类别的二分类分割。这一个步骤是做什么呢?听起来有点复杂,说白了就是在上面的boundingbox中把物体和背景分割出来,由于我们不关心类别,因此只需要把物体分割出来就行了。

总的来说,这个网络做了这么几件事情:

  • 首先是从下一帧中选取一个大致的区域(sliding window的方式),这个区域可能不太准确,但是需要跟前面要跟踪的目标进行siams对比,因此得到的区域不会太差;
  • 在上面那个区域上做位置的回归,得到精修的boudingbox,注意这里的boudingbox还不是简单的矩形框,而是一个带角度的旋转框;
  • 进一步从boudingbox的小区域内做前后背景分割。因此这个网络至少会有三个loss,一个相似读,一个box regression,一个binary segmentation。

简单的拆解这个网络大概就是这样。这个网络也不是从0开始搭建的,借鉴了一些前人的成果:

  1. SiamFC: 这个就是根据两张图,对比,得到i像素的response map,也就是说相似热力图。顺便这个网络其实也是牛津大学提出来的(所以从这个角度看,英国的人工智能是很牛逼的),这个文章的论文地址为:here
  2. SiamRPN:这个是根据相似读热力图获取RPN proposal的,原始论文在这里:here

1552636236378

总结一些训练的细节,简单的来说,就是这样开始训练:

  1. 在训练的时候,先搜索image patches,这里有个术语叫做:jitter examplar, 什么是jitter,什么是examplar?说白了就是拿我们的目标,在要搜索的图上进行目标搜索。这个examplar应该就是我们的target了。
  2. 在预测的时候,首先根据热力图找到候选的区域,然后对这个区域进行2分类的segmentation,得到mask。

1552636822171

从这张图来看,似乎,好像,这个玩意还支持多目标跟踪?好了,闲话不多说,开始coding。。