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

目标检测 | 卷积神经网络(CNN)详细介绍及其原理详解

前言:Hello大家好,我是小哥谈。卷积神经网络(Convolutional Neural Network,CNN)是一种深度学习模型,主要用于图像识别和计算机视觉任务。它的设计灵感来自于生物学中视觉皮层的工作原理。CNN的核心思想是通过输入层、卷积层、池化层、全连接层和输出层来提取图像特征并进行分类。本文将详细给大家介绍卷积神经网络的基本组成及其实现原理!~🌈

     目录

🚀1.基础概念

🚀2.输入层

🚀3.卷积层

🚀4.池化层

🚀5.激活函数

🚀6.全连接层

🚀7.输出层

1962年,加拿大神经科学家Hubel和Wiesel通过研究猫的视觉神经,首次提出神经元感受野这一概念。

20世纪80年代,日本科学家 Kunihiko Fukushima在论文中介绍了神经认知网络模型,该模型可以看作是卷积神经网络的初期结构。

20世纪90年代,Yann LeCun等人提出LeNet模型,并成功应用于美国的邮政系统,用来识别手写邮政编码,首次实现了卷积神经网络的商业应用。

2012年,Geoffrey E. Hinton等人提出AlexNet,该模型获得了计算机视觉领域ImageNet图像分类竞赛冠军。

2015年,何凯明等人将参数化修正线性单元(PReLU)激活函数应用于卷积神经网络,第一次在ImageNet数据集上使神经网络的预测错误率低于人类预测错误率。

随着残差网络(ResNet)稠密连接网络(DenseNet)以及使用神经结构搜索框架得到的NASNet等一系列新型卷积神经网络模型的提出,卷积神经网络的表达能力不断提高,应用领域越来越广泛。

卷积神经网络是各个领域的研究热点,尤其是图像分类、自然语言处理、语音分析等领域,它所拥有的权值共享结构极大地减少了权值的数量,从而使得模型在复杂度方面大大地降低,尤其是在处理多维图像时,避免了繁琐的特征处理及重建过程。


🚀1.基础概念

机器学习是现今非常热门的一种人工智能方法,是通过各种智能算法,从海量的数据中找到潜在的规律,并将学习到的规律应用在新样本的识别和预测当中。深度学习是在人工神经网络等智能算法的基础上发展起来的。通过模拟人的思维,获得了识别和区分事物的能力,并建立了多层神经网络模型,这个过程叫做深度学习

卷积神经网络(Convolutional Neural Network,CNN)是一种深度学习模型,主要用于图像识别和计算机视觉任务。它的设计灵感来自于生物学中视觉皮层的工作原理。

CNN的核心思想是通过输入层卷积层池化层全连接层输出层来提取图像特征并进行分类。下面是CNN的基本组成部分:

  1. 输入层(Input layer):主要用来输入图像信息,也是卷积神经网络最开始的层。
  2. 卷积层(Convolutional Layer):卷积层是CNN的核心部分,通过使用一组可学习的滤波器(也称为卷积核)对输入图像进行卷积操作,提取图像的局部特征。卷积操作可以有效地减少参数数量,并保留空间结构信息。

  3. 激活函数(Activation Function):在卷积层之后常,会使用激活函数对卷积结果进行非线性变换,增加网络的表达能力。常用的激活函数有ReLU、Sigmoid和Tanh等。

  4. 池化层(Pooling Layer):池化层用于降低特征图的空间尺寸,减少计算量,并保留重要的特征。常见的池化操作有最大池化和平均池化。

  5. 全连接层(Fully Connected Layer):全连接层将池化层输出的特征图展平成一维向量,并通过全连接操作进行分类或回归。全连接层通常使用softmax函数将输出转化为概率分布。

  6. 输出层(Output layer):输出预测结果,卷积神经网络最后的一层。

除了上述基本组成部分,CNN还可以通过堆叠多个卷积层、池化层和全连接层来构建深层网络,提高模型的表达能力和性能。此外,还可以使用批归一化(Batch Normalization)dropout等技术来加速训练和提高模型的泛化能力。

下面提供两种不同形式的卷积神经网络原理图,以供大家参考。👇

关于卷积神经网络,所涵盖层的作用简单总结如下: 👇

  • 输入层:输入图像等信息
  • 卷积层:用来提取图像的底层特征
  • 池化层:防止过拟合,将数据维度减小
  • 全连接层:汇总卷积层和池化层得到的图像的底层特征和信息
  • 输出层:根据全连接层的信息得到概率最大的结果

 可以看到其中最重要的一层就是卷积层,这也是卷积神经网络名称的由来。

说明:♨️♨️♨️

YOLOv5中的Conv是最基础的卷积模块,它由一个卷积层、一个批量归一化层和一个激活函数层组成。其中卷积层用于提取特征,批量归一化层用于规范化特征图,激活函数层用于增加非线性。批归一化(Batch Normalization)是一种用于加速深度神经网络训练的技术,它通过对每个小批量样本的输入进行归一化,使得网络在训练过程中更加稳定和快速收敛。

定义:♨️♨️♨️

批归一化(Batch Normalization)是一种在深度神经网络中常用的技术,它的主要目的是解决梯度消失梯度爆炸的问题,同时还能加速网络的训练过程

在深度神经网络中,随着网络层数的增加,输入数据在每一层的变化会逐渐放大或缩小,导致激活函数的输入值分布发生偏移。这种偏移会使得网络的学习变得困难,因为每一层的参数都需要重新适应新的输入分布。此外,由于每一层的参数都是通过反向传播算法进行更新的,梯度消失和梯度爆炸也会影响网络的训练效果。

