Python库使用介绍 LivermorE AI Projector for Computed Tomography LEAP

Python库使用介绍 LivermorE AI Projector for Computed Tomography LEAP

  • 前言
  • Projector 用于设定投影参数的类
    • 参数解释:
    • 其它功能
      • load_param(str filepath)
      • forward(ipt, project_mode="forward")
  • 样例代码
  • 后记

前言

github开源代码
python API文档

作为一个纯计算机背景的小白,关于CT的相关工具,专业课是一点没有呀,好不容易找到一个库,网上居然一个教程都没有。所以自己写一个简易的快速上手的教程,希望能帮到同样使用这个库的人。

LEAP这个库的好处在于,它利用pytorch.autograd进行实现,也就是他的输入和输出都是tensor,这实际上十分便于神经网络过程中添加一些这样的投影计算,也可以用来计算loss,真的非常棒。

库的安装大家可以查看开源代码,或许过几天我会写一个安装教程也说不定。

Projector 用于设定投影参数的类

from LEAP_torch import Projector
proj = Projector(forward_project=True, use_static=False, use_gpu=False, gpu_device=None, batch_size=1)
proj.load_param('...')

参数解释:

  • forward_project=None
    用于设定该投影类的forward函数是执行前向还是逆向过程。
    在这里插入图片描述
def forward(self, input, project_mode="forward"):if self.forward_project is not None:if self.forward_project:if self.use_gpu:return ProjectorFunctionGPU.apply(input, self.proj_data, self.vol_data, self.param_id_t)else:return ProjectorFunctionCPU.apply(input, self.proj_data, self.vol_data, self.param_id_t)else:if self.use_gpu:return BackProjectorFunctionGPU.apply(input, self.proj_data, self.vol_data, self.param_id_t)else:return BackProjectorFunctionCPU.apply(input, self.proj_data, self.vol_data, self.param_id_t)else:if project_mode=="forward":if self.use_gpu:return ProjectorFunctionGPU.apply(input, self.proj_data, self.vol_data, self.param_id_t)else:return ProjectorFunctionCPU.apply(input, self.proj_data, self.vol_data, self.param_id_t)elif project_mode=="backward":if self.use_gpu:return BackProjectorFunctionGPU.apply(input, self.proj_data, self.vol_data, self.param_id_t)else:return BackProjectorFunctionCPU.apply(input, self.proj_data, self.vol_data, self.param_id_t)

如果填写默认的None,并且在forward中不修改project_mode,即如果你什么都不做,那么默认为前向。

  • use_static=False
    官网并没有查到相关的说明,但是通过查其c++源码,可以发现,应该是用于确定XYZ顺序的,因为在C++源码里发现了设定volumeDimensionOrder变量。

  • use_gpu=False

  • gpu_device=None

字面意思,后面的gpu_device设置为数字即可,因为在实现过程中,是采用的将volume.to(deivce)这样的pytorch的实现方式。

  • batch_size=1

其它功能

load_param(str filepath)

这实际上是一个非常有用的函数,可以一次性解决很多问题,而不需要专门的调用设置不同光的函数这里我们以DOLCE这篇论文中的cfg设置为例,解析每个参数的含义这篇论文好是好,居然没有训练的脚本

img_dimx = 512
img_dimy = 512
img_dimz = 1
img_pwidth = 0.8
img_pheight = 0.8
img_offsetx = 0
img_offsety = 0
img_offsetz = 0
proj_geometry = parallel
proj_arange = 60
proj_nangles =240
proj_nrows = 1
proj_ncols = 512
proj_pheight = 0.8
proj_pwidth = 0.8
proj_crow = 0
proj_ccol = 255.5
proj_phis = 
proj_sod = 0
proj_sdd = 0

下面我们进行参数解释:

  • img_dimx 图像长度
  • img_dimy 图像宽度
  • img_dimz 图像channel
  • img_pwidth volume的x,y轴体素间距
  • img_pheight volume的z轴体素间距
  • img_offsetx volume的x轴体素偏移,单位为毫米(mm)
  • img_offsety volume的y轴体素偏移,单位为毫米(mm)
  • img_offsetz volume的z轴体素偏移,单位为毫米(mm)
  • proj_geometry 决定投影射线类型,是锥束光线(cone)还是平行光线(parallel)
  • proj_arange 设定角度的取值范围,如图为[0,60]度
  • proj_nrows 设定投影角度的数目
  • proj_nrows x射线探测器的行数
  • proj_ncols x射线探测器的列数
  • proj_pheight 探测器柱行之间的探测器像素间距(即像素大小),单位为mm
  • proj_pwidth 探测器柱列之间的探测器像素间距(即像素大小),单位为mm
  • proj_crow 探测器像素行索引,用于从光源经过原点到达探测器的光线(没看懂)
  • proj_ccol 探测器的像素列索引为从光源经过原点到达探测器的光线(没看懂)
  • proj_phis 如果有设定,则按照设定的角度直接作为角度的取值,类型为str,例如"10,20,30",用逗号隔开
  • proj_sod 放射源到物体距离,单位:mm;这也可以看作是放射源到物体的旋转中心的距离
  • proj_sdd 放射源到探测器的距离,单位为mm

