数字图像处理项目——基于Unet网络实现MRI图像的双肺区域分割(论文/代码)

news2024/10/6 3:12:44

完整的论文代码见文章末尾 以下为核心内容

摘要

在医学图像处理领域,肺部图像的分割是一个重要的研究方向,特别是针对肺部疾病的检测与诊断。传统的X射线和CT(计算机断层扫描)是常用的肺部成像技术,但MRI(磁共振成像)由于其对软组织成像的优越性,正逐渐在肺部成像中得到更多的应用。与CT图像相比,MRI图像可以提供更高的对比度和细节,尤其在软组织和病变检测方面表现出色。然而,MRI图像的肺部分割也面临诸多挑战,需要先进的图像处理技术来实现准确的分割。

训练过程

本项目将使用公开的肺部 MRI 图像数据集,该数据集包含多种肺部疾病的 MRI 图 像,并附有专家标注的肺部区域掩码。数据集包含多个患者的多时相图像,涵盖不同的 病理情况和成像条件,能够为算法的训练和评估提供丰富的样本。

在这里插入图片描述

模型搭建

import torch
from torch import nn
import torch.nn.functional as F


class DoubleConv(nn.Module):

    def __init__(self, in_channels, out_channels, mid_channels=None):
        super().__init__()
        if not mid_channels:
            mid_channels = out_channels
        self.double_conv = nn.Sequential(
            nn.Conv2d(in_channels, mid_channels, kernel_size=3, padding=1),
            nn.BatchNorm2d(mid_channels),
            nn.ReLU(inplace=True),
            nn.Conv2d(mid_channels, out_channels, kernel_size=3, padding=1),
            nn.BatchNorm2d(out_channels),
            nn.ReLU(inplace=True)
        )

    def forward(self, x):
        return self.double_conv(x)


class ResBlock(nn.Module):
    def __init__(self, in_channels, out_channels):
        super(ResBlock, self).__init__()
        self.downsample = nn.Sequential(
            nn.Conv2d(in_channels, out_channels, kernel_size=1, stride=1, bias=False),
            nn.BatchNorm2d(out_channels))
        self.double_conv = DoubleConv(in_channels, out_channels)
        self.down_sample = nn.MaxPool2d(2)
        self.relu = nn.ReLU()

    def forward(self, x):
        identity = self.downsample(x)
        out = self.double_conv(x)
        out = self.relu(out + identity)
        return self.down_sample(out), out


