news 2026/5/1 8:41:12

使用GAN实现压缩感知MRI图像重建:Python实战

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
使用GAN实现压缩感知MRI图像重建:Python实战

DL00112-使用GAN的压缩感知MRI图像重建python实现 旨在重建满足欠采样测量数据约束的图像;以及这些结果是否与完全无锯齿的结果相似。 另外,如果从数据集中获取的全采样图像也经历了同样的欠采样加速过程;仍然可以收到原始图像所期望的重建结果。

在医学成像领域,MRI(磁共振成像)是一种强大的技术,但传统MRI采集时间较长,这给患者带来了不便,也限制了其在一些场景中的应用。压缩感知技术与生成对抗网络(GAN)的结合为MRI图像重建提供了一种高效的解决方案。今天就来聊聊如何用Python实现基于GAN的压缩感知MRI图像重建。

一、目标解析

本次实现旨在重建满足欠采样测量数据约束的图像。啥意思呢?就是我们在采集MRI数据时,不采集完整的数据,而是只采集一部分(欠采样),然后通过算法把完整的图像重建出来。并且,我们还关心重建出来的图像和理想中完全无锯齿的图像相似度如何。

另外一个有趣的点是,如果从数据集中获取的全采样图像也经历同样的欠采样加速过程,是否还能得到原始图像所期望的重建结果。这就像是一个实验,看看我们的重建方法是不是足够鲁棒。

二、代码实现

1. 数据预处理

首先,我们需要导入一些必要的库。

import numpy as np import torch import torch.nn as nn import torch.optim as optim from torch.utils.data import DataLoader, Dataset import h5py

这里导入了numpy用于数值计算,torch及其相关模块用于构建和训练神经网络。h5py用于读取MRI数据文件,通常MRI数据会以.h5格式存储。

假设我们的MRI数据存储在.h5文件中,并且数据集中包含全采样图像和对应的欠采样测量数据。我们可以定义一个数据集类来加载数据。

class MRIDataset(Dataset): def __init__(self, h5_file): self.data = h5py.File(h5_file, 'r') self.full_images = self.data['full_images'][:] self.undersampled_measurements = self.data['undersampled_measurements'][:] def __len__(self): return len(self.full_images) def __getitem__(self, idx): full_image = torch.from_numpy(self.full_images[idx]).unsqueeze(0).float() undersampled_measurement = torch.from_numpy(self.undersampled_measurements[idx]).unsqueeze(0).float() return full_image, undersampled_measurement

在这个数据集类中,init方法打开.h5文件并读取全采样图像和欠采样测量数据。len方法返回数据集的大小,getitem方法根据索引获取对应的全采样图像和欠采样测量数据,并将它们转换为PyTorch的张量格式。

2. 构建GAN网络

接下来,我们定义生成器和判别器。生成器的任务是根据欠采样测量数据生成重建图像,判别器则判断生成的图像是真实的全采样图像还是生成器伪造的。

class Generator(nn.Module): def __init__(self): super(Generator, self).__init__() self.main = nn.Sequential( nn.Conv2d(1, 64, kernel_size=3, padding=1), nn.ReLU(True), nn.Conv2d(64, 128, kernel_size=3, padding=1), nn.ReLU(True), nn.Conv2d(128, 1, kernel_size=3, padding=1), nn.Tanh() ) def forward(self, x): return self.main(x) class Discriminator(nn.Module): def __init__(self): super(Discriminator, self).__init__() self.main = nn.Sequential( nn.Conv2d(1, 64, kernel_size=3, padding=1), nn.LeakyReLU(0.2, inplace=True), nn.Conv2d(64, 128, kernel_size=3, padding=1), nn.LeakyReLU(0.2, inplace=True), nn.Conv2d(128, 1, kernel_size=3, padding=1), nn.Sigmoid() ) def forward(self, x): return self.main(x)

生成器中,通过几个卷积层逐步增加特征维度,最后输出重建图像。判别器类似,不过激活函数使用LeakyReLU,最后用Sigmoid输出一个0到1之间的概率值,表示输入图像是真实图像的可能性。

3. 训练过程

