人工智能--图像语义分割

2a20c54b85e042bfa2440367ae4807e9.gif

个人主页:欢迎来到 Papicatch的博客

课设专栏 :学生成绩管理系统

 专业知识专栏:专业知识

文章目录

🍉引言

🍉介绍

🍈工作原理

🍍数据准备

🍍特征提取

🍍像素分类

🍍模型训练

🍍模型评估与优化

🍈关键技术

🍍特征提取

🍍上采样和下采样

🍍注意力机制

🍍多尺度融合

🍍损失函数

🍉分割方法

🍈基于阈值的分割方法

🍍基本原理

🍍阈值的选择

🍍优点

🍍缺点

🍍应用场景

🍍改进方法

🍈基于边缘检测的分割方法

🍍基本原理

🍍常见的边缘检测算子

🍍优点

🍍缺点

🍍应用场景

🍍改进和扩展

🍈基于区域的分割方法

🍍基本原理

🍍常见的基于区域的分割方法

🍍相似性准则

🍍优点

🍍缺点

🍍应用场景

🍍改进和发展

🍈基于聚类的分割方法

🍍优点

🍍缺点

🍍应用场景

🍈基于图的分割方法

🍍优点

🍍缺点

🍍应用场景

🍈基于深度学习的分割方法

🍍优点

🍍缺点

🍍应用场景

🍉示例

 🍈以下是一个使用 Python 和 TensorFlow 实现简单的全卷积网络(FCN)进行自然图像分割的示例。

🍈以下是一个使用 Python 和 TensorFlow 实现简单的 U-Net 模型进行医学图像分割的示例

🍉总结


2a20c54b85e042bfa2440367ae4807e9.gif

🍉引言

        图像语义分割是计算机视觉领域中的一项重要任务,它旨在将图像中的每个像素分配一个特定的类别标签,从而实现对图像内容的精细理解和划分。

        在人工智能的背景下,图像语义分割技术取得了显著的进展。它的应用范围广泛,包括自动驾驶、医学图像分析、卫星图像解译、虚拟现实和增强现实等领域。

🍉介绍

🍈工作原理

        图像语义分割的工作过程主要包含以下几个关键步骤:

🍍数据准备

        首先,需要收集大量的图像数据,并对这些图像中的每个像素进行类别标注。标注的类别可以是物体类别,如人、车、建筑物等,也可以是场景类别,如室内、室外、森林等。 

🍍特征提取

        使用深度卷积神经网络(CNN)来自动提取图像的特征。CNN 由多个卷积层和池化层组成。卷积层通过卷积操作来捕捉图像中的局部模式和特征,池化层则用于降低特征图的分辨率,减少计算量并提取主要特征。在这个过程中,图像从原始的像素空间被转换为抽象的特征空间。 

🍍编码 - 解码结构
许多图像语义分割模型采用编码 - 解码的结构。编码部分(通常是一系列卷积和池化层)逐渐降低图像的分辨率,提取高级语义特征。解码部分(通常包含上采样和反卷积操作)则逐步恢复图像的分辨率,将抽象的语义特征映射回像素空间,以实现像素级的分类预测。

🍍像素分类

        在特征提取和映射的基础上,对每个像素进行分类。通过在网络的最后一层使用 softmax 函数或其他分类器,为每个像素计算属于不同类别的概率。最终,根据概率分布为每个像素分配一个确定的类别标签。 

🍍模型训练

        使用准备好的带有标注的图像数据对模型进行训练。通过不断调整网络的参数,使得模型的预测结果与真实的标注尽可能接近。训练过程中,使用损失函数来衡量预测结果与真实标签之间的差异,常见的损失函数如交叉熵损失、Dice 损失等。通过反向传播算法来更新网络参数,优化模型性能。 

🍍模型评估与优化

        使用验证集或测试集对训练好的模型进行评估,常见的评估指标包括像素准确率、平均交并比(mIoU)等。根据评估结果,对模型进行进一步的优化,例如调整网络结构、超参数,或者使用更先进的技术如注意力机制、多尺度融合等。

        例如,对于一张包含汽车和道路的图像,模型会先提取图像中关于汽车和道路的特征,然后对每个像素判断其是属于汽车还是道路的类别,最终实现将汽车和道路在像素级别上进行准确的分割。

        再比如,在医学图像中,对肿瘤的分割,模型会学习肿瘤的特征,然后为图像中的每个像素判断其是否属于肿瘤区域,从而辅助医生进行诊断和治疗规划。

