ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

09-卷积神经网络

09-卷积神经网络 图像基础知识“图”是物体反射或透射光的分布“像“是人的视觉系统所接受的图在人脑中所形成的印象或认识。在计算机中按照颜色和灰度的多少可以将图像分为4种基本类型。图像类型通道数像素值范围主要特点常见用途二值图像1通道0 或 1每个像素只有黑与白两种值形态学操作、二值化、轮廓检测灰度图像1通道0 到 255每个像素表示灰度亮度图像预处理、物体检测、人脸识别索引图像1通道0 到 255索引像素值为颜色表的索引颜色表决定实际颜色存储压缩、较少颜色的图像表示RGB图像3通道RGB0 到 255每个像素由红、绿、蓝三个通道组成普通彩色图像显示、图像处理与分析二值图像一幅二值图像的二维矩阵仅由0、1两个值构成“0”代表黑色“1”代白色。由于每一像素矩阵中每一元素取值仅有0、1两种可能所以计算机中二值图像的数据类型通常为1个二进制位。二值图像通常用于文字、线条图的扫描识别OCR和掩膜图像的存储。# 3*3二值图 import torch binary_tensor torch.tensor([ [[0, 1, 0], [1, 1, 0], [0, 0, 1]] ]) print(binary_tensor.shape) # torch.Size([1, 3, 3]) CHW灰度图像灰度图像矩阵元素的取值范围通常为[0255]。因此其数据类型一般为8位无符号整数的int8这就是人们经常提到的256灰度图像。“0”表示纯黑色“255”表示纯白色中间的数字从小到大表示由黑到白的过渡色。二值图像可以看成是灰度图像的一个特例。# 3*3灰度图 gray_chw torch.tensor([ [ [10, 80, 150], [60, 120, 200], [90, 170, 240] ] ]) print(gray_chw.shape) # torch.Size([1, 3, 3])索引图像索引图像的文件结构比较复杂除了存放图像的二维矩阵外还包括一个称之为颜色索引矩阵MAP的二维数组。MAP的大小由存放图像的矩阵元素值域决定如矩阵元素值域为[0255]则MAP矩阵的大小为256Ⅹ3用MAP[RGB]表示。MAP中每一行的三个元素分别指定该行对应颜色的红、绿、蓝单色值MAP中每一行对应图像矩阵像素的一个灰度值如某一像素的灰度值为64则该像素就与MAP中的第64行建立了映射关系该像素在屏幕上的实际颜色由第64行的[RGB]组合决定。也就是说图像在屏幕上显示时每一像素的颜色由存放在矩阵中该像素的灰度值作为索引通过检索颜色索引矩阵MAP得到。图像每个像素不直接存颜色只存一个类别索引编号整数真实颜色存在一张独立调色板palette。取值特点像素是离散整数0,1,2,...,N-1N 为类别数不是 0~1 浮点数也不是灰度亮度值。# 3*3索引图[H,W] # 调色板是一张映射表 import torch label_2d torch.tensor([ [0, 1, 0], [1, 2, 1], [0, 2, 2] ]) print(label_2d.shape) # torch.Size([3, 3]) print(label_2d.dtype) # 一般 torch.int64(long)真彩色RGB图像RGB图像与索引图像一样都可以用来表示彩色图像。与索引图像一样它分别用红R、绿G、蓝B三原色的组合来表示每个像素的颜色。但与索引图像不同的是RGB图像每一个像素的颜色值由RGB三原色表示直接存放在图像矩阵中由于每一像素的颜色需由R、G、B三个分量来表示M、N分别表示图像的行列数三个M x N的二维矩阵分别表示各个像素的R、G、B三个颜色分量。RGB图像的数据类型一般为8位无符号整形。注意通道的顺序是 BGR 而不是 RGB。简单的讲图像是由像素点组成的每个像素点的取值范围为: [0, 255] 。像素值越接近于0颜色越暗接近于黑色像素值越接近于255颜色越亮接近于白色。在深度学习中我们使用的图像大多是彩色图彩色图由RGB3个通道组成如下图所示# 3*3真彩图CHW import torch img_chw torch.tensor([ # R通道 [[255, 0, 0], [255, 255, 0], [128, 255, 128]], # G通道 [[ 0, 255, 0], [255, 255, 0], [ 0, 165, 128]], # B通道 [[ 0, 0, 255], [ 0, 255, 0], [128, 0, 128]] ]) print(img_chw.shape) # torch.Size([3, 3, 3])图像相关APIimport matplotlib.pyplot as plt plt.imread(./data/img.png) # 加载图像 plt.imsave(./data/img.png) # 保存图像 # 展示图像 plt.imshow(img) plt.show() img.shape # HWC三通道 # HWC - CHW img2 torch.tensor(img).permute(2, 0, 1)卷积神经网络CNN概述什么是CNN卷积神经网络是深度学习在计算机视觉领域的突破性成果专门用于处理图像、视频、语音等数据的神经网络在计算机视觉领域, 往往我们输入的图像都很大使用全连接网络的话计算的代价较高。另外图像也很难保留原有的特征导致图像处理的准确率不高。卷积神经网络Convolutional Neural Network是含有卷积层的神经网络。卷积层的作用就是用来自动学习、提取图像的特征。CNN网络主要由三部分构成卷积层、池化层和全连接层构成1卷积层负责提取图像中的局部特征2池化层用来大幅降低参数量级(降维)3全连接层类似人工神经网络的部分用来输出想要的结果上图中CNN要做的事情是给定一张图片是车还是马未知是什么车也未知现在需要模型判断这张图片里具体是一个什么东西总之输出一个结果如果是车那是什么车最左边是数据输入层对数据做一些处理比如去均值各维度都减对应维度的均值使得输入数据各个维度都中心化为0避免数据过多偏差影响训练效果、归一化把所有的数据都归一到同样的范围、PCA等等。CNN只对训练集做“去均值”这一步。中间是卷积层(CONV)线性乘积求和提取图像中的局部特征激活层(RELU)ReLU激活函数,输入数据转换成输出数据池化层(POOL)取区域平均值或最大值大幅降低参数量级(降维)最右边是全连接层(FC)接收二维数据集输出CNN模型预测结果CNN的应用图像分类最常见的应用例如识别图片中的物体类别目标检测检测图像中物体的位置和类别图像分割将图像分成多个区域用于语义分割人脸识别识别图像中的人脸医学图像分析用于检测医学图像中的异常如癌症检测、骨折检测等自动驾驶用于识别交通标志、车辆、行人CNN的经典算法/网络架构LeNet-5作为最早的CNN架构之一证明了CNN在图像识别任务上的有效性为后续的CNN发展奠定了基础卷积层:提取图像的边缘、角点等基本特征池化层 (子采样层):降低特征图的维度减少计算量并提高模型对输入图像微小变化的鲁棒性全连接层:将卷积层和池化层提取的特征进行组合用于最终的分类AlexNet显著提升了ImageNet图像分类的准确率证明了深度学习在计算机视觉领域的潜力并推动了深度学习的快速发展卷积层:使用更大的卷积核和更多的卷积核提取更丰富的图像特征ReLU激活函数:加速训练过程并提高模型的性能最大池化层:降低特征图的维度Dropout层:防止过拟合全连接层:用于最终的分类VGGNet探索了网络深度对性能的影响证明了更深的网络可以提取更抽象和更具表达力的特征卷积层:使用更小的卷积核 (3x3)并堆叠多个卷积层增加了网络的深度提取更复杂的特征最大池化层:降低特征图的维度全连接层:用于最终的分类GoogLeNet (Inception)提出了 Inception 模块在提高性能的同时减少了计算量为后续的网络架构设计提供了新的思路Inception 模块:并行使用不同大小的卷积核和池化操作然后将它们的输出连接起来增加了网络的宽度提高了网络的效率ResNet解决了深度网络训练困难的问题使得可以训练更深的网络从而显著提高了模型的性能残差块 (Residual Block):引入跳跃连接 (Shortcut Connection)允许梯度直接反向传播到浅层解决了深度网络的梯度消失问题使得训练非常深的网络成为可能DenseNet密集块 (Dense Block):将每一层都与之前的所有层连接特征重用更加充分进一步提高了网络的性能和参数效率DenseNet通过密集连接Dense Connectivity在网络中各层之间建立了直接的连接即每一层都接收前面所有层的输出作为输入。这种设计增强了特征传递和梯度流动避免了梯度消失问题并提高了信息的利用率卷积层卷积层Convolutional Layer通过卷积操作提取输入数据中的特征例如图像中的边缘、纹理、形状等。卷积层利用卷积核滤波器对输入进行处理从而生成特征图feature map并且每个卷积层能够提取不同层次的特征从低级特征如边缘到高级特征如物体的形状。卷积层作用特征提取卷积层的主要作用是从输入图像中提取低级特征如边缘、角点、纹理等。通过多个卷积层的堆叠网络能够逐渐从低级特征到高级特征如物体的形状、区域等进行学习。权重共享在卷积层中同一个卷积核在整个输入图像上共享权重这使得卷积层的参数数量大大减少减少了计算量并提高了训练效率。局部连接卷积层中的每个神经元仅与输入图像的一个小局部区域相连这称为局部感受野这种局部连接方式更符合图像的空间结构有助于捕捉图像中的局部特征。空间不变性由于卷积操作是局部的并且采用权重共享卷积层在处理图像时具有平移不变性。也就是说不论物体出现在图像的哪个位置卷积层都能有效地检测到这些物体的特征。卷积计算卷积运算本质上就是在滤波器和输入数据的局部区域间做点积。input 表示输入的图像filter 表示卷积核, 也叫做滤波器(滤波矩阵)一组固定的权重因为每个神经元的多个权重固定所以又可以看做一个恒定的滤波器filter非严格意义上来讲下图中红框框起来的部分便可以理解为一个滤波器即带着一组固定权重的神经元。多个滤波器叠加便成了卷积层一个卷积核就是一个神经元input 经过 filter 得到输出为最右侧的图像该图叫做特征图具体来说左边是图像输入中间部分就是滤波器filter带着一组固定权重的神经元不同的滤波器filter会得到不同的输出数据比如颜色深浅、轮廓。相当于如果想提取图像的不同特征则用不同的滤波器filter提取想要的关于图像的特定信息颜色深浅或轮廓。Padding填充通过上面的卷积计算过程最终的特征图比原始图像小很多如果想要保持经过卷积后的图像大小不变, 可以在原图周围添加 Padding 来实现。Padding填充操作是一种用于在输入特征图的边界周围添加额外像素通常是零。Padding的主要作用保持空间维度如果不使用 padding每次卷积操作后特征图的尺寸都会缩小。多次卷积后特征图会变得非常小可能会丢失重要的边缘信息。Padding可以帮助维持输出特征图的尺寸与输入相同或接近相同。保留边缘信息图像边缘的像素在卷积过程中参与的计算次数较少这意味着边缘信息在特征提取过程中容易丢失。Padding通过在边缘添加额外的像素增加了边缘像素的参与度从而更好地保留了边缘信息。提高性能Padding有助于避免由于特征图尺寸快速缩小而导致的信息丢失从而提高模型的性能尤其是在处理较小的图像或需要进行多层卷积时。Padding的类型Valid Padding (No Padding):不进行任何填充。卷积核只在输入图像的有效区域内滑动。输出尺寸会缩小。Same Padding:添加足够的填充使得输出特征图的尺寸与输入相同。Full Padding:尽可能多地添加填充使得卷积核的每个元素都至少在输入图像上滑动一次。输出尺寸会增大。Padding的选择取决于具体的应用场景和网络架构Valid Padding:适用于不需要保持输出尺寸的场景或者输入图像足够大边缘信息丢失不重要的情况。Same Padding:广泛应用于各种CNN架构中因为它可以保持特征图的尺寸方便网络设计和计算。Full Padding:较少使用因为它会增加计算量并且可能会在边缘引入一些伪影。Stride步长Stride步长指的是卷积核在图像上滑动时的步伐大小即每次卷积时卷积核在图像中向右或向下移动的像素数。步长直接影响卷积操作后输出特征图的尺寸以及计算量和模型的特征提取能力。Stride的作用降低计算复杂度更大的步长意味着卷积核移动的次数更少从而减少了计算量并加快了训练和推理速度。步长越大生成的特征图尺寸越小。这类似于池化的降维效果。增大感受野虽然更大的步长会减小特征图的尺寸但它同时也会增大每个神经元在输入数据上的感受野。这意味着每个神经元能够捕捉到更大范围的输入信息。Stride的选择取决于具体的应用场景和网络架构Stride 1:这是最常见的设置尤其是在网络的早期层。它允许保留更多的空间细节。Stride 1:通常用于减小特征图的尺寸和增大感受野例如在网络的后期层或需要进行快速降维时。 常见的设置包括 stride2 或 stride4。按照步长为1来移动卷积核计算特征图如下所示多通道卷积计算实际中的图像都是多个通道组成的我们怎么计算卷积呢计算方法如下当输入有多个通道(Channel), 例如 RGB 三个通道, 此时要求卷积核需要拥有相同的通道数图像有多少通道每个卷积核就有多少通道.每个卷积核通道与对应的输入图像的各个通道进行卷积.将每个通道的卷积结果按位相加得到最终的特征图.多卷积核卷积计算上面的例子里我们只使用一个卷积核进行特征提取, 实际对图像进行特征提取时, 我们需要使用多个卷积核进行特征提取. 这个多个卷积核可以理解为从不同到的视角、不同的角度对图像特征进行提取.那么, 当使用多个卷积核时, 应该怎么进行特征提取呢?可以看到两个神经元意味着有两个滤波器数据窗口每次移动两个步长取3*3的局部数据即stride2zero-padding1。输入数据由5*5*3变为7*7*3左边是输入7*7*3中7*7代表图像的像素/长宽3代表R、G、B 三个颜色通道中间部分是两个不同的滤波器Filter w0、Filter w1最右边则是两个不同的输出特征图大小输出特征图的大小与以下参数息息相关:size: 卷积核/过滤器大小一般会选择为奇数比如有1*1,3*35*5Padding: 零填充的方式Stride: 步长那计算方法如下图所示:输入图像大小: W x W卷积核大小: F x FStride: SPadding: P输出图像大小: N x N图像大小: 5 x 5卷积核大小: 3 x 3Stride: 1Padding: 1(5 - 3 2) / 1 1 5如果除不尽向下取整, 即得到的特征图大小为: 5 x 5APIconv nn.Conv2d(in_channels, out_channels, kernel_size, stride, padding) 参数说明 in_channels: 输入通道数RGB图片一般是3 out_channels: 输出通道也可以理解为卷积核kernel的数量 kernel_size卷积核的高和宽设置一般为3,5,7... stride卷积核移动的步长 整数stride表示在所有维度上使用相同的步长 stride2 表示在水平和垂直方向上每次移动2个像素 元组stride: 允许在不同维度上设置不同的步长 stride(2, 1) 表示在水平方向上步长为2在垂直方向上步长为1 padding在四周加入padding的数量默认补0 padding0不进行填充。 padding1在每个维度上填充 1 个像素常用于保持输出尺寸与输入相同 padding输入形状大小-输出形状大小。 paddingsame从 PyTorch 1.9 开始支持让输出特征图的尺寸与输入保持一致。PyTorch会自动计算需要的填充量。stride必须等于1不支持跨行因为计算padding时可能出现小数 paddingkernel_size-1Full Padding 完全填充 池化层池化层Pooling Layer是用于降低输入数据的空间维度例如图像的高度和宽度从而减少计算量、减少内存消耗并提高模型的鲁棒性。池化层通常位于卷积层之后它通过对卷积层输出的特征图进行下采样保留最重要的特征信息同时丢弃一些不重要的细节。池化层的主要作用降维和计算量减少池化层通过减少特征图的尺寸从而降低了计算量特别是在多层网络中随着层数的增加池化能够显著减少计算资源的消耗。提高鲁棒性池化操作可以使得特征对小的变换、平移和旋转变得更加不敏感。这样模型在面对噪声或图像的轻微变化时依然能够稳定工作。防止过拟合通过池化减少了特征图的大小减少了模型的复杂度从而有助于防止过拟合尤其是在较小的数据集上。抽象特征通过池化层的操作可以提取更为抽象和高层次的特征使得网络能够学习到更具泛化能力的表示。池化层计算最大池化(Max Pooling) 通过池化窗口进行最大池化取窗口中的最大值作为输出平均池化(Avg Pooling) 取窗口内的所有值的均值作为输出Padding填充Stride步长多通道池化计算在处理多通道输入数据时池化层对每个输入通道分别池化而不是像卷积层那样将各个通道的输入相加。这意味着池化层的输出和输入的通道数是相等。池化只在宽高维度上池化在通道上是不发生池化池化前后多少个通道还是多少个通道API# 最大池化 nn.MaxPool2d(kernel_size2, stride2, padding1) # 平均池化 nn.AvgPool2d(kernel_size2, stride1, padding0) 参数说明 kernel_size核的高和宽设置一般为3,5,7... stride核移动的步长 padding在四周加入padding的数量默认补0 案例图像分类
返回列表