水平集方法用于深度卷积网络

水平集简介

水平集(Level Set)方法是用于图像分割非常受欢迎的方法,其通过比目标维度高一维的水平集函数(LSF)的零水平集隐式地表示曲线,能够自然地处理目标的复杂拓扑变化,如空洞或曲线分裂。一般来说,水平集方法需要在目标周围初始化水平集函数,再基于精心设计的能量函数(由外部驱动力、内部驱动力和正则项组成),通过求解偏微分方程迭代更新水平集函数实现曲线演变,达到最小化能量函数的目标,此时LSF的零水平集即为目标边界。如果对水平集原理有所困惑的话,可以参考知乎上的解答

CNN结合Level Set

原始的水平集方法并没有可以学习的参数,因此将其用于深度卷积网络需要合理的修改,最近阅读了一些相关的文献,在这里总结一下。

  1. 2017年的Deep Convolutional Level Set Method for Image Segmentation仅仅利用CNN目标检测器作为水平集方法分割的先验知识,即通过目标分类和回归两个分支获取待分割目标物体的类别和位置信息,基于卷积网络输出的先验初始化水平集函数ϕ0\phi_0,接着就是通过传统的水平集方法进行曲线的演化。该论文采取了Geodesic Active Contours (GAC)模型,对于水平集方法的GAC公式来说,初始的LSF(ϕ0\phi_0)的选择是非常重要的,卷积网络输出的先验包含目标的位置和尺寸信息,可能潜在地提高了图像分割的有效性。
    卷积神经网络结合水平集方法
  2. 2017年的Deep Level Sets for Salient Object Detection将CNN结合水平集用于显著性目标检测,深度卷积网络能够对显著性目标的语义属性进行建模,但是很难判断处于目标边界的属于相似感受野的像素类别,论文提出的深度水平集网络可以生成紧凑且均匀的显著性概率图。其核心思想是认为曲线的演变过程,即水平集函数的迭代更新本质上是根据计算得到的能量函数梯度,基于梯度下降算法最优化能量函数,这个形式正好和深度卷积网络中损失函数的反向传播更新网络参数一致,可以很自然地将能量函数作为网络的损失函数。如下面的网络结构所示,网络的backbone为VGG16,上采样输出接一个Guided Superpixel Filtering(GSF) layer,紧接着是一个Heaviside Function(HF) layer,其中VGG16输出的saliency maps会被提出的超像素引导滤波器进行优化,GSF层主要是利用了一个超像素块邻域的几个超像素块区域的信息,HF层则是将最终结果映射为0和1两个标签值。论文指出,网络训练是分阶段完成的,在前15个epochs采取Binary Cross Entropy(BCE)损失对网络进行训练(没有加入水平集方法和GSF),接着用提出的能量函数作为损失(计算损失时需要将取值在[0,1]之间的显著性概率图线性平移到[-0.5,0.5])微调15个epochs,最后加入GSF层再微调网络参数。
    卷积神经网络结合水平集方法
  3. 2019年的CNN-based Semantic Segmentation using Level Set Loss指出语义分割网络通常输出低分辨率但包含丰富语义信息的特征图,空间细节会丢失。其常用的损失是交叉熵损失函数,逐像素独立计算损失,没有考虑像素间的语义性,而基于区域的水平集方法能更好的利用像素间的关系。因此,将水平集的能量函数作为损失函数是很自然的想法,水平集方法通常用于分割前景和背景,为了用于多分类问题,将ground truth分解为一系列二值图像(不管原来标注时label像素为多少,都重新设计为1和0),每幅二值图像由背景和属于同一类的区域组成,再基于每幅二值图像和语义分割网络输出的对应类别(如:21类)通道的概率图(线性平移到[-0.5,0.5])计算水平集损失,交叉熵损失和水平集损失的加权和作为最终的损失函数。如下图所示,输入图像包含背景、马、人三个类别,首先针对这三个类别重构三幅ground truth二值图像,再选择语义分割网络输出的对应类别的通道(特征图),将特征图采取sigmoid函数映射成[0,1]之间的概率图,将概率图线性平移到[-0.5,0.5],再基于相关公式计算损失即可。这种方式将水平集方法应用到了多类别任务中,并且训练是带权重的交叉熵损失和水平集损失,训练方式简单。
    卷积神经网络结合水平集方法
  4. 2019年的Object Instance Annotation with Deep Extreme Level Set Evolution从另一个方面将CNN和Level Set结合了起来,前面介绍的思路是将能量函数作为损失函数,水平集函数(LSF)的更新策略是基于能量函数对LSF的梯度,但是这篇论文的思路是把LSF看出与时间有关的函数,曲线的演变即为LSF随着时间的改变而发生变化,也就是说,这里的LSF更新是基于LSF对时间的梯度。如下面公式,可以很容易理解LSF函数随着时刻是如何更新的。ϕi+1(x,y)=ϕi(x,y)+Δtϕit \phi_{i+1}(x,y) = \phi_{i}(x,y)+\Delta t \frac{\partial \phi_{i}}{\partial t} 这里的关键在于,初始的LSF如何产生,以及LSF对时间的梯度是如何求取的。传统的水平集方法给出的LSF对时间的梯度通常包含三项,分别是速度函数项,曲率项和正则项。为了将Level Set 融合到深度卷积网络中,这篇论文提出了三分支结构,首先人工交互给出目标的四个极点(目标的最左,最上,最右,最下),对四个极点采取高斯函数编码形成热图,然后与RGB通道concat形成四通道作为CNN输入,一个分支产生初始的掩膜预测结果(ϕ0(x,y)\phi_{0}(x,y),即初始的水平集函数),另外两个分支预测水平集函数演变所需的参数。卷积神经网络结合水平集方法
    最后水平集函数随时间(步数)的迭代公式如下,每个分支的损失函数都是精心设计的,一个分支学习的初始水平集函数(采取截断的符号距离函数作为LSF)根据另外两个分支学习到的网络参数以及正则项,按照下面的公式进行迭代更新,获得最终的分割结果。
    卷积神经网络结合水平集方法

疑惑

最近动手去尝试复现CNN结合Level Set用于语义分割的方法,采取deeplab v3+作为backbone,但是不管怎么检查复现代码或者改变参数,训练策略等,都无法实现更好的mIoU分数,可能是自己什么地方弄错了或者没有真正理解到吧。

相关文章:

  • 2021-09-28
  • 2022-01-20
  • 2021-08-11
  • 2021-05-18
  • 2021-09-09
  • 2021-07-02
猜你喜欢
  • 2022-12-23
  • 2022-01-01
  • 2021-04-06
  • 2022-01-12
  • 2022-12-23
  • 2021-12-19
相关资源
相似解决方案