DeepLabv1补充:对全连接条件随机场(Fully Connected / Dense CRF)的理解

本文从随机场概念出发,逐步深入介绍马尔科夫随机场、条件随机场及其特例线性链条件随机场和全连接条件随机场的概念与原理。详细解释了条件随机场在不同场景下的应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1. 随机场 (random field)

  由若干位置组成的整体,每一个位置按某种分布随机地赋一个值,全体即组成一个随机场。

2. 马尔科夫随机场(MRF)

  马尔科夫随机场是随机场的特例,假设某一个位置的赋值只与和它相邻的位置相关。

3. 条件随机场(CRF)

  条件随机场是马尔科夫随机场的特例,假设马尔可夫随机场只有XY两个随机变量,一般情况下,X是给定的,Y是输出。
  形式化定义:设XY是随机变量,P(Y∣X)P(Y|X)P(YX)是给定XY的条件概率分布,若Y构成一个马尔科夫随机场,则P(Y∣X)P(Y|X)P(YX)是条件随机场。

4. 线性链条件随机场(linear CRF)

  若XY有相同的结构,即X=(X1,X2,...,Xn),Y=(Y1,Y2,...Yn)X=(X_1,X_2,...,X_n),Y=(Y_1,Y_2,...Y_n)X=(X1,X2,...,Xn)Y=(Y1,Y2,...Yn),则构成线性链(linear chain)条件随机场。
  形式化定义:设X=(X1,X2,...,Xn),Y=(Y1,Y2,...Yn)X=(X_1,X_2,...,X_n),Y=(Y_1,Y_2,...Y_n)X=(X1,X2,...,Xn)Y=(Y1,Y2,...Yn)均为线性链表示的随机变量序列,在给定随机变量序列X的情况下,如果随机变量Y的条件概率分布P(Y∣X)P(Y|X)P(YX)构成条件随机场,即具有马尔科夫性,即:
P(Yi∣X,Y1,Y2,...,Yn)=P(Yi∣X,Yi−1,Yi+1)P(Y_i|X,Y_1,Y_2,...,Y_n)=P(Y_i|X,Y_{i-1},Y_{i+1})P(YiX,Y1,Y2,...,Yn)=P(YiX,Yi1,Yi+1)

  则$P(Y|X)是线性链条件随机场

5. 全连接条件随机场(Fully Connected / Dense CRF)

  如下图,有一幅图像:
在这里插入图片描述
  若像素类别之和自己所在的像素点有关,则建模如下图:
在这里插入图片描述
  更加复杂地,每一个像素类别和图像中所有像素有关,则如下图:
在这里插入图片描述
  更加fancy的,每一个像素类别和它的一个4邻域相关,如下图所示:
在这里插入图片描述
  最复杂的,把能连的都连起来,构成全连接CRF,即Dense CRF。下图并没有画全所有连接:
在这里插入图片描述

### 条件随机场 (CRF) 的 Python 实现及应用 #### CRF 基本概念 条件随机场是一种用于建模序列化标注问题的概率图模型,在自然语言处理领域有着广泛应用。相较于隐马尔可夫模型(HMM)CRF能够更好地捕捉特征之间的依赖关系,从而提高分类准确性。 #### Viterbi 算法的 Python 实现 对于线性链条件随机场而言,Viterbi算法被用来寻找最优标签路径[^1]: ```python def viterbi(obs, states, start_p, trans_p, emit_p): V = [{}] path = {} # Initialize base case (t == 0) for y in states: V[0][y] = start_p[y] * emit_p[y][obs[0]] path[y] = [y] # Run Viterbi when t > 0 for t in range(1, len(obs)): V.append({}) new_path = {} for y in states: (prob, state) = max( [(V[t-1][y0]*trans_p[y0][y]*emit_p[y][obs[t]], y0) for y0 in states]) V[t][y] = prob new_path[y] = path[state] + [y] path = new_path n = len(obs)-1 (prob, state) = max([(V[n][y], y) for y in states]) return (prob, path[state]) ``` 此函数接收观测序列`obs`,状态集合`states`,初始概率分布`start_p`,转移矩阵`trans_p`以及发射概率表`emit_p`.通过动态规划的方式计算给定观察下最可能的状态序列. #### 数据预处理到预测流程 构建一个完整的基于CRF的应用程序通常涉及以下几个方面的工作: * **数据准备**: 收集并清理文本语料库. * **特征工程**: 提取有助于区分不同类别的属性. * **模型训练**: 利用标记好的样本调整参数直至收敛. * **性能评估**: 测试泛化能力并对结果做出解释.[^2] 具体来说就是先定义好输入输出格式,再利用工具包如sklearn-crfsuite来简化编码工作量.下面是一个简单的例子展示如何操作这些步骤: ```python import pycrfsuite from sklearn.model_selection import train_test_split X_train,X_test,y_train,y_test=train_test_split(X,y,test_size=0.2) trainer = pycrfsuite.Trainer(verbose=False) for xseq, yseq in zip(X_train, y_train): trainer.append(xseq, yseq) trainer.set_params({ 'c1': 1.0, 'c2': 1e-3, }) tagger = trainer.train('model.crfsuite') # Predicting on test set preds = [] for seq in X_test: preds.extend(tagger.tag(seq)) ``` 这里采用了pycrfsuite作为底层支持,可以方便快捷地搭建起自己的NLP项目框架. #### 图像后处理中的全连接CRFs 除了传统的线性结构外,还有研究者提出了适用于计算机视觉任务的全连接条件随机场(full connected CRF).这类改进型架构允许任意两点之间存在边权联系,进而增强了表达力和灵活性.尤其是在解决分割边界模糊不清等问题上表现出色[^3]. ```python import pydensecrf.densecrf as dcrf from skimage.io import imread, imsave import numpy as np img = imread('image.png').astype(np.uint8) anno_rgb = imread('annotation.png').astype(np.uint32) H,W,C=img.shape[:3] U=-np.log((anno_rgb.astype(float)/255.).clip(min=1e-6,max=None)) d=dcrf.DenseCRF2D(W,H,2)# Width of input image,Height of input image,number of labels d.setUnaryEnergy(U.reshape(-1)) feats=create_pairwise_gaussian(sdims=(3,3), shape=img.shape[:2]) d.addPairwiseGaussian(sxy=(3,3), compat=3,kernel=dcrf.DIAG_KERNEL,norm=dcrf.NORMALIZE_SYMMETRIC) Q=d.inference(5) map=np.argmax(Q,axis=0).reshape(img.shape[:-1]) imsave('output.png', map.astype(np.uint8)*255) ``` 上述脚本实现了对二值图像进行平滑滤波的功能,其中create_pairwise_gaussian()负责生成高斯核权重向量.
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值