🍈关键技术

🍍特征提取

  • 特征提取是图像语义分割的基础。常用的特征提取方法基于卷积神经网络(CNN)。
  • 卷积层能够自动学习图像中的局部特征,通过不同大小的卷积核来捕捉不同尺度的信息。例如,较小的卷积核可以提取细节特征,如边缘和纹理;较大的卷积核则能获取更宏观的特征,如物体的形状。
  • 池化层用于降低特征图的分辨率,减少计算量并实现一定的平移不变性。但过度的池化可能会导致信息丢失,因此一些先进的方法采用了空洞卷积来在不降低分辨率的情况下扩大感受野。

🍍上采样和下采样

  • 下采样通过卷积和池化操作降低图像的分辨率,提取抽象的语义信息,但会丢失空间细节。
  • 上采样则相反,用于恢复图像的分辨率,将低分辨率的特征图映射回原始图像大小。常见的上采样方法包括双线性插值、反卷积等。
  • 例如,在卫星图像分割中,下采样用于获取大范围的地理特征,而上采样则能精确描绘小区域的细节。

🍍注意力机制

  • 注意力机制使模型能够聚焦于图像中的重要区域,从而提高分割的准确性。
  • 空间注意力机制可以根据像素之间的空间关系来分配权重,突出重要的空间位置。
  • 通道注意力机制则关注不同特征通道的重要性,为更有价值的通道赋予更高的权重。
  • 比如在场景复杂的图像中,注意力机制能够让模型优先关注主要物体,而不是被背景干扰。

🍍多尺度融合

  • 由于图像中的物体大小不一,单一尺度的特征可能无法很好地进行分割。
  • 多尺度融合方法将不同层次和尺度的特征进行组合。
  • 例如,通过金字塔池化模块获取不同尺度的特征图,并进行融合,从而能够同时分割大物体和小物体。

🍍损失函数

  • 损失函数用于衡量模型预测结果与真实标签之间的差异,引导模型的训练。
  • 常见的损失函数有交叉熵损失、Dice 损失等。
  • 交叉熵损失常用于二分类和多分类问题,但对于类别不平衡的图像分割任务,Dice 损失可能更有效,它更关注前景区域的分割准确性。
  • 例如,在医学图像中,病变区域通常较小,使用 Dice 损失可以更好地优化分割模型。

🍉分割方法

🍈基于阈值的分割方法

        基于阈值的分割方法是一种简单而直接的图像分割技术,其核心思想是通过设定一个或多个阈值,将图像中的像素分为不同的类别或区域。

🍍基本原理

        该方法基于像素的灰度值、颜色值或其他特征值与设定阈值的比较来进行分类。如果像素的值大于阈值,则将其分配到一个类别;如果小于阈值,则分配到另一个类别。当使用多个阈值时,可以实现更复杂的多类别分割。

🍍阈值的选择

        全局阈值:为整个图像设定一个固定的阈值。选择全局阈值的方法包括手动选择、基于图像的灰度直方图分析(如选择直方图双峰之间的谷底作为阈值)等。

  • 例如,对于具有明显双峰灰度直方图的图像,可直观地确定阈值。

        局部阈值:根据像素的局部邻域信息来确定每个像素的阈值。这对于光照不均匀或对比度变化较大的图像更有效。

  • 比如在一张部分区域明亮、部分区域昏暗的图像中,局部阈值能更好地适应不同区域的特征。

🍍优点

  • 计算简单,效率高,尤其对于简单的图像能快速实现分割。
  • 不需要复杂的先验知识和模型训练。

🍍缺点

  • 对噪声较为敏感,噪声可能导致像素值的异常,从而影响阈值的选择和分割结果。
  • 对于复杂的图像,可能难以找到一个合适的全局阈值,导致分割不准确。

🍍应用场景

  • 目标和背景灰度差异明显的图像,如文档图像中的文字和背景分离。
  • 简单的工业检测图像,例如检测产品表面的缺陷。

🍍改进方法

        为了克服基于阈值分割方法的一些局限性,发展出了一些改进的方法,如自适应阈值法、多阈值结合形态学操作等。

🍈基于边缘检测的分割方法

     基于边缘检测的分割方法旨在通过识别图像中像素值的显著变化来确定物体的边界,从而实现图像分割。

