用于图像分类任务的经典神经网络综述

news2024/11/9 2:38:52

🎀个人主页: https://zhangxiaoshu.blog.csdn.net
📢欢迎大家:关注🔍+点赞👍+评论📝+收藏⭐️,如有错误敬请指正!
💕未来很长,值得我们全力奔赴更美好的生活!

前言

长期以来,计算机视觉一直是人工智能研究的关键领域之一。早期的图像处理方法通常基于手工设计的特征提取器,这在处理复杂任务时面临一些限制,随着深度学习的崛起,特别是深度神经网络的发展,计算机视觉领域发生了革命性的变化。深度学习的优势在于其能够学习从原始数据中提取有用特征的能力,而无需手动设计特征提取器,本文主要介绍在深度学习发展史中用于图像分类任务的经典神经网络。


文章目录

  • 前言
  • 一、图像分类任务介绍
  • 二、基于卷积的网络
    • 1. LeNet
    • 2. AlexNet
    • 3. VGG
    • 4. GoogLeNet
    • 5. ResNet
    • 6. DenseNet
    • 7. RepVGG
  • 三、基于Transformer的网络
    • 1. Vision Transformer
    • 2. Swin Transformer
  • 四、基于轻量化的网络
    • 1. MobileNet
    • 2. ShuffleNet
    • 3. EfficientNet
  • 五、PyTorch网络使用


一、图像分类任务介绍

图像分类任务指输入一张或多张图像。输出为将图像分配到一个或多个类别中。

一些关键概念:

类别: 预定义的目标类别,每个类别代表一种对象或场景。

训练集: 包含标注(类别信息)的图像集合,用于训练模型。

验证集和测试集: 用于评估模型性能的独立数据集。验证集用于调整模型超参数,测试集用于最终性能评估。

特征学习: 模型通过训练从数据中学习特征,这些特征有助于区分不同类别的图像。

模型评估指标: 通常包括准确率(正确分类的图像比例)、精确度(正类别中被正确分类的比例)、召回率(实际正类别中被正确分类的比例)等。

二、基于卷积的网络

1. LeNet

LeNet是由Yann LeCun等人于1998年提出的卷积神经网络(Convolutional Neural Network,CNN)架构,它是深度学习领域中最早成功应用于图像分类任务的模型之一。LeNet的设计旨在处理手写数字识别问题,特别是美国邮政服务的邮政编码识别项目。这个模型的提出对卷积神经网络的发展产生了深远的影响。
在这里插入图片描述

主要结构和组成部分:

  • 输入层(Input Layer): LeNet最初被设计用于处理手写数字图像,因此输入层表示图像的像素。

  • 第一层(第一个卷积层):卷积操作:提取输入图像的局部特征。Sigmoid激活函数:引入非线性。平均池化层:降低特征图的维度,减小计算量。

  • 第二层(第二个卷积层):类似于第一层,包含卷积、激活和平均池化。

  • 全连接层(Fully Connected Layers):将卷积层提取的特征映射到输出类别。采用Sigmoid激活函数。

  • 输出层:通常是一个全连接层。Softmax激活函数用于将输出转换为类别概率分布。

2. AlexNet

AlexNet是由Alex Krizhevsky、Ilya Sutskever和Geoffrey Hinton等人于2012年设计的深度卷积神经网络,它在ImageNet大规模图像识别竞赛(ILSVRC)中取得了巨大的成功。这个模型标志着深度学习在计算机视觉领域的崛起,并成为后来深度卷积神经网络的开创者之一。
在这里插入图片描述

主要特点和结构:

  • 深度: AlexNet是一个相对较深的神经网络,包含5个卷积层和3个全连接层。

  • 卷积层和池化层:前两个卷积层后跟最大池化层,用于提取图像的特征。激活函数采用ReLU(Rectified Linear
    Unit),这一选择在当时并不常见,但后来成为了深度学习中的常用激活函数。

  • 局部响应归一化(Local Response Normalization):在激活层之后引入局部响应归一化层,这有助于抑制神经元的饱和度,增强模型的泛化性能。

  • Dropout:在全连接层中引入Dropout层,以减轻过拟合问题。Dropout通过在训练过程中随机关闭一些神经元来防止网络对特定数据过于依赖。

  • 大规模并行计算:AlexNet的设计考虑到了大规模并行计算,通过分布在多个GPU上进行训练,这在当时是一项创新。

