查看全课大纲(第 71 / 93 节)
  1. 1.计算机视觉概述
  2. 2.计算机视觉应用场景
  3. 3.困难与挑战
  4. 4.开源库介绍
  5. 5.图像显示与存储
  6. 6.CLAHE
  7. 7.腐蚀膨胀与开闭运算
  8. 8.滤波与边缘填充
  9. 9.各种滤波
  10. 10.图像金字塔
  11. 11.傅里叶变换
  12. 12.短时傅里叶变换与小波变换
  13. 13.颜色特征与颜色直方图
  14. 14.几何特征_边缘
  15. 15.几何特征-角点与斑点
  16. 16.局部特征-SIFT特征描述子
  17. 17.局部特征-SURF特征描述子
  18. 18.局部特征-ORB特征描述子
  19. 19.其他特征描述子
  20. 20.传统图像分割技术
  21. 21.GraphCut
  22. 22.GrabCut
  23. 23.人脸检测的传统方法
  24. 24.行人检测的传统方法HOG+SVM
  25. 25.行人检测DPM
  26. 26.人工神经网络的架构
  27. 27.目标函数与梯度下降
  28. 28.误差反向传播
  29. 29.可手算的神经网络
  30. 30.改进目标函数与克服梯度消散
  31. 31.神经网络之传统神经网络与深度网络的差异
  32. 32.各种梯度下降算法
  33. 33.如何选择合适的梯度下降算法
  34. 34.避免过适应
  35. 35.CNN的架构
  36. 36.CNN的误差反向传播_卷积层
  37. 37.CNN的误差反向传播_池化层
  38. 38.分类所用的数据集
  39. 39.Alexnet详解
  40. 40.VGG详解
  41. 41.GoogLeNet_v1
  42. 42.BatchNormalization
  43. 43.GoogLeNet_v3v4
  44. 44.ResNet
  45. 45.ResNeXt
  46. 46.CNN设计准则
  47. 47.图像检索与推土机距离
  48. 48.基于颜色相似性
  49. 49.基于形状相似性
  50. 50.基于纹理相似性
  51. 51.基于局部特征相似性
  52. 52.DL的二值哈希编码
  53. 53.高维空间中检索KDTree
  54. 54.高维空间中检索LSH
  55. 55.目标识别任务综述
  56. 56.RCNN
  57. 57.SPP-Net
  58. 58.Fast R-CNN
  59. 59.Faster R-CNN
  60. 60.R-CNN系列模型回顾
  61. 61.R-FCN的设计思路
  62. 62.R-FCN的实现
  63. 63.YOLOv1
  64. 64.YOLOv2_9000
  65. 65.YOLOv3
  66. 66.图像分割应用场景与数据集
  67. 67.上采样的实现方式
  68. 68.FCN网络架构的由来
  69. 69.FCN构建细节
  70. 70.DeepLabv1
  71. 71.CRF
  72. 72.DeepLabv2
  73. 73.DeepLabv3
  74. 74.特定的医学影像分割任务
  75. 75.U-Net
  76. 76.3D U-Net
  77. 77.V-Net
  78. 78.DenseNet
  79. 79.病理切片分析任务及数据集
  80. 80.病理切片分析
  81. 81.图说任务及其传统处理方法
  82. 82.深度语言模型与RNN
  83. 83.LSTM及其变种
  84. 84.NIC模型
  85. 85.SAT模型
  86. 86.图说的性能指标
  87. 87.判别模型与生成模型
  88. 88.KL散度与JS散度
  89. 89.VAE
  90. 90.GAN的基本原理
  91. 91.DCGAN与CGAN
  92. 92.Wasserstein GAN
  93. 93.SRGAN

CRF

条件随机场(CRF)在 DeepLab 中的应用

小象实战讲义 · 基于深度学习的计算机视觉

在上一节中,我们学习了 DeepLab V1 如何利用空洞卷积(Atrous Convolution)来获取高分辨率的特征图,从而避免因多次池化导致的空间信息丢失。然而,仅凭卷积神经网络(CNN)的输出,分割结果的边界往往不够精确,存在模糊和误判。本节我们将介绍 DeepLab V1 中另一个关键技术——条件随机场(Conditional Random Field, CRF),它作为一种后处理手段,能够有效利用像素间的颜色和空间关系,对 CNN 的粗糙分割结果进行迭代优化,从而恢复出清晰、精确的物体边界。

