图像分割算法Unet中的上采样(反卷积)

本文详细介绍了Unet模型在语义分割中的工作原理,重点讨论了下采样和上采样的过程。下采样通过卷积、批量归一化和ReLU激活函数提取特征;上采样则采用可学习的反卷积网络,以恢复图像的特征。早期的上采样方法如填充0或最近邻插值存在局限,而学习型反卷积使得网络能够训练上采样过程,提高了语义分割的准确性。文章还通过实例解释了卷积运算的计算过程,并指出反卷积并非完全逆运算,主要用于恢复图像维度而非像素。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在Unet模型当中,是先通过四个下采样提取目标特征,再通过四个上采样,然后挨个对特征当中的每一个像素点进行分类,从而达到语义分割的目的。

下采样的过程,就是很传统的卷积神经网络的卷积层,先通过Conv2D进行卷积,然后BatchNormalization进行批量正则化,然后进Relu激活函数层。其中核心算法就是卷积的过程,通过卷积核在图像上移动,得到结果。

而上采样的过程是一个反卷积的过程,在早期的语义分割任务中,网络模型涉及到上采样操作,最常见的就是通过填充0或者最近邻插值的方式来完成上采样。这种方法简单粗暴但是缺点也很明显,没有办法实现图像的还原,整个过程不可学习。

在ICCV 2015年的《Learning Deconvolution Network for Semantic Segmentation》论文中提出了可学习的反卷积网络,不再通过填充0或者最近邻插值方法来完成上采样,让整个过程变成可学习,在图像语义分割网络中实现了对上采样过程的训练。在论文中提到的反卷积,更加准确的说法应该是转置卷积。

卷积的过程 

   

在4*4的二维矩阵D中,使用一个3*3的卷积核,得到的结果是一个2*2的矩阵,结果为

 |12     12|

 |10     17|

其运算过程为

(0,0) 120x3+1x3+2x2+2x0+2x0+0x1+0x3+1x1+2x2=12
(0,1) 120x3+1x2+2x1+2x0+2x1+0x3+0x1+1x2+2x2=12
(1,0) 100x0+1x0+2x1+2x3+2x1+0x2+0x2+1x0+2x0=10
(1,1) 170x0+1x1+2x3+2x1+2x2+0x2+0x0+1x0+2x2=17

其运算过程,就是卷积核在矩阵上对应位置点乘线性组合得到的输出。

卷积计算可以看做是参数矩阵和输入矩阵相乘,Y是输出,C是参数矩阵,X是输入矩阵

然而反卷积其实就是通过X,去乘以一个相同的参数矩阵的转置,得到Y。

 

 这里需要注意的是,反卷积只是为了恢复图像维度,而不是为了恢复图像像素,只是恢复了图像的部分特征,所以并不是完全的逆运算,反卷积实质还是一种卷积。

参考:

https://iksinc.online/2017/05/06/deconvolution-in-deep-learning/

### U-Net卷积神经网络概述 U-Net是一种专为生物医学图像分割设计的卷积神经网络架构[^1]。该网络由两个主要部分组成:收缩路径(Contracting Path)和扩展路径(Expansive Path)。收缩路径负责捕捉上下文信息,而扩展路径则有助于精确定位。 #### 收缩路径(Encoder) 在网络的左侧,即编码器部分,每一层都执行两次3×3的卷积操作,每次卷积后跟有ReLU激活函数以及一次最大池化操作。这些操作能够有效地提取特征并减少空间维度: ```python import torch.nn as nn class DoubleConv(nn.Module): def __init__(self, in_channels, out_channels): super(DoubleConv, self).__init__() self.conv = nn.Sequential( nn.Conv2d(in_channels, out_channels, kernel_size=3, padding=1), nn.BatchNorm2d(out_channels), # 批量归一化可以稳定和加速训练过程[^3] nn.ReLU(inplace=True), nn.Conv2d(out_channels, out_channels, kernel_size=3, padding=1), nn.BatchNorm2d(out_channels), nn.ReLU(inplace=True) ) def forward(self, x): return self.conv(x) def downsample_block(input_features, output_features): conv_layer = DoubleConv(input_features, output_features) max_pool = nn.MaxPool2d(kernel_size=2, stride=2) class DownBlock(nn.Module): def __init__(self): super().__init__() self.maxpool_conv = nn.Sequential(max_pool, conv_layer) def forward(self, x): return self.maxpool_conv(x) return DownBlock() ``` #### 扩展路径(Decoder) 右侧解码器部分通过一系列转置卷积(也称为反卷积)逐步恢复原始的空间分辨率。每一步都会将当前特征图与来自相应编码阶段的裁剪特征图连接起来,从而保留更多细节信息[^2]。 ```python from typing import List def upsample_block(input_features, skip_connection_features, output_features): transposed_conv = nn.ConvTranspose2d(input_features, input_features // 2, kernel_size=2, stride=2) double_conv = DoubleConv(skip_connection_features, output_features) class UpBlock(nn.Module): def __init__(self): super().__init__() self.up = transposed_conv self.conv = double_conv def center_crop_and_concatenate(self, layer_to_upsample, cropped_encoder_output): diffY = cropped_encoder_output.size()[2] - layer_to_upsample.size()[2] diffX = cropped_encoder_output.size()[3] - layer_to_upsample.size()[3] x1 = F.pad(layer_to_upsample, [-diffX // 2, -(diffX - diffX // 2), -diffY // 2, -(diffY - diffY // 2)]) return torch.cat([cropped_encoder_output, x1], dim=1) def forward(self, x, encoder_feature_map): upscaled_x = self.up(x) concatenated_input = self.center_crop_and_concatenate(upscaled_x, encoder_feature_map) return self.conv(concatenated_input) return UpBlock() ``` #### 输出层 最终,在最后一层应用了一个1x1的卷积来映射到所需的类别数量,并通常采用softmax或其他适合分类任务的激活函数作为输出。 ```python final_conv = nn.Conv2d(last_decoder_out_channels, num_classes, kernel_size=1) output_activation = nn.Softmax(dim=1) if is_multiclass else nn.Sigmoid() class OutputLayer(nn.Module): def __init__(self): super(OutputLayer, self).__init__() self.final_conv = final_conv self.activation = output_activation def forward(self, x): logits = self.final_conv(x) probabilities = self.activation(logits) return probabilities ```
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值