批归一化通过对每一层的输入进行归一化处理,使得每一层的输入分布保持在一个较稳定的范围内。具体来说,它通过对每个小批量样本的均值和方差进行估计,然后对输入进行线性变换和平移操作,将输入数据重新映射到一个标准正态分布。这样做的好处是可以使得网络更容易学习到适应不同输入分布的参数,并且减少了梯度消失和梯度爆炸的问题。

批归一化的优点包括:

  1. 提高网络的收敛速度:通过将输入数据归一化到一个标准分布,可以加速网络的训练过程,使得网络更快地收敛到最优解。
  2. 减少梯度消失和梯度爆炸:通过控制每一层输入的范围,批归一化可以减少梯度消失和梯度爆炸的问题,使得网络更稳定地进行训练。
  3. 提高模型的泛化能力:批归一化可以减少模型对输入数据分布的依赖,提高了模型的泛化能力,使得模型在测试集上的表现更好。

总之,批归一化是一种非常有效的技术,可以提高深度神经网络的性能和训练效果。

定义:♨️♨️♨️

Dropout是一种常用的正则化技术,用于减少神经网络中的过拟合问题。在训练过程中,Dropout会随机地将一部分神经元的输出置为0,这样可以强制网络去学习更加鲁棒的特征表示。具体来说,Dropout会在每次训练迭代中随机选择一些神经元,并将它们的输出置为0。这样做的好处是,每个神经元都不能依赖于其他特定的神经元,因此强迫网络去学习更加鲁棒的特征表示。此外,Dropout还可以减少神经元之间的相互适应性,从而减少过拟合的风险。

在测试阶段,Dropout不会被应用,而是将所有神经元的输出乘以一个保留概率,通常为0.5或0.8,以保持期望输出的总体大小不变。

总结一下,Dropout的主要作用是减少过拟合问题,增强模型的泛化能力。

卷积神经网络(Convolutional Neural Network,CNN)是一种在计算机视觉和图像处理领域非常成功的深度学习模型。以下是一些比较有名的卷积神经网络结构:

  1. LeNet-5:LeNet-5 是由 Yann LeCun 在1998年提出的第一个卷积神经网络结构,用于手写数字识别任务。它包含了卷积层、池化层和全连接层,并且使用了激活函数和softmax分类器。

  2. AlexNet:AlexNet 是由 Alex Krizhevsky 等人在2012年提出的卷积神经网络结构,用于在 ImageNet 数据集上进行图像分类任务。它是第一个在大规模图像数据集上取得显著突破的卷积神经网络,包含了多个卷积层和全连接层,并且使用了ReLU激活函数和Dropout正则化。

  3. VGGNet:VGGNet 是由 Karen Simonyan 和 Andrew Zisserman 在2014年提出的卷积神经网络结构,也是用于在 ImageNet 数据集上进行图像分类任务。VGGNet 的特点是使用了非常小的卷积核(3x3),并且通过堆叠多个卷积层来增加网络的深度。

  4. GoogLeNet:GoogLeNet 是由 Google 的研究团队在2014年提出的卷积神经网络结构,用于在 ImageNet 数据集上进行图像分类任务。它的特点是引入了 Inception 模块,通过并行使用不同大小的卷积核和池化操作来提取多尺度的特征。

  5. ResNet:ResNet 是由 Kaiming He 等人在2015年提出的卷积神经网络结构,用于在 ImageNet 数据集上进行图像分类任务。ResNet 的特点是使用了残差连接(residual connection),允许网络更深,并且能够更容易地训练。

  6. MobileNet:MobileNet 是由 Google 的研究团队在2017年提出的卷积神经网络结构,用于在移动设备上进行图像分类和目标检测任务。MobileNet 的特点是使用了深度可分离卷积(depthwise separable convolution),可以在减少参数数量的同时保持较好的性能。


🚀2.输入层

输入层比较简单,这一层的主要工作就是输入图像等信息,因为卷积神经网络主要处理的是图像相关的内容,但是我们人眼看到的图像和计算机处理的图像是一样的么?很明显是不一样的,对于输入图像,首先要将其转换为对应的二维矩阵,这个二位矩阵就是由图像每一个像素的像素值大小组成的,我们可以看一个例子,如下图所示的手写数字“8”的图像,计算机读取后是以像素值大小组成的二维矩阵存储的图像。

上图又称为灰度图像,因为其每一个像素值的范围是0~255(由纯黑色到纯白色),表示其颜色强弱程度。另外还有黑白图像,每个像素值要么是0(表示纯黑色),要么是255(表示纯白色)。我们日常生活中最常见的就是RGB图像,有三个通道,分别是红色绿色蓝色。每个通道的每个像素值的范围也是0~255,表示其每个像素的颜色强弱。但是我们日常处理的基本都是灰度图像,因为比较好操作(值范围较小,颜色较单一),有些RGB图像在输入给神经网络之前也被转化为灰度图像,也是为了方便计算,否则三个通道的像素一起处理计算量非常大。当然,随着计算机性能的高速发展,现在有些神经网络也可以处理三通道的RGB图像。现在我们已经知道了,输入层的作用就是将图像转换为其对应的由像素值构成的二维矩阵,并将此二维矩阵存储,等待后面几层的操作。


🚀3.卷积层

图片输入后,想要提取其中的特征,则需要经过卷积层了。

