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

长沙公司建设网站网站需求分析与设计方案

长沙公司建设网站,网站需求分析与设计方案,应遵循哪些原则,软文代写兼职文章目录 一、简介二、网络结构2.1编码器部分2.2解码器部分2.3完整代码 三、实战案例 论文链接#xff1a;点击跳转 一、简介 UNet网络是一种用于图像分割的卷积神经网络#xff0c;其特点是采用了U型网络结构#xff0c;因此称为UNet。该网络具有编码器和解码器结构#… 文章目录 一、简介二、网络结构2.1编码器部分2.2解码器部分2.3完整代码 三、实战案例 论文链接点击跳转 一、简介 UNet网络是一种用于图像分割的卷积神经网络其特点是采用了U型网络结构因此称为UNet。该网络具有编码器和解码器结构两种结构的功能如下 编码器逐步提取输入图像的特征并降低空间分辨率。解码器通过上采样操作将特征图恢复到原始输入图像的尺寸并逐步生成分割结果。 【CNN角度的编码器、解码器】以卷积神经网络为例输入为一个猫进行特征提取后输出图片类别。 编码器完成对输入图片中猫的特征提取。解码器将特征提取的结果解码为分类结果。 【RNN角度的编码器、解码器】以循环神经网络LSTM为例输入为一个文本进行特征提取再输出 编码器将文本表示为向量并实现特征提取。解码器将向量转化为输出。 UNet算法的关键创新是在解码器中引入了跳跃连接Skip Connections即将编码器中的特征图与解码器中对应的特征图进行连接。这种跳跃连接可以帮助解码器更好地利用不同层次的特征信息从而提高图像分割的准确性和细节保留能力。 二、网络结构 UNet的设计思想是通过编码器逐渐提取丰富的低级特征和高级特征然后通过解码器逐渐恢复分辨率并将低级特征和高级特征进行融合以便获取准确且具有上下文信息的分割结果。这种U字形结构使得UNet能够同时利用全局高分辨率时的特征图和局部信息低分辨率时的特征图适用于图像分割任务。执行过程可粗略描述为 输入层 - 编码器下采样模块 编码器模块 - 解码器上采样模块 解码器模块- 输出层。 即 编码器Encoder部分 输入层接受输入图像作为模型的输入。下采样模块Downsampling Block由一系列卷积层通常是卷积、批归一化和激活函数的组合和池化层组成用于逐渐减小特征图的尺寸和通道数。这样可以逐渐提取出更高级别的特征信息。编码器模块Encoder Block重复使用多个下采样模块以便逐渐减小特征图的尺寸和通道数。每个编码器模块通常包含一个下采样模块和一个跳跃连接Skip Connection将上一级的特征图连接到下一级以便在解码器中进行特征融合。 解码器Decoder部分 上采样模块Upsampling Block由一系列上采样操作如反卷积或转置卷积和卷积操作组成用于逐渐增加特征图的尺寸和通道数。这样可以逐渐恢复分辨率并且保留更多的细节信息。解码器模块Decoder Block重复使用多个上采样模块以便逐渐增加特征图的尺寸和通道数。每个解码器模块通常包含一个上采样模块、一个跳跃连接和一个融合操作如拼接或加权求和用于将来自编码器的特征图与当前解码器的特征图进行融合。 输出层最后一层是一个卷积层用于生成最终的分割结果。通常输出层的通道数等于任务中的类别数并应用适当的激活函数如sigmoid或softmax以产生每个像素点属于各个类别的概率分布。 跳跃连接skip connection输入数据直接添加到网络某一层输出之上。这种设计使得信息可以更自由地流动并且保留了原始输入数据中的细节和语义信息。 使信息更容易传播到后面的层次避免了信息丢失。跳跃连接通常会通过求和操作或拼接操作来实现。 以图像分类任务为例假设我们使用卷积神经网络进行特征提取在每个卷积层后面都加入一个池化层来减小特征图尺寸。然而池化操作可能导致信息损失。通过添加一个跳跃连接将原始输入直接与最后一个池化层输出相加或拼接起来可以保留原始图像中更多的细节和语义信息。 2.1编码器部分 编码器部分由多个下采样模块down sampling step组成每个下采样模块都由两个卷积层卷积核大小为3x3且与ReLU函数配合使用。由于图像尺寸变小可见并未填充和一个最大池化层池化核大小2x2步幅为2将图像尺寸收缩一半组成并且每一次下采样操作后特征图的通道数均增加一倍。   事实上随着不断执行下采样模块也成为收缩路径特征图通道数随着卷积操作也不断增加从而获取了图像的更多特征。并且在进入下一下采样模块前进行 2x2 最大池化以获得最大像素值虽然丢失一些特征但保留最大像素值。通过这种方式可将图像中目标的像素按类别进行分割。每一下采样模块的实现代码如下 【第一个下采样模块】   卷积操作 self.conv1_1 nn.Conv2d(in_channels1, out_channels64, kernel_size3, stride1, padding0)#(572,572,1)-((572-31),(572-31),64)-(570,570,64)self.relu1_1 nn.ReLU(inplaceTrue)self.conv1_2 nn.Conv2d(64, 64, kernel_size3, stride1, padding0) # (570,570,64)-((570-31),(570-31),64)-(568,568,64)self.relu1_2 nn.ReLU(inplaceTrue)池化操作 #采用最大池化进行下采样图片大小减半通道数不变由(568,568,64)-(284,284,64) self.maxpool_1 nn.MaxPool2d(kernel_size2, stride2) 【第二个下采样模块】   卷积操作 self.conv2_1 nn.Conv2d(in_channels64, out_channels128, kernel_size3, stride1, padding0) #(284,284,64)-(282,282,128)self.relu2_1 nn.ReLU(inplaceTrue)self.conv2_2 nn.Conv2d(128, 128, kernel_size3, stride1, padding0) #(282,282,128)-(280,280,128)self.relu2_2 nn.ReLU(inplaceTrue)池化操作 # 采用最大池化进行下采样(280,280,128)-(140,140,128) self.maxpool_2 nn.MaxPool2d(kernel_size2, stride2) 编码器部分总代码 class Unet(nn.Module):def __init__(self):super(Unet, self).__init__()#第一个下采样模块self.conv1_1 nn.Conv2d(in_channels1, out_channels64, kernel_size3, stride1, padding0)self.relu1_1 nn.ReLU(inplaceTrue)self.conv1_2 nn.Conv2d(64, 64, kernel_size3, stride1, padding0) self.relu1_2 nn.ReLU(inplaceTrue)self.maxpool_1 nn.MaxPool2d(kernel_size2, stride2) #第二个下采样模块self.conv2_1 nn.Conv2d(in_channels64, out_channels128, kernel_size3, stride1, padding0) #(284,284,64)-(282,282,128)self.relu2_1 nn.ReLU(inplaceTrue)self.conv2_2 nn.Conv2d(128, 128, kernel_size3, stride1, padding0) #(282,282,128)-(280,280,128)self.relu2_2 nn.ReLU(inplaceTrue)self.maxpool_2 nn.MaxPool2d(kernel_size2, stride2) #第三个下采样模块self.conv3_1 nn.Conv2d(in_channels128, out_channels256, kernel_size3, stride1, padding0)self.relu3_1 nn.ReLU(inplaceTrue)self.conv3_2 nn.Conv2d(256, 256, kernel_size3, stride1, padding0)self.relu3_2 nn.ReLU(inplaceTrue)self.maxpool_3 nn.MaxPool2d(kernel_size2, stride2)#第四个下采样模块self.conv4_1 nn.Conv2d(in_channels256, out_channels512, kernel_size3, stride1, padding0)self.relu4_1 nn.ReLU(inplaceTrue)self.conv4_2 nn.Conv2d(512, 512, kernel_size3, stride1, padding0)self.relu4_2 nn.ReLU(inplaceTrue)self.maxpool_4 nn.MaxPool2d(kernel_size2, stride2) #第五个下采样模块self.conv5_1 nn.Conv2d(in_channels512, out_channels1024, kernel_size3, stride1, padding0) # 32*32*512-30*30*1024self.relu5_1 nn.ReLU(inplaceTrue)self.conv5_2 nn.Conv2d(1024, 1024, kernel_size3, stride1, padding0)self.relu5_2 nn.ReLU(inplaceTrue)在五个下采样操作后特征图大小变为 ( 28 , 28 , 1024 ) (28,28,1024) (28,28,1024)。 2.2解码器部分 up-conv 2x2上采样操作通过反卷积操作实现。copy and crop复制和裁剪将下采样模块输出的特征图进行复制和裁剪方便和上采样生成的特征图进行拼接。 下采样操作后虽然使用最大池化运算丢失了部分细节信息但模型已经得到了所有类的像素特征值。而在上采样中模型将特征图通过具有相同级别的上采样过滤器来将特征图恢复到原始的分辨率大小并通过跳跃连接的方式将下采样模块输出的每个特征图都添加到上采样模块的相应特征层中从而保留特征。最后通过完整的特征图即可定位每个类在图像中存在的位置从而实现类别的定位。 第一个上采样模块细节如下   最下面的下采样模块输出特征图大小为 ( 28 , 28 , 1024 ) (28,28,1024) (28,28,1024)经过反卷积操作up-conv 2x2得到大小为 ( 56 , 56 , 512 ) (56,56,512) (56,56,512)的特征图即尺寸扩大一倍通道数减半。之后将左侧下采样模块输出的 ( 64 , 64 , 512 ) (64,64,512) (64,64,512)图像进行复制并中心裁剪copy and crop同样转化为 ( 56 , 56 , 512 ) (56,56,512) (56,56,512)大小并与之拼接得到 ( 56 , 56 , 1024 ) (56,56,1024) (56,56,1024)大小的特征图可见此拼接仅是通道方向的拼接。代码实现 # 上采样中反卷积操作的实现 self.up_conv_1 nn.ConvTranspose2d(in_channels1024, out_channels512, kernel_size2, stride2, padding0) # 28*28*1024-56*56*512同理也可得到其他反卷积操作的实现 self.up_conv_2 nn.ConvTranspose2d(in_channels512, out_channels256, kernel_size2, stride2, padding0) # 52*52*512-104*104*256 self.up_conv_3 nn.ConvTranspose2d(in_channels256, out_channels128, kernel_size2, stride2, padding0) # 100*100*256-200*200*128 self.up_conv_4 nn.ConvTranspose2d(in_channels128, out_channels64, kernel_size2, stride2, padding0) # 196*196*128-392*392*64右半部分卷积操作的代码实现 【第一次卷积】 self.conv6_1 nn.Conv2d(in_channels1024, out_channels512, kernel_size3, stride1, padding0) # 56*56*1024-54*54*512self.relu6_1 nn.ReLU(inplaceTrue)self.conv6_2 nn.Conv2d(512, 512, kernel_size3, stride1, padding0) # 54*54*512-52*52*512self.relu6_2 nn.ReLU(inplaceTrue)【第二次卷积】 self.conv7_1 nn.Conv2d(in_channels512, out_channels256, kernel_size3, stride1, padding0) # 104*104*512-102*102*256self.relu7_1 nn.ReLU(inplaceTrue)self.conv7_2 nn.Conv2d(256, 256, kernel_size3, stride1, padding0) # 102*102*256-100*100*256self.relu7_2 nn.ReLU(inplaceTrue)【第三次卷积】 self.conv8_1 nn.Conv2d(in_channels256, out_channels128, kernel_size3, stride1, padding0) # 200*200*256-198*198*128self.relu8_1 nn.ReLU(inplaceTrue)self.conv8_2 nn.Conv2d(128, 128, kernel_size3, stride1, padding0) # 198*198*128-196*196*128self.relu8_2 nn.ReLU(inplaceTrue)【第四次卷积】 self.conv9_1 nn.Conv2d(in_channels128, out_channels64, kernel_size3, stride1, padding0) # 392*392*128-390*390*64self.relu9_1 nn.ReLU(inplaceTrue)self.conv9_2 nn.Conv2d(64, 64, kernel_size3, stride1, padding0) # 390*390*64-388*388*64self.relu9_2 nn.ReLU(inplaceTrue)【第五次卷积】 # 最后的conv1*1self.conv_10 nn.Conv2d(in_channels64, out_channels2, kernel_size1, stride1, padding0) #64x388x388-2x388x388中心裁剪操作的实现 # 中心裁剪def crop_tensor(self, tensor, target_tensor):target_size target_tensor.size()[2]tensor_size tensor.size()[2]delta tensor_size - target_sizedelta delta // 2# 如果原始张量的尺寸为10而delta为2那么delta:tensor_size - delta将截取从索引2到索引8的部分长度为6以使得截取后的张量尺寸变为6。return tensor[:, :, delta:tensor_size - delta, delta:tensor_size - delta]【第一次上采样拼接】 # 第一次上采样需要Copy and crop复制并裁剪up1 self.up_conv_1(x10) # 得到56*56*512# 需要对x8进行裁剪从中心往外裁剪crop1 self.crop_tensor(x8, up1)# 拼接操作up_1 torch.cat([crop1, up1], dim1)【第二次上采样拼接】 # 第二次上采样需要Copy and crop复制并裁剪up2 self.up_conv_2(y2)# 需要对x6进行裁剪从中心往外裁剪crop2 self.crop_tensor(x6, up2)# 拼接up_2 torch.cat([crop2, up2], dim1)【第三次上采样拼接】 # 第三次上采样需要Copy and crop复制并裁剪up3 self.up_conv_3(y4)# 需要对x4进行裁剪从中心往外裁剪crop3 self.crop_tensor(x4, up3)up_3 torch.cat([crop3, up3], dim1)【第四次上采样拼接】 # 第四次上采样需要Copy and crop复制并裁剪up4 self.up_conv_4(y6)# 需要对x2进行裁剪从中心往外裁剪crop4 self.crop_tensor(x2, up4)up_4 torch.cat([crop4, up4], dim1)2.3完整代码 import torch import torch.nn as nnclass Unet(nn.Module):def __init__(self):super(Unet, self).__init__()self.conv1_1 nn.Conv2d(in_channels1, out_channels64, kernel_size3, stride1, padding0) # 由572*572*1变成了570*570*64self.relu1_1 nn.ReLU(inplaceTrue)self.conv1_2 nn.Conv2d(64, 64, kernel_size3, stride1, padding0) # 由570*570*64变成了568*568*64self.relu1_2 nn.ReLU(inplaceTrue)self.maxpool_1 nn.MaxPool2d(kernel_size2, stride2) # 采用最大池化进行下采样图片大小减半通道数不变由568*568*64变成284*284*64self.conv2_1 nn.Conv2d(in_channels64, out_channels128, kernel_size3, stride1, padding0) # 284*284*64-282*282*128self.relu2_1 nn.ReLU(inplaceTrue)self.conv2_2 nn.Conv2d(128, 128, kernel_size3, stride1, padding0) # 282*282*128-280*280*128self.relu2_2 nn.ReLU(inplaceTrue)self.maxpool_2 nn.MaxPool2d(kernel_size2, stride2) # 采用最大池化进行下采样 280*280*128-140*140*128self.conv3_1 nn.Conv2d(in_channels128, out_channels256, kernel_size3, stride1, padding0) # 140*140*128-138*138*256self.relu3_1 nn.ReLU(inplaceTrue)self.conv3_2 nn.Conv2d(256, 256, kernel_size3, stride1, padding0) # 138*138*256-136*136*256self.relu3_2 nn.ReLU(inplaceTrue)self.maxpool_3 nn.MaxPool2d(kernel_size2, stride2) # 采用最大池化进行下采样 136*136*256-68*68*256self.conv4_1 nn.Conv2d(in_channels256, out_channels512, kernel_size3, stride1, padding0) # 68*68*256-66*66*512self.relu4_1 nn.ReLU(inplaceTrue)self.conv4_2 nn.Conv2d(512, 512, kernel_size3, stride1, padding0) # 66*66*512-64*64*512self.relu4_2 nn.ReLU(inplaceTrue)self.maxpool_4 nn.MaxPool2d(kernel_size2, stride2) # 采用最大池化进行下采样 64*64*512-32*32*512self.conv5_1 nn.Conv2d(in_channels512, out_channels1024, kernel_size3, stride1, padding0) # 32*32*512-30*30*1024self.relu5_1 nn.ReLU(inplaceTrue)self.conv5_2 nn.Conv2d(1024, 1024, kernel_size3, stride1, padding0) # 30*30*1024-28*28*1024self.relu5_2 nn.ReLU(inplaceTrue)# 接下来实现上采样中的up-conv2*2self.up_conv_1 nn.ConvTranspose2d(in_channels1024, out_channels512, kernel_size2, stride2, padding0) # 28*28*1024-56*56*512self.conv6_1 nn.Conv2d(in_channels1024, out_channels512, kernel_size3, stride1, padding0) # 56*56*1024-54*54*512self.relu6_1 nn.ReLU(inplaceTrue)self.conv6_2 nn.Conv2d(512, 512, kernel_size3, stride1, padding0) # 54*54*512-52*52*512self.relu6_2 nn.ReLU(inplaceTrue)self.up_conv_2 nn.ConvTranspose2d(in_channels512, out_channels256, kernel_size2, stride2, padding0) # 52*52*512-104*104*256self.conv7_1 nn.Conv2d(in_channels512, out_channels256, kernel_size3, stride1, padding0) # 104*104*512-102*102*256self.relu7_1 nn.ReLU(inplaceTrue)self.conv7_2 nn.Conv2d(256, 256, kernel_size3, stride1, padding0) # 102*102*256-100*100*256self.relu7_2 nn.ReLU(inplaceTrue)self.up_conv_3 nn.ConvTranspose2d(in_channels256, out_channels128, kernel_size2, stride2, padding0) # 100*100*256-200*200*128self.conv8_1 nn.Conv2d(in_channels256, out_channels128, kernel_size3, stride1, padding0) # 200*200*256-198*198*128self.relu8_1 nn.ReLU(inplaceTrue)self.conv8_2 nn.Conv2d(128, 128, kernel_size3, stride1, padding0) # 198*198*128-196*196*128self.relu8_2 nn.ReLU(inplaceTrue)self.up_conv_4 nn.ConvTranspose2d(in_channels128, out_channels64, kernel_size2, stride2, padding0) # 196*196*128-392*392*64self.conv9_1 nn.Conv2d(in_channels128, out_channels64, kernel_size3, stride1, padding0) # 392*392*128-390*390*64self.relu9_1 nn.ReLU(inplaceTrue)self.conv9_2 nn.Conv2d(64, 64, kernel_size3, stride1, padding0) # 390*390*64-388*388*64self.relu9_2 nn.ReLU(inplaceTrue)# 最后的conv1*1self.conv_10 nn.Conv2d(in_channels64, out_channels2, kernel_size1, stride1, padding0)# 中心裁剪def crop_tensor(self, tensor, target_tensor):target_size target_tensor.size()[2]tensor_size tensor.size()[2]delta tensor_size - target_sizedelta delta // 2# 如果原始张量的尺寸为10而delta为2那么delta:tensor_size - delta将截取从索引2到索引8的部分长度为6以使得截取后的张量尺寸变为6。return tensor[:, :, delta:tensor_size - delta, delta:tensor_size - delta]def forward(self, x):x1 self.conv1_1(x)x1 self.relu1_1(x1)x2 self.conv1_2(x1)x2 self.relu1_2(x2) # 这个后续需要使用down1 self.maxpool_1(x2)x3 self.conv2_1(down1)x3 self.relu2_1(x3)x4 self.conv2_2(x3)x4 self.relu2_2(x4) # 这个后续需要使用down2 self.maxpool_2(x4)x5 self.conv3_1(down2)x5 self.relu3_1(x5)x6 self.conv3_2(x5)x6 self.relu3_2(x6) # 这个后续需要使用down3 self.maxpool_3(x6)x7 self.conv4_1(down3)x7 self.relu4_1(x7)x8 self.conv4_2(x7)x8 self.relu4_2(x8) # 这个后续需要使用down4 self.maxpool_4(x8)x9 self.conv5_1(down4)x9 self.relu5_1(x9)x10 self.conv5_2(x9)x10 self.relu5_2(x10)# 第一次上采样需要Copy and crop复制并裁剪up1 self.up_conv_1(x10) # 得到56*56*512# 需要对x8进行裁剪从中心往外裁剪crop1 self.crop_tensor(x8, up1)up_1 torch.cat([crop1, up1], dim1)y1 self.conv6_1(up_1)y1 self.relu6_1(y1)y2 self.conv6_2(y1)y2 self.relu6_2(y2)# 第二次上采样需要Copy and crop复制并裁剪up2 self.up_conv_2(y2)# 需要对x6进行裁剪从中心往外裁剪crop2 self.crop_tensor(x6, up2)up_2 torch.cat([crop2, up2], dim1)y3 self.conv7_1(up_2)y3 self.relu7_1(y3)y4 self.conv7_2(y3)y4 self.relu7_2(y4)# 第三次上采样需要Copy and crop复制并裁剪up3 self.up_conv_3(y4)# 需要对x4进行裁剪从中心往外裁剪crop3 self.crop_tensor(x4, up3)up_3 torch.cat([crop3, up3], dim1)y5 self.conv8_1(up_3)y5 self.relu8_1(y5)y6 self.conv8_2(y5)y6 self.relu8_2(y6)# 第四次上采样需要Copy and crop复制并裁剪up4 self.up_conv_4(y6)# 需要对x2进行裁剪从中心往外裁剪crop4 self.crop_tensor(x2, up4)up_4 torch.cat([crop4, up4], dim1)y7 self.conv9_1(up_4)y7 self.relu9_1(y7)y8 self.conv9_2(y7)y8 self.relu9_2(y8)# 最后的conv1*1out self.conv_10(y8)return out if __name__ __main__:input_data torch.randn([1, 1, 572, 572])unet Unet()output unet(input_data)print(output.shape)# torch.Size([1, 2, 388, 388])三、实战案例 准备复现论文点击跳转、点击跳转   准备复现项目点击跳转
http://www.w-s-a.com/news/281215/

