U-Net学习

部署运行你感兴趣的模型镜像

1.U-Net介绍

U-Net的提出是为了解决医疗图像中的问题。

1.1 网络结构

UNet网络是Encoder-Decoder的结构。 左边为Encoder,进行卷积与池化来减低维度;右边为Decoder,进行卷积与上采样来提升维度。

  • 蓝色箭头:卷积操作,卷积核=3x3,padding=0,步长=1,使用ReLU激活函数
  • 红色箭头:最大池化,卷积核=2x2
  • 灰色箭头:复制与拼接
  • 绿色箭头:转置卷积,卷积核=2x2,也就是两倍上采样
  • 墨绿色箭头:卷积操作,卷积核=1x1,卷积核个数=分类个数,步长=1,

在这里插入图片描述

1.2. Encoder

Encoder部分的执行过程如图所示,可以分为四层,每层包含两个卷积层,而且卷积核的个数在倍增。
经过卷积层,图像的高宽会减少2;经过池化层,图像的高宽会减少一半。
在这里插入图片描述

1.3. Decoder

在Decoder部分会进行卷积与转置卷积(上采样),流程如图所示。可以分为四层,每层包含两个卷积层,而且卷积核的个数在倍减。经过卷积层,图像的高宽会减少2;

层与层之间使用转置卷积进行上采样,转置卷积会让图像的高宽放大两倍,而通道数减半。
经过转置卷积后,会从Encoder部分的对应层中的中心截取与上采样后的图像大小相同的部分,并且与上采样后的图像进行拼接使得通道数翻倍,但图像的高宽没有发生改变

最后会使用1x1的卷积核进行卷积操作,卷积核个数=分类个数。

在这里插入图片描述
注意,最后输出的图像大小与输入的图像大小是不一样的,这是因为卷积操作会使得图像缩小。如图所示,输出的图像只是黄色框。
在这里插入图片描述

1.4 改进

  1. 在原始的UNet中,输出的图像大小会小于输入的图像,这是因为进行卷积操作时padding=0,会导致图像缩小,因此现在的技术会在进行卷积时进行padding来保证输出图像不会缩小。
  2. 对于高分辨率的图像,一次性全部输入到模型时不合理,因此需要切分。在切分过程中,会让相邻的区域有一定的重叠(overlap),来保证边缘区域的效果。
  3. 对于位于两个物体之间的背景区域给予更高的权重,这样在热力图中就更加明显。
    在这里插入图片描述

您可能感兴趣的与本文相关的镜像

Seed-Coder-8B-Base

Seed-Coder-8B-Base

文本生成
Seed-Coder

Seed-Coder是一个功能强大、透明、参数高效的 8B 级开源代码模型系列,包括基础变体、指导变体和推理变体,由字节团队开源

U-net是一种在图像分割领域广泛应用的卷积神经网络,以下是一个U-net学习路线: ### 基础理论学习 - **了解图像分割概念**:图像分割是将图像中具有特殊含义的不同区域区分开来,U-net主要用于语义分割,即对图像中每个像素进行分类。 - **学习卷积神经网络基础**:掌握卷积层、池化层、全连接层等基本概念,理解神经网络的前向传播和反向传播过程。 - **熟悉U-net基本原理**:U-net是一种对称的编码器 - 解码器结构,编码器用于特征提取,解码器用于恢复图像的空间分辨率。U-net++是在深度为4层的U-net基础上,把1 - 3层的U-net也全部组合到一起,能将每个深度的训练效果相互融合补充,对图像进行更精确分割[^1]。 ### 代码实践 - **学习Python和深度学习框架**:Python是深度学习中最常用的编程语言,深度学习框架如TensorFlow、PyTorch等提供了丰富的工具和函数来构建和训练神经网络- **实现U-net网络结构**:参考开源代码,自己动手实现U-net网络,理解网络中各个模块的具体实现方式。 - **进行图像分割任务实践**:可以使用公开的图像分割数据集,如PHC - U373和DIC HELA数据集等,进行模型的训练和测试,观察模型的性能表现[^3]。 ### 应用拓展 - **了解U-net在不同领域的应用**:U-net在医学图像分割、遥感图像分割等领域都有广泛应用。例如在医学方面,由于样本收集困难,U-net应用图像增强方法,在数据集有限的情况下获得了不错的精度;在遥感领域,可使用Sentinel - 2和CNN(U - Net)进行森林砍伐分析的语义分割等[^2][^4]。 - **尝试改进U-net模型**:如学习U-net++等改进版本的结构,了解如何通过改进网络结构来提高模型性能。 ### 深入研究 - **阅读相关学术论文**:深入了解U-net的发展历程和最新研究成果,学习如何在理论层面上对模型进行优化。 - **参与相关科研项目或竞赛**:通过实际项目和竞赛,进一步提升自己的能力和水平。 以下是一个简单的使用PyTorch实现U-net部分结构的代码示例: ```python import torch import torch.nn as nn class DoubleConv(nn.Module): def __init__(self, in_channels, out_channels): super().__init__() self.conv = nn.Sequential( nn.Conv2d(in_channels, out_channels, 3, 1, 1, bias=False), nn.BatchNorm2d(out_channels), nn.ReLU(inplace=True), nn.Conv2d(out_channels, out_channels, 3, 1, 1, bias=False), nn.BatchNorm2d(out_channels), nn.ReLU(inplace=True) ) def forward(self, x): return self.conv(x) class UNET(nn.Module): def __init__( self, in_channels=3, out_channels=1, features=[64, 128, 256, 512] ): super().__init__() self.ups = nn.ModuleList() self.downs = nn.ModuleList() self.pool = nn.MaxPool2d(kernel_size=2, stride=2) # Down part of UNET for feature in features: self.downs.append(DoubleConv(in_channels, feature)) in_channels = feature # Up part of UNET for feature in reversed(features): self.ups.append( nn.ConvTranspose2d( feature*2, feature, kernel_size=2, stride=2, ) ) self.ups.append(DoubleConv(feature*2, feature)) self.bottleneck = DoubleConv(features[-1], features[-1]*2) self.final_conv = nn.Conv2d(features[0], out_channels, kernel_size=1) def forward(self, x): skip_connections = [] for down in self.downs: x = down(x) skip_connections.append(x) x = self.pool(x) x = self.bottleneck(x) skip_connections = skip_connections[::-1] for idx in range(0, len(self.ups), 2): x = self.ups[idx](x) skip_connection = skip_connections[idx//2] if x.shape != skip_connection.shape: x = nn.functional.interpolate(x, size=skip_connection.shape[2:], mode='bilinear', align_corners=True) concat_skip = torch.cat((skip_connection, x), dim=1) x = self.ups[idx+1](concat_skip) return self.final_conv(x) ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值