《Deep Watershed Transform for Instance Segmentation》原文翻译

文章地址:https://arxiv.org/abs/1611.08303
作者给的代码demo:https://github.com/min2209/dwt

代码目录结构

/DN/
/DN/train_direction.py
/DN/direction_model.py
/DN/ioUtils.py
/DN/lossFunction.py

/WTN/
/WTN/train_depth.py
/WTN/depth_model.py
/WTN/ioUtils.py
/WTN/lossFunction.py

/E2E/
/E2E/main.py
/E2E/train.py
/E2E/e2e_model.py
/E2E/forward.py
/E2E/forward_e2e.py
/E2E/model_io.py
/E2E/network_init.py
/E2E/post_process.py
/E2E/io_utils.py
/E2E/loss_function.py

/matlab/
/matlab/batch_generate_cityscapes.m
/matlab/batch_generate_cityscapes_PSP_ss.m
/matlab/generate_GT_cityscapes_unified.m

数据集目录结构


/** 数据集目录 数据集下载地址(需注册):[https://www.cityscapes-dataset.com] */ /cityscapes/ /** 原图位置,图片大小为2048*1024 代码在输入做了输小(为原图0.5倍,1024*512) */ /cityscapes/leftImg8bit/{train/val/test}/city/ *.png /* 真值(ground truth)位置,其中包括了语义分割、实例分割的结果; cityscapes 提供了每一类实例所对应的值,用于生成自己的训练真值。我们可以对其进行修改, 并生成我们自己想要的语义分割或实例分割的结果。 Cityscapes的github地址:[https://github.com/mcordts/cityscapesScripts] */ /cityscapes/gtFine/{train/val/test}/city/ *.png /** PSPNet生成结果位置,格式为.mat; 代码为每一个类别生成了一张二维mask,其中,1表示该类别,0表示背景。 有多少个类别,就会生成多少张mask。 同时注意:代码对输入图做了缩小(为原图的0.5倍,1024*512) 代码地址为:[https://github.com/qiaoD/learnDWT/blob/master/matlab/batch_generate_cityscapes_PSP_ss.m] */ /cityscapes/unified/ssMaskFinePSP/{train/val}/city/ *ss.mat /** 真值生成的中间结果(训练时至关重要的一个环节,没有完全理解),格式为.mat 代码地址为:[https://github.com/qiaoD/learnDWT/blob/master/matlab/batch_generate_cityscapes.m] 依据/cityscapes/gtFine/{train/val/test}/city/id__gtFine_instanceIds.png, 处理后得到以下几个变量: dir_map : DN网络训练的真值(网络结果) depth_map : WTN网络训练的真值(网络结果) weight_map : 实例分割的结果,weight_map(annotation_i==1) = 200 / sqrt(sum(sum(annotation_i))); ss_map : 01mask,其中0表示背景,1表示感兴趣部分 edge_map : - */ /cityscapes/unified/iGTFull/{train/val}/city/ *GT.mat /** 训练图片索引存放位置 */ /cityscapes/splits/{train/val}/list.txt

文章翻译

摘要

当下,在实例分割领域所做之研究都用了比较复杂的流程步骤。诸如:条件随机场、循环神经网络、目标建议、完全匹配模式。本文中,我们会介绍一个简单且强大的端到端卷积神经网络来完成此项任务。我们将经典的分水岭算法和现代深度学习相结合,以生成图像的能量图(energy map),各目标实例以能量域的方式清晰地被表示在图中。最后我们将属于某个目标实例的连接组成成分在单一的能量级上做切割,以完成实例分割的任务。在Cityscapes的实例分割比赛中,我们的模型获得了优于最好模型两倍的成绩。

1.Introduction