🍍基本原理

     图像中的边缘通常对应着物体的轮廓、纹理的变化或者不同区域的交界。边缘检测算法通过计算像素及其邻域像素之间的差异来确定边缘的位置。这种差异可以通过梯度、导数等数学运算来衡量。

🍍常见的边缘检测算子

  • Sobel 算子:对水平和垂直方向分别进行卷积运算,得到相应方向的边缘强度。
  • Prewitt 算子:与 Sobel 算子类似,用于检测边缘。
  • Roberts 算子:计算对角方向上的梯度。
  • Canny 算子:被认为是一种较为优秀的边缘检测算法,具有较好的信噪比和定位精度。它包括高斯滤波平滑图像、计算梯度幅值和方向、非极大值抑制以及双阈值检测和边缘连接等步骤。

🍍优点

  • 能够有效地捕捉物体的轮廓信息,为图像分割提供重要的线索。
  • 计算相对简单,效率较高。

🍍缺点

  • 对噪声敏感,噪声可能会导致虚假边缘的出现。
  • 检测到的边缘可能不连续,需要后续的处理来连接边缘。
  • 只能检测到灰度值的变化,对于颜色或纹理复杂的区域可能效果不佳。

🍍应用场景

  1. 工业检测中对物体外形的提取。
  2. 医学图像中器官边界的确定。

🍍改进和扩展

        为了改善边缘检测的效果,常常会采取以下措施:

  1. 先对图像进行平滑去噪处理,再进行边缘检测。
  2. 结合其他分割方法,如区域生长,以利用边缘信息和区域信息来提高分割的准确性。

🍈基于区域的分割方法

        基于区域的分割方法是一种通过将具有相似特征的像素组合成区域来实现图像分割的技术。

🍍基本原理

        从初始的像素或小区域开始,根据预先定义的相似性准则,逐步合并或分裂这些区域,直到满足特定的终止条件。相似性可以基于像素的灰度值、颜色、纹理、形状等特征来衡量。

🍍常见的基于区域的分割方法

        区域生长法:选择一个或多个种子点作为起始,然后将邻域中与种子点具有相似特征的像素合并到当前区域,不断重复这个过程,直到没有可合并的像素为止。

  • 例如,在一张肺部 CT 图像中,选择一个位于肺部组织内的像素作为种子点,基于灰度值相似性逐渐生长出整个肺部区域。

        区域分裂合并法:首先将图像视为一个整体区域,然后根据某种不相似性准则将其分裂为较小的子区域,接着对相邻的子区域进行合并,直到满足终止条件。

  • 比如对于一幅包含多个物体的图像,先将其大致分裂为几个区域,再根据区域之间的相似性判断是否合并。

🍍相似性准则

  1. 灰度值:比较像素之间的灰度差异。
  2. 颜色:基于颜色空间(如 RGB、HSV 等)的距离。
  3. 纹理:分析像素的纹理特征,如粗糙度、方向性等。

🍍优点

  • 对噪声的敏感度相对较低,能够得到较为完整和连续的区域。
  • 通常能够产生有意义的区域,符合人类对图像的直观理解。

🍍缺点

  • 计算复杂度较高,特别是对于大规模图像和复杂的相似性准则。
  • 初始种子点的选择或区域的初始划分对最终结果有较大影响。
  • 相似性准则的定义和选择可能具有一定的主观性。

🍍应用场景

  1. 卫星图像中不同地理区域的划分。
  2. 医学图像中对病变组织的提取。

🍍改进和发展

        为了提高基于区域分割方法的性能,出现了一些改进措施,如结合多尺度分析、使用自适应的相似性准则、引入先验知识等。

🍈基于聚类的分割方法

        基于聚类的分割方法将图像中的像素看作数据点,根据它们之间的相似性将像素分组为不同的簇,每个簇对应一个分割区域。

        常见的聚类算法包括 K-Means 、层次聚类等。

🍍以 K-Means 为例,其工作步骤如下:

  1. 随机选择 K 个像素作为初始聚类中心。
  2. 计算每个像素到 K 个中心的距离,将像素分配到距离最近的中心所属的簇。
  3. 重新计算每个簇的中心。
  4. 重复步骤 2 和 3 ,直到聚类中心不再变化或达到设定的迭代次数。

🍍优点

  • 能够自动确定分割的类别数量。
  • 对于数据分布有一定的适应性。

