一、DenseCRF 简介
DenseCRF (Dense Conditional Random Field),即密集条件随机场,是一种基于 MRF(马尔可夫随机场) 的图像分割方法。与传统 MRF 方法相比,DenseCRF 算法在计算过程与模型中引入了更多的信息,这些信息有助于提高分类精度。DenseCRF 是先前算法的改良版本,它不仅适用于二分类问题,更适用于多分类问题。DenseCRF 算法应用简单,运行速度快而且可靠,被广泛应用于图像分割领域。
二、DenseCRF 工作原理
DenseCRF 算法主要由两个部分组成,分别是势函数(potentials) 和标准函数(kernels)。Potentials 函数对于图像上的每个像素,都会估计一个相对应的能量值,而 kernel 函数则是对 Potentials 函数进行参数调整,使它能尽可能地拟合训练集数据,减少误差。
DenseCRF 的 Potentials 函数主要通过以下两个方式来设计。
1. 条件随机场(Conditional Random Fields)
CRFs 算法是 MRF 的一种特例,它在处理固定大小而标签依赖性问题时具有最佳效果。
DenseCRF 使用了针对处于固定pos,处于某个标签上()的0/1特征的函数,这些特征的组合是potentials函数的数学式。将CRF和神经网络结合,能够起到更好的特效提取作用。
2. 二元势函数(Bilateral potentials)
Bilateral 运算是将颜色和空间(或纹理)联合起来在图像中进行推导,建立两类像素间的惩罚函数。具体到每个像素上,它既与其颜色临近的像素保持相似,也与它在空间上邻近的像素保持相似,这使得得到的分割的边缘更加柔和和鲁棒。
三、DenseCRF 实现代码
import numpy as np import pydensecrf.densecrf as dcrf #定义一个DenseCRF处理类 class CRF(object): def __init__(self, iter_num, pos_w, pos_xy_std, bi_w, bi_xy_std, bi_rgb_std): self.iter_num = iter_num self.pos_w = pos_w self.pos_xy_std = pos_xy_std self.bi_w = bi_w self.bi_xy_std = bi_xy_std self.bi_rgb_std = bi_rgb_std def dense_crf(self, img, prob_map): C, H, W = prob_map.shape d = dcrf.DenseCRF2D(W, H, C) U = -np.log(prob_map) U = U.reshape((C, -1)) U = U.astype(np.float32) img = img.astype(np.uint8) img = img.reshape((3, -1)) d.setUnaryEnergy(U) d.addPairwiseGaussian(sxy=self.pos_xy_std, srgb=self.pos_w, compat=3) d.addPairwiseBilateral(sxy=self.bi_xy_std, srgb=self.bi_rgb_std, rgbim=img, compat=self.bi_w) Q = d.inference(self.iter_num) Q = np.array(Q).reshape((C, H, W)) return Q
四、DenseCRF 算法的优势和局限性
1. 优势
- 边缘被更自然地分割,过于锐利的边缘被避免
- 更准确的先验水平,在颜色信息不足的情况下,可以使用空间先验
- 速度更快,尤其是图像分割复杂度比较高时表现更为突出
2. 局限性
- 在面对复杂形状或分割的同时还要处理空间和颜色特征,处理上会更复杂一些
- 过于复杂的模型还需要设置计算的算法优化
五、总结
DenseCRF 作为一种改良了的 MRF 算法,采用了更多信息来优化它的分类精度,从而使它在图像分割等领域中展现出比传统方法更好的性能。虽然它具有很多优点,但在某些情况下也存在一定的局限性,需要我们对其模型和算法进行优化。