袜子技术支持北京网站建设,网站开发进度设计,温州网站推广价钱,WordPress出现归档目录
概要
一、概述
二、实现方法
1.转置卷积
2.反池化
3.双线性插值法 三、在经典网络中的的应用
1.U-Net
2.FCN
总结 概要
上采样是用于深度学习中提高语义分割精度的技术#xff0c;可以实现图像放大和像素级别标注 一、概述
神经网络的基本结构为#xff1a;…目录
概要
一、概述
二、实现方法
1.转置卷积
2.反池化
3.双线性插值法 三、在经典网络中的的应用
1.U-Net
2.FCN
总结 概要
上采样是用于深度学习中提高语义分割精度的技术可以实现图像放大和像素级别标注 一、概述
神经网络的基本结构为输入层-隐藏层-输出层。而在传统卷积神经网络中隐藏层往往由多个卷积层和池化层、激活函数层和批标准化层全连接层组成。而为了提高模型的泛化性能演变出了可以与卷积层或输出层结合使用的Dropout、softmax等技术。本文将以语义分割任务为背景通过分析U-net、FCN等经典网络结构介绍上采样(up-sampling)技术在神经网络模型中的应用。
传统卷积神经网络结构如图 输入图像经过多次卷积、池化等操作图像尺寸不算缩小最后在全连接层转化为向量经过处理如softmax等得到预测得分 W。这样的网络输出结果是一个数字或向量在分类问题中可以起到很好的效果但它存在以下问题 固定输入尺寸 传统CNN通常采用固定大小的输入图像在实际应用中可能需要对图像进行裁剪或缩放这会导致信息丢失或扭曲。 特征图分辨率损失 在传统CNN中随着网络层数的增加特征图的尺寸会逐渐减小导致分辨率损失。这会影响对图像中细节信息的捕获和重建。 语义信息丢失 传统CNN在进行卷积和池化操作时会丢失部分像素级别的细节信息导致对语义信息的表达不够准确。 上下文信息不足 传统CNN通常只关注局部区域的特征提取缺乏对整体上下文信息的充分利用导致在处理全局语义信息时效果不佳。 缺乏跳跃连接 传统CNN中各层之间通常是串行连接信息传递受限难以实现跳跃连接的功能而跳跃连接有助于提高网络的信息传递效率和性能。 如果说对传统端到端需求尚无太大影响的话这些缺陷在语义分割任务中的表现就不可谓不突出了。语义分割任务当中对原始图像的处理是模型构建面临的主要难题之一即如何实现对图片像素级的标注。
2014年Long等人发表了FCN网络结构。2015年为了解决生物医学图像分割问题Olaf Ronneberger等发表了《U-Net: Convolutional Networks for Biomedical Image Segmentation》在这篇文章中UNet网络结构中使用了一种称为转置卷积transpose convolution或反卷积deconvolution的上采样操作这使得网络能够将下采样后的特征图进行还原从而实现端到端的语义分割。U-Net标志着上采样技术在深度学习中的广泛应用开始兴起。
上采样(up-sampling)的逻辑思路是通过多种手段增加图像尺寸或恢复图像分辨率从而使模型的输出不是一个向量而是一张标注的热力图heatmap。事实上它可以看作是池化又称为下采样down-sampling)的逆向操作。
U-Net语义分割实现效果
总的来说与传统神经网络相比FCN和U-Net分别通过将全连接层替换为卷积层并进行反卷积操作 和 在图像压缩层后增加扩展层等手段实现上采样还原了因特征采集而缩小的图像尺寸实现了对图像分割精度的提高。
二、实现方法
我们知道下采样池化通过最大值池化、平均池化、概率池化等方式缩小图像尺寸实现特征提取下面我们介绍上采样的三种实现方案
1.转置卷积
转置卷积transpose convolution也称为反卷积deconvolution是一种常见的神经网络层用于实现上采样操作可以将一个单个值映射到一个较大的局部区域用于输入特征图的尺寸扩大。
转置卷积的操作本质上是通过学习参数来实现的通过学习卷积核来放大特征图。在转置卷积中输入特征图中的每个像素值都会被扩展到一个更大的区域通常使用插值或填充技术来实现。
转置卷积操作通常包括以下几个步骤 零填充Zero Padding在输入特征图的周围添加零值以增加输出特征图的大小。这样可以保持输出特征图的大小与输入特征图的大小相同。 扩展卷积核Expanded Convolution Kernel将卷积核进行扩展通常通过在卷积核中插入零值来实现。扩展后的卷积核的大小通常大于原始卷积核的大小。 正常的卷积操作将扩展后的卷积核应用于输入特征图执行常规的卷积操作生成输出特征图。 调整步长Adjusting Stride通过调整卷积操作的步长可以控制输出特征图的尺寸从而实现上采样的效果。 我们用最简单的手段在结果卷积得到的特征图像素周围填充0从而提高图像的分辨率
当然为了使图像的特征分布更合理我们可以将填充方法修改为在每个像素点周围补0
2.反池化
卷积时特征图尺寸会缩小我们采用了反卷积而针对池化我们也有类似的上采样手段。 其中最简单的如上图保留池化的区域在其他部分填充0。
3.双线性插值法
双线性插值法是一种常用的图像插值方法用于在已知离散采样点的图像上估计任意位置的像素值。这种方法假设在每个像素之间存在线性关系并且利用相邻四个像素的信息进行插值。 具体来说双线性插值法通过以下步骤进行
确定目标像素在原始图像中的位置并计算其在水平和垂直方向上的相对位置通常使用浮点数表示。找到目标像素周围的四个最近的像素点通常是左上、右上、左下和右下四个点。对这四个像素点的像素值进行加权平均其中权重是根据目标像素在水平和垂直方向上的相对位置计算得到的。通常使用的权重是与目标像素与相邻像素之间的距离成反比的。将加权平均值作为目标像素的插值结果。 简而言之双线性插值首先在x方向进行线性插值得到R1和R2然后在y方向进行线性插值得到P这样就得到所要的结果f(x,y)。 三、在经典网络中的的应用
1.U-Net 它包括一条收缩路径(左侧)和一条扩张路径(右侧)。 收缩路径遵循卷积网络的典型架构。它由两个3x3卷积(未填充卷积)的重复应用组成每个卷积后面都有一个整流线性单元(ReLU)和一个2x2 max池化操作步幅为2用于下采样在每个降采样步骤中我们将特征通道的数量加倍。 扩展路径中的每一步都包括特征映射的上采样2x2卷积(“反卷积”)将特征通道的数量减半与收缩路径中相应裁剪的特征映射进行连接以及两个3x3卷积每个卷积都有一个ReLU。由于在每次卷积中边界像素的损失裁剪是必要的。在最后一层使用1x1卷积将每个64个分量的特征向量映射到所需的类数这个网络总共有23个卷积层。 右侧进行反卷积上采样但因为卷积进行的下采样会导致部分边缘信息的丢失失去的特征并不能从上采样中找回因此作者采用了特征拼接操作来弥补后续FPN貌似是延用了这一思想通过横向连接将低分辨率语义强的特征和高分辨率语义弱的特征结合起来。
class deconv2d_bn(nn.Module):def __init__(self,in_channels,out_channels,kernel_size2,strides2):super(deconv2d_bn,self).__init__()self.conv1 nn.ConvTranspose2d(in_channels,out_channels,kernel_size kernel_size,stride strides,biasTrue)self.bn1 nn.BatchNorm2d(out_channels)def forward(self,x):out F.relu(self.bn1(self.conv1(x)))return out
上采样是通过 deconv2d_bn 类实现的。具体来说deconv2d_bn 类使用了 nn.ConvTranspose2d 这个 PyTorch 中的函数来进行上采样操作。在 U-Net 中上采样是通过反卷积转置卷积层实现的。
在 Unet 类的 forward 方法中你可以看到这样的部分代码
convt1 self.deconv1(conv5)
convt2 self.deconv2(conv6)
convt3 self.deconv3(conv7)
convt4 self.deconv4(conv8)这些部分使用了 deconv2d_bn 类来进行上采样操作将特征图的大小调整为原始输入图像的大小以便进行后续的特征融合和预测。
2.FCN
在FCN中典型的结构包括编码器Encoder和解码器Decoder部分。编码器部分通常由预训练的卷积神经网络如VGG、ResNet等组成用于提取输入图像的特征。然后解码器部分通过上采样操作将编码器部分得到的低分辨率特征图恢复到输入图像相同的分辨率从而得到像素级别的语义分割结果。
FCN通过转置卷积、双线性插值达到了以下效果 恢复空间信息在卷积过程中由于池化操作等因素图像的空间信息被逐渐丢失。上采样能够将特征图的分辨率提高从而恢复空间信息使网络更好地理解图像中的细节和结构。 提高分割精度在语义分割任务中精确的像素级别的预测非常重要。通过上采样可以获得更高分辨率的特征图从而提高分割的精度和准确性。 增加感受野通过上采样可以扩大特征图的大小使得每个像素点能够感知更广阔的上下文信息从而提高网络对图像的理解能力。 另一种连接粗糙输出到dense像素的方法就是插值法。比如简单的双线性插值计算每个输出y_ij来自只依赖输入和输出单元的相对位置的线性图最近的四个输入。 从某种意义上伴随因子f的上采样是对步长为1/f的分数式输入的卷积操作。只要f是整数一种自然的方法进行上采样就是向后卷积有时称为去卷积伴随输出步长为f。这样的操作实现是不重要的因为它只是简单的调换了卷积的顺推法和逆推法。所以上采样在网内通过计算像素级别的损失的反向传播用于端到端的学习。 需要注意的是去卷积滤波在这种层面上不需要被固定不变比如双线性上采样但是可以被学习。一堆反褶积层和激励函数甚至能学习一种非线性上采样。在我们的实验中我们发现在网内的上采样对于学习dense prediction是快速且有效的。我们最好的分割架构利用了这些层来学习上采样用以微调预测 class FCN(nn.Module):def __init__(self, out_channel21):super(FCN, self).__init__()#self.backbone models.resnet101(pretrainedTrue) #旧版本写法self.backbone models.resnet101(weights models.ResNet101_Weights.IMAGENET1K_V1)# 4倍下采样 256self.stage1 nn.Sequential(*list(self.backbone.children())[:-5])# 8倍下采样 512self.stage2 nn.Sequential(list(self.backbone.children())[-5])# 16倍下采样 1024self.stage3 nn.Sequential(list(self.backbone.children())[-4])# 32倍下采样 2048self.stage4 nn.Sequential(list(self.backbone.children())[-3])self.conv2048_256 nn.Conv2d(2048, 256, 1)self.conv1024_256 nn.Conv2d(1024, 256, 1)self.conv512_256 nn.Conv2d(512, 256, 1)self.upsample2x nn.Upsample(scale_factor2)self.upsample8x nn.Upsample(scale_factor8)self.outconv nn.Conv2d(256, out_channel, kernel_size3, stride1, padding1) 总结
以语义分割任务为背景通过分析U-net、FCN等经典网络结构介绍上采样(up-sampling)技术在神经网络模型中的应用