💡 核心导读

  • 条件随机场(CRF)的定义:理解 CRF 作为一种概率图模型,如何描述可观测变量(像素值)与不可观测变量(像素类别标签)之间的条件概率关系。
  • 从随机场到条件随机场:掌握随机场、马尔可夫随机场(MRF)的基本概念,以及它们如何演变为条件随机场。
  • 无向图模型与能量函数:学习如何用无向图模型表示像素间的依赖关系,并引入能量函数(Energy Function)和吉布斯分布(Gibbs Distribution)来描述这种联合概率。
  • DeepLab 中的全连接 CRF:剖析 DeepLab V1 中使用的全连接条件随机场(Fully-Connected CRF)的能量函数构成,理解一元势函数和二元势函数的具体形式与作用。
  • CRF 的迭代优化效果:通过可视化结果,直观感受 CRF 如何通过迭代,逐步精化分割边界,使其逼近真实标注(Ground Truth)。

条件随机场(CRF)的基本概念

条件随机场是一种判别式的概率图模型,它用于对一组输入随机变量条件下,另一组输出随机变量的概率分布进行建模。在图像分割的语境下,输入随机变量是我们能观测到的图像像素值,输出随机变量是我们希望推断的每个像素的类别标签。

从随机场到马尔可夫随机场

为了理解 CRF,我们首先需要了解几个基础概念:

  1. 随机场(Random Field):想象一张图像,我们把每个像素位置看作一个“位置”。如果给每个位置都按照某种概率分布随机赋予一个值(例如,一个像素强度或一个类别标签),那么所有这些位置上的随机变量构成的整体,就称为一个随机场。简单说,它就是一组定义在空间位置上的随机变量的集合。

  2. 马尔可夫随机场(Markov Random Field, MRF):这是一种特殊的随机场,它满足马尔可夫性质。该性质指出:一个位置(节点)的随机变量取值,在给定其直接相邻位置(节点)取值的条件下,与其他所有不相邻的节点条件独立。这种局部依赖关系可以用一个无向图来表示,图中的节点代表随机变量,边代表变量之间存在概率依赖关系。

条件随机场的定义

条件随机场在马尔可夫随机场的基础上,引入了“条件”的概念。具体来说,在 CRF 中,我们有两组随机变量:

  • 观测变量 X:我们可以直接看到的数据。在图像分割中,这就是整张图像的像素值。
  • 标签变量 Y:我们无法直接观测,需要去推断的数据。这就是每个像素对应的类别标签。

CRF 直接对给定观测 X 时,标签 Y 的条件概率分布 P(Y|X) 进行建模。其关键假设是:在给定观测 X 的条件下,标签变量 Y 构成一个马尔可夫随机场。注意这里建图的只有 Y:观测 X 被整体当作已知条件,X 之间不必假设任何依赖关系;而某个像素的标签,只依赖它在图上相邻的像素标签。

用一个生动的比喻来理解:你可以想象自己是一只小蚂蚁,在地上爬行。你能观察到的(X)是地面是干的还是湿的。但你观察不到(Y)的是天气是晴、阴还是正在下雨。然而,地面干湿的状态,实际上是由背后的天气(隐变量)所控制的。并且,天气的变化(例如,是否下雨)在空间上具有连续性(马尔可夫性),一个地方下雨,很可能邻近的地方也在下雨。CRF 的任务就是,通过观察遍地“干湿”的表象,来推测整个区域“晴雨”的分布情况。

无向图模型与吉布斯分布

在 CRF 中,标签变量 Y 构成的马尔可夫随机场是一个无向图模型。这与我们熟悉的有向图模型(如贝叶斯网络)不同。

  • 有向图模型:变量间的依赖关系用箭头表示,每个变量都有一个明确的条件概率分布(P(子节点 | 父节点))。
  • 无向图模型:变量间用无向边连接,表示彼此之间存在一种“亲和”或“互动”关系,但没有明确的因果方向。这种关系用势函数(Potential Function) 或因子(Factor) 来描述。

