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

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

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, concatenatedef 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, concatenatedef 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

相关文章:

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

个人主页:欢迎来到 Papicatch的博客 课设专栏 :学生成绩管理系统 专业知识专栏:专业知识 ​ 文章目录 🍉引言 🍉介绍 🍈工作原理 🍍数据准备 🍍特征提取 🍍像素分…...

fl studio20和21用哪一个好?FL-Chan from FL Studio欣赏

最近接到很多小伙伴的私信,都在问我平时会使用哪些音乐软件,能不能给一些参考。其实每个人的使用习惯不一样,需求也不一样。以DAW为例,有些人就是喜欢FL Studio,有些人吹爆Studio One,还有些人习惯使用Cuba…...

OpenCV直方图计算函数calcHist的使用

操作系统:ubuntu22.04OpenCV版本:OpenCV4.9IDE:Visual Studio Code编程语言:C11 功能描述 图像的直方图是一种统计表示方法,用于展示图像中不同像素强度(通常是灰度值或色彩强度)出现的频率分布。具体来说…...

09 docker 安装tomcat 详解

目录 一、安装tomcat 1. tomcat镜像的获取 2. docker创建容器实列 3. 访问测试 404错误 4. 解决方案 5. 使用免修改版容器镜像 5.1. 运行实列的创建 5.2. 出现问题及解决: 6. 验证 OK 一、安装tomcat 1. tomcat镜像的获取 docker search tomcat #docker …...

44.实现管理HOOK点的链表对象

上一个内容:43.实现HOOK接管寄存器数据 以 43.实现HOOK接管寄存器数据 它的代码为基础进行修改 首先创建一个类 这里创建的名为HOOKPOINT.h HOOKPOINT.cpp文件里面的内容 #include "pch.h" #include "HOOKPOINT.h"HOOKPOINT::HOOKPOINT() {…...

Unity小知识

1.当我们把摄像机的内容渲染到RenderTexture上而不是屏幕上时,那么相机的Aspect默认会设置成和RenderTexture的分辨率一样.不过最终如果把RenderTexture作为贴图贴到模型上去的时候还是会被UV拉伸和缩小的。 2.要想自定义UnityPackage的内容,只要找到UnityProject/L…...

【Jupyter Notebook与Git完美融合】在Notebook中驾驭版本控制的艺术

标题:【Jupyter Notebook与Git完美融合】在Notebook中驾驭版本控制的艺术 Jupyter Notebook是一个流行的开源Web应用程序,允许用户创建和共享包含实时代码、方程、可视化和解释性文本的文档。而Git是一个广泛使用的分布式版本控制系统,用于跟…...

Python开发者必看:内存优化的实战技巧

更多Python学习内容:ipengtao.com Python是一种高级编程语言,以其易读性和强大的功能而广受欢迎。然而,由于其动态类型和自动内存管理,Python在处理大量数据或高性能计算时,内存使用效率可能不如一些低级语言。本文将介…...

Golang | Leetcode Golang题解之第214题最短回文串

题目&#xff1a; 题解&#xff1a; func shortestPalindrome(s string) string {n : len(s)fail : make([]int, n)for i : 0; i < n; i {fail[i] -1}for i : 1; i < n; i {j : fail[i - 1]for j ! -1 && s[j 1] ! s[i] {j fail[j]}if s[j 1] s[i] {fail[i…...

【ajax实战08】分页功能

本文章目标&#xff1a;点击上/下一页按钮&#xff0c;实现对应页面的变化 实现基本步骤&#xff1a; 一&#xff1a;保存并设置文章总条数 设置一个全局变量&#xff0c;将服务器返回的数据返回给全局变量 二&#xff1a;点击下一页&#xff0c;做临界值判断&#xff0c;并…...

基于Hadoop平台的电信客服数据的处理与分析②项目分析与设计---需求分析-项目场景引入

任务描述 需求分析是软件生命周期中一个非常重要的过程&#xff0c;它决定着整个软件项目的质量&#xff0c;也是整个软件开发的成败所在。本环节任务是完成软件需求规格说明书。 知识点 &#xff1a;软件需求规格说明书的编写 重 点 &#xff1a;软件需求规格说明书内容的…...