# 初始化网络 generator = Generator() discriminator = Discriminator() # 定义损失函数和优化器 criterion = nn.BCELoss() optimizerG = optim.Adam(generator.parameters(), lr=0.0001) optimizerD = optim.Adam(discriminator.parameters(), lr=0.0001) # 加载数据集 h5_file = 'your_mri_data.h5' dataset = MRIDataset(h5_file) dataloader = DataLoader(dataset, batch_size=16, shuffle=True) # 训练循环 num_epochs = 50 for epoch in range(num_epochs): for i, (full_images, undersampled_measurements) in enumerate(dataloader): # 训练判别器 optimizerD.zero_grad() real_labels = torch.ones(full_images.size(0), 1, 1, 1) fake_labels = torch.zeros(full_images.size(0), 1, 1, 1) real_outputs = discriminator(full_images) d_loss_real = criterion(real_outputs, real_labels) fake_images = generator(undersampled_measurements) fake_outputs = discriminator(fake_images.detach()) d_loss_fake = criterion(fake_outputs, fake_labels) d_loss = d_loss_real + d_loss_fake d_loss.backward() optimizerD.step() # 训练生成器 optimizerG.zero_grad() fake_images = generator(undersampled_measurements) fake_outputs = discriminator(fake_images) g_loss = criterion(fake_outputs, real_labels) g_loss.backward() optimizerG.step() print(f'Epoch [{epoch+1}/{num_epochs}], d_loss: {d_loss.item():.4f}, g_loss: {g_loss.item():.4f}')

在训练过程中,我们交替训练判别器和生成器。判别器的损失由真实图像的损失和伪造图像的损失组成,通过反向传播更新判别器的参数。生成器则通过让判别器误以为生成的图像是真实的来更新自己的参数。

三、结果分析

通过上述代码实现训练后,我们得到了重建图像。回到我们最初的目标,重建图像与完全无锯齿的理想图像的相似度可以通过一些图像质量指标来衡量,比如峰值信噪比(PSNR)、结构相似性指数(SSIM)等。

如果从数据集中获取的全采样图像经历同样的欠采样加速过程后再重建,观察重建结果与原始全采样图像的差异,可以评估我们重建方法的稳定性和鲁棒性。如果重建结果与原始图像很接近,说明我们的方法在不同数据上都能有较好的表现。

总之,基于GAN的压缩感知MRI图像重建是一个有趣且具有实际应用价值的领域,通过Python的实现,我们可以进一步探索和优化这个过程,为医学成像技术的发展贡献一份力量。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/17 15:48:57

【光照】[PBR][法线分布]为何不选Beckmann

Beckmann分布函数原理Beckmann分布函数是最早用于微表面模型的法线分布函数之一,由Paul Beckmann在1963年的光学研究中首次提出。它描述了表面微平面法线分布的统计规律,是计算机图形学中最早的物理准确NDF实现。数学原理Beckmann分布函数的标准形式为&a…

作者头像 李华
网站建设 2026/5/1 8:14:24

基于Spring Boot的电影购票系统

基于Spring Boot的电影购票系统介绍 基于Spring Boot的电影购票系统是一款面向影院、用户及运营方的全流程购票平台,整合了用户管理、影院资源调度、智能选座、支付结算及数据分析等功能,旨在解决传统购票效率低、资源分配不均等问题,提升用户…

作者头像 李华
网站建设 2026/5/1 7:23:43

基于Spring Boot的农业合作社果蔬批发信息管理系统

基于Spring Boot Vue的租车网站系统介绍 一、系统背景与目标 传统租车行业依赖线下门店和人工操作,存在信息不透明、流程繁琐、用户体验差等问题。本系统基于Spring Boot(后端)与Vue.js(前端)技术栈开发,旨…

作者头像 李华
网站建设 2026/5/1 6:52:03

基于python的热门歌曲采集分析系统

基于Python的热门歌曲采集分析系统是一种利用Python语言及其相关技术实现的,用于采集、分析和可视化热门歌曲数据的系统。以下是对该系统的详细介绍: 一、系统架构与技术栈 1.后端开发:主要使用Python进行开发,可以利用Python的Re…

作者头像 李华
网站建设 2026/5/1 8:14:28

2020级秦zhengdan经验分享

学弟学妹们好,我是秦zhengdan,非常有幸能够给大家分享经验。回顾大学四年,感觉认知水平得到了很大提升,敢于接受不完美的自己,学会了自主学习更加独立。毕业后是去互联网公司做实施交付。关于考公,谈点失败…

作者头像 李华
网站建设 2026/4/20 20:02:16

韩suo经验分享

学弟学妹们好,我是信管2002班的韩suo,在这里给学弟学妹们分享一些工作上的故事,谈不上是建议,人生匆匆,我认为人很多时候是不太需要听其他人的建议的。所以接下来是个故事,希望可以帮助到大家,任…

作者头像 李华