在卷积神经网络出现以前,最常见的神经网络被称为多层感知机(Multi-Layer Perceptron,MLP),多层感知机由输入层隐藏层输出层组成,多层感知机的结构较为简单,相邻两层之间的节点是全连接的,如下图所示,隐藏层通过非线性激活函数(Sigmoid,ReLu等)对输入数据进行处理,并将处理后的数据传递到输出层,对于分类任务,输出层通常使用Softmax输出每个类别的概率,对于回归任务,输出层输出的是一个连续值,与卷积神经网络相同的是,二者都使用反向传播算法来学习权重参数, 通常用在处理文本数据和数值数据,但在图像等非结构化数据上效果远不如卷积神经网络。

图  多层感知机

定义:♨️♨️♨️

Softmax是一种常用的数学函数,它通常用于多分类问题中,将一个向量转换为概率分布。Softmax函数的定义如下:

给定一个具有n个元素的向量x = [x1, x2, …, xn],Softmax函数将每个元素xi映射为一个介于0和1之间的值,使得所有映射后的值的和等于1。

Softmax函数的计算公式如下:

softmax(xi) = exp(xi) / (exp(x1) + exp(x2) + … + exp(xn)),其中exp()表示指数函数。

Softmax函数的作用是将原始的向量转换为概率分布,使得每个元素表示对应类别的概率。在机器学习中,Softmax函数常用于多分类问题中的输出层,用于计算每个类别的概率。

定义:♨️♨️♨️

反向传播算法是一种用于训练神经网络的常用优化算法。它通过计算损失函数对网络参数的梯度,然后利用梯度下降法来更新参数,从而使得网络能够逐步优化并适应输入数据。

具体来说,反向传播算法可以分为两个阶段:前向传播反向传播

前向传播阶段,输入数据通过神经网络的各个层,逐层进行计算和传递,最终得到输出结果。在这个过程中,每个神经元都会根据输入数据和激活函数计算出输出值,并将其传递给下一层。

反向传播阶段,首先计算输出结果与真实标签之间的误差,通常使用损失函数来度量误差大小。然后,从输出层开始,通过链式法则将误差逐层向前传播回网络的每一层。在每一层中,根据上一层传递过来的误差和该层的激活函数的导数,计算出该层的误差,并将其传递给前一层。最终,得到每个参数对误差的贡献,即参数的梯度。利用参数的梯度,可以使用梯度下降法或其他优化算法来更新网络的参数,使得网络的输出结果逐渐接近真实标签,从而实现对网络的训练。

总结一下,反向传播算法通过计算损失函数对网络参数的梯度,然后利用梯度下降法来更新参数,从而实现神经网络的训练和优化。

与多层感知机不同的是,卷积神经网络主要是通过卷积层堆叠组成的,它通过卷积层对图像进行特征提取,通常一个网络会堆叠很深层的卷积结构,这样就可以从图像中提取出更高质量的特征,从而提升了对目标的识别准确率,同时卷积神经网络还具有多层感知机不具备的两个特性:局部连接权值共享,局部连接这个特性类似于生物视觉系统,类似于人眼可以通过物体的局部特征去判断这个物体的类别,对于卷积神经网络而言,输出特征图上的每一个像素点都是由卷积核在输入图像上卷积得到的,也就是卷积核只与输入特征的一个小区域连接,因此,卷积层可以保留到图像的空间局部性,从而准确地捕捉到特征的局部信息,这与全连接层不同,全连接层的各个节点之间是互相连接的,输出层的每一个特征点都与上一层的特征点有联系。

具体来讲,卷积层就是通过一定数量的卷积核对输入通道的单个或多个通道的特征图进行“滑窗”式运算,得到更高层次的语义信息的特征图,不断重复这个过程就可以实现高维度的特征提取,从而识别出图像上的特征信息。

下图展示的是单通道的二维特征图进行卷积运算的滑动步骤,即一个尺寸为3×3卷积核(绿色方格)特征尺寸为5×5 (浅蓝色方格)步长为2填充边界为1的输入图像上进行卷积的完整过程。

图   卷积运算的滑动过程

关于卷积运算过程,大家可能有点懵,让我们讲解的再详细一点。

首先卷积核也是一个二维矩阵,当然这个二维矩阵要比输入图像的二维矩阵要小或相等,卷积核通过在输入图像的二维矩阵上不停的移动,每一次移动都进行一次乘积的求和,作为此位置的值,这个过程如下图所示:

可以看到,整个过程就是一个降维的过程,通过卷积核的不停移动计算,可以提取图像中最有用的特征。我们通常将卷积核计算得到的新的二维矩阵称为特征图,比如上方动图中,下方移动的深蓝色正方形就是卷积核上方不动的青色正方形就是特征图

有的读者可能注意到,每次卷积核移动的时候中间位置都被计算了,而输入图像二维矩阵的边缘却只计算了一次,会不会导致计算的结果不准确呢?

让我们仔细思考,如果每次计算的时候,边缘只被计算一次,而中间被多次计算,那么得到的特征图也会丢失边缘特征,最终会导致特征提取不准确,那为了解决这个问题,我们可以在原始的输入图像的二维矩阵周围再拓展一圈或者几圈,这样每个位置都可以被公平的计算到了,也就不会丢失任何特征,此过程可见下面两种情况,这种通过拓展解决特征丢失的方法又被称为Padding

🍀(1)Padding取值为1,拓展一圈

🍀(2)Padding取值为2,拓展两圈

那如果情况再复杂一些呢?如果我们使用两个卷积核去提取一张彩色图片呢?之前我们介绍过,彩色图片都是三个通道,也就是说一个彩色图片会有三个二维矩阵,当然,我们仅以第一个通道示例,否则太多了也不好介绍。此时我们使用两组卷积核,每组卷积核都用来提取自己通道的二维矩阵的特征,刚才说了,我们只考虑第一通道的,所以说我们只需要用两组卷积核的第一个卷积核来计算得到特征图就可以了,那么这个过程可见下图。