3. VGG

VGG(Visual Geometry Group)是由牛津大学的Visual Geometry Group在2014年提出的深度卷积神经网络架构。VGG以其简洁而规整的网络结构而闻名,对卷积层和池化层的堆叠使用非常规则的结构,使得整个网络非常容易理解和调整。
在这里插入图片描述

主要特点和结构:

  • 深度和规整的结构:VGG网络非常深,有16或19个卷积层(根据不同的配置),并且所有的卷积层都是3x3的卷积核。这种深度和规整的结构有助于提取图像中的丰富特征。

  • 小卷积核:VGG采用多个3x3的卷积核来替代一个较大的卷积核(如5x5或7x7)。这样的设计有助于增加非线性,提高网络的表达能力,并减少参数数量。

  • 池化层:VGG网络中使用最大池化层,通过减小空间维度来降低计算复杂性。

  • 全连接层:VGG在卷积层之后使用全连接层,将卷积层提取的特征映射到最终的输出。

  • 激活函数:VGG使用ReLU(Rectified Linear Unit)作为激活函数,这对训练过程中的梯度流动和网络的收敛起到了积极的作用。

  • VGG16 和 VGG19:VGG16包含16个权重层,其中有13个卷积层和3个全连接层。VGG19是VGG的一个变种,包含19个权重层,其中有16个卷积层和3个全连接层。

4. GoogLeNet

GoogLeNet,也称为Inception v1,是由Google研究团队于2014年提出的深度卷积神经网络。它在ImageNet大规模图像识别竞赛(ILSVRC)中取得了显著的成功,并引入了"Inception"模块,该模块采用多尺度卷积核来提取不同层次的特征,使得网络更具表达能力。
在这里插入图片描述

主要特点和结构:

  • Inception 模块:Inception模块采用了不同大小的卷积核(1x1、3x3、5x5)和最大池化层,并将它们在同一层级进行堆叠。这有助于网络同时学习不同尺度的特征,提高了网络的表达能力。
    1x1卷积核用于降维,减少计算量。这也可以看作是一种瓶颈结构(Bottleneck Structure)。

  • 全局平均池化(Global Average Pooling):GoogLeNet采用全局平均池化层,取代了传统的全连接层。这有助于减少参数数量,降低过拟合风险,并使网络更具通用性。

  • 辅助分类器:GoogLeNet在中间层添加了辅助分类器,用于提供额外的梯度信号,有助于缓解梯度消失问题,加速训练过程。

  • Batch Normalization:GoogLeNet引入了批量归一化(Batch Normalization),有助于提高网络的训练速度,增加网络的稳定性。

Inception 模块的示意图如下:

Input -> 1x1 Conv -> \
                       -> Concatenate
Input -> 3x3 Conv -> /
Input -> 5x5 Conv -> \
                       -> Concatenate
Input -> Max Pool -> /
  • Inception v1 (GoogLeNet): 这是最早的"Inception"版本,由Christian Szegedy等人在2014年提出。它引入了"Inception"模块,该模块使用多个不同大小的卷积核并行处理输入数据,从而提高了网络的效果。

  • Inception v2 (BN-Inception or Inception-BN): 也称为Batch Normalization Inception,这个版本在Inception v1的基础上引入了批量归一化(Batch Normalization),从而加速训练过程。

  • Inception v3: 这是"Inception"系列的第三个版本,引入了一些新的设计原则,如分解卷积(Factorized Convolutions)和更深的网络结构。它在识别精度和计算效率方面都有所提高。

  • Inception v4: 这个版本在Inception v3的基础上进行了改进,引入了一些额外的技巧,如残差连接(Residual Connections)和更深层次的网络结构。

5. ResNet

ResNet(Residual Network)是由微软研究院的Kaiming He等人在2015年提出的深度卷积神经网络结构。ResNet的设计突破了传统的深度神经网络的训练难题,通过引入残差学习(residual learning)机制,成功训练了非常深的网络,达到了当时的领先水平。
在这里插入图片描述

主要特点和结构:

残差学习:ResNet的关键创新是引入了残差块(Residual Block)或残差学习。在传统的卷积神经网络中,随着网络层数的增加,梯度逐渐变小,导致梯度消失问题。而残差学习通过引入跳跃连接(shortcut connection),允许网络学习残差(residual)而不是直接学习映射,从而有效解决了梯度消失问题。

残差块结构:残差块通常包括两个卷积层,每个卷积层之间有一个跳跃连接。残差块的结构可以用数学公式表示为:

o u t p u t = i n p u t + F ( i n p u t ) output=input+F(input) output=input+F(input)

其中 F ( i n p u t ) F(input) F(input)是卷积层的输出。

  • 堆叠残差块:ResNet通过堆叠多个残差块来构建深度网络。深度网络的训练变得更加容易,因为残差学习机制减缓了梯度逐层传播的消失问题。

  • 全局平均池化:与GoogLeNet类似,ResNet使用全局平均池化层替代全连接层,以减少参数数量。

  • 批量归一化和ReLU激活:ResNet中广泛使用批量归一化(Batch Normalization)和ReLU激活函数,有助于提高网络的训练速度和稳定性。

6. DenseNet

DenseNet(Densely Connected Convolutional Networks)是由李飞飞等人于2017年提出的深度卷积神经网络架构。DenseNet的关键创新是在网络的设计中引入了密集连接(dense connectivity)的概念,即每一层都与前面所有层直接相连,使得网络具有更加紧密的信息流动,有效地缓解了梯度消失问题。
在这里插入图片描述

主要特点和结构:

  • 密集连接(Dense Connectivity):DenseNet中每一层都与前面所有层直接相连,每一层接收来自前面所有层的特征图作为输入。这种密集连接的结构有助于保持更多的特征信息,并促使梯度更容易传播。

  • 稠密块(Dense Block):DenseNet的主要构建单元是稠密块,每个稠密块包含多个密集连接的卷积层。在每个卷积层之后,都将其输出与前面层的输出连接起来,形成密集连接。

  • 过渡块(Transition Block):在稠密块之间引入过渡块,通过使用1x1卷积层和平均池化层来减小特征图的尺寸。这有助于控制网络的复杂度,减少计算量。

  • 全局平均池化:与其他一些先进的网络一样,DenseNet采用全局平均池化来替代全连接层,减少参数数量,提高网络的泛化能力。

  • 批量归一化和ReLU激活:DenseNet中广泛使用批量归一化和ReLU激活函数,有助于提高网络的训练速度和稳定性。

7. RepVGG

RepVGG(Reparameterized VGG)是由Microsoft Research提出的一种卷积神经网络架构,旨在结合VGG的简单结构和ResNet的强大性能。RepVGG通过重新参数化卷积层,使得网络具有VGG风格的简单性,同时保留了ResNet中的残差连接,提高了网络的性能。
在这里插入图片描述

RepVGG 主要特点和结构:

  • 重新参数化的卷积层:RepVGG使用了重新参数化的卷积层,将卷积核的权重分解成两个部分:一个是可学习的,一个是固定的。这种设计简化了卷积层的计算,同时保持了一定的灵活性。

  • ResNet 风格的残差连接:RepVGG引入了ResNet风格的残差连接,使得网络能够更有效地传递梯度、缓解梯度消失问题,并加速了训练过程。

  • 简单且有效的结构:RepVGG的整体结构类似于VGG,由多个卷积层和全连接层组成,具有简单、易理解的特点,同时在性能上具备了一定的深度学习模型的优势。

  • 端到端可训练:RepVGG 是一个端到端可训练的网络结构,可以通过梯度下降来学习网络中所有的参数。

三、基于Transformer的网络

1. Vision Transformer

Vision Transformer(ViT)是一种基于注意力机制的图像分类网络,由Alexey Dosovitskiy等人在2020年提出。相比于传统的卷积神经网络(CNNs),ViT采用了全注意力机制,将输入图像分割成一系列的图像块(patches),并通过自注意力机制捕捉图像全局信息。 ViT是一种在图像分类任务上取得显著成功的全新方法,它改变了传统卷积神经网络的范式,通过自注意力机制更灵活地捕捉图像中的关系。
Vision Transformer