那么,如何计算无向图中所有变量取某一组特定值的联合概率呢?答案是使用吉布斯分布(Gibbs Distribution)。

吉布斯分布提供了一种用势函数乘积来表示联合概率的方法:

  1. 将无向图分解为多个团(Clique),即图中全连接的子图。
  2. 为每个团 c 定义一个非负的势函数 φ_c(Y_c),它衡量该团中变量取特定组合 Y_c 的“可能性”或“亲和度”。值越大,表示该组合越可能出现。
  3. 整个图的联合概率分布 P(Y) 正比于所有团势函数的乘积。

为了使其成为一个合法的概率分布(所有可能情况之和为1),需要除以一个归一化常数 Z,称为配分函数(Partition Function)。

吉布斯分布的标准形式如下:

P(Y)=1Z∏cϕc(Yc)P(Y) = \frac{1}{Z} \prod_{c} \phi_c(Y_c)

其中,Z = ∑_{Y} ∏_{c} φ_c(Y_c),是对所有可能的变量赋值求和。

在实际计算和优化中,我们通常处理势函数的对数形式,并引入能量函数(Energy Function)。定义能量 E(Y) = -log(φ(Y)),那么吉布斯分布可以改写为:

P(Y)=1Zexp⁡(−E(Y))P(Y) = \frac{1}{Z} \exp(-E(Y))

这个形式在物理中很常见:能量越低的状态,出现的概率越高。我们的目标就是找到使能量 E(Y) 最小化的标签配置 Y,这也就是最可能的分割结果。

用一个最小例子看看这套写法如何落地。设无向图上有 A、B、C、D 四个二值节点,只保留 A—B、B—D、A—C、C—D 四条边。对每条边定义一个因子,因子的取值就是这对变量“同时出现”的观测频次,例如 A、B 同时出现的次数为 60,A 出现而 B 不出现为 1,A 不出现而 B 出现为 70,两者都不出现为 10,这四组数就构成 φ_AB 的四个取值(φ_BD、φ_AC、φ_CD 同理)。于是 P(A=1, B=1, C=1, D=1) 正比于四条边因子取值的连乘,再除以配分函数 Z;Z 就是把 4 个二值节点共 16 种组合的连乘值全部加总得到的归一化常数。注意 A 与 D、B 与 C 之间并没有边,它们的关系不需要显式定义,而是通过中间节点间接体现——这正是无向图“只描述观察到的局部耦合”的含义。

把上面的联合分布“条件化”到观测 X 上,就得到 CRF 的标准形式。此时势函数写成以 X 为条件的特征函数 f_k(X, Y),每个特征配一个权重 w_k,指数内部的“因子连乘”就变成“加权连加”:

P(Y∣X)=1Z(X)exp⁡(−E(Y∣X)),E(Y∣X)=∑kwkfk(X,Y)P(Y|X) = \frac{1}{Z(X)} \exp\left(-E(Y|X)\right), \qquad E(Y|X) = \sum_k w_k f_k(X, Y)

其中 Z(X) = ∑_{Y} exp(-E(Y|X))。由于归一化常数依赖 X,每张输入图像都有各自的 Z(X)。DeepLab 正是把这条一般形式落到“像素标签 + 图像观测”上,并只保留一元项和二元项,得到下一节的特例。

DeepLab V1 中的全连接条件随机场

DeepLab V1 采用了全连接条件随机场(Fully-Connected CRF)。这里的“全连接”意味着在模型中,每一个像素的标签变量都与图像中所有其他像素的标签变量相连,而不仅仅是其邻居。这极大地扩展了模型捕捉长距离依赖关系的能力,有助于处理那些在颜色上相似但空间距离较远的区域。当然,连接强度并非一视同仁:二元势用高斯核按“空间距离 + 颜色差异”给每一对像素打分,相距越远、颜色差越大,耦合越弱——也就是说,“邻接”这件事从固定的 4 邻域或 8 邻域,变成了由核函数连续定义的软邻接。

DeepLab 中 CRF 的能量函数 E(y) 定义如下:

E(y)=∑iψu(yi)+∑i<jψp(yi,yj)E(y) = \sum_i \psi_u(y_i) + \sum_{i<j} \psi_p(y_i, y_j)