看着上面的动图确实有些不知所措是吧,我来解释一下,按照刚才的思路,输入图片是彩色图片,有三个通道,所以输入图片的尺寸就是7×7×3,而我们只考虑第一个通道,也就是从第一个7×7的二维矩阵中提取特征,那么我们只需要使用每组卷积核的第一个卷积核即可,这里可能有读者会注意到Bias,其实它就是偏置项,最后计算的结果加上它就可以了,最终通过计算就可以得到特征图了。可以发现,有几个卷积核就有几个特征图,因为我们现在只使用了两个卷积核,所以会得到两个特征图。

随着卷积神经网络在各种问题中的广泛应用,卷积层也衍生出许多的变种版本,其中常见的有分组卷积(Group Convolution)转置卷积(Transposed Convolution)空洞卷积(Atrous Convolution)深度分离卷积(Depthwise Separable Convolution)

分组卷积的主要思想就是将卷积分成不同的小组,每个小组分别计算一部分通道的卷积,从而减少计算量和参数量。转置卷积的运算方式与普通的卷积相似,转置卷积通常用于逆操作,也就是将缩小的特征图进行放大,其原理图如下图所示。这样可以在增强语义信息的同时对特征图进行上采样,转置卷积通常用于语义分割或者图像生成领域。

图   转置卷积

空洞卷积的操作方式近似于普通卷积,与普通卷积不同的是,空洞卷积的卷积核中存在空洞,如下图所示,这些空洞的大小可以通过调整空洞率来实现,这种方式近似于增加了卷积核的大小,但并未带来更多的参数量,所以空洞卷积可以显著增加卷积层的感受野。

图   空洞卷积 

深度可分离卷积的操作方式和普通卷积有很大的区别,深度可分离卷积由深度卷积 (Depthwise Convolution)点卷积(Pointwise Convolution)两步组成,原理图如下图所示。在深度卷积中,每个通道的特征图都独立使用一组卷积核进行卷积,在点卷积中,深度卷积的结果使用一个小的卷积核进行卷积,从而得到最终的输出。深度可分离卷积相比普通卷积具有更少的参数,因此可以在降低计算复杂度的同时保持较高的准确度。它在计算机视觉、图像语义分割等任务中得到了广泛应用。

图   深度可分离卷积


🚀4.池化层

池化操作也是卷积神经网络中一个非常重要的概念,它可以对特征层的信息进行筛选或计算,从而得到该部分特征最具代表性的一个,在降低特征信息冗余的同时间接地扩大了网络的感受野,一般情况下,池化层在卷积神经网络里面扮演着降采样层 (Downsampling Layer)的作用,常用的池化操作有最大值池化平均池化

总结:♨️♨️♨️

池化层(Pooling)可以对图片进行压缩从而使得压缩后的图像在质量方面优于原图,同时可以降低特征维度并保留有用信息,网络模型的参数数量得到了进一步的减少,过拟合的情况也有所缓解。当输入图片的领域像素值产生了一些微小的位移时,下采样层可保持输出不变,增强网络模型的鲁棒性。

下图展示的是一个4×4大小的特征图通过2×2大小的池化核进行最大值池化过程👇

图   最大值池化

下图展示的是一个4×4大小的特征图通过2×2大小的池化核进行平均值池化过程。👇

图   平均值池化

池化层特点:

  1. 特征不变性:池化相当于对图像进行放大缩小操作,假设原图是一只猫,那么不管我们对该图放大一倍或是缩小一倍,都能够看出这张图片是一只猫,其重要的特征仍在,含有该张图像的主要特征,这就是我们平时所了解到的尺度不变性,丢失掉的特征对原图不会造成影响。
  2. 特征降维:当我们对一张图片进行处理时,图像尺寸越大,参数量就越多,导致网络的计算量增大。但是对于该张图片,有很多的信息是冗余的,对于我们的网络没有太大的用处,因此我们可以通过降维提取其中重要的特征,减少卷积神经网络计算量。
  3. 在一定程度上避免过拟合。

随着卷积神经网络技术的不断发展,池化层也逐渐衍生出了很多的变种版本,如混合池化随机池化全局平均池化等。在卷积神经网络训练初期,卷积层通过池化层后一般要接多个全连接层进行降维,最后再Softmax分类,这种做法使得全连接层参数很多,降低了网络训练速度,且容易出现过拟合的情况。在这种背景下,提出使用全局平均池化(Global Average Pooling)来取代最后的全连接层,如下图所示。全局平均池化用很小的计算代价实现了降维,更重要的是全局平均池化极大减少了网络参数,除此之外,使用全局平均池化代替全连接层,可以实现任意图像大小的输入,并且全局平均池化对整个特征图求平均值,也可以用来提取全局上下文信息,进一步增强网络性能。

图   全局平均池化


🚀5.激活函数

多层神经网络中,每一层都有多个节点,每个节点通过连接上一层的节点来接收输入,并将输出传递给下一层的节点。这种上下层节点之间的映射关系,可以通过一个函数来描述,该函数被称为激活函数

激活函数的作用是对输入信号进行非线性变换,从而增加网络的表达能力,使其能够更好地拟合复杂的非线性模型。具体来说,激活函数能够将神经网络的输出限制在一个特定的范围内,使其具有一定的鲁棒性非线性可塑性常用的非线性激活函数主要有SigmoidTanhReLUSiLU等,其图像如下图所示。

图   常用激活函数图像