🍍缺点

  • 对初始聚类中心敏感,不同的初始选择可能导致不同的结果。
  • 难以处理复杂的形状和空间关系。

🍍应用场景

  • 例如对自然场景图像中的不同颜色区域进行分割。

🍈基于图的分割方法

        基于图的分割方法将图像构建为一个图,其中像素是节点,像素之间的关系是边,边的权重表示像素之间的相似性。

        常见的算法如 Graph Cut (图割)。

        其基本思想是将图像分割问题转化为一个能量最小化问题。通过定义一个能量函数,包括区域项和边界项,区域项鼓励像素在区域内具有相似性,边界项鼓励边界在低能量处切割。

🍍优点

  • 能够处理复杂的结构和全局关系。
  • 可以结合先验知识和约束条件。

🍍缺点

  • 计算复杂度高,尤其是对于大规模图像。
  • 参数设置较为复杂。

🍍应用场景

        在医学图像分割中,处理具有复杂结构的器官。

🍈基于深度学习的分割方法

        基于深度学习的分割方法利用深度卷积神经网络(CNN)自动学习图像的特征,并进行像素级的分类预测。

        常见的模型如 FCN (全卷积网络)、U-Net 等。

        这些模型通过大量的有标注数据进行训练,学习到不同类别像素的特征模式。

🍍优点

  • 分割精度高,能够处理复杂的场景和多类别分割任务。
  • 具有强大的泛化能力,可以应用于各种类型的图像。

🍍缺点

  • 需要大量的标注数据和强大的计算资源进行训练。
  • 模型解释性较差。

🍍应用场景

        自动驾驶中的道路和车辆分割、医学图像中的肿瘤和器官分割等。

🍉示例

 🍈以下是一个使用 Python 和 TensorFlow 实现简单的全卷积网络(FCN)进行自然图像分割的示例。

import tensorflow as tf
from tensorflow.keras.models import Model
from tensorflow.keras.layers import Input, Conv2D, MaxPooling2D, UpSampling2D, concatenate

def fcn_model(input_shape=(224, 224, 3), num_classes=2):
    # 输入层
    inputs = Input(shape=input_shape)

    # 编码器:卷积和池化层
    conv1 = Conv2D(64, (3, 3), activation='relu', padding='same')(inputs)
    conv1 = Conv2D(64, (3, 3), activation='relu', padding='same')(conv1)
    pool1 = MaxPooling2D((2, 2), strides=(2, 2))(conv1)

    conv2 = Conv2D(128, (3, 3), activation='relu', padding='same')(pool1)
    conv2 = Conv2D(128, (3, 3), activation='relu', padding='same')(conv2)
    pool2 = MaxPooling2D((2, 2), strides=(2, 2))(conv2)

    conv3 = Conv2D(256, (3, 3), activation='relu', padding='same')(pool2)
    conv3 = Conv2D(256, (3, 3), activation='relu', padding='same')(conv3)
    conv3 = Conv2D(256, (3, 3), activation='relu', padding='same')(conv3)
    pool3 = MaxPooling2D((2, 2), strides=(2, 2))(conv3)

    conv4 = Conv2D(512, (3, 3), activation='relu', padding='same')(pool3)
    conv4 = Conv2D(512, (3, 3), activation='relu', padding='same')(conv4)
    conv4 = Conv2D(512, (3, 3), activation='relu', padding='same')(conv4)
    pool4 = MaxPooling2D((2, 2), strides=(2, 2))(conv4)

    conv5 = Conv2D(512, (3, 3), activation='relu', padding='same')(pool4)
    conv5 = Conv2D(512, (3, 3), activation='relu', padding='same')(conv5)
    conv5 = Conv2D(512, (3, 3), activation='relu', padding='same')(conv5)

    # 解码器:上采样和特征融合
    up6 = concatenate([UpSampling2D((2, 2))(conv5), conv4], axis=-1)
    conv6 = Conv2D(256, (3, 3), activation='relu', padding='same')(up6)
    conv6 = Conv2D(256, (3, 3), activation='relu', padding='same')(conv6)

    up7 = concatenate([UpSampling2D((2, 2))(conv6), conv3], axis=-1)
    conv7 = Conv2D(128, (3, 3), activation='relu', padding='same')(up7)
    conv7 = Conv2D(128, (3, 3), activation='relu', padding='same')(conv7)

    up8 = concatenate([UpSampling2D((2, 2))(conv7), conv2], axis=-1)
    conv8 = Conv2D(64, (3, 3), activation='relu', padding='same')(up8)
    conv8 = Conv2D(64, (3, 3), activation='relu', padding='same')(conv8)

    # 输出层
    outputs = Conv2D(num_classes, (1, 1), activation='softmax')(conv8)

    model = Model(inputs=inputs, outputs=outputs)
    return model

