当前位置: 首页 > news >正文

条件随机场 (CRF) 原理及其在语义分割中的应用

条件随机场 (CRF) 原理及其在语义分割中的应用

一、条件随机场的原理

条件随机场 (Conditional Random Fields, CRF) 是一种判别式概率无向图模型。它用于在给定观测序列 (如图像中的像素) 的条件下,对另一组序列 (如像素的语义标签) 进行建模和预测。

与生成式模型 (如隐马尔可夫模型 HMM) 不同,CRF 直接对条件概率 P ( Y ∣ X ) P(Y|X) P(YX) 建模,而不是对联合概率 P ( X , Y ) P(X,Y) P(X,Y) 建模 (其中 X X X 是观测序列, Y Y Y 是待预测的标签序列)。这使得 CRF 在建模时可以利用 X X X 中的复杂特征,而无需担心这些特征之间的依赖关系,因为 CRF 不会对 X X X 的概率分布进行建模。

CRF 的核心思想:

  1. 马尔可夫随机场 (Markov Random Field, MRF): CRF 是 MRF 的一种特殊形式。MRF 是一种无向图模型,图中的每个节点代表一个随机变量,边代表变量之间的依赖关系。MRF 具有马尔可夫性,即给定邻居节点,一个节点的状态与其他节点无关。
  2. 条件性: CRF 的"条件性"体现在它对条件概率 P ( Y ∣ X ) P(Y|X) P(YX) 进行建模。这意味着我们关心的是在已知观测 X X X 的情况下,标签序列 Y Y Y 的概率分布。
  3. 特征函数 (Feature Functions): CRF 的强大之处在于它能够灵活地定义特征函数。特征函数 f k ( Y , X , i ) f_k(Y, X, i) fk(Y,X,i) 描述了观测序列 X X X 和标签序列 Y Y Y 在位置 i i i 处的一些特性。这些特性可以是任意的,例如:
    • 某个像素的颜色值与其标签的关系。
    • 相邻像素具有相同标签的可能性。
    • 某个像素的纹理特征与其标签的关系。
  4. 参数学习: 每个特征函数都有一个对应的权重 λ k \lambda_k λk。CRF 的学习过程就是通过训练数据来估计这些权重,使得在给定观测 X X X 时,模型能够更好地预测出正确的标签序列 Y Y Y
  5. 概率计算: 给定观测序列 X X X,标签序列 Y Y Y 的条件概率可以表示为:
    P ( Y ∣ X ) = 1 Z ( X ) exp ⁡ ( ∑ k ∑ i λ k f k ( y i , y i − 1 , X , i ) ) P(Y|X) = \frac{1}{Z(X)} \exp\left(\sum_k \sum_i \lambda_k f_k(y_i, y_{i-1}, X, i)\right) P(YX)=Z(X)1exp(kiλkfk(yi,yi1,X,i))
    其中:
    • y i y_i yi 是位置 i i i 的标签。
    • f k ( y i , y i − 1 , X , i ) f_k(y_i, y_{i-1}, X, i) fk(yi,yi1,X,i) 是在位置 i i i 处定义的特征函数,它可能依赖于当前标签 y i y_i yi、前一个标签 y i − 1 y_{i-1} yi1 (对于序列数据) 以及整个观测序列 X X X。在图像中,它通常会考虑当前像素的标签、邻近像素的标签以及图像特征。
    • λ k \lambda_k λk 是与特征函数 f k f_k fk 相关联的权重。
    • Z ( X ) Z(X) Z(X) 是归一化因子,也称为配分函数 (partition function),它确保所有可能的标签序列 Y Y Y 的概率之和为 1。计算 Z ( X ) Z(X) Z(X) 通常是 CRF 中计算复杂度最高的部分。
      Z ( X ) = ∑ Y exp ⁡ ( ∑ k ∑ i λ k f k ( y i , y i − 1 , X , i ) ) Z(X) = \sum_Y \exp\left(\sum_k \sum_i \lambda_k f_k(y_i, y_{i-1}, X, i)\right) Z(X)=Yexp(kiλkfk(yi,yi1,X,i))
  6. 推断 (Inference): 在学习到模型参数后,对于新的观测序列 X X X,我们需要找到最可能的标签序列 Y ∗ Y^* Y,即:
    Y ∗ = arg ⁡ max ⁡ Y P ( Y ∣ X ) Y^* = \arg\max_Y P(Y|X) Y=argmaxYP(YX)
    于序列标注),可以使用 Viterbi 算法进行高效推断。对于更一般的图结构 (如图像网格),推断问题通常是 NP-hard 的,需要使用近似推断算法,如信念传播 (Belief Propagation)、图割 (Graph Cuts) 或均值场 (Mean Field) 等。

总结 CRF 的优点:

  • 判别式模型: 直接对条件概率建模,通常能获得比生成式模型更高的预测精度。
  • 灵活性: 可以定义非常丰富的、全局性的特征,捕捉观测数据和标签之间的复杂依赖关系。
  • 克服标签偏置问题: 相较于最大熵马尔可夫模型 (MEMM),CRF 通过全局归一化解决了标签偏置问题。

二、CRF 在语义分割中的应用

在语义分割任务中,目标是将图像中的每个像素分配一个语义标签 (例如,“人”,“汽车”,"天空"等)。