class UpBlock(nn.Module):
    def __init__(self, in_channels, out_channels):
        super(UpBlock, self).__init__()
        self.up_sample = nn.Upsample(scale_factor=2, mode='bilinear', align_corners=True)
        self.double_conv = DoubleConv(in_channels, out_channels)

    def forward(self, down_input, skip_input):
        x = self.up_sample(down_input)
        # input is CHW
        diffY = skip_input.size()[2] - x.size()[2]
        diffX = skip_input.size()[3] - x.size()[3]

        x = F.pad(x, [diffX // 2, diffX - diffX // 2,
                        diffY // 2, diffY - diffY // 2])
        x = torch.cat([x, skip_input], dim=1)
        return self.double_conv(x)


class OutConv(nn.Module):
    def __init__(self, in_channels, out_channels):
        super(OutConv, self).__init__()
        self.conv = nn.Conv2d(in_channels, out_channels, kernel_size=1)

    def forward(self, x):
        return self.conv(x)

class ResUNet(nn.Module):
    def __init__(self, out_classes=2):
        super(ResUNet, self).__init__()

        self.down_conv1 = ResBlock(3, 64)
        self.down_conv2 = ResBlock(64, 128)
        self.down_conv3 = ResBlock(128, 256)
        self.down_conv4 = ResBlock(256, 512)

        self.double_conv = DoubleConv(512, 1024)

        self.up_conv4 = UpBlock(512 + 1024, 512)
        self.up_conv3 = UpBlock(256 + 512, 256)
        self.up_conv2 = UpBlock(128 + 256, 128)
        self.up_conv1 = UpBlock(128 + 64, 64)

        self.conv_last = nn.Conv2d(64, out_classes, kernel_size=1)

    def forward(self, x):
        x, skip1_out = self.down_conv1(x)
        x, skip2_out = self.down_conv2(x)
        x, skip3_out = self.down_conv3(x)
        x, skip4_out = self.down_conv4(x)
        x = self.double_conv(x)
        x = self.up_conv4(x, skip4_out)
        x = self.up_conv3(x, skip3_out)
        x = self.up_conv2(x, skip2_out)
        x = self.up_conv1(x, skip1_out)
        x = self.conv_last(x)
        return x

使用UNet模型,使用 SGD 优化器,学习率为 1e-3,动量为 0.9。使用 CosineAnnealingLR 学习率调度器。损失函数使用 DiceCELoss。每个批次包含 16 个样本,共训练500个批次。

在这里插入图片描述

评价指标

本文输出分割图大小为388x388,使用测试集计算分割为肺部和背景的平均像素点数量评估模型性能。

在这里插入图片描述
再使用LOU 指标来评估模型效果,LOU(Localization Overlap Union) 是一个衡量图像分割和目标检测中预测结果与实际标注之间重叠程度的指标。

IoU = 0:表示预测结果与实际标注完全不重叠。
0 < IoU < 0.5:表示预测结果与实际标注有部分重叠,但重叠程度较低。
0.5 ≤ IoU < 1:表示预测结果与实际标注有较高程度的重叠,越接近1,说明预测结果越准确。
IoU = 1:表示预测结果与实际标注完全重叠,预测结果非常准确。

在这里插入图片描述

• 真阳性 (TP):有 8362 个像素被正确识别为肺部,这表明模型在检测肺部区域方面表现良好。
• 假阳性 (FP):有 1544 个像素被错误识别为肺部,这些像素实际上属于背景但被错误预测为肺部。相比于真阳性,这个数字相对较小。
• 假阴性 (FN):有 957 个实际属于肺部的像素被错误预测为背景。这表明模型漏掉了一些肺部区域。

实验结果

真实对应的肺部如下,图中共有八个子图,每个子图显示了一对被分割出来的肺部轮廓。背景是黑色的,肺部区域是白色的。

在这里插入图片描述

在这里插入图片描述
Unet网络在图像分割中表现出色,尤其在保持边界清晰度方面。对比图像可以看出,Unet网络分割出的肺部边界较为平滑,细节保留较好。这是由于Unet网络结构中对称的下采样和上采样路径,可以有效捕捉到图像的全局和局部信息。

从对比图像中可以看出,Unet网络分割出的肺部区域较为完整,缺失区域较少。这是因为Unet在上采样阶段通过跳跃连接(skip connections)结合了高分辨率特征,增强了分割结果的准确性和完整性。

Unet网络对于MRI图像中的噪声有较好的鲁棒性。在对比图像中,背景噪声较少,伪影较少,显示出Unet网络在处理复杂医学图像时的优越性能。

Unet网络分割结果在对称性方面表现出色。对比图像中,左右肺部的分隔线一致,显示出Unet网络在捕捉对称结构方面的能力。这对于医学图像中的解剖结构分割尤为重要。

获取方式

点这里论文 代码 ipynb文件都有 无需运行

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2191019.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

I/O多路转接

目录 一、select 1.1、select概念 1.2、select 函数原型 1.3、理解 select 执行过程 1.4、select就绪条件 1.4.1、读就绪 1.4.2、写就绪 1.4.3、异常就绪&#xff08;了解&#xff09; 1.5、select 基本工作流程 1.6、select服务器 1.6.1、Sock.hpp 1.6.2、selectS…

python实战四:输入一个年份,判断是否是闰年

问题&#xff1a; 从键盘获取一个四位的整数年份&#xff0c;判断其是否是闰年。闰年的判断条件为︰能被4整除但不能被100整除&#xff0c;或者能被400整除。 需求方法&#xff1a; 使用 input() 函数从键盘获取输入。输入的年份是一个字符串。检查输入是否为四位数&#xf…

Elasticsearch学习笔记(四) Elasticsearch集群安全配置一

继续我们的实验。先谈一下我对Elasticsearch粗浅的一些认识&#xff0c;首先Elasticsearch是一个非常宏大的技术栈&#xff0c;发展到今天围绕着Elasticsearch已经产生了更多的组件、套件。因此在看官方文档或者别人的一些教程的时候经常会遇到ELK,elastic stack等。elastic st…

如何在电脑上浏览手机界面

联想浏览器中&#xff0c;点击右键-》检查&#xff0c;进入开发者工具&#xff1a; 点击如上&#xff0c;红色框框选中的手机浏览模式即可。

【微服务】服务注册与发现、分布式配置管理 - Nacos

概述 Nacos是阿里巴巴旗下的一个开源产品&#xff0c;目前市场使用率还是比较高的。在最初开源时&#xff0c;Nacos选择内部三个产品合并并统一开源&#xff0c;这三个产品分别是&#xff1a;非持久化注册中心&#xff08;Configserver&#xff09;、持久化注册中心&#xff0…

InnoDB 事务模型

文章目录 InnoDB 事务模型事务ACID特性事务隔离级别 事务操作事务并发问题事务数据读写类型Consistent Nonlocking Reads 快照读Locking Reads 加锁读 MVCC 并发控制实现原理InnoDB 隐藏列Read ViewUndo log实现过程 MVCC与隔离级别MVCC和辅助索引 幻读可重复读MVCC会出现幻读的…

腾讯自研Git客户端,助力每个人都可以轻松使用Git

工具介绍 UGit是一款腾讯自研的Git客户端&#xff0c;为了让每个人都可以轻松使用Git&#xff0c;从而提高开发效率和团队协作的流畅性。支持工蜂MR/CR&#xff0c;工蜂议题管理&#xff0c;另外对于Git的原生特性有着深度支持。 支持的系统 支持macOS 10.11、Apple Silicon和…

【数据结构】什么是哈希表(散列表)?

&#x1f984;个人主页:修修修也 &#x1f38f;所属专栏:数据结构 ⚙️操作环境:Visual Studio 2022 目录 &#x1f4cc;哈希表的概念 &#x1f4cc;哈希函数的构造方法 &#x1f38f;直接定址法 &#x1f38f;除留余数法 &#x1f38f;平方取中法 &#x1f38f;折叠法 &#x…

自动驾驶的技术实现及原理

自动驾驶技术是现代科技领域中一项引人注目的创新&#xff0c;它具有变革运输行业并提升道路安全的潜力。随着人工智能、传感器技术以及数据处理能力的不断提升&#xff0c;自动驾驶车辆已经从实验室研究逐渐走向现实应用。 自动驾驶的技术实现及原理 1. 自动驾驶技术的核心…

【深度学习】— 多层感知机介绍、 隐藏层、从线性到非线性、线性模型的局限性

【深度学习】— 多层感知机介绍 4.1 多层感知机4.1.1 隐藏层线性模型的局限性引入隐藏层 4.2 从线性到非线性线性组合的局限性引入非线性堆叠更多隐藏层 4.1 多层感知机 在第 3 节中&#xff0c;我们介绍了 softmax 回归&#xff0c;并实现了其从零开始的实现和基于高级 API 的…

UART通信协议

什么是UART UART ( Universal Asynchronous Receiver/Transmitter&#xff0c; 通用异步收发器) 是一种常用的串行通信协议&#xff0c;用于在 计算机和外部设备之间传输数据。它是一种异步通信协议&#xff0c;也就是说数据的传输不需要事先建立好同步时钟信号。 UART&#xf…

Unity MVC框架演示 1-1 理论分析

本文仅作学习笔记分享与交流&#xff0c;不做任何商业用途&#xff0c;该课程资源来源于唐老狮 1.一般的图解MVC 什么是MVC我就不说了&#xff0c;老生常谈&#xff0c;网上有大量的介绍&#xff0c;想看看这三层都起到什么职责&#xff1f;那就直接上图吧 2.我举一个栗子 我有…

深入理解 JavaScript 事件循环机制:单线程中的异步处理核心

深入理解 JavaScript 事件循环机制&#xff1a;单线程中的异步处理核心 JavaScript 是一门单线程的编程语言&#xff0c;也就是说它在同一时间只能执行一个任务。然而&#xff0c;现代 Web 应用经常需要处理大量的异步操作&#xff0c;如用户输入、网络请求、定时器等。为了确…

Vue的基本用法及模板语法

Vue.js使用了基于 HTML 的模板语法&#xff0c;允许开发者声明式地将 DOM 绑定至底层 Vue实例的数据。所有 Vue.js的模板都是合法的 HTML&#xff0c;所以能被遵循规范的浏览器和 HTML 解析器解析。 在底层的实现上&#xff0c;Vue将模板编译成虚拟 DOM 渲染函数。结合响应系…

实现Xshell与虚拟机中Linux服务器的连接(附常见错误解决)

前言 Xshell是一个强大的安全终端模拟软件&#xff0c;它支持SSH1, SSH2, 以及Microsoft Windows 平台的TELNET 协议。Xshell 通过互联网到远程主机的安全连接以及它创新性的设计和特色帮助用户在复杂的网络环境中享受他们的工作。 本文将介绍Xshell与虚拟机中Linux服务器连接…

前缀线性基——关于目前的理解以及一些样题

怎么说呢&#xff1f;在前几天我总结了了有关线性基的一篇博客&#xff0c;线性基用来去求整个区间的异或最值问题 前缀线性基——用于统计一个区间内的异或最值问题 那么我们如何去统计呢&#xff1f;那么就要去存储一个区间的异或空间线性基&#xff0c;因此我们的思路就是用…

【python】追加写入excel

输出文件运行前&#xff08;有两张表&#xff0c;“表1”和“Sheet1”&#xff09;&#xff1a; 目录 一&#xff1a;写入单表&#xff08;删除所有旧工作表&#xff0c;写入新表&#xff09;二&#xff1a;写入多表&#xff08;删除所有旧工作表&#xff0c;写入新表&#x…

平衡二叉搜索树之 AVL 树的模拟实现【C++】

文章目录 AVL树的简单介绍全部的实现代码放在了文章末尾准备工作包含头文件类的成员变量 构造函数和拷贝构造swap和赋值运算符重载析构函数findinsert[重要]当parent的平衡因子为1/-1时&#xff0c;如何向上更新祖先节点的平衡因子呢&#xff1f;怎么旋转&#xff1f;左单旋右单…

Windows Ubuntu下搭建深度学习Pytorch训练框架与转换环境TensorRT

Windows Ubuntu下搭建深度学习Pytorch训练框架与转换环境TensorRT JetBrains2024&#xff08;IntelliJ IDEA、PhpStorm、RubyMine、Rider……&#xff09;安装包Anaconda Miniconda安装.condarc 文件配置镜像源查看conda的配置和源(channel)自定义conda虚拟环境路径conda常用命…

Chromium 中JavaScript Screen API接口c++代码实现

Screen - Web API | MDN (mozilla.org) Screen Screen 接口表示一个屏幕窗口&#xff0c;往往指的是当前正在被渲染的 window 对象&#xff0c;可以使用 window.screen 获取它。 请注意&#xff1a;由浏览器决定提供屏幕对象&#xff0c;此对象一般通过当前浏览器窗口活动状…