主要特点和结构:

  • 图像块的表示:输入图像被分割成固定大小的图像块(patches)。每个图像块被视为一个向量,这样整个图像就被表示为一个序列。

  • 位置嵌入(Position Embeddings):为了捕捉序列中的位置信息,ViT引入了位置嵌入。这些位置嵌入向量被加到图像块的表示中,以便模型学习到图像中不同位置的关系。

  • 多头注意力机制:ViT使用了多头注意力机制,允许模型关注图像中不同区域的信息。每个注意力头都学习到了图像块之间的关系,有助于捕捉全局信息。

  • 全连接层(MLP):在多头注意力机制之后,ViT采用了全连接层(多层感知机,MLP)来进一步提取特征。这一部分被称为MLP处理块。

  • 层归一化和残差连接:每个MLP处理块后都进行了层归一化和残差连接,以提高模型的训练稳定性。

  • 全局池化:最终的序列表示经过全局平均池化,得到整个图像的表示。

2. Swin Transformer

Swin Transformer是一种用于图像分类任务的变种Transformer架构,由微软亚洲研究院在2021年提出。Swin Transformer采用了分层的局部注意力机制和窗口化的注意力机制,以处理大尺寸输入图像,并取得了在图像分类任务上的卓越性能。
在这里插入图片描述

主要特点和结构:

  • 分层的局部注意力机制:Swin Transformer引入了分层的局部注意力机制,将输入图像分割成非重叠的块,并在每个块内部执行局部注意力,以处理大尺寸输入。

  • 窗口化的注意力机制:Swin Transformer使用窗口化的注意力机制,即在每个块中只与相邻的块进行注意力交互,从而减少了计算复杂性。

  • 交换操作(Shift Operation):为了促进图像信息的交流,Swin Transformer引入了交换操作,即在不同块之间进行位置的平移,有助于捕捉图像中的全局信息。

  • 层次结构:Swin Transformer采用了层次结构,包含多个Swin Transformer块。每个Swin Transformer块中包含分层的局部注意力、窗口化的注意力、交换操作等模块。

  • 跨层连接:Swin Transformer中引入了跨层连接,允许低层特征直接连接到高层特征,促进特征的信息流动。

  • 多尺度特征:Swin Transformer通过采用多层次的注意力机制,能够处理多尺度的特征,使得模型对于不同尺度的物体具有更强的感知能力。

四、基于轻量化的网络

1. MobileNet

MobileNet是由Google在2017年提出的一系列轻量级神经网络架构,旨在在计算资源有限的移动设备上实现高效的图像分类和目标检测。MobileNet的设计目标是在保持较高的性能的同时,大幅减少参数数量和计算复杂度,使得它适用于嵌入式设备和移动端应用。

MobileNet的核心思想是采用深度可分离卷积(depthwise separable convolution)代替传统的标准卷积操作,以减少模型中的参数数量。深度可分离卷积将标准卷积分为两步:深度卷积(depthwise convolution)和逐点卷积(pointwise convolution)。
在这里插入图片描述

MobileNet 主要特点和结构:

  • 深度可分离卷积:深度可分离卷积分为两步:深度卷积对每个输入通道执行卷积,然后通过逐点卷积将其映射到输出通道。这一操作降低了计算复杂度,减少了参数数量。

  • 宽度乘数(Width Multiplier):MobileNet引入了宽度乘数,允许用户控制每一层网络的宽度。通过减少中间层的通道数,可以在不显著损失性能的情况下减小网络的大小。

  • 分辨率乘数(Resolution Multiplier):MobileNet还引入了分辨率乘数,允许用户缩小输入图像的分辨率。降低分辨率可以减少计算量,但可能损失一些图像细节。

  • 全局平均池化:MobileNet通常使用全局平均池化层替代全连接层,以减少参数数量。

  • 线性瓶颈:在每个深度可分离卷积的逐点卷积之前,MobileNet采用了线性激活函数(没有非线性变换),以提高模型的表达能力。

  • MobileNetV1(2017): 第一个MobileNet版本,采用了深度可分离卷积,成功地在移动设备上实现了高效的图像分类。

  • MobileNetV2(2018): 引入了倒残差结构(inverted residual structure),在V1的基础上进一步改进。此版本通过使用残差连接和线性瓶颈来提高性能。

  • MobileNetV3(2019): 进一步改进MobileNetV2,引入了更多的优化和设计改进,如可分离卷积的非线性激活、更大的网络输入尺寸、更精细的网络宽度调整等。