# 示例用法
model = fcn_model()
model.summary()

以下是对关键部分的解析:

  • 编码器部分:通过一系列的卷积和池化层逐渐降低特征图的分辨率,提取图像的高级特征。
    • Conv2D 层用于进行卷积操作,提取特征。
    • MaxPooling2D 层用于降低特征图的大小,减少计算量。
  • 解码器部分:通过上采样和特征融合来恢复图像的分辨率,并进行像素级的分类预测。
    • UpSampling2D 层用于对特征图进行上采样。
    • concatenate 用于融合不同层次的特征。
  • 输出层:使用 Conv2D 层和 softmax 激活函数进行像素级的分类,得到每个像素属于不同类别的概率。

🍈以下是一个使用 Python 和 TensorFlow 实现简单的 U-Net 模型进行医学图像分割的示例

import tensorflow as tf
from tensorflow.keras.models import Model
from tensorflow.keras.layers import Input, Conv2D, MaxPooling2D, UpSampling2D, concatenate

def unet_model(input_shape=(256, 256, 1), num_classes=2):
    # 输入层
    inputs = Input(shape=input_shape)

    # 收缩路径(编码器)
    conv1 = Conv2D(64, (3, 3), activation='relu', padding='same')(inputs)
    conv1 = Conv2D(64, (3, 3), activation='relu', padding='same')(conv1)
    pool1 = MaxPooling2D((2, 2))(conv1)

    conv2 = Conv2D(128, (3, 3), activation='relu', padding='same')(pool1)
    conv2 = Conv2D(128, (3, 3), activation='relu', padding='same')(conv2)
    pool2 = MaxPooling2D((2, 2))(conv2)

    conv3 = Conv2D(256, (3, 3), activation='relu', padding='same')(pool2)
    conv3 = Conv2D(256, (3, 3), activation='relu', padding='same')(conv3)
    pool3 = MaxPooling2D((2, 2))(conv3)

    conv4 = Conv2D(512, (3, 3), activation='relu', padding='same')(pool3)
    conv4 = Conv2D(512, (3, 3), activation='relu', padding='same')(conv4)
    drop4 = tf.keras.layers.Dropout(0.5)(conv4)  # 添加 dropout 防止过拟合
    pool4 = MaxPooling2D((2, 2))(drop4)

    conv5 = Conv2D(1024, (3, 3), activation='relu', padding='same')(pool4)
    conv5 = Conv2D(1024, (3, 3), activation='relu', padding='same')(conv5)
    drop5 = tf.keras.layers.Dropout(0.5)(conv5)  # 添加 dropout 防止过拟合

    # 扩展路径(解码器)
    up6 = concatenate([UpSampling2D((2, 2))(drop5), conv4], axis=3)
    conv6 = Conv2D(512, (3, 3), activation='relu', padding='same')(up6)
    conv6 = Conv2D(512, (3, 3), activation='relu', padding='same')(conv6)

    up7 = concatenate([UpSampling2D((2, 2))(conv6), conv3], axis=3)
    conv7 = Conv2D(256, (3, 3), activation='relu', padding='same')(up7)
    conv7 = Conv2D(256, (3, 3), activation='relu', padding='same')(conv7)

    up8 = concatenate([UpSampling2D((2, 2))(conv7), conv2], axis=3)
    conv8 = Conv2D(128, (3, 3), activation='relu', padding='same')(up8)
    conv8 = Conv2D(128, (3, 3), activation='relu', padding='same')(conv8)

    up9 = concatenate([UpSampling2D((2, 2))(conv8), conv1], axis=3)
    conv9 = Conv2D(64, (3, 3), activation='relu', padding='same')(up9)
    conv9 = Conv2D(64, (3, 3), activation='relu', padding='same')(conv9)

    # 输出层
    outputs = Conv2D(num_classes, (1, 1), activation='softmax')(conv9)

    model = Model(inputs=inputs, outputs=outputs)
    return model

# 示例用法
model = unet_model()
model.summary()