forward(ipt, project_mode=“forward”)

用于进行投影的函数,可以直接对Projector调用,用法可以将Projector当作一个神经网络的感觉。

# 这是一个样例
pObj = Projector(...)ct= torch.tensor(size=(1,1,512,512)) # 一般一个CT的Slice切片尺寸是这个样子
sino = pObj(ct, project_mode="forward") # 根据前文的cfg,尺寸为(1,240,1,512)
# 分别为(BatchSize,nAngels,channel,ImgSize)
backsino = pObj(sino, project_mode="backward") # (1,1,512,512)

下面给出几个样例图片,其中图一是sino(由Projector产生),图二是backsino,图三是FBP产生的图像,图四为原图ct。

其中需要说明,sino的这个图是调整nangle=512=img_size,并且交换维度产生的。
Alt

请添加图片描述
请添加图片描述
请添加图片描述

样例代码

import matplotlib.pyplot as plt
from guided_diffusion.image_datasets import dataset2run
from dataFidelities.CTClass import set_CTClass
from guided_diffusion import logger
data = dataset2run(data_dir="./dataset/CKC/",batch_size=1,image_size=512,angle_range=90,deterministic=True)
dObj = set_CTClass('cpu', 'cuda:1', use_cuda=False, batch_size=1, use_static=False,param_fn="./config/param_parallel512_la90.cfg", rank=1, logger=logger)
for i, j in data.load_data():plt.imsave('ts.png',i.squeeze(0).squeeze(0),cmap='gray')plt.imsave('fbp.png',j['condition_fbp'].squeeze(0).squeeze(0),cmap='gray')tt = dObj.fmult(i)img = dObj.projector(tt, project_mode='backward')tt = tt.permute(0, 2, 1, 3)print(tt.shape)print(img.shape)plt.imsave('sino.png',tt.squeeze(0).squeeze(0),cmap='gray')plt.imsave('rec.png',img.squeeze(0).squeeze(0),cmap='gray')break

后记

其它的功能我用到再说吧。可能写的leap版本不一样,这里的leap是DOLCE里面实现的fork版本。

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

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

相关文章

TypeScript-自动编译

1.生成文件 tsc --init 2.修改配置文件 说明:通过CTRLF搜索到以下单词,进行修改。 "strict": true, //是否开启严格模式 "outDir": "./outFile", //表示ts文件最终编译为js文件,js文件存放的位置 3.新…

C++心决之命名空间、重载函数和引用

目录 1. C关键字(C98) 2. 命名空间 2.1 命名空间定义 2.2 命名空间使用 3. C输入&输出 4. 缺省参数 4.1 缺省参数概念 4.2 缺省参数分类 5. 函数重载 5.1 函数重载概念 5.2 C支持函数重载的原理--名字修饰(name Mangling) 6. 引用 6.1 引用概念 6.2 引用特性…

基于spark的大数据分析预测地震受灾情况的系统设计

基于spark的大数据分析预测地震受灾情况的系统设计 在本篇博客中,我们将介绍如何使用Apache Spark框架进行地震受灾情况的预测。我们将结合数据分析、特征工程、模型训练和评估等步骤,最终建立一个预测模型来预测地震造成的破坏程度,同时使用可视化大屏的方式展示数据的分布…

DreamSim技术小结

paperhttps://arxiv.org/abs/2306.09344codehttps://github.com/ssundaram21/dreamsimorgMiT个人博客主页http://myhz0606.com/article/dream_sim 1 Motivation 目前较为成熟度量图片相似性的做法是通过模型将图片转为embedding,再用余弦相似度来度量相似性。虽然…

【数据分析面试】1. 计算年度收入百分比(SQL)

题目 你需要为公司的营收来源生成一份年度报告。计算截止目前为止,在表格中记录的第一年和最后一年所创造的总收入百分比。将百分比四舍五入到两位小数。 示例: 输入: annual_payments 表 列名类型amountINTEGERcreated_atDATETIMEstatusV…

Linux企业级别日志的查找