CRF 如何应用于语义分割?

  1. 将图像视为一个图:

    • 图像中的每个像素可以看作是图中的一个节点。
    • 节点之间的边可以连接邻近的像素。
  2. 一元势能 (Unary Potentials / Likelihood Term):

    • 这部分通常由一个深度卷积神经网络 (DCNN,如 FCN, U-Net, DeepLab 等) 提供。
    • 对于每个像素 i i i,DCNN 会输出一个概率分布 P ( l i ∣ X ) P(l_i|X) P(liX),表示该像素属于各个语义标签 l i l_i li 的概率。这个概率可以看作是 CRF 模型中的一元势能 ψ u ( l i ) \psi_u(l_i) ψu(li)
    • 它反映了单个像素自身的特征 (如颜色、纹理,由 DCNN 提取) 与其可能的标签之间的关系。
    • 形式上,可以定义为 ψ u ( l i ) = − log ⁡ P ( l i ∣ X ) \psi_u(l_i) = -\log P(l_i|X) ψu(li)=logP(liX)
  3. 成对势能 (Pairwise Potentials / Smoothness Term / Prior Term):

    • 这部分用于建模像素之间的关系,鼓励标签的平滑性,即相邻像素倾向于具有相同的标签,除非它们之间存在明显的边界。
    • 常用的成对势能函数是基于高斯核的:
      ψ p ( l i , l j ) = μ ( l i , l j ) ∑ m = 1 K w m k m ( f i , f j ) \psi_p(l_i, l_j) = \mu(l_i, l_j) \sum_{m=1}^{K} w_m k_m(\mathbf{f}_i, \mathbf{f}_j) ψp(li,lj)=μ(li,lj)m=1Kwmkm(fi,fj)
      其中:
      • l i , l j l_i, l_j li,lj 是像素 i i i j j j 的标签。
      • μ ( l i , l j ) \mu(l_i, l_j) μ(li,lj) 是一个标签兼容性函数。最简单的是 Potts 模型: μ ( l i , l j ) = [ l i e q l j ] \mu(l_i, l_j) = [l_i eq l_j] μ(li,lj)=[lieqlj] (如果标签不同则为1,否则为0),它惩罚相邻像素具有不同标签的情况。
      • w m w_m wm 是每个核的权重。
      • k m ( f i , f j ) k_m(\mathbf{f}_i, \mathbf{f}_j) km(fi,fj) 是高斯核函数,它依赖于像素 i i i j j j 的特征 f i , f j \mathbf{f}_i, \mathbf{f}_j fi,fj。常用的特征包括:
        • 外观核 (Appearance Kernel): 基于像素的颜色 (或强度) 差异和空间位置差异。
          k 1 ( f i , f j ) = w 1 exp ⁡ ( − ∥ p i − p j ∥ 2 2 σ α 2 − ∥ I i − I j ∥ 2 2 σ β 2 ) k_1(\mathbf{f}_i, \mathbf{f}_j) = w_1 \exp\left(-\frac{\|p_i - p_j\|^2}{2\sigma_\alpha^2} - \frac{\|I_i - I_j\|^2}{2\sigma_\beta^2}\right) k1(fi,fj)=w1exp(2σα2pipj22σβ2IiIj2)
          其中 p i , p j p_i, p_j pi,pj 是像素位置, I i , I j I_i, I_j Ii,Ij 是像素颜色值。这个核鼓励颜色相似且空间上接近的像素拥有相同的标签。
        • 平滑核 (Smoothness Kernel): 仅基于像素的空间位置差异,鼓励局部平滑。
          k 2 ( f i , f j ) = w 2 exp ⁡ ( − ∥ p i − p j ∥ 2 2 σ γ 2 ) k_2(\mathbf{f}_i, \mathbf{f}_j) = w_2 \exp\left(-\frac{\|p_i - p_j\|^2}{2\sigma_\gamma^2}\right) k2(fi,fj)=w2exp(2σγ2pipj2)
          这个核鼓励小范围内的标签一致性,有助于消除小的噪声区域。
  4. 能量函数:
    结合一元势能和成对势能,CRF 的目标是最小化以下能量函数 (等价于最大化后验概率):
    E ( L ) = ∑ i ψ u ( l i ) + ∑ i , j ∈ N ψ p ( l i , l j ) E(L) = \sum_i \psi_u(l_i) + \sum_{i,j \in \mathcal{N}} \psi_p(l_i, l_j) E(L)=iψu(li)+i,jNψp(li,lj)
    其中 L = { l 1 , l 2 , . . . , l N } L = \{l_1, l_2, ..., l_N\} L={l1,l2,...,lN} 是所有像素的标签集合, N \mathcal{N} N 表示像素邻域关系。

  5. 全连接 CRF (Fully Connected CRF / Dense CRF):

    • 在传统的 CRF 中,成对势能通常只考虑局部邻域 (例如,4邻域或8邻域)。
    • DeepLab 系列模型推广了 全连接 CRF 的概念。在全连接 CRF 中,每个像素都与其他所有像素通过成对势能连接起来。
    • 这使得模型能够捕捉长距离的依赖关系,从而产生更精细、更符合图像真实边界的分割结果。
    • 尽管全连接 CRF 的图非常稠密,但由于高斯核的特性,可以使用高效的均值场近似推断算法在 O ( N ) O(N) O(N) 的时间内求解 (其中 N N N 是像素数量),这使得它在实践中是可行的。