相关文章:

  • 网上建立网站赚钱网站建设方案书纯文字
  • 专业网站设计哪家好it外包合同模板
  • 个人网站备案都需要什么中小企业服务网
  • 佛山网站建设哪个在公司网站投简历该怎么做
  • 八戒网站做推广老域名全部失效请拿笔记好
  • iss服务器网站建设甘肃建设厅网站执业注册中心
  • 域名访问网站 过程网站 免费 托管运营
  • 下单的网站建设教程wordpress php7.1
  • 爱网站查询怎么做网站的图片跳转
  • 阿里云建站百度收录吗北京的设计公司排名
  • 网站制作方案包含哪些内容布吉网站建设方案
  • 吉林省建设安全信息网站宜宾市建设工程质量监督站网站
  • 镇江网站建设远航网络帝国cms 网站地图 自定义
  • 金融网站模板源代码net网站是国际域名吗
  • 北京高端网站建设价格企业网络托管公司
  • 规范门户网站建设没有网站可以做域名解析吗
  • pc 手机网站源码织梦网站修改教程视频教程
  • 江苏省建设厅副厅长网站济南网络建站模板
  • 工信部网站备案举报做网站竞争大吗
  • 网站建设经费管理注册了域名怎么做网站
  • 哪个着陆页网站福田做网站的公司
  • 网站备案完成后该如何做宁波公司网站建设价格
  • 标识标牌网站怎么做手机网站开发session
  • 怎样建设网站是什么样的广州做和改版网站的公司
  • 世界网站制作帮助做职业规划的网站
  • wordpress 查看站点ppt素材大全免费图片
  • 网站做弹幕广告有什么兼职做it的网站
  • 什么公司做网站出名广州做外贸网站公司
  • 源码网站取名企业网站怎么做百度
  • 织梦网站如何打通百度小程序深圳网站设计灵点网络品牌