2. ShuffleNet

ShuffleNet是由微软亚洲研究院于2018年提出的一种轻量级神经网络结构,旨在在计算资源受限的移动设备上实现高效的图像分类和目标检测。ShuffleNet的设计注重在减小计算复杂度和参数数量的同时,保持较高的模型性能。

ShuffleNet的主要特点是通过引入分组卷积和通道重排操作来减少计算复杂度。分组卷积将输入通道分为若干组,每组进行独立的卷积计算,然后将结果拼接在一起。通道重排操作则用于对通道进行重新排列,从而增强信息的传递。
ShuffleNet 主要特点和结构:
在这里插入图片描述

  • 分组卷积:ShuffleNet引入了分组卷积,将输入通道分为多个组,每个组进行独立的卷积操作。这有助于降低计算复杂度和参数数量。

  • 通道重排(Channel Shuffle):通道重排操作将输入通道进行重新排列,以增强信息的传递。这一操作在分组卷积之后进行,有助于促进不同组之间的信息交流。

  • 逐点卷积(Pointwise Convolution):ShuffleNet使用逐点卷积(1x1卷积)来调整通道数量,使得网络更加灵活,同时减少参数数量。

  • 基础单元(ShuffleNet Unit):ShuffleNet的基础单元包括分组卷积、通道重排、逐点卷积和批量归一化等操作。多个基础单元的堆叠构成了整个网络。

  • 全局平均池化:与其他一些轻量级网络一样,ShuffleNet通常使用全局平均池化层替代全连接层,以减少参数数量。

  • ShuffleNetV1(2018): 第一个版本,引入了分组卷积和通道重排的概念,取得了较好的性能。

  • ShuffleNetV2(2018): 在ShuffleNetV1的基础上进行改进,引入了更多的特征通道重排和新的网络结构设计。ShuffleNetV2进一步减小了计算复杂度,提升了性能。

3. EfficientNet

EfficientNet是由谷歌研究团队在2019年提出的一种高效且性能优越的卷积神经网络架构。EfficientNet的设计目标是在给定计算资源的情况下,取得更好的性能,同时充分考虑了网络的深度、宽度和分辨率等因素。

EfficientNet的设计基于三个主要组件:宽度乘数(width multiplier)、深度乘数(depth multiplier)和分辨率乘数(resolution multiplier)。这些乘数允许用户在不同方向上对网络进行缩放,以满足不同的性能和计算资源需求。
在这里插入图片描述

EfficientNet 主要特点和结构:

  • 宽度乘数(Width Multiplier):宽度乘数控制每一层网络的通道数,即每个卷积层的宽度。通过调整宽度乘数,可以在不改变模型深度的情况下减小或增大模型的计算复杂度。

  • 深度乘数(Depth Multiplier):深度乘数控制网络的层数。通过调整深度乘数,可以在不改变模型宽度的情况下减小或增大模型的计算复杂度。

  • 分辨率乘数(Resolution Multiplier):分辨率乘数控制输入图像的分辨率。通过调整分辨率乘数,可以在不改变模型深度和宽度的情况下减小或增大模型的计算复杂度。

  • 复合缩放系数(Compound Scaling):EfficientNet采用复合缩放系数,同时调整宽度、深度和分辨率,以获得更好的性能。复合缩放系数的提出是为了综合考虑这三个方向上的缩放效果。

  • MBConv(MobileNetV2-like Bottleneck Block):EfficientNet中使用了一种称为MBConv(MobileNetV2-like Bottleneck Block)的块作为基础单元,该块结合了深度可分离卷积和残差连接。

五、PyTorch网络使用

torchvision.models 模块是 PyTorch 中用于定义和加载预训练模型的模块。它提供了许多经典的图像分类、目标检测、图像生成等深度学习模型的实现。这些模型已经在大规模图像数据集上进行了预训练,可以用于各种计算机视觉任务。

下面以ResNet为例简单说明 torchvision.models 模块中图像分类网络的使用示例:

import torch
import torchvision.transforms as transforms
from torchvision.models import resnet50

# 示例输入图像(需要调整为你的图像路径)
image_path = 'path/to/your/image.jpg'