实例分割主要完成两项任务:1、确定每一个像素的语义类别;2、确定每一个像素的实例类别。而语义分割主要关注第一个问题。(实例分割之定义)| 实例分割尤其在街景中具有挑战性,因为街景中的目标尺度在很大的范围内变化。更有甚者,目标的显示会被部分遮挡、变形、过饱和、移动模糊等因素所影响。(在街景实例分割中的挑战性)|解决这个问题极大地有利于很多方面的应用,诸如:机器人工操作、场景识别、自动驾驶等等。(解决意义)

当前的解决方案都使用了复杂的流程,诸如:目标建议、条件随机场、循环神经网络、完全匹配等等。与此相较,我们介绍一个优于最好解决方案的简单且直观的理论。特别地,我们做了一个新颖的进展:将经典的分割技术和现代深度神经网络相结合。(引出自己的模型)

分水岭算法是数学形态学中一个很好理解的理论,其在图像分割中的应用可以追溯到70年代。该算法原理从直观上很好理解。任何灰度的图像都可以看做是一张地形表面图,如果我们从最小值开始向这个表面注水,并且阻止不同来源的水汇合,这样就可以将图像分割成不同的部分。这个算法经常被应用在图像梯度上,这样在图片中属于同一类别的物体就处于了同一个划分区域。但是分水岭算法有一个显著的缺陷,即过分割的问题。目前有解决的办法,但是在实际场景中很难实现,所以,一直没有将分水岭算法应用到实例分割中。(分水岭算法现状)

在本文中,我们做了一项新颖的进展:将现代神经网络和经典的分割算法相结合。我们想直接学习得到分水岭算法的能量图,该能量图中的每一个域都对应一个单一的实例,同时所有的分割线都处于同一个高度。这样就可以单一能量范围进行切割,以避免过分割的问题。我们的算法有以下几点优势:1、快速的端到端训练,2、快速且精准的分割预测。(本文工作的具体介绍,分水岭算法的应用接上文)

我们的模型取得了优于最好模型的两倍的实验结果。在接下来的章节中,我们先介绍相关工作,接着介绍更多的算法细节和模型设计,最后我们介绍我们模型的一些部分在“ablation studies”的影响。(介绍结尾,引出下文大纲)

2.related

介绍最近几年出现的实例分割的算法思路。

Proposal based:

Deep structured models:

Template matching:

Recurrent Networks:

CNN:

Proposal+recursion:

3.A Review on the Watershed Transform

我们先来看分水岭算法,一种在数学形态学里很好理解的算法。该算法基于这样一个事实:任何灰度图像都可以看做是一张地表图,如果我们从最小值流过表面同时建立隔断来防止不同源的水汇合,我们就可以将该图像分割为不同的区域,这些区域被叫做捕获域,而建立的隔断或者说分水岭基线就是不同域之间的边界。(算法介绍)

该处理过程表示在图 2 的第一行中,该图中表示分水岭算法得到的结果有7个不同的域,用7种不同的颜色来表示。值得注意的是传统的分水岭算法倾向于生成过分割的结果。(算法分析)

(目前改进方案)

分水岭算法应用于图像梯度,捕获域和图像中同一灰度区域是相对应的,然而捕获不同实例之间的敏感梯度是极具挑战性的事情。接下来,我们介绍一种替代方案:学习预测生成能量图。

4.Deep Watershed Transform(重点阅读)

在本章中,我们介绍在实例分割中所做的工作。特别地,我们使用前向传播网络来学习分水岭算法的结果,这个算法思想很是直观。该算法学习预测一个能量图,该能量图的每一个域(basin)都对应一个单一实例,同时在能量域中的所有分割线在同一个高度,这样分水岭切割只使用单一门槛,这样就不会导致过分割。图2的下面一行显示了理想的能量图。(介绍算法思想)

不幸的是,从开始学习能量分布图是一件十分复杂的任务。因此,我们使用网络来做一项相对中间的任务:学习得到分水岭能量下降方向,然后在传输给另外一个网络来学习最终的能量图。原则上,我们可以将该网络解释为:学习属于实例的每一个像素距离实例边界的距离。图4显示了我们网络的输入、中间结果、最终输出。图3是我们的网络结构。(我们的实现思路)