CRF 作为后处理步骤:

  • 在许多现代语义分割框架中,CRF (特别是全连接 CRF) 通常作为深度学习模型输出的后处理步骤。
  • DCNN 首先提供一个初始的、可能有些粗糙的像素级概率图。
  • 然后,CRF 利用这些概率作为一元势能,并结合像素间的颜色和位置信息 (成对势能) 来优化分割结果,使得分割边界更加平滑,并且更好地贴合图像中的真实物体边界。
  • 这样做的好处是结合了 DCNN 强大的特征提取能力和 CRF 精细化边界的能力。

优点:

  • 能够显著改善分割结果的边界质量,使其更平滑、更精确。
  • 能够消除由 DCNN 产生的一些小的、孤立的错误分割区域。
  • 全连接 CRF 能够捕捉长距离依赖,有助于分割大目标和区分具有相似外观但在空间上分离的物体。

缺点/挑战:

  • 参数调整: CRF 中的高斯核参数 ( σ α , σ β , σ γ \sigma_\alpha, \sigma_\beta, \sigma_\gamma σα,σβ,σγ) 和权重 ( w m w_m wm) 通常需要仔细调整,这可能比较耗时。
  • 计算成本: 尽管有高效的近似推断算法,但与纯 DCNN 推断相比,CRF 仍然会增加额外的计算开销。
  • 端到端训练: 将 CRF 与 DCNN 进行端到端训练比较困难,尽管有一些研究工作尝试解决这个问题 (例如,将 CRF 的推断步骤展开为神经网络层)。大多数情况下,CRF 仍然作为独立的后处理步骤。

三、实验

我们采用一个简单的语义分割模型对VOC的一个实例进行推理:
在这里插入图片描述
接着我们通过一下脚本来进行后处理:

import numpy as np
import pydensecrf.densecrf as dcrf
from pydensecrf.utils import unary_from_labels, create_pairwise_bilateral, create_pairwise_gaussian
from PIL import Image
import matplotlib.pyplot as plt
import matplotlib.font_manager as fm
import os
import warnings
warnings.filterwarnings('ignore')  # 忽略警告信息def apply_crf(image_path, predicted_mask_path, output_path,crf_iterations=5, pairwise_gaussian_sdims=(3, 3), pairwise_gaussian_compat=3,pairwise_bilateral_sdims=(80, 80), pairwise_bilateral_schan=(13, 13, 13),pairwise_bilateral_compat=10, unary_gt_prob=0.7):"""对预测的分割掩码应用密集条件随机场(DenseCRF)进行后处理参数说明:image_path (str): 原始RGB图像路径predicted_mask_path (str): 预测分割掩码路径(灰度图或索引色图)output_path (str): 保存CRF优化后掩码的路径crf_iterations (int): CRF迭代次数(次数越多处理越精细,但耗时更长)pairwise_gaussian_sdims (tuple): 高斯成对项的空间标准差(控制局部平滑范围)pairwise_gaussian_compat (int): 高斯成对项的兼容性权重(权重越大平滑效果越明显)pairwise_bilateral_sdims (tuple): 双边成对项的空间标准差(控制颜色感知范围)pairwise_bilateral_schan (tuple): 双边成对项的RGB标准差(控制颜色相似度敏感度)pairwise_bilateral_compat (int): 双边成对项的兼容性权重(权重越大颜色一致性越强)unary_gt_prob (float): 一元势中预测标签的置信度(取值范围0-1,值越大越信任原始预测)"""try:# ---------------------- 1. 加载图像和预测掩码 ----------------------img = Image.open(image_path).convert('RGB')  # 读取原始图像并转为RGB格式img_np = np.array(img, dtype=np.uint8)  # 转为NumPy数组predicted_mask_img = Image.open(predicted_mask_path)  # 读取预测掩码# 处理不同格式的掩码(灰度图/索引图/RGB图)if predicted_mask_img.mode == 'P':  # 索引色图(调色板模式)# 转换为灰度图(需根据实际标签存储方式调整)predicted_mask_img = predicted_mask_img.convert('L')elif predicted_mask_img.mode in ['RGB', 'RGBA']:  # RGB/RGBA彩色掩码print("警告:检测到RGB掩码,将转为灰度图提取标签。\n""如果掩码通过颜色映射不同类别,需自定义颜色到标签的映射逻辑!")predicted_mask_img = predicted_mask_img.convert('L')  # 临时转为灰度图labels_np = np.array(predicted_mask_img, dtype=np.int32)  # 转为标签数组# 检查图像与掩码尺寸是否一致if img_np.shape[:2] != labels_np.shape:print(f"错误:图像尺寸{img_np.shape[:2]}与掩码尺寸{labels_np.shape}不匹配,正在调整掩码大小...")# 按最近邻插值缩放掩码至图像尺寸predicted_mask_img_resized = predicted_mask_img.resize((img_np.shape[1], img_np.shape[0]), Image.NEAREST)labels_np = np.array(predicted_mask_img_resized, dtype=np.int32)H, W = img_np.shape[:2]  # 获取图像高宽# ---------------------- 2. 分析掩码中的类别信息 ----------------------unique_labels = np.unique(labels_np)  # 获取掩码中的唯一标签n_labels = len(unique_labels)  # 类别总数print(f"检测到{len(unique_labels)}个唯一标签:{unique_labels}")if n_labels <= 1:print("警告:掩码中仅存在1个或0个标签,CRF处理可能无效或失败!")# 直接保存原始掩码predicted_mask_img.save(output_path)print(f"已将原始掩码保存至:{output_path}")return# 映射标签为连续整数(如原始标签为[255, 0] → 映射为[1, 0])label_map = {label: i for i, label in enumerate(unique_labels)}mapped_labels_np = np.copy(labels_np)for original_label, new_label in label_map.items():mapped_labels_np[labels_np == original_label] = new_label# ---------------------- 3. 构建一元势(Unary Potentials) ----------------------# 根据标签生成一元势矩阵(假设预测标签的置信度为unary_gt_prob)unary = unary_from_labels(mapped_labels_np, n_labels, gt_prob=unary_gt_prob, zero_unsure=False)unary = np.ascontiguousarray(unary)  # 确保数组内存连续# ---------------------- 4. 初始化DenseCRF模型 ----------------------d = dcrf.DenseCRF2D(W, H, n_labels)  # 创建二维CRF模型d.setUnaryEnergy(unary)  # 输入一元势# ---------------------- 5. 添加成对势(Pairwise Potentials) ----------------------# ① 高斯成对势:鼓励相邻像素标签一致(实现局部平滑)d.addPairwiseGaussian(sxy=pairwise_gaussian_sdims,  # 空间标准差(控制平滑范围)compat=pairwise_gaussian_compat,  # 兼容性权重(权重越大平滑越强)kernel=dcrf.DIAG_KERNEL,  # 对角线核(计算效率更高)normalization=dcrf.NORMALIZE_SYMMETRIC  # 对称归一化)# ② 双边成对势:结合图像颜色信息,鼓励颜色相似的相邻像素标签一致img_np_contiguous = np.ascontiguousarray(img_np)  # 确保图像数组内存连续d.addPairwiseBilateral(sxy=pairwise_bilateral_sdims,  # 空间标准差(控制颜色感知范围)srgb=pairwise_bilateral_schan,  # RGB标准差(控制颜色相似度敏感度)rgbim=img_np_contiguous,  # 输入图像compat=pairwise_bilateral_compat,  # 兼容性权重(权重越大颜色一致性越强)kernel=dcrf.DIAG_KERNEL,normalization=dcrf.NORMALIZE_SYMMETRIC)# ---------------------- 6. 执行CRF推理 ----------------------print("正在执行CRF推理...")Q = d.inference(crf_iterations)  # 迭代优化标签概率分布# ---------------------- 7. 解析优化结果并恢复原始标签 ----------------------# 提取概率最大的标签作为最终结果map_result = np.argmax(Q, axis=0).reshape((H, W))# 映射回原始标签值(如0→255,1→0等)final_result_np = np.copy(map_result)reverse_label_map = {v: k for k, v in label_map.items()}for new_label, original_label in reverse_label_map.items():final_result_np[map_result == new_label] = original_label# ---------------------- 8. 保存结果并可视化对比 ----------------------result_img = Image.fromarray(final_result_np.astype(np.uint8))  # 转为图像对象result_img.save(output_path)  # 保存优化后的掩码print(f"已将CRF优化后的掩码保存至:{output_path}")# 可视化原始图像、输入掩码、输出掩码(可选)fig, axes = plt.subplots(1, 3, figsize=(15, 5))axes[0].imshow(img)axes[0].set_title('原始图像')axes[0].axis('off')axes[1].imshow(labels_np, cmap='gray')  # 显示原始标签(输入掩码)axes[1].set_title('预测掩码(输入)')axes[1].axis('off')axes[2].imshow(final_result_np, cmap='gray')  # 显示CRF优化后的标签(输出掩码)axes[2].set_title('CRF优化掩码(输出)')axes[2].axis('off')plt.show()except FileNotFoundError:print(f"错误:未找到输入文件!\n查找路径:图像={image_path},掩码={predicted_mask_path}")except Exception as e:print(f"处理过程中发生错误:{str(e)}")if __name__ == '__main__':# ---------------------- 配置参数 ----------------------original_image_file = "2007_000032.png"  # 原始图像路径(需替换为实际路径)predicted_mask_file = "2007_000032_mask.png"  # 预测掩码路径(需替换为实际路径)output_refined_mask_file = "2007_000032_crf_refined_mask.png"  # 输出路径# CRF参数配置(需根据实际数据调参)ITERATIONS = 500  # CRF迭代次数(建议取值50-200,数值越大效果越精细但耗时越长)UNARY_GT_PROB = 0.95  # 一元势中预测标签的置信度(建议0.8-0.95)# 高斯成对势参数GAUSS_SXY = (3, 3)  # 空间标准差(控制局部平滑范围,建议2-5)GAUSS_COMPAT = 2  # 兼容性权重(建议1-5,数值越大平滑效果越明显)# 双边成对势参数BI_SXY = (40, 40)  # 空间标准差(控制颜色感知范围,建议20-100)BI_SRGB = (7, 7, 7)  # RGB标准差(控制颜色相似度,建议3-10)BI_COMPAT = 10  # 兼容性权重(建议5-20,数值越大颜色一致性越强)# ---------------------- 结束配置 ----------------------print("开始CRF后处理...")apply_crf(original_image_file,predicted_mask_file,output_refined_mask_file,crf_iterations=ITERATIONS,pairwise_gaussian_sdims=GAUSS_SXY,pairwise_gaussian_compat=GAUSS_COMPAT,pairwise_bilateral_sdims=BI_SXY,pairwise_bilateral_schan=BI_SRGB,pairwise_bilateral_compat=BI_COMPAT,unary_gt_prob=UNARY_GT_PROB)print("CRF后处理完成!")