# 预处理图像
transform = transforms.Compose([
    transforms.Resize((224, 224)),
    transforms.ToTensor(),
])

image = transform(Image.open(image_path)).unsqueeze(0)

# 创建 ResNet50 模型
model = resnet50(pretrained=True)

# 将模型设置为评估模式
model.eval()

# 进行预测
with torch.no_grad():
    output = model(image)

# 打印预测结果
print(torch.argmax(output[0]).item())


文中图片大多来自论文和网络,如有侵权,联系删除,文中有不对的地方欢迎指正。

参考:
Rawat W, Wang Z. Deep convolutional neural networks for image classification: A comprehensive review[J]. Neural computation, 2017, 29(9): 2352-2449.
Chen L, Li S, Bai Q, et al. Review of image classification algorithms based on convolutional neural networks[J]. Remote Sensing, 2021, 13(22): 4712.

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

电脑如何录音?适合初学者的详细教程

“电脑怎么录音呀?参加了一个学校举办的短视频大赛,视频拍摄都很顺利,音乐却出了问题,朋友说可以用电脑录制一段音乐应付一下,可是我不会操作,有哪位大佬教教我!” 声音是一种强大的媒介&#…

回归预测 | MATLAB实现SMA+WOA+BOA-LSSVM基于黏菌算法+鲸鱼算法+蝴蝶算法优化LSSVM回归预测

回归预测 | MATLAB实现SMAWOABOA-LSSVM基于黏菌算法鲸鱼算法蝴蝶算法优化LSSVM回归预测 目录 回归预测 | MATLAB实现SMAWOABOA-LSSVM基于黏菌算法鲸鱼算法蝴蝶算法优化LSSVM回归预测效果一览基本介绍程序设计参考资料 效果一览 基本介绍 MATLAB实现SMAWOABOA-LSSVM基于黏菌算法…

Ubuntu18.04磁盘取证-中难度篇

涉及的镜像文件: sdb.vhd uac.tar ubuntu.20211208.mem 需要利用的工具: volatility3 volatility2.6.1 FTK/Autopsy Strings 题干 容器是一个Ubuntu Linux 蜜罐,用来观察利用 CVE-2021-41773 的漏洞攻击者想要做什么。 您将看到一个 cr…

高仿IT之家微信小程序(附精选源码32套,涵盖商城团购等)

项目预览 主要包含主页资讯,圈子俩大模块 主页 资讯详情 圈子 相关代码 网络请求 import wx from wx import Fly from flyioconst request new Fly()request.interceptors.request.use((request) > {wx.showNavigationBarLoading()return request })requ…

Linux - 动静态库(下篇)

前言 在上篇博客当中,对静态库是什么,怎么使用,简单实现自己的静态库,这些做了描述,具体请看上篇博客: 本篇博客将会对 动态库是什么,怎么使用,简单实现自己的动态库&#xff0c…

什么是yum?

🎈个人主页:🎈 :✨✨✨初阶牛✨✨✨ 🐻推荐专栏1: 🍔🍟🌯C语言初阶 🐻推荐专栏2: 🍔🍟🌯C语言进阶 🔑个人信条: 🌵知行合一 &#x1f…

浅谈安科瑞多功能仪表和网关在中国香港某项目的应用

摘要:本文介绍了安科瑞多功能电能表在中国香港某项目的应用。APM系列交流多功能仪表是一款专门为电力系统、工矿企业、公用事业和智能建筑用于电力监控而设计的智能电表。 Abstract:This article introduces the application of the IoT power meter in…

AI超级个体:ChatGPT与AIGC实战指南

目录 前言 一、ChatGPT在日常工作中的应用场景 1. 客户服务与支持 2. 内部沟通与协作 3. 创新与问题解决 二、巧用ChatGPT提升工作效率 1. 自动化工作流程 2. 信息整合与共享 3. 提高决策效率 三、巧用ChatGPT创造价值 1. 优化产品和服务 2. 提高员工满意度和留任率…

vue3中的Fragment、Teleport、Suspense新组件

Fragment组件 在Vue2中: 组件必须有一个根标签 在Vue3中: 组件可以没有根标签, 内部会将多个标签包含在一个Fragment虚拟元素中 好处: 减少标签层级, 减小内存占用 <template><div style"font-size: 14px;"><p> 组件可以没有根标签</p&g…