4.1.Direction Network(DN)

我们的网络使用语义分割作为输入,以使得我们的精力只聚焦在图像有用的区域。值得注意的是:我们的网络对选择哪一种语义分割算法是不可知的,在我们的paper中,我们使用PSPNet的语义分割结果。(注:在代码实际处理中,我直接使用Cityscapes数据集上的语义分割结果)

网络的输入是原始的RGB图像(注:在实际实现中,作者将图像长宽变为原来的0.5倍)和二值化的语义分割:将不属于一个语义类别部分的所有像素全部置为0(原文是:where all pixels that are not part of one of the semantic classes of interest are sent to zero.)。在输入图像的基础上加了语义分割作为第四个Channel。因为 RGB 的值在做减均值之前是介于 0 到 255 的,所以,我们将改变语义分割图像的编码,使其的类别标签也是在数字上排列的,同时变化范围接近于RGB频道里的取值。(输入4个channel,最后一个channel为语义分割的结果,且编码方式要尽可能靠近 RGB 的取值)

为了让该模型获得一个精确的能量分布图,我们预训练了整个网络的第一部分(在这里叫做Direction Network)来预测每一个像素的能量下降方向:用指向边界上最近的点的单位向量来进行参数化这个概念。这个过程给了我们一个十分强烈的信号:最近边界的方向已经被直接编码在单位向量中。更为重要的是,被遮挡物遮挡的两个物体上的两个像素所得到的向量将指向完全相反的方向,在这里,一个像素被判断为一个错误的目标实例将导致最大化的角度错误(angular error)。这和物体的形状是没有关系的,尽管有些物体是凹形或者拉长。这让网络聚焦在像素级别上去学习精确的边界。

我们用Dgt(p)来表示一个点距离其所属实例边界的距离的真值。我们将我们的真值目标定义为标准梯度,正式公式见下图公式总结的第一个公式。

这样,DN网络生成两个Channel的输出。值得提醒的是DN输出的归一化层(normalization layer)要求每个channel的平方和为1。同时使用单位向量而不是角度来作为训练目标,避免了角度0°-360°的大范围变化。

4.2.Watershed Transform Network(WTN)

整个网络的第二部分输入是两个频道的单位向量图,生成一张离散化修正的的分水岭图,该图取K=16种可能的能量值。这里,bin 0用来表示背景或者一个实例边界的2个pixel。同时有高能量值的高bin,代表了目标实例的内部区域。

4.3.Network Training

我们首先预训练DNWTN网络,然后进行整个网络的端到端训练。

Direction Network pre-training : 损失函数如下图公式列表的第二个公式。这个网络的预训练有三个输入:1、原始输入图像;2、真值语义分割;3、真值单位向量

Watershed Network pre-training : 损失函数如下图公式列表的第三个公式,是一个修改过的交叉熵损失函数。

End-to-End fine-tuning : epochs:20;batch-size:3;learning rate:5e-6;L2 weight penalty:1e-6。

4.4.Energy Cut and Instance Extraction

我们对分水岭算法的输出做如下切割:一些小目标物体(人、骑者、自行车,摩托车)使用0-2个像素;大目标物体(car、bus、truck、train)使用3-4个像素进行切割。

5.Experimental Evaluation

6.Conclusion

本文中,我们受分水岭算法的启发,提出了一个简单的实例分割技术。(做了什么)我们提出了一个模型,该使用新颖的卷积神经网络和改进的LOSS函数进行预训练和fine-tuning,生成一个改进版的分水岭能量图。从这张能量图中,我们直接生成高质量的实例分割。(怎么做的)我们的实验结果显示优于当前最好实验结果的2倍。(做的效果)我们将发布代码及训练参数。将来,我们希望可以增强模型来解决目标实例被遮挡的问题。同时,我们希望扩展我们的工作来完成实例分割和语义分割的双重任务,希望将来可以做同时输出。(下一步计划)