debug-mmlab

mmyolo bug1: MMYOLO for yolov5 instance segmentation on balloon dataset getting this error "ValueError: Key img_path is not in available keys. solution: pip install albumentations1.3.1 reference...

年轻人为什么那么爱喝奶茶?

作者 | 艾泊宇 为什么年轻人那么爱喝奶茶&#xff1f;答案很简单&#xff1a;对他们来说&#xff0c;奶茶之于年轻人&#xff0c;正如白酒之于中年人。 奶茶不仅仅是一种饮料&#xff0c;它已经演化成一种文化现象&#xff0c;代表着温暖和爱的象征&#xff0c;甚至在某种程度上…...

手写数组去重

方法1-判断相邻元素 function _deleteRepeat(arr){if(!Array.isArray(arr)){throw new Error(参数必须是数组)}let res[];// 使用slice创建arr的副本&#xff0c;并排序let sortArrarr.slice().sort((a,b)>a-b);for(let i0;i<sortArr.length;i){if(isortArr.length-1||s…...

Firewalld 防火墙

1. 概述 在 RHEL7 系统中&#xff0c;firewalld 防火墙取代了传统的 iptables 防火墙。iptables 的防火墙策略是通过内核层面的 netfilter 网络过滤器来处理的&#xff0c;而 firewalld 则是通过内核层面的 nftables 包过滤框架来处理。firewalld 提供了更为丰富的功能和动态更…...

Hive查询优化 - 面试工作不走弯路

引言&#xff1a;Hive作为一种基于Hadoop的数据仓库工具&#xff0c;广泛应用于大数据分析。然而&#xff0c;由于其依赖于MapReduce框架&#xff0c;查询的性能可能会受到影响。为了确保Hive查询能够高效运行&#xff0c;掌握查询优化技巧至关重要。在日常工作中&#xff0c;高…...

【VUE3】uniapp + vite中 uni.scss 使用 /deep/ 不生效(踩坑记录三)

vite 中使用 /deep/ 进行样式穿透报错 原因&#xff1a;vite 中不支持&#xff0c;换成 ::v-deep 或:deep即可...

容器部署rabbitmq集群迁移

1、场景&#xff1a; 因业务需要&#xff0c;要求把rabbitmq-A集群上的数据迁移到rabbitmq-B集群上&#xff0c;rabbitmq的数据包括元数据&#xff08;RabbitMQ用户、vhost、队列、交换和绑定&#xff09;和消息数据&#xff0c;而消息数据存储在单独的消息存储库中。 2、迁移要…...

DP:背包问题----0/1背包问题

文章目录 &#x1f497;背包问题&#x1f49b;背包问题的变体&#x1f9e1;0/1 背包问题的数学定义&#x1f49a;解决背包问题的方法&#x1f499;例子 &#x1f497;解决背包问题的一般步骤&#xff1f;&#x1f497;例题&#x1f497;总结 ❤️❤️❤️❤️❤️博客主页&…...

React antd umi 监听当前页面离开,在菜单栏提示操作

需求是我这里有个页面&#xff0c;离开当前页面之后&#xff0c;需要在菜单栏显示个提示&#xff0c;也就是Tour const [unblock, setUnblock] useState<() > void>(() > () > {});const [next, setNext] useState();useEffect(() > {const unblockHandler…...

在 Windows PowerShell 中模拟 Unix/Linux 的 touch 命令

在 Unix 或 Linux 系统中&#xff0c;touch 命令被广泛用于创建新文件或更新现有文件的时间戳。不过&#xff0c;在 Windows 系统中&#xff0c;尤其是在 PowerShell 环境下&#xff0c;并没有内置的 touch 命令。这篇博客将指导你如何在 Windows PowerShell 中模拟 touch 命令…...

鸿蒙NEXT

[中国&#xff0c;东莞&#xff0c;2024年6月24日] 华为开发者大会&#xff08;HDC&#xff09;正式开幕&#xff0c;带来全新的 HarmonyOS NEXT、盘古大模型5.0等最创新成果&#xff0c;持续为消费者和开发者带来创新体验。 HarmonyOS NEXT 鸿蒙生态 星河璀璨 鸿蒙生态设备数…...

VUE3-Elementplus-form表单-笔记

1. 结构相关 el-row表示一行&#xff0c;一行分成24份 el-col表示列 (1) :span"12" 代表在一行中&#xff0c;占12份 (50%) (2) :span"6" 表示在一行中&#xff0c;占6份 (25%) (3) :offset"3" 代表在一行中&#xff0c;左侧margin份数 el…...

Analyze an ORA-12801分析并行 parallel 12801 实际原因

"ORA-06512: at "PKG_P_DATA", line 19639 ORA-06512: at "PKG_P_DATA", line 19595 ORA-06512: at "PKG_P_DATA", line 14471-JOB 调用 -ORA-12801: error signaled in parallel query server P009, instance rac2:dwh2 (2) Error: ORA-12…...

高级运维工程师讲述银河麒麟V10SP1服务器加固收回权限/tmp命令引起生产mysql数据库事故实战

高级运维工程师讲述银河麒麟V10SP1服务器加固收回权限/tmp命令引起生产MySql数据库事故实战 一、前言 作为运维工程师经常会对生产服务器进行安全漏洞加固&#xff0c;一般服务厂商、或者甲方信息安全中心提供一些安全的shell脚本&#xff0c;一般这种shell脚本都是收回权限&…...

昇思25天学习打卡营第09天|sea_fish

打开第九天&#xff0c;本次学习的内容为保存与加载&#xff0c;记录学习的过程。本次的内容少而且简单。 在训练网络模型的过程中&#xff0c;实际上我们希望保存中间和最后的结果&#xff0c;用于微调&#xff08;fine-tune&#xff09;和后续的模型推理与部署&#xff0c;因…...

flutter开发实战-Charles抓包设置,dio网络代理

flutter开发实战-Charles抓包设置 在开发过程中抓包&#xff0c;可以看到请求参数等数据&#xff0c;方便分析问题。flutter上使用Charles抓包设置。dio需要设置网络代理。 一、dio设置网络代理 在调试模式下需要抓包调试&#xff0c;所以需要使用代理&#xff0c;并且仅用H…...

Elasticsearch:Runtime fields - 运行时字段(二)

这是继上一篇文章 “Elasticsearch&#xff1a;Runtime fields - 运行时字段&#xff08;一&#xff09;” 的续篇。 在查询时覆盖字段值 如果你创建的运行时字段与映射中已存在的字段同名&#xff0c;则运行时字段会隐藏映射字段。在查询时&#xff0c;Elasticsearch 会评估运…...

Python正则表达式的入门用法(上)

Python正则表达式是使用re模块来进行操作的。re模块提供了一组函数&#xff0c;用于进行字符串的匹配和查找操作。 下面是Python中使用正则表达式的一些常用函数&#xff1a; re.search(pattern, string)&#xff1a;在字符串中查找并返回第一个匹配的对象。 re.match(patte…...

Audio Processing Graphs 管理 Audio Units

Audio Processing Graphs 管理 Audio Units Audio Processing Graphs 管理 Audio UnitsAudio Processing Graph 拥有精确的 I/O UnitAudio Processing Graph 提供线程安全通过 graph "pull" 音频流 Audio Processing Graphs 管理 Audio Units audio processing grap…...

欧盟,又出了新规-通用充电器新规通用充電器的 RED 修正案如何办理?

欧盟&#xff0c;又出了新规-通用充电器新规通用充電器的 RED 修正案如何办理&#xff1f; 欧盟新规委员会发布《通用充电器指令》指南通用充電器的 RED 修正案办理流程&#xff1a; 2024年5月7日&#xff0c;欧盟委员会发布《通用充电器指令》指南&#xff0c;修订了《无线…...

thinkphp6/8 验证码

html和后台验证代码按官方来操作 ThinkPHP官方手册 注意&#xff1a; 如果验证一直失败&#xff0c;看看Session是否开启&#xff0c; 打印dump(session_status());结果2为正确的&#xff0c; PHP_SESSION_DISABLED: Session功能被禁用&#xff08;返回值为0&#xff09;。…...

Ubuntu 22.04 LTS 上安装 MySQL8.0.23(在线安装)

目录 在线安装MySQL 步骤1&#xff1a;更新软件包列表 步骤2&#xff1a;安装MySQL服务器 步骤3&#xff1a;启动MySQL服务 步骤4&#xff1a;检查MySQL状态 步骤5&#xff1a;修改密码、权限 在线安装MySQL 步骤1&#xff1a;更新软件包列表 在进行任何软件安装之前&a…...

如何选择优质模型?SD3性能究竟如何?

遇到难题不要怕&#xff01;厚德提问大佬答&#xff01; 厚德提问大佬答12 厚德提问大佬答第十二期 你是否对AI绘画感兴趣却无从下手&#xff1f;是否有很多疑问却苦于没有大佬解答带你飞&#xff1f;从此刻开始这些问题都将迎刃而解&#xff01;你感兴趣的话题&#xff0c;厚德…...

Linux上脚本备份数据库(升级版)

直接上代码&#xff1a; #!/bin/bash# 配置部分 mysql_user"root" mysql_host"localhost" mysql_port"3306" mysql_charset"utf8mb4" mysql_defaults_file"/home/mysql/mysql_back/.my.cnf"backup_base_dir"/mnt/sdd/…...

【深度解析】滑动窗口:目标检测算法的基石

标题&#xff1a;【深度解析】滑动窗口&#xff1a;目标检测算法的基石 目标检测是计算机视觉领域的一个核心任务&#xff0c;旨在识别图像中所有感兴趣的目标&#xff0c;并确定它们的位置和大小。滑动窗口方法作为目标检测中的一种传统技术&#xff0c;虽然在深度学习时代逐…...

约束:对于数据的限制

主键约束 主键约束&#xff1a;唯一约束非空约束&#xff0c;该字段上的数据不能重复且不能为null 注意&#xff1a;一张表必须有且只有一个主键 添加主键约束 -- 方式一(推荐) CREATE TABLE user(username VARCHAR(32) PRIMARY KEY,password VARCHAR(32),nick_name VARCHAR(3…...

【总线】AXI4第七课时:AXI的额外的控制信息(PROT和CACHE)

大家好,欢迎来到今天的总线学习时间!如果你对电子设计、特别是FPGA和SoC设计感兴趣&#xff0c;那你绝对不能错过我们今天的主角——AXI4总线。作为ARM公司AMBA总线家族中的佼佼者&#xff0c;AXI4以其高性能和高度可扩展性&#xff0c;成为了现代电子系统中不可或缺的通信桥梁…...

MAVEN 重新配置参考

【笔记04】下载、配置 MAVEN&#xff08;配置 MAVEN 本地仓库&#xff09;&#xff08;MAVEN 的 setting.xml&#xff09;-阿里云开发者社区 windows 系统环境变量 MAVEN_HOME 也可以改一下...

ByteTrack论文阅读笔记

目录 ByteTrack: Multi-Object Tracking by Associating Every Detection Box摘要INTRODUCTION — 简介BYTE算法BYTE算法用Python代码实现实验评测指标轻量模型的跟踪性能 总结SORT算法简介ByteTrack算法和SORT算法的区别 ByteTrack: Multi-Object Tracking by Associating Eve…...

LVS+Keepalived 高可用集群搭建实验

192.168.40.204lvs+keepalivedlvs-k1192.168.40.140lvs+keepalivedlvs-k2192.168.40.150nginx官方教程web-1192.168.40.151nginxepel阿里云源web-2Woo79 | LVS+Keepalived 高可用集群搭建 (图文详解小白易懂) doctor @yang | 生产环境必备的LVS+Keepalived ,超级详细的原理…...

代码随想三刷动态规划篇7

代码随想三刷动态规划篇7 198. 打家劫舍题目代码 213. 打家劫舍 II题目代码 337. 打家劫舍 III题目代码 121. 买卖股票的最佳时机题目代码 198. 打家劫舍 题目 链接 代码 class Solution {public int rob(int[] nums) {if(nums.length1){return nums[0];}if(nums.length2){…...

linux应用开发基础知识(八)——内存共享(mmap和system V)

mmap内存映射 内存共享定义 内存映射&#xff0c;简而言之就是将用户空间的一段内存区域映射到内核空间&#xff0c;映射成功后&#xff0c;用户对这段内存区域的修改可以直接反映到内核空间&#xff0c;同样&#xff0c;内核空间对这段区域的修改也直接反映用户空间。那么对…...

上海小程序开发需要进行定制开发吗?

随着互联网技术与移动设备的不断成熟&#xff0c;小程序也已普及到人们日常生活的方方面面。随着企业与互联网联结的愈发深入&#xff0c;小程序的开发可以为企业带来更高效的经营模式&#xff0c;降本增效。那么&#xff0c;上海小程序作为无需安装且开发门槛较低的应用&#…...

Qt开发 | qss简介与应用

文章目录 一、qss简介与应用二、QLineEdit qss介绍与使用三、QPushButton qss1.常用qss1.1 基本样式表1.2 背景图片1.3 图片在左文字在右 2.点击按钮弹出菜单以及右侧箭头样式设置3.鼠标悬浮按钮弹出对话框 四、QCheckBox qss妙用&#xff1a;实时打开关闭状态按钮五、QComboBo…...

模块一SpringBoot(一)

maven记得配置本地路径和镜像 IJ搭建 SpringIntiallizer--》将https://start.spring.io改成https://start.aliyun.com/ 项目结构 Spring有默认配置&#xff0c; application.properties会覆盖默认信息&#xff1a; 如覆盖端口号server.port8888...

C语言 | Leetcode C语言题解之第213题打家劫舍II

题目&#xff1a; 题解&#xff1a; int robRange(int* nums, int start, int end) {int first nums[start], second fmax(nums[start], nums[start 1]);for (int i start 2; i < end; i) {int temp second;second fmax(first nums[i], second);first temp;}retur…...

​​​​Linux LVS 负载均衡群集

在业务量达到一定量的时候&#xff0c;往往单机的服务是会出现瓶颈的。此时最常见的方式就是通过负载均衡来进行横向扩展。其中我们最常用的软件就是 Nginx。通过其反向代理的能力能够轻松实现负载均衡&#xff0c;当有服务出现异常&#xff0c;也能够自动剔除。但是负载均衡服…...

onTouch()与onTouchEvent()的区别

onTouch()和onTouchEvent()是Android中处理触摸事件的两个重要方法。它们用于不同的场景&#xff0c;并在事件分发机制中扮演不同的角色。以下是它们的详细区别和使用方法&#xff1a; onTouch() 方法 定义&#xff1a;onTouch(View v, MotionEvent event)是View.OnTouchList…...

计算机网络网络层复习题2

一. 单选题&#xff08;共22题&#xff0c;100分&#xff09; 1. (单选题)如果 IPv4 数据报太大&#xff0c;会在传输中被分片&#xff0c;对分片后的数据报进行重组的是&#xff08; &#xff09;。 A. 中间路由器B. 核心路由器C. 下一跳路由器D. 目的主机 我的答案: D:目的…...

数据统计与数据分组18-25题(30 天 Pandas 挑战)

数据统计与数据分组 1. 知识点1.18 分箱与统计个数1.19 分组与求和统计1.20 分组获取最小值1.21 分组获取值个数1.22 分组与条件查询1.23 分组与条件查询及获取最大值1.24 分组及自定义函数1.25 分组lambda函数统计 2. 题目2.18 按分类统计薪水&#xff08;数据统计&#xff09…...

Linux多进程和多线程(六)进程间通信-共享内存

多进程(六) 共享内存共享内存的创建 示例: 共享内存删除 共享内存映射 共享内存映射的创建解除共享内存映射示例:写入和读取共享内存中的数据 写入: ### 读取: 大致操作流程: 多进程(六) 共享内存 共享内存是将分配的物理空间直接映射到进程的⽤户虚拟地址空间中, 减少数据在…...

新型开发语言的试用感受-仓颉语言发布之际

经常听一些媒体介绍一些新型的开发语言&#xff0c;所以最近心血来潮&#xff0c;安装了几种感受了一些。 先看名气&#xff0c;如ziglang&#xff0c;网址为&#xff1a;Home ⚡Zig Programming Language 号称是可以取代C语言的一门新语言&#xff0c;其实我主要是受下面这篇…...

C#——Property属性详情

属性 属性&#xff08;Property&#xff09;是类&#xff08;class&#xff09;、结构体&#xff08;structure&#xff09;和接口&#xff08;interface&#xff09;的成员&#xff0c;类或结构体中的成员变量称为字段&#xff0c;属性是字段的扩展&#xff0c;使用访问器&am…...

基于Spring Boot的在线考试系统

您好&#xff01;我是专注于计算机技术研究的码农小野。如果您对在线考试系统感兴趣或有相关开发需求&#xff0c;欢迎随时联系我。 开发语言&#xff1a;Java 数据库&#xff1a;MySQL 技术&#xff1a;Spring Boot框架&#xff0c;Java技术 工具&#xff1a;Eclipse&…...

【MindSpore学习打卡】应用实践-计算机视觉-ShuffleNet图像分类:从理论到实践

在当今的深度学习领域&#xff0c;卷积神经网络&#xff08;CNN&#xff09;已经成为图像分类任务的主流方法。然而&#xff0c;随着网络深度和复杂度的增加&#xff0c;计算资源的消耗也显著增加&#xff0c;特别是在移动设备和嵌入式系统中&#xff0c;这种资源限制尤为突出。…...

L3规模化落地加速自动驾驶迎来发展新机遇

近日,工信部网站发布《四部门有序开展智能网联汽车准入和上路通行试点》通知,公布了9家首批智能网联汽车准入和上路通行试点联合体,即汽车生产企业+使用主体成对出现。其中,车企负责产品生产,测试则由相关平台提供。从发放L3自动驾驶测试牌照,到此次《通知》发布,不仅表…...

低姿态魅力:丰田雅力士AIRBFT气动避震改装秀

丰田雅力士,一款以其灵巧与动感著称的小车,当它搭载了AIRBFT气动避震系统后,车身姿态得以进一步降低,展现出了前所未有的低姿态魅力。低至地面的车身,不仅在视觉上给人以强烈的冲击感,更在行驶中提供了更低的风阻,提升了车辆的稳定性和操控性。AIRBFT气动避震系统以其卓…...

城市通勤神器!奔腾小马2.89万元火爆预售

上下班高峰期的通勤,总是让人头疼。坐公交人挤人,路上的耗时更是无法计算;乘地铁相对省时间,但车厢里依然像是“沙丁鱼罐头”。如果遇到刮风下雨等恶劣天气,就更加令人恼火。在这种情况下,很多人都希望能拥有一辆价格便宜、配置够用的代步小车,虽无奢华体验,但求遮风挡…...

Facebook的魅力:数字时代的社交热点

在当今数字化时代&#xff0c;社交媒体已经成为人们日常生活中不可或缺的一部分&#xff0c;而Facebook作为其中的巨头&#xff0c;一直以其独特的魅力吸引着全球数十亿用户。本文将深入探讨Facebook的魅力所在&#xff0c;以及它在数字时代的社交热点。 1. 社交网络的霸主&…...

无线麦克风什么牌子的音质效果好?一文读懂无线领夹麦克风哪款好

​在当今的数字时代&#xff0c;无线技术已经深入到我们生活的方方面面&#xff0c;无线领夹麦克风便是其中的佼佼者。它们为讲者、表演者以及那些需要在移动中讲话的人们提供了解放双手和自由移动的可能。本文旨在探讨无线领夹麦克风的多种用途&#xff0c;以及如何挑选最适合…...

打造高可用系统:深入了解心跳检测机制

本文作者:小米,一个热爱技术分享的29岁程序员。如果你喜欢我的文章,欢迎关注我的微信公众号“软件求生”,获取更多技术干货! Hello,大家好!我是你们的技术小伙伴小米,今天咱们来聊聊分布式系统中的“心跳检测”机制。心跳检测是一种简单而又重要的机制,用来监控系统的…...