它由两部分组成:

1. 一元势函数(Unary Potential)

ψ_u(y_i) 只与单个像素 i 的标签 y_i 有关。它代表了像素 i 被独立地分类为标签 y_i 的代价。在 DeepLab V1 中,这个代价直接来自 CRF 之前的深层卷积网络的输出(即模型的前端 CNN,此处并非特指 FCN 这一模型):

ψu(yi)=−log⁡P(yi∣X)\psi_u(y_i) = -\log P(y_i | X)

其中 P(y_i | X) 是 CNN 对于像素 i 属于类别 y_i 的预测概率(通常是 Softmax 之后的输出)。因此,如果 CNN 非常确信像素 i 属于类别 y_i(概率接近1),那么 -log(P) 就接近0,代价很小;反之,如果 CNN 不确定(概率小),代价就会很大。能量函数最小化时,会倾向于选择 CNN 预测概率高的标签。

2. 二元势函数(Pairwise Potential)

ψ_p(y_i, y_j) 衡量一对像素 (i, j) 的标签 (y_i, y_j) 同时出现的代价。它是 CRF 精化边界的关键。DeepLab 中使用的二元势函数形式为:

ψp(yi,yj)=μ(yi,yj)[w1exp⁡(−∥pi−pj∥22θα2−∥Ii−Ij∥22θβ2)+w2exp⁡(−∥pi−pj∥22θγ2)]\psi_p(y_i, y_j) = \mu(y_i, y_j) \left[ w_1 \exp\left(-\frac{\Vert p_i - p_j\Vert ^2}{2\theta_{\alpha}^2} -\frac{\Vert I_i - I_j\Vert ^2}{2\theta_{\beta}^2}\right) + w_2 \exp\left(-\frac{\Vert p_i - p_j\Vert ^2}{2\theta_{\gamma}^2}\right) \right]

让我们拆解这个公式:

  • μ(y_i, y_j):这是一个简单的兼容性函数。通常定义为当 y_i ≠ y_j 时为1,否则为0。这意味着只有当两个像素被赋予不同的标签时,才会产生惩罚。相同标签则无额外代价。
  • 第一项(外观核):w1 * exp(...)。这一项同时考虑了像素间的空间接近度 (p_i - p_j) 和颜色相似度 (I_i - I_j)。
    • 如果两个像素在空间上很近 (‖p_i - p_j‖ 小) 且 颜色很相似 (‖I_i - I_j‖ 小),那么指数项的值会很大。
    • 由于当两像素标签不同时 μ(y_i, y_j)=1,这个大的值意味着:对于颜色相似、位置相近的像素,如果给它们分配不同的标签,将会产生很高的能量(代价)。因此,模型会倾向于给这样的像素对分配相同的标签,从而使得同质区域内部标签一致,边界处标签变化。
  • 第二项(平滑核):w2 * exp(...)。这一项只考虑空间接近度,不考虑颜色。它作为一个全局的平滑项,鼓励在空间上邻近的像素(无论颜色如何)拥有相同的标签,有助于去除小的孤立噪声点。

参数 θ_α, θ_β, θ_γ 控制着高斯核的宽度,即“相似”的范围。w1 和 w2 是两项的权重。

这与我们之前学过的 Graph Cuts 能量函数思想非常相似! Graph Cuts 的能量 E(A) = λ·R(A) + B(A) 中,R(A)(区域项)对应这里的一元势函数,衡量将像素分配给某个标签的代价;B(A)(边界项)对应这里的二元势函数,衡量相邻像素标签不同的惩罚——两像素越相似(颜色越接近),给不同标签的惩罚越大;越不相似,惩罚越小。CRF 的全连接二元势函数可以看作是 Graph Cuts 边界项的一个非常强大和泛化的版本。

CRF 的迭代优化与效果

在 DeepLab V1 的流程中:

  1. 输入图像经过带有空洞卷积的 CNN,得到粗糙的分割概率图。
  2. 将 1/8 分辨率的概率图经双线性插值上采样 8 倍,恢复到原图尺寸,作为 CRF 一元势的输入(即每个像素的初始类别概率),而不是当作 CRF 的“初始标签”使用。
  3. 使用平均场近似(Mean Field Approximation) 等高效推理算法,对上述全连接 CRF 的能量函数进行最小化迭代。这个过程会不断调整像素的标签,使得能量降低。
  4. 经过多次迭代(例如10次)后,得到最终的能量最小化标签配置,即精化后的分割结果。

