U-net学习笔记

目录

前言

U-net简介

U-net网络架构理解

输入与输出说明

下采样

上采样以及输出

U-net的特点

谷歌Colab复现基于U-Net的眼底图像血管分割

1.环境配置

 2.数据获取及其处理

3.代码框架

3.1 数据预处理:

3.2 数据增强:

 3.3 U-net网络代码:

3.4 代码运行结果

总结

前言

        本文只是记录自己的学习过程,并不是面向技术向的硬核文章。

U-net简介

         U-net首见于这篇论文U-Net: Convolutional Networks for Biomedical,距今7年,算是比较老的模型了,但是它的引用量突破了四万,由此看来,它的重要性不言而喻。U-net初始论文的标题就告诉我们,它是一个用于医学图像分割的卷积神经网络。在医学领域,如果仅仅对图像进行分类,这是不够的。医生在对病人进行医疗诊断时,需要综合更多的信息来得出病情的判断。

        所以,U-net做的事就是,在已有图像类别的基础上,对图像进行进一步分类---即像素这一级别的分类(图像分割),定位每个像素的类别,使图像中解剖或病理结构的变化更加清晰,最后输出根据像素点的类别而分割好的图像。

U-net网络架构理解

论文中的U-net网络架构如下:

# 上图图标以及操作讲解
蓝色图标:3*3 卷积操作 pad = 0 stride = 1  + ReLU激活函数(稀疏激活、收敛速度快、梯度计算简单)

红色图标:2*2 最大池化操作 pad = 0 stride = 2 下采样
# 每次下采样步骤后通道数翻倍,即64--->128--->256--->512--->1024  共四步

## 反卷积
反卷积本质还是卷积,并不是卷积的逆操作,而且也无法还原成原来的图像,只能还原图像的大小
绿色图标:up-Conv 上采样,每次上采样图像大小翻倍,通道数减半

青色图标:Conv 1*1 2个1×1的卷积核把64个特征通道变成2个,也就是最后的388×388×2,这里就是一个二分类的操作,
把图片分成背景和目标两个类别。

灰色图标:对左边下采样得到的特征图进行裁剪复制,与右边对应通道数的上采样输出特征图合并。

说明:在卷积过程中,我们会丢失边缘像素信息,此外,而上采样并不能恢复图像,只能恢复大小,所以需要复制
左边的特征图然后再和右边的特征图合并,弥补缺失的信息,使得最终结果更加准确。

#同样,上采样也是有四步,特点是,图像大小翻倍,通道数减半

        可以看到图中U-net的网络结构呈U形,左半部分我们称之为编码器,右半部分我们称之为解码器。编码器将图片不断压缩,分辨率变得越来越低,解码器将图像分辨率不断还原,分辨率逐步升高。下面我们针对上图,对网络操作流程进行说明。

输入与输出说明

        我们的输入图像大小为572,572单通道,输出为388,388二通道。图像分割不应该原图和输出图片大小一样吗?实质上,U-net这边做的处理是,根据预先设置的输出图像大小,然后对输入图像进行镜像填充。具体怎么做的呢?

        如上图所示,预测的分割区域在黄色区域,蓝色区域作为输入,提供更多的局部信息,但实质上我们是没有那么大的蓝色区域的,所以缺失的数据就以镜像的方式被填充了。这样的操作会带来图像重叠问题,即某一图像的周围可能会和另一张图片重叠。因此作者在卷积时只使用有效部分。

下采样

        网络左半部分为下采样,一共有四步。

#input 572*572*1 ---(卷积)--->570*570*64(ReLu激活)---(卷积)--->568*568*64(ReLu)激活
下采样
step1:568*568*64---(max pooling)--->284*284*128---(卷积)--->282*282*128(ReLu激活)---
(卷积)--->280*280*128(ReLu激活)
之后的三步与step1类似

上采样以及输出

        网络右半部分为上采样,同样有四步,与左半部分不同的是,它每次进行上采样采用的都是反卷积(pytorch总的transpose函数即可实现),而且每次都会引入裁剪后高分辨率的图像信息。