企业级别日志的查找 查看mysql数据库的日志错误日志(Error Log)查询日志(General Query Log)慢查询日志(Slow Query Log)事务日志(Transaction Log)二进制日志(Binary Lo…

Thread 之start 和run 的区别

Java Thread 之start 和run 的区别 用start方法来启动线程,真正实现了多线程运行,这时无需等待run方法体代码执行完毕而直接继续执行下面的代码。通过调用Thread类的start()方法来启动一个线程,这时此线程处于就绪(可运行&#x…

【MATLAB源码-第23期】基于matlab的短时傅里叶STFT信号变换仿真,得到信号的时频曲线图。

操作环境: MATLAB 2022a 1、算法描述 短时傅里叶变换(Short-Time Fourier Transform,STFT)是傅里叶变换的一种扩展,用于分析信号在时域和频域上的变化。描述如下: 1. **时域与频域分析**: …

【Chapter2】进程、线程与作业,计算机操作系统教程,第四版,左万利,王英

文章目录 [toc] 一、多道程序设计1.1单道程序设计的缺点1.2多道程序设计的提出1.3多道程序设计存在的问题 二、进程的引入2.1进程的概念2.2进程的组成2.2.1进程控制块2.2.2程序 2.3进程的类型及特征2.3.1进程的类型2.3.2进程的特征 2.4进程的状态及转换2.4.1进程的状态创建态就…

【对比golang和java的区别】

🌈个人主页:程序员不想敲代码啊 🏆CSDN优质创作者,CSDN实力新星,CSDN博客专家 👍点赞⭐评论⭐收藏 🤝希望本文对您有所裨益,如有不足之处,欢迎在评论区提出指正,让我们共…

【LeetCode: 330. 按要求补齐数组 + 贪心 + 构造区间】

🚀 算法题 🚀 🌲 算法刷题专栏 | 面试必备算法 | 面试高频算法 🍀 🌲 越难的东西,越要努力坚持,因为它具有很高的价值,算法就是这样✨ 🌲 作者简介:硕风和炜,…

Beans模块之工厂模块DisposableBean

博主介绍:✌全网粉丝5W,全栈开发工程师,从事多年软件开发,在大厂呆过。持有软件中级、六级等证书。可提供微服务项目搭建与毕业项目实战,博主也曾写过优秀论文,查重率极低,在这方面有丰富的经验…

【STM32嵌入式系统设计与开发】——12IWDG(独立看门狗应用)

这里写目录标题 一、任务描述二、任务实施1、ActiveBeep工程文件夹创建2、函数编辑(1)主函数编辑(2)USART1初始化函数(usart1_init())(3)USART数据发送函数( USART1_Send_Data(&…

2025中国跨境电商交易会(春季福州)

2025中国跨境电商交易会(春季福州) 时间:2025年3月18-20日 地点:福州海峡国际会展中心 预订以上展会详询陆先生 I38(前三位) I82I(中间四位) 9I72(后面四位&#x…

系统慢查询的思考

系统慢查询的思考 在一个系统中发现慢查询的功能或很卡的现象。你是怎么思考的?从哪几个方面去思考?会用什么工具? 一个系统使用了几年后都可能会出现这样的问题。原因可能有以下几点。 数据量的增加。系统中平时的使用中数据量是有一个累…

数据结构——优先级队列及多服务台模拟系统的实现

一、优先级队列的定义和存储 优先级队列定义:优先级高的元素在队头,优先级低的元素在队尾 基于普通线性表实现优先级队列,入队和出队中必有一个时间复杂度O(n),基于二叉树结构实现优先级队列,能够让入队和出队时间复杂度都为O(log…

正多边形拓扑与泛函

(原创:Daode3056) 也许,关于“拓扑”,“泛函”几本书上的内容与实例都是大同小异,总是那么点内容,数学要开拓一些新领域与新内容才能满足不断发展的社会与工业各种需要。本文就以人工智能生成对…

喜报!湖南创远荣获“2023年度中国有色金属工业科技进步奖”二等奖

近日,一则喜讯传来,湖南创远再创佳绩,联合中南大学、山西紫金合作的“智能矿山穿孔装备智能作业系统”项目荣获“中国有色金属工业科学技术奖二等奖”。 穿孔作业是传统非煤矿山开采的关键环节,穿孔效率、穿孔质量,直接…

nextjs+shadcn学习

1、安装nextjs 创建文件夹next-shadcn 在文件夹中执行 npx create-next-applatest . --typescript --tailwind --eslint安装后,跑起来 2、安装shadcn 在刚才目录下,运行命令 npx shadcn-uilatest init目录中会增加两个目录 components 和lib 替换原…

MySql实战--行锁功过:怎么减少行锁对性能的影响

在上一篇文章中,我跟你介绍了MySQL的全局锁和表级锁,今天我们就来讲讲MySQL的行锁。 MySQL的行锁是在引擎层由各个引擎自己实现的。但并不是所有的引擎都支持行锁,比如MyISAM引擎就不支持行锁。不支持行锁意味着并发控制只能使用表锁&#xf…