查看全课大纲(第 71 / 93 节)
- 1.计算机视觉概述
- 2.计算机视觉应用场景
- 3.困难与挑战
- 4.开源库介绍
- 5.图像显示与存储
- 6.CLAHE
- 7.腐蚀膨胀与开闭运算
- 8.滤波与边缘填充
- 9.各种滤波
- 10.图像金字塔
- 11.傅里叶变换
- 12.短时傅里叶变换与小波变换
- 13.颜色特征与颜色直方图
- 14.几何特征_边缘
- 15.几何特征-角点与斑点
- 16.局部特征-SIFT特征描述子
- 17.局部特征-SURF特征描述子
- 18.局部特征-ORB特征描述子
- 19.其他特征描述子
- 20.传统图像分割技术
- 21.GraphCut
- 22.GrabCut
- 23.人脸检测的传统方法
- 24.行人检测的传统方法HOG+SVM
- 25.行人检测DPM
- 26.人工神经网络的架构
- 27.目标函数与梯度下降
- 28.误差反向传播
- 29.可手算的神经网络
- 30.改进目标函数与克服梯度消散
- 31.神经网络之传统神经网络与深度网络的差异
- 32.各种梯度下降算法
- 33.如何选择合适的梯度下降算法
- 34.避免过适应
- 35.CNN的架构
- 36.CNN的误差反向传播_卷积层
- 37.CNN的误差反向传播_池化层
- 38.分类所用的数据集
- 39.Alexnet详解
- 40.VGG详解
- 41.GoogLeNet_v1
- 42.BatchNormalization
- 43.GoogLeNet_v3v4
- 44.ResNet
- 45.ResNeXt
- 46.CNN设计准则
- 47.图像检索与推土机距离
- 48.基于颜色相似性
- 49.基于形状相似性
- 50.基于纹理相似性
- 51.基于局部特征相似性
- 52.DL的二值哈希编码
- 53.高维空间中检索KDTree
- 54.高维空间中检索LSH
- 55.目标识别任务综述
- 56.RCNN
- 57.SPP-Net
- 58.Fast R-CNN
- 59.Faster R-CNN
- 60.R-CNN系列模型回顾
- 61.R-FCN的设计思路
- 62.R-FCN的实现
- 63.YOLOv1
- 64.YOLOv2_9000
- 65.YOLOv3
- 66.图像分割应用场景与数据集
- 67.上采样的实现方式
- 68.FCN网络架构的由来
- 69.FCN构建细节
- 70.DeepLabv1
- 71.CRF
- 72.DeepLabv2
- 73.DeepLabv3
- 74.特定的医学影像分割任务
- 75.U-Net
- 76.3D U-Net
- 77.V-Net
- 78.DenseNet
- 79.病理切片分析任务及数据集
- 80.病理切片分析
- 81.图说任务及其传统处理方法
- 82.深度语言模型与RNN
- 83.LSTM及其变种
- 84.NIC模型
- 85.SAT模型
- 86.图说的性能指标
- 87.判别模型与生成模型
- 88.KL散度与JS散度
- 89.VAE
- 90.GAN的基本原理
- 91.DCGAN与CGAN
- 92.Wasserstein GAN
- 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,我们首先需要了解几个基础概念:
随机场(Random Field):想象一张图像,我们把每个像素位置看作一个“位置”。如果给每个位置都按照某种概率分布随机赋予一个值(例如,一个像素强度或一个类别标签),那么所有这些位置上的随机变量构成的整体,就称为一个随机场。简单说,它就是一组定义在空间位置上的随机变量的集合。
马尔可夫随机场(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)。
吉布斯分布提供了一种用势函数乘积来表示联合概率的方法:
- 将无向图分解为多个团(Clique),即图中全连接的子图。
- 为每个团
c定义一个非负的势函数φ_c(Y_c),它衡量该团中变量取特定组合Y_c的“可能性”或“亲和度”。值越大,表示该组合越可能出现。 - 整个图的联合概率分布
P(Y)正比于所有团势函数的乘积。
为了使其成为一个合法的概率分布(所有可能情况之和为1),需要除以一个归一化常数 Z,称为配分函数(Partition Function)。
吉布斯分布的标准形式如下:
其中,Z = ∑_{Y} ∏_{c} φ_c(Y_c),是对所有可能的变量赋值求和。
在实际计算和优化中,我们通常处理势函数的对数形式,并引入能量函数(Energy Function)。定义能量 E(Y) = -log(φ(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,指数内部的“因子连乘”就变成“加权连加”:
其中 Z(X) = ∑_{Y} exp(-E(Y|X))。由于归一化常数依赖 X,每张输入图像都有各自的 Z(X)。DeepLab 正是把这条一般形式落到“像素标签 + 图像观测”上,并只保留一元项和二元项,得到下一节的特例。
DeepLab V1 中的全连接条件随机场
DeepLab V1 采用了全连接条件随机场(Fully-Connected CRF)。这里的“全连接”意味着在模型中,每一个像素的标签变量都与图像中所有其他像素的标签变量相连,而不仅仅是其邻居。这极大地扩展了模型捕捉长距离依赖关系的能力,有助于处理那些在颜色上相似但空间距离较远的区域。当然,连接强度并非一视同仁:二元势用高斯核按“空间距离 + 颜色差异”给每一对像素打分,相距越远、颜色差越大,耦合越弱——也就是说,“邻接”这件事从固定的 4 邻域或 8 邻域,变成了由核函数连续定义的软邻接。
DeepLab 中 CRF 的能量函数 E(y) 定义如下:
它由两部分组成:
1. 一元势函数(Unary Potential)
ψ_u(y_i) 只与单个像素 i 的标签 y_i 有关。它代表了像素 i 被独立地分类为标签 y_i 的代价。在 DeepLab V1 中,这个代价直接来自 CRF 之前的深层卷积网络的输出(即模型的前端 CNN,此处并非特指 FCN 这一模型):
其中 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 中使用的二元势函数形式为:
让我们拆解这个公式:
μ(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 的流程中:
- 输入图像经过带有空洞卷积的 CNN,得到粗糙的分割概率图。
- 将 1/8 分辨率的概率图经双线性插值上采样 8 倍,恢复到原图尺寸,作为 CRF 一元势的输入(即每个像素的初始类别概率),而不是当作 CRF 的“初始标签”使用。
- 使用平均场近似(Mean Field Approximation) 等高效推理算法,对上述全连接 CRF 的能量函数进行最小化迭代。这个过程会不断调整像素的标签,使得能量降低。
- 经过多次迭代(例如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 迭代是更靠后的独立一步,两者不是同一件事。
📝 动手练一练
- 概念辨析:马尔可夫随机场(MRF)和条件随机场(CRF)的核心区别是什么?在图像分割任务中,观测变量和标签变量分别对应什么?
👉 点击查看参考答案
核心区别在于建模的对象不同:
- MRF 直接对一组随机变量(如所有像素的标签)的联合概率分布 P(Y) 进行建模。它描述的是这些标签之间自身的依赖关系(如空间平滑性)。
- CRF 是对给定观测变量 X 时,标签变量 Y 的条件概率分布 P(Y|X) 进行建模。它明确地将可观测的图像信息(X)纳入模型,用于指导标签(Y)的推断。可以说,CRF 是 “条件于”观测数据 的 MRF。
在图像分割中:
- 观测变量 X:对应图像的像素值(RGB值、亮度等),这是我们可以直接看到的数据。
- 标签变量 Y:对应每个像素的语义类别标签(如“人”、“车”、“背景”),这是我们模型需要预测的、不可直接观测的数据。
- 能量函数理解:回顾 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 迭代优化能量函数 → 输出精化结果。
—— 小象教研组