其中,Sigmoid函数具有良好的平滑性和可导性,在一定程度上可以缓解梯度消失的问题;Tanh函数是Sigmoid函数的扩展,具有更强的非线性能力,但也容易出现梯度消失的问题;ReLU函数在实际应用中表现良好,其简单的形式和高效的计算使其成 了神经网络中最常用的激活函数之一;SiLU函数是一种近期提出的激活函数,具有平滑性和可导性,并在一些实验中表现出了优异的性能。总之,激活函数是神经网络中非常重要的组成部分,通过选择不同的激活函数,可以为神经网络提供不同的表达能力和适应性。


🚀6.全连接层

全连接层通常位于网络的最后几层,在全卷积神经网络出现以前,大部分网络的最后一层都通过全连接层进行分类,全连接层可以将网络的低维度特征映射到更高的维度,从而实现对特征进行分类,下图为全连接层的特征示意图,将经过卷积层、池化层、 激活函数层的二维图像特征展平成为一维向量特征,随后,全连接层将卷积核提取到的特征进行融合,通常在网络的输出端都使用多层全连接层进行分类,但多层全连接层也会导致网络的参数量大幅上升,目前很多网络都使用全局平均池化替代全连接层。

总结即是,输出层用于输出经卷积神经网络计算得到的数值。

对于不同的问题,输出的形式也不同。

  • 对于分类问题,输出层输出的是一个概率分布,这个概率分布通过对数值应用Softmax函数得到,表示不同类别对应的概率。
  • 对于回归问题,输出层输出经卷积神经网络由输入数据计算得到数值。
  • 对于图像生成图像分割等要求输出图像的问题,输出层输出的是表示图像的数值矩阵。

图   全连接层

单看这个过程可能还是不太清晰,所以我们可以把之前的过程与全连接层结合起来,如下图所示:

 图   整个过程

可以看到,经过两次卷积和最大池化之后,得到最后的特征图,此时的特征都是经过计算后得到的,所以代表性比较强,最后经过全连接层,展开为一维的向量,再经过一次计算后,得到最终的识别概率,这就是卷积神经网络的整个过程。


🚀7.输出层

卷积神经网络的输出层理解起来就比较简单了,我们只需要将全连接层得到的一维向量经过计算后得到识别值的一个概率,当然,这个计算可能是线性的,也可能是非线性的。在深度学习中,我们需要识别的结果一般都是多分类的(对于不同的问题,输出的形式也不同),所以每个位置都会有一个概率值,代表识别为当前值的概率,取最大的概率值,就是最终的识别结果。在训练的过程中,可以通过不断地调整参数值来使识别结果更准确,从而达到最高的模型准确率。


相关文章:

目标检测 | 卷积神经网络(CNN)详细介绍及其原理详解

前言:Hello大家好,我是小哥谈。卷积神经网络(Convolutional Neural Network,CNN)是一种深度学习模型,主要用于图像识别和计算机视觉任务。它的设计灵感来自于生物学中视觉皮层的工作原理。CNN的核心思想是通…...

机器人学、机器视觉与控制 上机笔记(第一版译文版 2.1章节)

机器人学、机器视觉与控制 上机笔记(第一版译文版 2.1章节) 1、前言2、本篇内容3、代码记录3.1、新建se23.2、生成坐标系3.3、将T1表示的变换绘制3.4、完整绘制代码3.5、获取点*在坐标系1下的表示3.6、相对坐标获取完整代码 4、结语 1、前言 工作需要&a…...

关于vue2+antd 信息发布后台不足的地方