以下是对关键部分的分析:

  • 收缩路径(编码器)
    • 通过一系列的卷积和最大池化操作逐渐降低特征图的分辨率,提取图像的高层抽象特征。每经过一次卷积操作,特征通道数增加,以获取更丰富的特征表示。
    • Dropout 层用于随机地将神经元的输出设置为 0,以防止模型过拟合。
  • 扩展路径(解码器)
    • 通过上采样操作逐渐恢复特征图的分辨率,并与来自收缩路径的对应特征图进行拼接(concatenate),融合高层和低层的特征信息。
    • 随后经过卷积操作进一步处理特征,以得到更准确的分割预测。
  • 输出层
    • 最终使用一个 Conv2D 层和 softmax 激活函数进行像素级的分类,输出每个像素属于不同类别的概率。

🍉总结

        图像语义分割是计算机视觉领域中的关键任务,旨在为图像中的每个像素赋予特定的类别标签,以实现对图像内容的精细理解和划分。

        其具有广泛的应用,涵盖了自动驾驶、医学图像分析、卫星图像解译等众多领域。在技术层面,它融合了多种方法和技术,如基于阈值、边缘检测、区域、聚类、图以及深度学习的分割方法。

        基于阈值的方法简单直接,但对复杂图像效果有限;边缘检测能捕捉物体轮廓,但易受噪声影响且可能存在边缘不连续;区域方法对噪声敏感度低,但计算复杂且受初始条件影响;聚类方法自动确定类别数量,但对初始选择敏感;图方法处理复杂结构出色,但计算和参数设置复杂;深度学习方法,尤其是如 FCN、U-Net 等模型,分割精度高、泛化能力强,但依赖大量标注数据和强大计算资源。

        未来,图像语义分割有望在技术创新、性能提升、多模态数据融合以及更广泛的应用场景拓展等方面取得进一步的发展,为解决各种实际问题提供更强大的支持。

2a20c54b85e042bfa2440367ae4807e9.gif

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/768726.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

实习总结 --- 其他业务

一. 回归测试:回归测试与测新是对应的,当需求准入交付测试的时候首先要进行的就是测新,也就是对新功能对测试,一般是在sim环境下测试的;当测新通过后才会进行回归测试,回归测试的目的是为了保证老功能的正确…

人工智能 (AI) 基本概念 入门篇【C#】版

1. 什么是人工智能? 人工智能(Artificial Intelligence, AI)是指计算机系统能够执行通常需要人类智能的任务,如视觉识别、语音识别、决策和语言翻译等。AI的核心是通过算法和数据进行学习和推理,以实现智能行为。 2.…

2.3.2 主程序和外部IO交互 (文件映射方式)----IO Client实现

2.3.2 主程序和外部IO交互 (文件映射方式)----IO Client C实现 和IOServer主要差别: 1 使用Open_Client 连接 2 一定要先打开IOServer,再打开IO_Client 效果显示 1 C 代码实现 1.1 shareddataClient.h 头文件中引用 和sharedd…

PTA-线性表实验(JAVA)

题目1:Josephus环的问题及算法 【实验内容】 编程实现如下功能: 题意说明:古代某法官要判决n个犯人的死刑,他有一条荒唐的法律,将犯人站成一个圆圈,从第start个犯人开始数起,每数到第distance的…

Redis基础教程(一):redis配置

💝💝💝首先,欢迎各位来到我的博客,很高兴能够在这里和您见面!希望您在这里不仅可以有所收获,同时也能感受到一份轻松欢乐的氛围,祝你生活愉快! 💝&#x1f49…

信息安全体系架构设计

对信息系统的安全需求是任何单一安全技术都无法解决的,要设计一个信息安全体系架构,应当选择合适的安全体系结构模型。信息系统安全设计重点考虑两个方面;其一是系统安全保障体系;其二是信息安全体系架构。 1.系统安全保障体系 安…

Go语言特点、编译及命令

本文主要分为三部分内容分别为:Go语言的特点介绍;编译windows、linux环境文件及Go命令。 目录 Go语言特点 编译文件 编译window文件 编译linux文件 Go命令(build/run/install/env) 编译文件 直接运行程序 安装程序 配置G…

【分布式数据仓库Hive】常见问题及解决办法

目录 一、启动hive时发现log4j版本和hadoop的版本有冲突 解决办法:删除hive下高版本的slf4j 二、启动hive报错 Exception in thread "main" java.lang.NoSuchMethodError:com.google.common.base.Preconditions.checkArgument(ZLjava/lang/Object;)V …