下面的代码块模拟了 CRF 迭代优化中,二元势函数如何根据像素相似度计算惩罚权重。请注意,这是一个高度简化的示意,用于展示核心计算逻辑,真实的 CRF 推理要复杂得多。

import numpy as np

# 假设我们有两个像素的信息
# 像素1: 位置 (0, 0), 颜色 (100, 150, 200) - RGB
# 像素2: 位置 (1, 1), 颜色 (105, 155, 205) - RGB
p_i = np.array([0.0, 0.0])
p_j = np.array([1.0, 1.0])
I_i = np.array([100.0, 150.0, 200.0])
I_j = np.array([105.0, 155.0, 205.0])

# 设置CRF高斯核参数(示例值)
theta_alpha = 5.0  # 空间距离尺度
theta_beta = 10.0  # 颜色距离尺度
theta_gamma = 1.0  # 平滑项空间尺度
w1 = 1.0
w2 = 1.0

# 计算各项距离的平方
dist_sq = np.sum((p_i - p_j) ** 2)  # 空间距离平方
color_dist_sq = np.sum((I_i - I_j) ** 2)  # 颜色距离平方 (使用L2范数简化)

# 计算外观核(第一项)
appearance_kernel = w1 * np.exp(-dist_sq / (2 * theta_alpha**2) - color_dist_sq / (2 * theta_beta**2))

# 计算平滑核(第二项)
smooth_kernel = w2 * np.exp(-dist_sq / (2 * theta_gamma**2))

print(f"像素间空间距离平方: {dist_sq:.2f}")
print(f"像素间颜色距离平方: {color_dist_sq:.2f}")
print(f"外观核值 (颜色/空间相似度高则值大): {appearance_kernel:.4f}")
print(f"平滑核值 (仅空间接近则值大): {smooth_kernel:.4f}")

# 假设这两个像素被赋予了不同的标签 (y_i != y_j),则惩罚项为:
pairwise_potential = 1.0 * (appearance_kernel + smooth_kernel)
print(f"\n二元势函数惩罚值 (标签不同时): {pairwise_potential:.4f}")
print("说明:这个值越大,意味着给这两个相似像素分配不同标签的‘代价’越高,")
print("在能量最小化过程中,算法会尽量避免这种情况。")
像素间空间距离平方: 2.00
像素间颜色距离平方: 75.00
外观核值 (颜色/空间相似度高则值大): 0.6603
平滑核值 (仅空间接近则值大): 0.3679

二元势函数惩罚值 (标签不同时): 1.0282
说明:这个值越大,意味着给这两个相似像素分配不同标签的‘代价’越高,
在能量最小化过程中,算法会尽量避免这种情况。

从效果上看,CRF 的后处理能力非常显著。在 DeepLab 论文和课件给出的对比图中,从上到下依次是:

  • 输入图像:原始 RGB 图像。
  • 第一行(Softmax 之前的分值):飞机类别的得分图,未把最大响应突出显示,看起来更模糊。
  • 第二行(Softmax 之后的概率):把得分归一化为概率、突出最大响应后,飞机的轮廓已经显现出来,但边缘仍未贴合真实物体边界。
  • CRF 迭代之后:把这张概率图作为一元势送入全连接 CRF,迭代约 10 次后,分割边界变得清晰、锐利,与真实标注(Ground Truth)几乎重合。它有效地利用了图像本身的颜色和空间信息,把 CNN 语义上的高置信度区域与图像的低级边缘信息对齐,从而实现了边界精化。

需要注意,第一行与第二行的差别只在于“是否做 Softmax 并突出最大响应”,CRF 迭代是更靠后的独立一步,两者不是同一件事。

📝 动手练一练

  1. 概念辨析:马尔可夫随机场(MRF)和条件随机场(CRF)的核心区别是什么?在图像分割任务中,观测变量和标签变量分别对应什么?
👉 点击查看参考答案