有的写法可以cv 1.序号递增 {title: "序号",customRender: (text, record, index) > ${index 1},align: "center",}, 2.关于类型 {title: "类型",dataIndex: "type",align: "center",customRender: function (t) {sw…...

Ubuntu+Anaconda 常用指令记录

Anaconda 使用指令记录 1 创建环境 conda create -n name pythonx.x(python版本自己指定)例如 conda create --name myenv: 创建名为"myenv"的新环境。 conda activate myenv: 激活名为"myenv"的环境。 conda deactivate: 退出当前环境。 2 删除环境 c…...

P5732 【深基5.习7】杨辉三角 python解法

# 【深基5.习7】杨辉三角 ## 题目描述 给出 n<20&#xff0c;输出杨辉三角的前 n 行。 如果你不知道什么是杨辉三角&#xff0c;可以观察样例找找规律。 ## 输入格式 ## 输出格式 ## 样例 #1 ### 样例输入 #1 6 ### 样例输出 #1 1 1 1 1 2 1 1 3 3 1 1 4 6 4 1 1 5…...

VitePress-12-markdown中使用vue的语法

前言 VitePress 中&#xff0c;markdown文档最终都会转换成为 html文件&#xff0c;我们在访问的时候&#xff0c;也是直接访问的 xxx.html 文件。而且&#xff0c;markdown文档会被作为 [vue单文件] 进行处理&#xff0c;因此&#xff0c;我们我们可以在文档中使用 vue 语法&…...

“bound drug/molecule”or “unbound drug/molecule”、molecule shape、sketching是什么?

“bound drug/molecule”or “unbound drug/molecule” For clarity, the following terms will be used throughout this study: “bound drug/molecule” (or “unbound drug/molecule”) refers to the drug/molecule that is bound (or unbound) to proteins [48]. 意思就是…...

深入理解C语言中的函数指针:概念、机制及实战应用

在C语言的世界里&#xff0c;函数是一等公民&#xff0c;可以被赋值给变量&#xff0c;这种特殊的变量就是我们今天要探讨的主角——函数指针。函数指针作为C语言中一种强大的工具&#xff0c;允许我们以间接方式调用函数&#xff0c;从而实现动态绑定、回调函数、策略模式等多…...

《UE5_C++多人TPS完整教程》学习笔记1 ——《P2 关于本课程(About This Course)》

本文为B站系列教学视频 《UE5_C多人TPS完整教程》 —— 《P2 关于本课程&#xff08;About This Course&#xff09;》 的学习笔记&#xff0c;该系列教学视频为 Udemy 课程 《Unreal Engine 5 C Multiplayer Shooter》 的中文字幕翻译版&#xff0c;UP主&#xff08;也是译者&…...

权限系统设计

权限系统设计 RBAC 基于角色的访问控制 ABAC 基于属性的访问控制 普通的系统无非 CRUD&#xff0c;那系统如何控制一个用户该看到哪些数据、能操作哪些功能&#xff1f;日常开发中最常用到 RBAC 和 OAuth2 这两种访问控制和授权方案 RBAC 基于角色的访问控制 所有的访问控制模…...

Ubuntu Desktop - Screenshot (截图工具)

Ubuntu Desktop - Screenshot [截图工具] 1. Search your computer -> Screenshot -> Lock to Launcher2. gnome-screenshot3. System Settings -> Keyboard -> ShortcutsReferences 1. Search your computer -> Screenshot -> Lock to Launcher 2. gnome-s…...

docker 1:介绍

docker 1&#xff1a;介绍 docker解决哪些问题&#xff1a; 传统APP在安装到不同电脑的时候可能会遇到依赖问题&#xff0c;比如缺少VS 20xx&#xff0c;软件无法运行”的情况。docker使用容器技术将软件 依赖​打包为image包发布&#xff0c;解决了依赖问题。docker有一个官…...

RibbonBar RibbonPage切换事件

在开发的过程中&#xff0c;我们会用到点击切换page&#xff0c;来响应对应的事件&#xff0c;例如以下事件&#xff1a; 头文件中&#xff1a; void ribboncurrentPageIndexChanged(int index); 实现文件中&#xff1a; connect(ribbonBar(), SIGNAL(currentPageIndexChang…...

Conda历史版本下载地址和python对应关系

一、前言 因为Conda安装版本问题&#xff0c;带来了很多问题&#xff0c;虽然不能直接确定二者之间的关系&#xff0c;但是安装指定版本的conda,确实是一个比较好的方法。特此记忆。 二、下载地址 下载最新版本&#xff1a;Free Download | Anaconda 下载历史版本&#xff…...

Clickhouse查询语句执行过程

问题 简述clickhosue中一条select语句的执行过程&#xff0c;使用的引擎是ReplacingMergeTree。例如&#xff1a; select col1,col2 from table final prewhere col3 > ? and col4 ? and col5 ? -- col3为分区键&#xff0c;col4为二级索引,col5为主键字段 where col…...

【动态规划】【中位数】【C++算法】1478. 安排邮筒

# 作者推荐 【深度优先搜索】【树】【图论】2973. 树中每个节点放置的金币数目 本文涉及知识点 动态规划汇总 LeetCode1478. 安排邮筒 给你一个房屋数组houses 和一个整数 k &#xff0c;其中 houses[i] 是第 i 栋房子在一条街上的位置&#xff0c;现需要在这条街上安排 k…...

C#系列-数据结构+递归算法+排序算法(3)

C#数据结构 在C#中&#xff0c;数据结构是用于组织和管理数据的方式&#xff0c;以便更有效地进行数据的存储、访问和操作。数据结构对于算法的性能和设计至关重要&#xff0c;因为它们决定了数据如何在内存中布局以及如何与算法进行交互。C#提供了许多内置的数据结构&#xf…...

Redis实现秒杀

前期准备 缓存选择考虑 Redis和Redis Cluster&#xff08;分布式版本&#xff09;&#xff0c;是一个分布式缓存系统。其支持多种数据结构&#xff0c;也支持MQ。Redis在性能上做了大量优化。因此使用Redis或者Redis Cluster就可以轻松实现一个强大的秒杀系统。 用Redis的这…...

4 scala集合-Map

和 Java 一样&#xff0c;Scala 也有表示键值对&#xff08;Key-Value&#xff09;集合的 Map 数据结构。同样&#xff0c;Map 也分不可变和可变&#xff0c;不可变需要使用类 scala.collection.mutable.Map。 1 不可变 Map 可以使用以下语法定义不可变 Map 对象 val/var ma…...

QT 对象树模型

QObject是Qt里边绝大部分类的根类 QObject对象之间是以对象树的形式组织起来的。 当两个QObject&#xff08;或子类&#xff09;的对象建立了父子关系的时候。子对象就会加入到父对象的一个成员变量叫children&#xff08;孩子&#xff09;的list&#xff08;列表&#xff09;…...

ubuntu快速安装miniconda

ubuntu快速安装miniconda 环境 ubuntu.22.04 显卡 RTX 3050 关于选择Miniconda还是Anaconda的问题&#xff0c;Anaconda安装包比较大&#xff0c;耗时比较长&#xff0c;如果你是绝对的初学者&#xff0c;选择Anaconda会比较稳妥一些&#xff1b;否则建议你还是选择Miniconda安…...

阿里云游戏服务器多少钱一年?

阿里云游戏服务器租用价格表&#xff1a;4核16G服务器26元1个月、146元半年&#xff0c;游戏专业服务器8核32G配置90元一个月、271元3个月&#xff0c;阿里云服务器网aliyunfuwuqi.com分享阿里云游戏专用服务器详细配置和精准报价&#xff1a; 阿里云游戏服务器租用价格表 阿…...

小游戏和GUI编程(7) | SimpleNN 界面源码解析

小游戏和GUI编程(7) | SimpleNN 界面源码解析 0. 简介 SimpleNN 是 AdamYuan 在高中一年级时用 1 天时间写出来的简易 CNN, 使用 SFML 做 UI, 用于交互式输入手写数字&#xff0c;这个数字被训练好的 CNN 网络执行推理得到识别结果, 它的运行效果如下&#xff1a; 这一篇我们…...

c++设计模式之代理模式

作用 代理模式主要用于&#xff0c;通过代理类&#xff0c;来控制实际对象的访问权限 案例 class VideoSite { public:virtual void freeVideo()0;virtual void vipVideo()0;virtual void trickVideo()0; };class FixBugVideoSite:public VideoSite { public:void freeVideo()…...

第5个-模糊加载

Day 5 - Blurry Loading 1. 项目展示 2. 分析思路 变化过程 数字从 0 不断增长到 100&#xff1b;中间的百分比数字逐渐消失&#xff0c;即透明度 opacity 从 1 到 0&#xff1b;背景图片从模糊变为清晰&#xff0c;滤镜 filter.blur()的参数设置为从 30px 到 0px。 小 tips…...

rtt设备io框架面向对象学习-adc设备

目录 1.adc设备基类2.adc设备基类的子类3.初始化/构造流程3.1设备驱动层3.2 设备驱动框架层3.3 设备io管理层 4.总结5.使用 1.adc设备基类 此层处于设备驱动框架层。也是抽象类。 在/ components / drivers / include / drivers 下的adc.h定义了如下adc设备基类 struct rt_ad…...

面试官:介绍一下Exception和Error之间的区别

前言 大家好&#xff0c;我是chowley&#xff0c;在我之前的面试中&#xff0c;遇到过这样一个问题&#xff1a;Exception和Error之间有什么区别&#xff1f;今天我就来好好地总结一下&#xff01; 主体 在Java编程中&#xff0c;Exception和Error都是Java中的可抛出对象&am…...

【RabbitMQ(一)】:基本介绍 | 配置安装与快速入门

应该是新年前最后一篇博客了&#xff0c;明天浅浅休息一下&#xff0c;提前祝大家新年快乐捏&#xff01;&#x1f60a;&#x1f60a;&#x1f60a; 01. 基础理解 1.1 同步调用和异步调用 &#x1f449; 同步调用 的时候调用者会 阻塞 等待被调用函数或方法执行完成&#xff…...

ElasticSearch之search API

写在前面 本文看下查询相关内容&#xff0c;这也是我们在实际工作中接触的最多的&#xff0c;所以有必要好好学习下&#xff01; 1&#xff1a;查询的分类 主要分为如下2类&#xff1a; 1:基于get查询参数的URI search 2&#xff1a;基于post body的request body search&am…...

07-Java桥接模式 ( Bridge Pattern )

Java桥接模式 摘要实现范例 桥接模式&#xff08;Bridge Pattern&#xff09;是用于把抽象化与实现化解耦&#xff0c;使得二者可以独立变化 桥接模式涉及到一个作为桥接的接口&#xff0c;使得实体类的功能独立于接口实现类&#xff0c;这两种类型的类可被结构化改变而互不影…...

golang集成sentry: go-redis

网上没有找到go-redis集成sentry的库&#xff0c; 所以我简单实现了一个 代码&#xff1a; https://github.com/Shujie-Tan/go-redis-sentry 使用方法&#xff1a; import (redis_sentry "github.com/Shujie-Tan/go-redis-sentry" ) rdb : redis.NewClient(&re…...

用EXCEL从地址(上海)中提取各区(浦东新区等区)信息

背景&#xff1a; 朋友工作需要经常用EXCEL把各上海用户收货地址中的区提取出来&#xff0c;之前一直手动处理&#xff0c;希望我帮忙用EXCEL公式直接提取处理。 数据样式&#xff1a; 中国上海市浦东新区A小区 上海徐汇区B小区 中国&#xff0c;上海&#xff0c;浦东新区&a…...

关于在分布式环境中RVN和使用场景的介绍3

简介 在《关于在分布式环境中RVN和使用场景的介绍2》和《关于在分布式环境中RVN和使用场景的介绍1》中我们介绍了RVN的概念和在一些具体用例中的使用。在本文中我们讨论一下在分布式环境中使用RVN需要注意的问题。 问题 我们在收到一条待处理的事件时&#xff0c;需要检查该…...

计算最小公倍数math.lcm()

【小白从小学Python、C、Java】 【计算机等考500强证书考研】 【Python-数据分析】 计算最小公倍数 math.lcm() 请问以下代码输出的结果是&#xff1f; import math print("【执行】math.lcm(2, 4)") print(math.lcm(2, 4)) print("【执行】math.lcm(1, 2, 3…...

VUE SEO 几种方案经典面试题

1、SSR服务器渲染 Vue.js 是构建客户端应用程序的框架。默认情况下&#xff0c;可以再浏览器中输出Vue组件&#xff0c;进行生成DOM和操作DOM。然而&#xff0c;也可以将同一个组件渲染未服务器端的HTML字符串&#xff0c;将它们直接发送到浏览器&#xff0c;最后将这些静态标…...

Python和VBA批量提取Word中的表格

表格在word文档中常见的文档元素之一。操作word文件时有时需要提取文件中多个表格的内容到一个新的文件&#xff0c;甚至有时还会要提取题注信息。 今天&#xff0c;给大家分享两种批量提取文档中表格的两种方法&#xff0c;分别是VBA法和Python法两种。 一、VBA法提取word中…...

Swift Combine 有序的异步操作 从入门到精通十二

Combine 系列 Swift Combine 从入门到精通一Swift Combine 发布者订阅者操作者 从入门到精通二Swift Combine 管道 从入门到精通三Swift Combine 发布者publisher的生命周期 从入门到精通四Swift Combine 操作符operations和Subjects发布者的生命周期 从入门到精通五Swift Com…...

国产航顺HK32F030M: 超声波测距模块串口通信数据接收与处理

参考代码 /************************************************************************************************** * file usart_async_tx_no_int_rx_rxneint.c * brief 异步串口通信例程, 通过查询TXE标志发送数据,通过RXNE中断接收数据,当中断接收到数据后会将 * …...

idea:如何连接数据库

1、在idea中打开database: 2、点击 ‘’ ---> Data Source ---> MySQL 3、输入自己的账号和密码其他空白处可以不填&#xff0c;用户和密码可以在自己的mysql数据库中查看 4、最后选择自己需要用的数据库&#xff0c;点击运用ok&#xff0c;等待刷新即可 最后&#xff1a…...

JS中ES5和ES6的区别

前言 ES5是JavaScript的第五个修订版本&#xff0c;于2009年发布。而ES6是JavaScript的第六个修订版本&#xff0c;也称为ES2015&#xff0c;于2015年发布。以下是它们两个版本之前的一些区别&#xff1a; 变量声明方式 在ES5中&#xff0c;使用var关键字进行变量声明&#…...

软考24-上午题-图1

一、数据结构的回忆 线性结构&#xff1a;&#xff08;一对一&#xff09; 除首结点没有前驱、末尾结点没有后继外&#xff0c;一个结点只有唯一的一个直接前驱和唯一的一个直接后继。 树结构&#xff1a;&#xff08;一对多&#xff09; 除根节点没有前驱节点外&#xff0c;…...

书生·浦语大模型第四课作业

基础作业&#xff1a; 构建数据集&#xff0c;使用 XTuner 微调 InternLM-Chat-7B 模型, 让模型学习到它是你的智能小助手&#xff0c;效果如下图所示&#xff0c;本作业训练出来的模型的输出需要将不要葱姜蒜大佬替换成自己名字或昵称&#xff01; 1.安装 # 如果你是在 Int…...

勒索攻击风起云涌,Sodinokibi深度分析

前言 Sodinokibi勒索病毒&#xff0c;又称为REvil勒索病毒&#xff0c;这款勒索病毒最早在国内被发现是2019年4月份&#xff0c;笔者在早期分析这款勒索病毒的时候就发现它与其他勒索病毒不同&#xff0c;于是被笔者称为GandCrab勒索病毒的“接班人”&#xff0c;为什么它是Ga…...

1124. 骑马修栅栏(欧拉路径,模板)

农民John每年有很多栅栏要修理。 他总是骑着马穿过每一个栅栏并修复它破损的地方。 John是一个与其他农民一样懒的人。 他讨厌骑马&#xff0c;因此从来不两次经过一个栅栏。 你必须编一个程序&#xff0c;读入栅栏网络的描述&#xff0c;并计算出一条修栅栏的路径&#xf…...

C# CAD2016获取数据操作BlockTableRecord、Polyline、DBObject

一、数据操作说明 //DBObject 基础类 DBObject dbObj (DBObject)tr.GetObject(outerId, OpenMode.ForRead); //Polyline 线段类 Polyline outerPolyline (Polyline)tr.GetObject(outerId, OpenMode.ForRead); //BlockTableRecord 块表类 BlockTableRecord modelSpace (Bloc…...

java SSM新闻管理系统myeclipse开发mysql数据库springMVC模式java编程计算机网页设计

一、源码特点 java SSM新闻管理系统是一套完善的web设计系统&#xff08;系统采用SSM框架进行设计开发&#xff0c;springspringMVCmybatis&#xff09;&#xff0c;对理解JSP java编程开发语言有帮助&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采用B/S…...

Linux_线程

线程与进程 多级页表 线程控制 线程互斥 线程同步 生产者消费者模型 常见概念 下面选取32位系统举例。 一.线程与进程 上图是曾经我们认为进程所占用的资源的集合。 1.1 线程概念 线程是一个执行分支&#xff0c;执行粒度比进程细&#xff0c;调度成本比进程低线程是cpu…...

【selenium】

selenium是一个Web的自动化测试工具&#xff0c;最初是为网站自动化测试而开发的。Selenium可以直接调用浏览器&#xff0c;它支持所有主流的浏览器。其本质是通过驱动浏览器&#xff0c;完成模拟浏览器操作&#xff0c;比如挑战&#xff0c;输入&#xff0c;点击等。 下载与打…...

HX711压力传感器学习一(STM32)

目录 原理图&#xff1a;​ 引脚介绍&#xff1a; HX711介绍工作原理: 程序讲解&#xff1a; 整套工程&#xff1a; 发送的代码工程&#xff0c;与博客的不一致&#xff0c;如果编译有报错请按照报错和博客进行修改 原理图&#xff1a; 引脚介绍&#xff1a; VCC和GND引…...

作业2.13

1、选择题 1.1、若有定义语句&#xff1a;int a[3][6]; &#xff0c;按在内存中的存放顺序&#xff0c;a 数组的第10个元素是 D A&#xff09;a[0][4] B) a[1][3] C)a[0][3] D)a[1][4] 1.2、有数组 int a[5] {10&#xff0c;20&#xff0c;30&#xff0c;40&#xff0c;50},…...