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

第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博客 


http://www.kler.cn/a/529436.html

相关文章:

  • 全面认识了解DeepSeek+利用ollama在本地部署、使用和体验deepseek-r1大模型
  • Microsoft Power BI:融合 AI 的文本分析
  • Node.js——body-parser、防盗链、路由模块化、express-generator应用生成器
  • 【Leetcode 热题 100】64. 最小路径和
  • 大模型培训讲师老师叶梓分享:DeepSeek多模态大模型janus初探
  • 基于微信小程序的医院预约挂号系统设计与实现(LW+源码+讲解)
  • 成绩案例demo
  • 【FreeRTOS 教程 七】互斥锁与递归互斥锁
  • Java 中的 function 接口像一件艺术品
  • BUUCTF_[羊城杯2020]easyphp(构造特殊文件名,字符串拼接绕过/正则表达式/代码审计)
  • 【自开发工具介绍】SQLSERVER的ImpDp和ExpDp工具02
  • Swoole如何实现多进程
  • kamailio-ASYNC模块详解【以下内容来源于官网,该文章仅作为翻译】
  • Python淘宝电脑销售数据爬虫可视化分析大屏全屏系统 开题报告
  • 电信传输基本理论/5G网络层次架构——超三万字详解:适用期末考试/考研/工作
  • Redis背景介绍
  • Node.js 和 npm 安装教程
  • 99.24 金融难点通俗解释:MLF(中期借贷便利)vs LPR(贷款市场报价利率)
  • 软件工程概论试题四
  • 【Shell编程 / 8】脚本优化与高级功能:提高效率与自动化管理
  • 在 Windows 上安装 DeepSeek 的完整指南
  • 为什么要用tauri开发跨平台桌面
  • 首发!ZStack 智塔支持 DeepSeek V3/R1/ Janus Pro,多种国产 CPU/GPU 可私有化部署
  • 个人笔记(很没营养,纯备忘录)
  • Maven全解析:第二个项目 IDEA 整合 Maven
  • 网络原理(4)—— 网络层详解