核心区别在于建模的对象不同:

  • MRF 直接对一组随机变量(如所有像素的标签)的联合概率分布 P(Y) 进行建模。它描述的是这些标签之间自身的依赖关系(如空间平滑性)。
  • CRF 是对给定观测变量 X 时,标签变量 Y 的条件概率分布 P(Y|X) 进行建模。它明确地将可观测的图像信息(X)纳入模型,用于指导标签(Y)的推断。可以说,CRF 是 “条件于”观测数据 的 MRF。

在图像分割中:

  • 观测变量 X:对应图像的像素值(RGB值、亮度等),这是我们可以直接看到的数据。
  • 标签变量 Y:对应每个像素的语义类别标签(如“人”、“车”、“背景”),这是我们模型需要预测的、不可直接观测的数据。
  1. 能量函数理解:回顾 DeepLab 中全连接 CRF 的能量函数 E(y) = Σ_i ψ_u(y_i) + Σ_{i<j} ψ_p(y_i, y_j)。如果某个像素 i,CNN 非常确信它属于“汽车”类(P(汽车|X) = 0.99),那么它的一元势函数 ψ_u(y_i=汽车) 值大约是多少?这个值是鼓励还是抑制将该像素标记为“汽车”?
👉 点击查看参考答案

一元势函数定义为:ψ_u(y_i) = -log P(y_i | X)。

当 P(汽车|X) = 0.99 时: ψ_u(汽车) = -log(0.99) ≈ -(-0.01005) ≈ 0.01005 (这里 log 以 e 为底,值很小)。

这个值很小(接近0)。在能量函数最小化的框架下,小的能量值意味着该状态(像素 i 被标记为“汽车”)出现的概率高。因此,这个很小的一元势函数值强烈鼓励模型将该像素的标签 y_i 设置为“汽车”,因为这样能为总能量 E(y) 做出很小的贡献。反之,如果设置为其他概率低的标签,-log(P) 会很大,导致能量激增。注意概率不会超过 1,所以 -log(P) 恒为非负值,不会出现“负贡献”。

本章小结

本节我们深入探讨了条件随机场(CRF),特别是其在 DeepLab V1 模型中作为后处理模块的关键作用。我们了解到:

  • CRF 是一种强大的概率图模型,它通过建模像素标签在给定图像观测下的条件概率分布,能够有效融合 CNN 的高级语义信息与图像本身的低级视觉线索(颜色、纹理、空间邻近性)。
  • DeepLab 采用的全连接 CRF 突破了传统局部邻域的限制,允许任意两个像素间建立连接,通过定义精巧的二元势函数(结合外观核与平滑核),能够精确地惩罚在颜色相似、位置相近的像素对上出现不同标签的情况,从而驱使分割边界与图像中的真实物体边缘对齐。
  • CRF 的能量最小化过程是一个迭代优化过程,能够显著提升分割结果的边界精度,使模糊的 CNN 输出变得清晰、锐利。

需要把这项技术放回它的历史位置:DeepLab V1 发表于 2015 年,它所用的全连接 CRF 平均场推理来自 Krähenbühl 与 Koltun 在 2011 年提出的 dense CRF,因此“CNN 粗分割 + 全连接 CRF 后处理”属于 2015 年前后的方案。DeepLab V2 仍保留 CRF,从 DeepLab V3 起改由空洞空间金字塔池化(ASPP)与更强的多尺度上下文承担边界与细节,DeepLab V3+ 又引入编码器—解码器结构,CRF 不再是必需组件;今天主流的分割模型更多依靠高分辨率特征、多尺度融合与基于 Transformer 的查询式结构来直接得到精细边界,全连接 CRF 已基本退出工程实践。学习它的价值,在于理解“如何把图像的低级线索作为先验注入分割结果”这一建模思路。

📋 行动清单

  • 理解 CRF 中“条件”的含义,能清晰区分 MRF 与 CRF。
  • 掌握 DeepLab 全连接 CRF 能量函数的构成,能说明一元势函数和二元势函数各自的作用及来源。
  • 在脑海中构建 CRF 后处理的工作流程:CNN 粗分割 → 上采样 → CRF 迭代优化能量函数 → 输出精化结果。

—— 小象教研组