个人博客|PHP源码|支持多国语言切换

一. 前言 今天小编给大家带来了一款可学习,可商用的,支持多国语言的个人博客网站源码,支持二开,无加密。此博客相当简洁,也适合海外。详细界面和功能见下面视频演示。 如果您正好有此需求源码,请联系小编…

Zabbix 配置钉钉告警

Zabbix 配置钉钉告警 随着企业IT运维需求的不断增加,及时、准确地获取系统告警信息显得尤为重要。在众多告警工具中,Zabbix 因其强大的监控功能和灵活的告警机制,成为了很多企业的首选。同时,随着企业内部沟通工具的多样化&#…

苹果AI的国产大模型之争,没有悬念

文 | 智能相对论 作者 | 陈泊丞 苹果终于公布了最新的AI进程。 一个月前,正如此前预期的那样,人工智能是今年 WWDC 发布会的焦点。全程105分钟的主题演讲,就有40多分钟用于介绍苹果的AI成果。 苹果似乎还有意玩了一把“谐音梗”&#xff…

海外虚拟卡开卡平台有哪些?无限开卡,无其他限制

随着时代的发展很多小伙伴都需要海外虚拟卡,海外虚拟卡开卡平台我这里用的是Fomepay的,他们比较人性化,有客服,随时可咨询 对于消费者而言,虚拟卡号提供了隐私,因此广告商更难以跟踪和定位购买行为&#x…

深入浅出:进程管理的艺术

目录 进程的定义 进程的特征 进程的状态 进程与程序的区别 进程的控制和管理 进程的特点 1. 虚拟内存空间的分配 2. 时间片轮转调度 图解: 进程段 数据段(Data Segment) 正文段(Text Segment) 堆栈段&…

Redis持久化详解

【关闭文件、AOF 刷盘、释放内存这三个任务都有各自的任务队列】所以不是单线程 Redis有两种持久化方案: RDB持久化 AOF持久化 基于Redis集群解决单机Redis存在的问题 【Redis是单进程的】 【也有人做分布式section】 【主从集群中多个从就是做负载均衡的】 …

一维信号全变分(TV)降噪方法(MATLAB)

信号降噪一直是领域研究的热点,这是一项十分有意义并且极具挑战性的工作,经过几十年来相关科研人员的共同努力,降噪技术得到了极大的发展,并在现实生活中也得到了广泛的应用。其中,许多常用的方法有:小波变…

vector模拟实现【C++】

文章目录 全部的实现代码放在了文章末尾准备工作包含头文件定义命名空间和类类的成员变量 迭代器迭代器获取函数 构造函数默认构造使用n个值构造迭代器区间构造解决迭代器区间构造和用n个值构造的冲突拷贝构造 析构函数swap【交换函数】赋值运算符重载emptysize和capacityopera…

上位机网络通讯

目录 一 设计原型 二 后台源码 一 设计原型 二 后台源码 using System; using System.Net.Sockets; using System.Text; using System.Threading.Tasks; using System.Windows.Forms;namespace 上位机网络通讯 {public partial class Form1 : Form{public Form1(){Initializ…

BUG TypeError: GPT2Model.forward() got an unexpected keyword argument ‘past’

TypeError: GPT2Model.forward() got an unexpected keyword argument past’ 环境 transformers 4.38.1详情 这是由于新版的transformers 对GPT2Model.forward() 参数进行了改变导致的错误。具体是past名称改为了 past_key_values 。 解决方法 找到错误语…

黑马点评-Redis的缓存击穿,缓存雪崩,缓存穿透,互斥锁,逻辑过期

文章目录 1.缓存穿透2.缓存雪崩3.缓存击穿3.1 互斥锁3.2 基于逻辑过期 1.缓存穿透 解决办法 写入NULL值到Redis缓存,以后就会命中Redis的控制缓存而不会出现请求直接打到数据库的问题! 代码 2.缓存雪崩 这个概念很好理解,雪崩就是无数的…

开发者聊科学作息时间表

非常有幸对科学作息时间表app的开发者做一次采访。 问:你对科学作息时间表app满意么? 答:非常不满意,我们的设想是让他更智能,更多的提醒方式,更好的交互体验。如果作为一个闹钟他是非常不合格的&#xff0…