github: https://github.com/Duder-git/Phy_MPI_DNN

An effective reconstruction method for magnetic particle imaging based on deep neural networks constrained by a physical model

实现

目标:

基于物理模型约束的MPI重建图像
实现从信号的重建图像的两步走,从随机图像到信号——从信号到图像

过程:

网络模型
-- 输入随机图像
-- 输出重建图像
物理模型约束
* 输入实测电压信号
* 基于迭代图像计算电压信号
* 计算损失函数:实测电压信号与迭代图像计算电压L1范数
* 反向传递损失函数,更新网络
* 计算新的迭代图像

结果:

重建结果较传统XSpace重建有较大提升

物理模型

与MATLAB编写MPI仿真类似,代码方式改成面向对象编程,整体结构上确实要好看很多。
面向对象编程要求将对象抽象,处理它相关的数据和函数都在它的类中实现。
并且与一般在Python上构架的物理模型不太一样的地方,这里全部使用torch替代numpy数据格式

Phantom

在仿体类中,需要考虑几个主要参数:仿体、粒子特性、弛豫时间
其中粒子特性的计算需要用到很多参数,包括弛豫时间,但在本项目中的深度学习部分涉及到对弛豫时间的计算,因此单列一项。

仿体

仿体本身代表粒子浓度分布,在数据上体现为二维信息,这里主要使用CV2读取信息,根据系统参数缩放图像,归一化处理。

粒子特性

粒子特性核心是langevin函数,代表着当前粒子在不同磁场条件下的非线性变化。这个函数相关粒子浓度,磁饱和强度、温度、粒径等参数,是MPI物理模型的核心。

Scanner

扫描类的主要功能是构建磁场条件和扫描轨迹,并基于当前磁场环境和扫描轨迹计算粒子磁化信号,达到仿真的效果。可以说重建的好坏就取决于仿真模型和真实粒子信号的差距。
这里从磁场分布、驱动场构建、获取电压介绍

磁场分布

磁场在设备搭建完成后,参数就固定不变了。仿真不同设备需要根据磁场强度进行调整
构建磁场强度的方式也有一些,这里假设磁场分布是均匀的,因此磁场范围就是成像视野*磁场梯度
主要注意离散化参数,离散越密,重建图像的分辨率越高
但如果扫描轨迹不跟着变密的,图像质量可能会下降

驱动场构建

驱动场参数与电流和线圈灵敏度相关,1A电流产生3mT磁场强度,那线圈灵敏度就是3mT/A,根据这个可以估算覆盖FOV区域需要多大的电流。
常用正弦做驱动信号

计算电压信号

得到磁场分布和随时间变化的驱动场信号,我们可以计算出FFP位置
根据FFP位置定位各个时刻的信号,建立起时间和空间的关系

那电压如何计算?
为了方便GPU加速,这里使用矩阵块输入,即构建[]50,50,1000]的矩阵,0维和1维表示图像信息,2维表示时间关系。
将矩阵输入朗之万函数,乘以粒子浓度分布就可以得到粒子磁化信号,
进一步,由于电磁线圈接收到整个FOV的磁场变换,因此需要对单个时间片求和,构建时间线
进一步,电磁线圈接收信号的核心是磁通量变化,因此需要对时间线求导,加上线圈灵敏度的变化得到实测的电压信号

需要解释一下,代码中使用的是磁化曲线的导数,即对上述的过程进行简化的操作
到这里,物理模型的约束条件完成,剩下就是一些缝缝补补的工作了

UNet网络模型

典型的UNet网络模型

调参的事情我就不太擅长了

写在末尾

写的比较快,主要分享这样一个思路,如有不理解的地方看书或者联系我

感谢发现我的小空间😋