第12章:基于TransUnet和SwinUnet网络实现的医学图像语义分割:腹部13器官分割(网页推理)
目录
1. 前言
2. TransUnet 和 SwinUnet
3. 腹部多器官分割
4. 训练
5. 推理
6. 项目下载
1. 前言
TransUNet 是一种用于医学图像分割的混合架构,结合了 Transformer 和 U-Net 的优势。它利用 Transformer 的全局上下文建模能力和 U-Net 的精确定位特性,在医学图像分割任务中实现了优异的性能。
TransUNet 的核心组成部分:
1. Transformer 编码器:Transformer 编码器用于捕捉输入图像中的长距离依赖关系和全局上下文信息。这在医学图像中尤为重要,因为整个图像的上下文信息对准确分割至关重要。输入图像首先被分割成多个图像块(patches),这些图像块被展平后通过一系列 Transformer 层进行处理。
2. U-Net 解码器:U-Net 解码器负责对特征图进行上采样,并将其与编码器中的高分辨率特征结合,生成精确的分割结果。编码器和解码器之间的跳跃连接(skip connections)有助于保留空间细节,这对精确分割非常重要。
3. 混合架构:TransUNet 的混合架构将 Transformer 编码器与 U-Net 解码器结合。Transformer 编码器提供丰富的全局上下文信息,而 U-Net 解码器确保精确定位和细节分割。
TransUNet 的优势:
- 全局上下文建模:Transformer 能够捕捉图像中的全局信息,解决了传统卷积神经网络(CNN)在长距离依赖关系建模上的局限性。
- 精确定位:U-Net 的解码器结构和跳跃连接确保了分割结果的细节和准确性。
- 适用于医学图像:TransUNet 在医学图像分割任务(如器官分割、病变检测等)中表现出色,能够处理复杂的解剖结构。
SwinUnet 是一种基于 **Swin Transformer** 的医学图像分割模型,结合了 Swin Transformer 的层次化特征提取能力和 U-Net 的经典编码器-解码器结构。SwinUnet 在医学图像分割任务中表现出色,尤其是在处理高分辨率图像时,能够有效捕捉全局上下文信息并保留局部细节。
SwinUnet 的核心思想:
1. Swin Transformer 作为骨干网络:Swin Transformer 是一种基于窗口(Window)机制的 Transformer 模型,通过局部窗口内的自注意力计算来降低计算复杂度,同时支持层次化特征提取。Swin Transformer 的层次化设计(Hierarchical Architecture)使其能够捕捉多尺度的特征信息,非常适合医学图像中复杂的目标结构。
2. U-Net 风格的编码器-解码器结构:SwinUnet 采用了经典的 U-Net 结构,包括编码器(下采样)和解码器(上采样)两部分。编码器部分使用 Swin Transformer 提取多层次特征,解码器部分通过上采样和跳跃连接(Skip Connections)恢复空间细节,从而实现精确的分割。
SwinUnet 的主要特点:
1. 基于窗口的自注意力机制:Swin Transformer 将图像划分为多个局部窗口,在每个窗口内计算自注意力,显著降低了计算复杂度。通过移动窗口(Shifted Window)机制,不同窗口之间可以交互信息,从而捕捉全局上下文。
2. 层次化特征提取:Swin Transformer 通过多阶段的下采样(Patch Merging)构建层次化特征金字塔,能够同时捕捉局部细节和全局信息。这种多尺度特征提取能力非常适合医学图像中不同大小的目标结构。
3. 跳跃连接:SwinUnet 在编码器和解码器之间引入了跳跃连接,将低层次的高分辨率特征与高层次语义特征结合,提升了分割的精度。
4. 计算效率高:相比于传统的 Vision Transformer(ViT),Swin Transformer 的窗口机制大幅减少了计算量,使其能够处理高分辨率医学图像。
SwinUnet 的优势:
- 全局与局部信息结合: Swin Transformer 能够同时捕捉全局上下文和局部细节,解决了传统 CNN 在长距离依赖建模上的不足。
- 多尺度特征提取:层次化设计使其能够处理医学图像中不同尺度的目标结构。
- 高分辨率图像处理:基于窗口的自注意力机制降低了计算复杂度,适合处理高分辨率医学图像。
- 通用性强:在多种医学图像分割任务(如器官分割、病变检测)中均表现出色。
SwinUnet 是一种结合了 Swin Transformer 和 U-Net 的先进医学图像分割模型。它通过 Swin Transformer 的层次化窗口机制实现了高效的全局上下文建模,同时利用 U-Net 的解码器结构和跳跃连接保留了局部细节。SwinUnet 在医学图像分割任务中表现优异,是当前医学图像分析领域的重要研究方向之一。
2. TransUnet 和 SwinUnet
代码如下:
其中实现的部分在这:
3. 腹部多器官分割
数据集文件如下:
标签采用0 1 2 ...标注,看起来是全黑的
其中,训练集的总数为799,验证集的总数为342
4. 训练
训练的参数如下:
- ct 如果数据集是医学影像的ct格式,那么会自动进行windowing增强,效果会更好
- model 可以选择TransUnet或者SwinUnet
- base size是预处理的图像大小,也就是输入model的图像尺寸
- batch size 批大小,epoch 训练轮次,lr 是cos衰减的起始值,lrf是衰减倍率,这里lr最终大小是0.01 * 0.001
- results 是训练生成的主目录
parser.add_argument("--ct", default=False,type=bool,help='is CT?') # Ct --> True
parser.add_argument("--model", default='swinUnet',help='transUnet,swinUnet')
parser.add_argument("--base-size",default=(224,224),type=tuple) # 根据图像大小更改
parser.add_argument("--batch-size", default=4, type=int)
parser.add_argument("--epochs", default=5, type=int)
parser.add_argument('--lr', default=0.002, type=float)
parser.add_argument('--lrf',default=0.002,type=float) # 最终学习率 = lr * lrf
parser.add_argument("--img_f", default='.png', type=str) # 数据图像的后缀
parser.add_argument("--mask_f", default='.png', type=str) # mask图像的后缀
parser.add_argument("--results", default='runs', type=str) # 保存目录
parser.add_argument("--data-train", default='./data/train/images', type=str)
parser.add_argument("--data-val", default='./data/val/images', type=str)
模型信息如下:
指标如下:这里训练了200个epoch
训练日志如下:
"epoch:199": {
"train log:": {
"info": {
"pixel accuracy": [
0.9870787858963013
],
"Precision": [
"0.9609",
"0.9276",
"0.9269",
"0.8783",
"0.7920",
"0.9686",
"0.9406",
"0.8954",
"0.8510",
"0.8087",
"0.8332",
"0.6710",
"0.6722"
],
"Recall": [
"0.9499",
"0.9224",
"0.9211",
"0.8383",
"0.6954",
"0.9684",
"0.9349",
"0.8407",
"0.8014",
"0.6766",
"0.7812",
"0.3995",
"0.3718"
],
"F1 score": [
"0.9554",
"0.9250",
"0.9240",
"0.8578",
"0.7406",
"0.9685",
"0.9377",
"0.8672",
"0.8255",
"0.7368",
"0.8064",
"0.5008",
"0.4788"
],
"Dice": [
"0.9554",
"0.9250",
"0.9240",
"0.8578",
"0.7406",
"0.9685",
"0.9377",
"0.8672",
"0.8255",
"0.7368",
"0.8064",
"0.5008",
"0.4788"
],
"IoU": [
"0.9145",
"0.8605",
"0.8587",
"0.7510",
"0.5880",
"0.9388",
"0.8828",
"0.7656",
"0.7028",
"0.5833",
"0.6756",
"0.3341",
"0.3147"
],
"mean precision": 0.855877697467804,
"mean recall": 0.777043342590332,
"mean f1 score": 0.8095670938491821,
"mean dice": 0.8095670938491821,
"mean iou": 0.7054123282432556
}
},
"val log:": {
"info": {
"pixel accuracy": [
0.9790719151496887
],
"Precision": [
"0.9333",
"0.8834",
"0.8761",
"0.8169",
"0.6622",
"0.9539",
"0.8835",
"0.8654",
"0.7797",
"0.6982",
"0.7444",
"0.5177",
"0.5125"
],
"Recall": [
"0.9096",
"0.8404",
"0.8526",
"0.7472",
"0.4546",
"0.9501",
"0.8547",
"0.7692",
"0.6896",
"0.5066",
"0.6195",
"0.2401",
"0.2349"
],
"F1 score": [
"0.9213",
"0.8614",
"0.8642",
"0.7805",
"0.5391",
"0.9520",
"0.8689",
"0.8145",
"0.7319",
"0.5871",
"0.6762",
"0.3281",
"0.3221"
],
"Dice": [
"0.9213",
"0.8614",
"0.8642",
"0.7805",
"0.5391",
"0.9520",
"0.8689",
"0.8145",
"0.7319",
"0.5871",
"0.6762",
"0.3281",
"0.3221"
],
"IoU": [
"0.8541",
"0.7565",
"0.7609",
"0.6400",
"0.3690",
"0.9084",
"0.7681",
"0.6870",
"0.5772",
"0.4156",
"0.5108",
"0.1962",
"0.1920"
],
"mean precision": 0.7790209054946899,
"mean recall": 0.6668398976325989,
"mean f1 score": 0.7113207578659058,
"mean dice": 0.7113207578659058,
"mean iou": 0.5873586535453796
}
5. 推理
这里推理利用streamlit在本地网页进行推理:streamlit run infer.py
这里页面没有优化,有兴趣的话可以自己试试
6. 项目下载
关于本项目代码和数据集、训练结果的下载:【更换数据集进行训练的话,参考readme文件,pip requirements文件就行了】
基于TransUnet和Swin-Unet实现的医学图像语义分割对比项目:腹部器官多类别图像语义分割资源-CSDN文库
关于图像分类、分割网络的改进:图像分类网络改进_听风吹等浪起的博客-CSDN博客