EtherCAT从站XML文件组成元素详解(2):状态机

0 工具准备 1.EtherCAT从站XML文件(本文使用DM3E-556) 2.ETG.2000 S (R) V1.0.71 前言 EtherCAT从站的设备描述文件ESI(EtherCAT Slave Information)是联系主站和从站的桥梁,主站可以通过xml格式的从站设备描述文件识别从站的特征信息、获取对象字典信息、进行组态等。因此…

vue3(二)-基础入门之列表循环、数组变动检测、filter模糊查询、事件修饰符

一、列表循环 of 和 in 都是一样的效果 html代码&#xff1a; <div id"app"><ul><li v-for"item of datalist">{{ item }}</li></ul><ul><li v-for"item in dataobj">{{ item }}</li></u…

k8s安装步骤

环境&#xff1a; 操作系统&#xff1a;win10 虚拟机&#xff1a;VMware linux发行版&#xff1a;CentOS7.9 CentOS镜像&#xff1a;CentOS-7-x86_64-DVD-2009 master和node节点通信的ip(master)&#xff1a; 192.168.29.164 0.检查配置 本次搭建的集群共三个节点&#xff0c;…

【开发实践】使用POI实现导出带有复杂表头的的excel文件

一、需求分析 公司业务部门需要&#xff0c;根据一些数据&#xff0c;加上表头&#xff0c;导出需要的excel表格。效果如下&#xff1a; 二、代码实现 【依赖准备】 <!-- POI --><dependency><groupId>org.apache.poi</groupId><artifactId>po…

Echarts地图registerMap使用的GeoJson数据获取

https://datav.aliyun.com/portal/school/atlas/area_selector 可以选择省&#xff0c;市&#xff0c;区。 也可以直接在地图上点击对应区域。 我的应用场景 我这里用到这个还是一个特别老的大屏项目&#xff0c;用的jq写的。显示中国地图边界区域 我们在上面的这个地区选择…

C++学习之路(九)C++ 用Qt5实现一个工具箱(增加一个JSON数据格式化功能)- 示例代码拆分讲解

上篇文章&#xff0c;我们用 Qt5 实现了在小工具箱中添加了《粘贴板记录管理》功能&#xff0c;用着还不错哈。为了继续丰富我们的工具箱&#xff0c;今天我们就再增加一个平时经常用到的功能吧&#xff0c;就是「 JSON数据格式化 」功能。下面我们就来看看如何来规划开发一个这…

【MATLAB源码-第91期】基于matlab的4QAM和4FSK在瑞利(rayleigh)信道下误码率对比仿真。

操作环境&#xff1a; MATLAB 2022a 1、算法描述 正交幅度调制&#xff08;QAM&#xff0c;Quadrature Amplitude Modulation&#xff09;是一种在两个正交载波上进行幅度调制的调制方式。这两个载波通常是相位差为90度&#xff08;π/2&#xff09;的正弦波&#xff0c;因此…

解决在SwingBench压测时出现一些问题

解决在SwingBench压测时出现一些问题 压测时断层 1.问题来由&#xff1a;在进行swingbench压测的时候会出现断断续续的情况 2.导致原因&#xff1a; 我们通过查看日志文件&#xff0c;看看是什么情况 tail -100 /u01/app/oracle/diag/rdbms/orcl/orcl/trace/alert_orcl.l…

锂电行业废水及母液除铊解决方案,除铊树脂技术

锂电池原材料和生产设备的制造、电池回收和处理等&#xff0c;产业的发展会带来铊排放问题。除了锂电池生产过 程中存在的铊污染外&#xff0c;企业的生活污水或者初期雨水也含有铊&#xff0c;因为铊是一种广泛存在于自然环境中的 元素&#xff0c;存在于饮用水、土壤和食物中…

【三维重建】摄像机标定(张正友相机标定法)

摄像机标定的目的是为了求解摄像机的内、外参数 求解投影矩阵M 通过建立特殊的场景&#xff0c;我们能过得到多对世界坐标和对应图像坐标 根据摄像机几何可知 &#xff1a; &#xff0c;M是一个3*4的矩阵&#xff0c;令 通过一对点可以得到两个方程组&#xff0c;M中一共有11个…