结果如下:
请添加图片描述
可以看到CRF确实提高了分割的精度。

: pydensecrf库可以从一下命令来下载

pip install git+https://github.com/lucasb-eyer/pydensecrf.git

相关文章:

条件随机场 (CRF) 原理及其在语义分割中的应用

条件随机场 (CRF) 原理及其在语义分割中的应用 一、条件随机场的原理 条件随机场 (Conditional Random Fields, CRF) 是一种判别式概率无向图模型。它用于在给定观测序列 (如图像中的像素) 的条件下&#xff0c;对另一组序列 (如像素的语义标签) 进行建模和预测。 与生成式模…...

2025年Y2大型游乐设施操作证备考练习题

Y2 大型游乐设施操作证备考练习题 单选题 1、《游乐设施安全技术监察规程&#xff08;试行&#xff09;》规定&#xff1a;对操作控制人员无法观察到游乐设施的运行情况&#xff0c;在可能发生危险的地方应&#xff08; &#xff09;&#xff0c;或者采取其他必要的安全措施。…...

L53.【LeetCode题解】二分法习题集2

目录 1.162. 寻找峰值 分析 代码 提交结果 2.153. 寻找旋转排序数组中的最小值 分析 图像的增长趋势可以分这样几类 逐个击破 比较明显的 先增后减再增 用二段性给出left和right的更新算法 代码 提交结果 其他做法 提交结果 3.LCR 173. 点名(同剑指offer 53:0~…...

趣味编程:抽象图(椭圆组成)

概述&#xff1a;本篇博客主要讲解由椭圆图案组合而成的抽象图形。 1.效果展示 该程序的实际运行是一个动态的效果&#xff0c;因此实际运行相较于博客图片更加灵动。 2.源码展示 // 程序名称&#xff1a;椭圆组合而成的抽象图案// #include <graphics.h> #include <…...

RPA浪潮来袭,职业竞争的新风口已至?

1. RPA职业定义与范畴 1.1 RPA核心概念 RPA&#xff08;Robotic Process Automation&#xff0c;机器人流程自动化&#xff09;是一种通过软件机器人模拟人类操作&#xff0c;实现重复性、规律性任务自动化的技术。它能够自动执行诸如数据输入、文件处理、系统操作等任务&…...

【Elasticsearch】字段别名

在 Elasticsearch 中&#xff0c;字段别名&#xff08;Field Alias&#xff09;主要用于查询和检索阶段&#xff0c;而不是直接用于写入数据。 为什么不能通过字段别名写入数据&#xff1f; 字段别名本质上是一个映射关系&#xff0c;它将别名指向实际的字段。Elasticsearch …...

【Linux笔记】防火墙firewall与相关实验(iptables、firewall-cmd、firewalld)

一、概念 1、防火墙firewall Linux 防火墙用于控制进出系统的网络流量&#xff0c;保护系统免受未授权访问。常见的防火墙工具包括 iptables、nftables、UFW 和 firewalld。 防火墙类型 包过滤防火墙&#xff1a;基于网络层&#xff08;IP、端口、协议&#xff09;过滤流量&a…...

人工智能解析:技术革命下的认知重构

当生成式AI能够自主创作内容、设计方案甚至编写代码时&#xff0c;我们面对的不仅是工具革新&#xff0c;更是一场关于智能本质的认知革命。人工智能解析的核心&#xff0c;在于理解技术如何重塑人类解决问题和创造价值的底层逻辑——这种思维方式的转变&#xff0c;正成为数字…...

Neo4j实现向量检索

最近因为Dify、RagFlow这样的智能体的镜像拉取的速度实在太麻烦&#xff0c;一狠心想实现自己的最简单的RAG。 因为之前图数据库使用到了neo4j&#xff0c;查阅资料才发现​​Neo4j从5.11版本开始支持向量索引&#xff0c;提供一个真实可用的单元测试案例。 Neo4j建向量索引表…...

SpringBoot外部化配置

外部化配置&#xff08;Externalized Configuration&#xff09;是指将应用的配置从代码中剥离出来&#xff0c;放在外部文件或环境中进行管理的一种机制。 通俗地说&#xff0c;就是你不需要在代码里写死配置信息&#xff08;比如数据库账号、端口号、日志级别等&#xff09;…...

Gut(IF: 23.1)|深度多组学破局肝癌免疫联合治疗耐药的空间微环境图谱

肝细胞癌&#xff08;HCC&#xff09;是癌症相关死亡的主要原因之一&#xff0c;晚期患者预后极差。近年来&#xff0c;免疫检查点抑制剂&#xff08;ICI&#xff09;联合治疗&#xff08;如抗CTLA-4的tremelimumab和抗PD-L1的durvalumab&#xff09;已成为晚期HCC的一线治疗方…...

2025年保姆级教程:Powershell命令补全、主题美化、文件夹美化及Git扩展

文章目录 1. 美化 Powershell 缘起2. 安装 oh-my-posh 和 posh-git3. 安装文件夹美化主题【可选】 1. 美化 Powershell 缘起 背景&#xff1a;用了 N 年的 Windows 系统突然觉得命令行实在太难用了&#xff0c;没有补全功能、界面也不美观。所以&#xff0c;我决定改变它。但是…...

LeetCode-链表-合并两个有序链表

LeetCode-链表-合并两个有序链表 ✏️ 关于专栏&#xff1a;专栏用于记录 prepare for the coding test。 文章目录 LeetCode-链表-合并两个有序链表&#x1f4dd; 合并两个有序链表&#x1f3af;题目描述&#x1f50d; 输入输出示例&#x1f9e9;题目提示&#x1f9ea;AC递归&…...

SpringBoot3+Vue3(2)-前端基本页面配置-登录界面编写-Axios请求封装-后端跨越请求错误

前端&#xff1a; 清理文件 main.js 刷新后页面上什么都没有了 App.vue就留这 1.基本页面配置 新建Vue组件 单页面&#xff0c;考路由才操作。 1.前端根目录下安装路由 2.创建路由文件夹 main.js中添加路由配置 App.vue 添加上路由 welcomeView.vue 浏览器刷新&…...

Android Framework学习八:SystemServer及startService原理

文章目录 SystemServer、SystemServiceManger、SystemService、serviceManager的关系SystemServer进程的执行包含的ServiceSystemServer启动服务的流程startService Framework学习系列文章 SystemServer、SystemServiceManger、SystemService、serviceManager的关系 管理机制&a…...

远程访问家里的路由器:异地访问内网设备或指定端口网址

在一些情况下&#xff0c;我们可能需要远程访问家里的路由器&#xff0c;以便进行设置调整或查看网络状态等&#xff0c;我们看看怎么操作&#xff1f; 1.开启远程访问 在路由本地电脑或手机&#xff0c;登录浏览器访问路由管理后台&#xff0c;并设置开启WEB远程访问。 2.内…...

大语言模型 17 - MCP Model Context Protocol 介绍对比分析 基本环境配置

MCP 基本介绍 官方地址&#xff1a; https://modelcontextprotocol.io/introduction “MCP 是一种开放协议&#xff0c;旨在标准化应用程序向大型语言模型&#xff08;LLM&#xff09;提供上下文的方式。可以把 MCP 想象成 AI 应用程序的 USB-C 接口。就像 USB-C 提供了一种…...

python生成requirements.txt文件

方法一&#xff1a;只生成项目所用到的python包(常用) 首先安装pipreqs pip install pipreqs 然后进入到你所在的项目根目录&#xff0c;运行以下命令&#xff1a; pipreqs ./ --encodingutf-8 方法二&#xff1a;把本地所有安装包写入文件 pip freeze > requirements.txt …...

如何在PyCharm2025中设置conda的多个Python版本

前言 体验的最新版本的PyCharm(Community)2025.1.1&#xff0c;发现和以前的版本有所不同。特别是使用Anaconda中的多个版本的Python的时候。 关于基于Anaconda中多个Python版本的使用&#xff0c;以及对应的Pycharm&#xff08;2023版&#xff09;的使用&#xff0c;可以参考…...

StepX-Edit:一个通用图像编辑框架——论文阅读笔记

一. 前言 代码&#xff1a;https://github.com/stepfun-ai/Step1X-Edit 论文&#xff1a;https://arxiv.org/abs/2504.17761 近年来&#xff0c;图像编辑技术发展迅速&#xff0c;GPT- 4o、Gemini2 Flash等前沿多模态模型的推出&#xff0c;展现了图像编辑能力的巨大潜力。 这…...

vue原生table表格实现动态添加列,一行添加完换行继续添加。el-select输入框背景颜色根据所选内容不同而改变

效果如下 动态添加列 代码如下 <template><div class"table-container"><button click"addColumn">添加列</button><div class"scroll-container"><div class"table-grid"><div v-for"(r…...

maven之pom.xml

MAVEN 1、基础配置​2、项目信息3、依赖管理​4、构建配置​5、继承与聚合​6、仓库与SCM​7、其他高级配置​ Maven的pom.xml文件是项目的核心配置文件&#xff0c;用于定义项目结构、依赖关系和构建过程 https://www.runoob.com/maven/maven-pom.html 1、基础配置​ **<…...

深度学习Y8周:yolov8.yaml文件解读

&#x1f368; 本文为&#x1f517;365天深度学习训练营中的学习记录博客&#x1f356; 原作者&#xff1a;K同学啊 本周任务&#xff1a;根据yolov8n、yolov8s模型的结构输出&#xff0c;手写出yolov8l的模型输出、 文件位置&#xff1a;./ultralytics/cfg/models/v8/yolov8.…...

充电桩APP的数据分析:如何用大数据优化运营?

随着新能源汽车的普及&#xff0c;充电桩作为基础设施的核心环节&#xff0c;其运营效率直接影响用户体验和行业可持续发展。充电桩APP积累了海量用户行为、充电记录、设备状态等数据&#xff0c;如何利用这些数据优化运营成为关键课题。大数据分析能够帮助运营商精准定位问题、…...

shell脚本之函数详细解释及运用

什么是函数 通俗地讲&#xff0c;所谓函数就是将一组功能相对独立的代码集中起来&#xff0c;形成一个代码块&#xff0c;这个代码可 以完成某个具体的功能。从上面的定义可以看出&#xff0c;Shell中的函数的概念与其他语言的函数的 概念并没有太大的区别。从本质上讲&#…...

校平机的原理、应用及发展趋势

一、校平机的定义与作用 校平机&#xff08;Leveling Machine&#xff09;是一种用于矫正金属板材、带材或卷材表面平整度的工业设备。其核心功能是通过机械作用消除材料内部残余应力&#xff0c;修正材料在加工、运输或存储过程中产生的弯曲、波浪形、翘曲等缺陷&#xff0c;…...

NFM算法解析:如何用神经网络增强因子分解机的特征交互能力?

在推荐系统和广告点击率预测等场景中&#xff0c;特征交叉&#xff08;Feature Interaction&#xff09;是提升模型效果的关键。传统的因子分解机&#xff08;FM&#xff09;通过二阶特征交互取得了显著效果&#xff0c;但其线性建模方式和有限阶数限制了模型的表达能力。今天&…...

Python人工智能算法 模拟退火算法:原理、实现与应用

模拟退火算法&#xff1a;从物理启发到全局优化的深度解析 一、算法起源与物理隐喻 模拟退火算法&#xff08;Simulated Annealing, SA&#xff09;起源于20世纪50年代的固体退火理论&#xff0c;其核心思想可追溯至Metropolis等人提出的蒙特卡罗模拟方法。1983年&#xff0c…...

服务器网络配置 netplan一个网口配置两个ip(双ip、辅助ip、别名IP别名)

文章目录 问答 问 # This is the network config written by subiquity network:ethernets:enp125s0f0:dhcp4: noaddresses: [192.168.90.180/24]gateway4: 192.168.90.1nameservers:addresses:- 172.0.0.207- 172.0.0.208enp125s0f1:dhcp4: trueenp125s0f2:dhcp4: trueenp125…...

FTP与NFS服务详解

一、FTP服务 &#xff08;一&#xff09;Linux下FTP客户端管理工具 1. ftp工具 安装命令&#xff1a;yum install ftp -y连接服务器&#xff1a;ftp 服务器IP&#xff0c;输入账号密码登录。常用命令&#xff1a; 命令说明ls查看远程目录文件put上传单个文件到远程服务器get…...

算法中的数学:欧拉函数

1.相关定义 互质&#xff1a;a与b的最大公约数为1 欧拉函数&#xff1a;在1~n中&#xff0c;与n互质的数的个数就是欧拉函数的值 eg&#xff1a; n1时&#xff0c;欧拉函数的值为1&#xff0c;因为1和1是互质的 n2是&#xff0c;值为2&#xff0c;因为1和2都是互质的 积性函数&…...

如果有三个服务实例部署在三台不同的服务器上,这三个服务实例的本地缓存,是存储一模一样的数据?还是各自只存一部分?

✅ 答案是&#xff1a;通常每个服务实例都会独立地缓存它自己访问过的数据&#xff0c;这些数据可能是相同的&#xff0c;也可能是不同的&#xff0c;取决于请求的内容。 &#x1f4cc; 举个例子说明 假设你有一个商品详情页的服务&#xff0c;部署了 3 个服务实例&#xff08…...

Coze工作流-选择器的用法

上集回顾 上集教程我们学习了什么是变量以及变量类型的用法。即什么时候用什么变量类型 教程简介 本教程将带大家学习工作流的选择和问答模块 工作流类型选择 在Coze中&#xff0c;工作流是智能体的核心逻辑单元。根据任务复杂度&#xff0c;可选择两种模式&#xff1a; 类…...

《AI工程技术栈》:三层结构解析,AI工程如何区别于ML工程与全栈工程

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗&#xff1f;订阅我们的简报&#xff0c;深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同&#xff0c;从行业内部的深度分析和实用指南中受益。不要错过这个机会&#xff0c;成为AI领…...

uni-app使用大集

1、手动修改页面标题 uni.setNavigationBarTitle({title: 修改标题 }); 2、单选 不止有 radio-group&#xff0c;还有 uni-data-checkbox 数据选择器 <!-- html部分 --> <uni-data-checkbox v-model"sex" :localdata"checkboxList"></u…...

链表day3

链表定义 struct ListNode{int val;ListNode *next; //next是一个指针变量&#xff0c;存储的是地址&#xff0c;是ListNode类型的地址ListNode(int x) : val(x),next(nullptr){} //也就是说ListNode必须接受一个int x&#xff0c;next指针默认为nullptr&#xff0c;值由外部指…...

C++23关联容器的异质擦除重载 (P2077R2)介绍

文章目录 一、基本概念二、原理重载机制类型转换 三、优势提高查找效率提升程序整体性能避免不必要的初始化确保系统实时性 四、应用场景高性能计算大型对象管理实时系统 五、代码示例六、相关图片材料结构与微观图像半导体研究图示与图表科学图表芯片与电路板 一、基本概念 在…...

Flink架构概览,Flink DataStream API 的使用,FlinkCDC的使用

一、Flink与其他组件的协同 Flink 是一个分布式、高性能、始终可用、准确一次&#xff08;Exactly-Once&#xff09;语义的流处理引擎&#xff0c;广泛应用于大数据实时处理场景中。它与 Hadoop 生态系统中的组件可以深度集成&#xff0c;形成完整的大数据处理链路。下面我们从…...

AI加速芯片全景图:主流架构和应用场景详解

目录 一、为什么AI芯片如此重要? 二、主流AI芯片架构盘点 三、不同芯片在训练与推理中的部署逻辑 四、真实应用案例解读 五、AI芯片发展趋势预测 AI芯片的选择,是AI系统能否高效运行的关键。今天笔者就从架构角度出发,带你系统了解主流AI加速芯片的种类、优劣对比及实际…...

Ubuntu22.04 系统安装Docker教程

1.更新系统软件包 #确保您的系统软件包是最新的。这有助于避免安装过程中可能遇到的问题 sudo apt update sudo apt upgrade -y 2.安装必要的依赖 sudo apt install apt-transport-https ca-certificates curl software-properties-common -y 3.替换软件源 原来/etc/apt/s…...

更新ubuntu软件源遇到GPG error

BUG背景 执行sudo apt update后遇到类似下列报错&#xff1a; E: The repository https://download.docker.com/linux/ubuntu bionic Release no longer has a Release file. N: Updating from such a repository cant be done securely, and is therefore disabled by defau…...

vue调后台接口

1.1 什么是 axios Axios 是一个基于 promise 的 HTTP 库&#xff0c;可以用来发送网络请求。它可以在浏览器和 node.js 中使用&#xff0c;本质上是对原生 XMLHttpRequest 的封装&#xff0c;符合最新的 ES 规范&#xff0c;支持 Promise API&#xff0c;能够拦截请求和响应&am…...

Ubuntu学习记录

冷知识补充 1.VMware官网安装后&#xff0c;会有两个软件&#xff0c;一个收费&#xff08;pro&#xff09;(功能更多&#xff0c;可以一次运行多个虚拟机)&#xff08;尽管2024年最新版本的也免费了&#xff09;一个免费(player)。 2.ubuntu打开终端快捷键&#xff1a;ctrlal…...

【音频】如何解析mp3文件

解析和播放MP3文件涉及两个主要步骤:解码(将MP3压缩数据转换为原始PCM音频)和播放(将PCM数据通过音频设备输出)。以下是不同平台和编程语言的实现方法: 一、MP3文件结构基础 MP3文件由多个**帧(Frame)**组成,每帧包含固定时长的音频数据(通常为26ms)。每个帧包含:…...

学习笔记:黑马程序员JavaWeb开发教程(2025.4.9)

12.16 异常处理 定义一个类&#xff0c;加上注解RestControllerAdvice&#xff0c;即定义了一个全局异常处理器 再方法上加上注解ExceptionHandler&#xff0c;通过注解当中的value属性来指定捕获那个类型的异常 完成Filter、interceptor、异常处理代码实操 Filter Filter里…...

【音频】wav文件如何解析编码格式(压缩格式)?

要确定一个WAV文件的编码格式&#xff0c;可以通过以下几种方法实现&#xff0c;包括使用操作系统自带工具、专业音频软件或编程解析文件头信息。以下是详细说明&#xff1a; 一、通过文件属性查看&#xff08;Windows/macOS&#xff09; 1. Windows系统 步骤&#xff1a; 右…...

【Django系统】Python+Django携程酒店评论情感分析系统

Python Django携程酒店评论情感分析系统 项目概述 这是一个基于 Django 框架开发的酒店评论情感分析系统。系统使用机器学习技术对酒店评论进行情感分析&#xff0c;帮助酒店管理者了解客户反馈&#xff0c;提升服务质量。 主要功能 评论数据导入&#xff1a;支持导入酒店…...

OpenCv高阶(十六)——Fisherface人脸识别

文章目录 前言一、Fisherface人脸识别原理1. 核心思想&#xff1a;LDA与Fisher准则2. 实现步骤(1) 数据预处理(2) 计算类内散布矩阵 SW对每个类别&#xff08;每个人&#xff09;计算均值向量 μi&#xff1a;(3) 计算类间散布矩阵 SB(4) 求解投影矩阵 W(5) 降维与分类 3. Fish…...

数据库与Redis数据一致性解决方案

在写数据时保证 Redis 和数据库数据一致,可采用以下方案,需根据业务场景权衡选择: 1. 先更新数据库,再更新 Redis 步骤: 写入 / 更新数据库数据。删除或更新 Redis 缓存。适用场景:读多写少,对缓存一致性要求不高(短暂不一致可接受)。风险:若第二步失败,导致缓存与…...

Python面试题

Python面试题 Python面试题回答1. Python面向对象的三个特征&#xff1f;多态如何实现和使用2. is 和 的区别&#xff1f;3. GIL了解吗&#xff1f;说说4. 可变类型和不可变类型&#xff1f;5. yield用法&#xff1f;6. 深拷贝和浅拷贝区别&#xff1f;7. Python中的线程8. 生…...