step1:28*28*1024---(反卷积)--->56*56*512+左半部分64*64*512---(裁剪合并)=56*56*1024
 ---(卷积)--->54*54*512(ReLu激活)---(卷积)--->52*52*512(ReLu激活)
 接下来三步与上面一步类似
 
 1*1Conv:
 388*388*64--->388*388*2 将前景和背景分割出来,变成一个二分类问题

### 3D U-Net 的概述 3D U-Net 是一种基于卷积神经网络 (CNN) 的架构,专为三维医学影像分割设计。它扩展了经典的二维 U-Net 架构,在处理体积数据时表现出优异性能[^1]。通过引入更深的层次结构以及跳跃连接机制,该模型能够有效捕捉空间上下文特征并保持高分辨率细节。 以下是有关 3D U-Net 实现、教程及其在医疗成像中的应用案例的具体说明: --- ### 3D U-Net 的实现方式 #### 数据预处理 为了适应 3D 卷积操作的要求,输入数据通常需要经过标准化和裁剪等预处理步骤。具体而言: - 将原始 CT 或 MRI 扫描转换为统一大小的体素网格。 - 对像素强度值进行归一化以提高训练稳定性。 ```python import numpy as np from skimage.transform import resize def preprocess_data(volume, target_shape=(128, 128, 64)): """Resize and normalize the input volume.""" resized_volume = resize( volume, target_shape, mode='constant', anti_aliasing=True ) normalized_volume = (resized_volume - np.min(resized_volume)) / (np.max(resized_volume) - np.min(resized_volume)) return normalized_volume[..., None] # Add channel dimension for CNN compatibility. ``` 此代码片段展示了如何调整输入数据形状以便于后续建模过程。 #### 模型定义 构建一个典型的 3D U-Net 结构涉及多个编码器层与解码器层之间的交互作用。下面给出了一种简化版本的设计方案: ```python from tensorflow.keras.layers import Input, Conv3D, MaxPooling3D, UpSampling3D, concatenate from tensorflow.keras.models import Model def create_3d_unet(input_size=(128, 128, 64, 1), num_classes=2): inputs = Input(input_size) conv1 = Conv3D(32, kernel_size=3, activation='relu', padding='same')(inputs) pool1 = MaxPooling3D(pool_size=(2, 2, 2))(conv1) conv2 = Conv3D(64, kernel_size=3, activation='relu', padding='same')(pool1) pool2 = MaxPooling3D(pool_size=(2, 2, 2))(conv2) bridge = Conv3D(128, kernel_size=3, activation='relu', padding='same')(pool2) up1 = UpSampling3D(size=(2, 2, 2))(bridge) concat1 = concatenate([up1, conv2], axis=-1) conv_up1 = Conv3D(64, kernel_size=3, activation='relu', padding='same')(concat1) up2 = UpSampling3D(size=(2, 2, 2))(conv_up1) concat2 = concatenate([up2, conv1], axis=-1) conv_up2 = Conv3D(32, kernel_size=3, activation='relu', padding='same')(concat2) outputs = Conv3D(num_classes, kernel_size=1, activation='softmax')(conv_up2) model = Model(inputs=[inputs], outputs=[outputs]) return model ``` 上述函数创建了一个基础版的 3D U-Net 网络用于分类任务。 --- ### 教程资源推荐 对于希望深入学习 3D U-Net 的开发者来说,可以参考以下公开资料: - **Kaggle Notebooks**: 平台上存在大量针对不同应用场景优化过的 Jupyter 笔记本实例[^2]。 - **PyTorch 和 TensorFlow 官方文档**: 提供详细的 API 使用指南和技术支持论坛链接。 --- ### 应用案例分析 实际项目中,3D U-Net 已成功应用于多种领域,例如脑肿瘤自动检测、肺结节识别等领域。一项研究利用 PTSNet 方法改进传统视频对象分割框架,并取得显著效果。尽管这些成果主要集中在自然场景理解方面,但其核心思想同样适用于医学图像序列处理场合。 ---
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值