CRF(Conditional Random Field)是图像分割中很常用的后处理算法。在《全卷积网络(FCN)与图像分割 》这篇博文中提到,FCN可以得到较好的分割结果,Chen, Liang-Chieh, et al. 2014在其基础上使用fully connected CRF得到了更好的效果,但是FCN的步骤和CRF的步骤是分开的。Zheng et al 2015将fully connected CRF表示成RNN的结构,与FCN连接在一起,可以同时训练FCN和CRF,使分割的准确率有了更多提高。
CRF as RNN的原理
CRF的能量函数包括一个数据项和平滑项。数据项是基于每个像素属于各个类别的概率,平滑项是基于像素之间的灰度值差异和空间距离。传统的CRF的平滑项只考虑相邻像素间的关联,而Fully connected CRF考虑了图像中任意两个像素之间的关联性。
公式(1)
其中是数据项, 是能量项, 即像素对之间的能量,其定义为若干个高斯函数的和:
公式(2)
高斯函数的定义为:
公式(3)
由两部分组成,第一部分是Bilateral Filter, 其想法是空间上离得近并且灰度值接近的像素很有可能是属于同一个物体。第二部分是Spatial Kernel,起到空间平滑作用,可以去除掉分割结果中一些孤立的小区域。
条件随机场的概率函数为。对公式(1)中的E(x)最小化对应着对后验概率P(X=x | I)的最大化,从而得到最优分割结果。
由于直接计算概率函数P(X)比较麻烦,可以通过一个比较方便计算的概率函数Q(X)来近似得到P(X)。 。为了让Q(X)最大限度接近P(X),可通过对它们的KL-divergence最小化得到。这个最小化过程的迭代步骤如下:
公式(4)
将该步骤中的各个操作拆分,可以得到如下的算法:
该算法的输入为: 初始势能,对应公式(1)的第一项; m个滤波器; 各滤波器的权重, 不同类别之间的兼容性矩阵。输出为Q_i即更新后的概率分布。
该算法的每一次迭代分为5个步骤:
1, 信息传递。即使用m个滤波器分别对每一个类别l的概率图进行滤波的过程。
2, 滤波结果加权相加。对每一个类别l的m个滤波结果根据权重相加。
3,类别兼容性转换。对每一个类别l的概率图根据不同类别之间的兼容性矩阵进行更新。
4, 加上数据项(一元项 Unary Potential)。
5, 归一化。对各像素所属不同类别l的概率归一化,这实际上是一个Softmax的过程。
Caffe实现
GitHub上可以找到CRF as RNN的源代码。主要有两个类:MultiStageMeanfieldLayer和MeanfieldIteration。其中MultiStageMeanfieldLayer将CRF的所有迭代步骤组装在一起形成一个Caffe层,迭代的每一步作为一个子层在MeanfieldIteration中实现。目前是基于cpu代码的实现,还没有在cuda上实现。
该实现中考虑了Bilateral filter 和Spatial filter两种滤波器,分别对应公式(3)中的两项。由于Fully connected CRF中的滤波操作要考虑整个图像的信息, 滤波器核的大小为整个图像的尺寸,因此滤波过程比较耗时,为了提高效率,Zheng et al使用了Andrew Adams et al所提出的基于Perutohedral Lttice的滤波实现: 实现Bilateral filter 的bilateral_lattices_和实现Spatial filter的spatial_lattice。