Cuda实现Radon变换

本文探讨了如何利用CUDA技术实现Radon变换。通过详细阐述算法,并提供类似于C语言的编程方式,展示了如何在CUDA中设置block和thread,每个block包含numAngles(如181个)线程来执行变换,提升计算效率。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

有关radon变换的算法的详情,写在这里:http://blog.csdn.net/celte/article/details/9826505

用Cuda实现radon变换,可以类似C语言程序操作。。。

这里可以简单的使用一个block,每个block包含numAngles个thread(在下面的代码中是181个thread)

#include <stdio.h>
#include "math.h"
#include "cuda_runtime.h"
#include "device_launch_parameters.h"

   
__global__ static void radon_cuda_core(float *gpuOutput,float *gpuInput,float *gpuAngles,int M,int N,int xOrgin,int yOrgin,int numAngles,int rFirst,int rSize)
{
	const int tid=threadIdx.x;	
	float angle=gpuAngles[tid];
	float *pOutput=gpuOutput+tid*rSize;		
	float sine=sin(angle);
	float cosine=cos(angle);
	int m,n;
``` radon_288_736 = para_prepare_parallel(2.5) radon_72_736 = para_prepare_parallel(8.5) radon_36_736 = para_prepare_parallel(16.5) helper = {"fbp_para_288_736": radon_288_736, "fbp_para_36_736": radon_36_736, "fbp_para_72_736": radon_72_736} for i in range(0, num//args.batch_size):# model_kwargs = next(data) raw_img = model_kwargs.pop('raw_img').to("cuda") index = model_kwargs.pop('index') model_kwargs = {k: v.to(dist_util.dev()) for k, v in model_kwargs.items()} model_kwargs["fbp_para_36_736"] = radon_36_736 model_kwargs["fbp_para_288_736"] = radon_288_736 sample_fn = p_sample_loop_super_res sample, sample_72_288 = sample_fn( model, (args.batch_size, 1, 288, 736), #args.large_size, args.large_size # clip_denoised=args.clip_denoised, model_kwargs=model_kwargs, ) model_72_sino = F.interpolate(sample_72_288, [72, 736], mode="nearest") model_72_fbp = run_reco(model_72_sino + 1., helper["fbp_para_72_736"])[:,:,112:624,112:624] model_72_fbp_npy = model_72_fbp.cpu().detach().numpy() model_output_fbp = run_reco(sample + 1., helper["fbp_para_288_736"])[:,:,112:624,112:624] target_fbp = run_reco(raw_img + 1., helper["fbp_para_288_736"])[:,:,112:624,112:624] output_fbp_npy = model_output_fbp.cpu().detach().numpy() for j in range(0, args.batch_size): l2loss_value = l2loss(model_output_fbp[j], target_fbp[j]).item() print("index:", index[j], "MSELoss:", l2loss_value) MSE.append(l2loss_value) raw_npy = target_fbp.cpu().detach().numpy() ssim_value = ssim(np.squeeze(output_fbp_npy[j]),np.squeeze( raw_npy[j]), data_range = raw_npy[j].max() - raw_npy[j].min()) psnr_value = psnr(np.squeeze(output_fbp_npy[j]),np.squeeze( raw_npy[j]), data_range = raw_npy[j].max() - raw_npy[j].min()) print("index:", index[j], "SSIM:", ssim_value) SSIM.append(ssim_value) PSNR.append(psnr_value) lpip_value = lpip_loss(model_output_fbp[j], target_fbp[j]) print("lpips:", lpip_value.item()) LPIP.append(lpip_value.item())```什么意思
最新发布
04-03
这段代码主要用于图像重建、超分辨率生成以及评估模型性能的任务中,结合了前向投影(FBP)、反向传播和多种指标计算。以下是逐段解释: --- ### **代码的主要功能** #### **初始化部分** ```python radon_288_736 = para_prepare_parallel(2.5) radon_72_736 = para_prepare_parallel(8.5) radon_36_736 = para_prepare_parallel(16.5) helper = {"fbp_para_288_736": radon_288_736, "fbp_para_36_736": radon_36_736, "fbp_para_72_736": radon_72_736} ``` - `para_prepare_parallel` 函数用于准备 Radon 变换的参数,Radon变换是一种将二维函数转换为一维投影的技术,在医学成像领域广泛应用。 - 这里的三个变量分别表示不同的角度采样配置 (`2.5`, `8.5`, 和 `16.5`) 下的平行束投影矩阵。 #### **主循环开始** ```python for i in range(0, num // args.batch_size): model_kwargs = next(data) raw_img = model_kwargs.pop('raw_img').to("cuda") # 将原始数据转移到GPU上处理 index = model_kwargs.pop('index') # 获取样本索引信息 model_kwargs = {k: v.to(dist_util.dev()) for k, v in model_kwargs.items()} # 转移到设备(如 GPU) model_kwargs["fbp_para_36_736"] = radon_36_736 # 添加额外的参数到输入字典中 model_kwargs["fbp_para_288_736"] = radon_288_736 sample_fn = p_sample_loop_super_res # 定义采样函数 sample, sample_72_288 = sample_fn( # 使用扩散模型进行高分辨率重建 model, (args.batch_size, 1, 288, 736), model_kwargs=model_kwargs, ) ``` ##### 解释: - 循环从批量数据加载器获取一批训练数据,并对每个批次的数据依次执行操作。 - `model_kwargs` 包含传递给神经网络的动态参数。 - 利用扩散模型的超级分辨率生成算法 `p_sample_loop_super_res()` 来生成高分辨结果 `(sample)` 和中间维度的结果 `(sample_72_288)`. #### **插值与滤波反投影 (Filtered Back Projection)** ```python model_72_sino = F.interpolate(sample_72_288, [72, 736], mode="nearest") model_72_fbp = run_reco(model_72_sino + 1., helper["fbp_para_72_736"])[:, :, 112:624, 112:624] model_output_fbp = run_reco(sample + 1., helper["fbp_para_288_736"])[:, :, 112:624, 112:624] # 滤波反投影输出图 target_fbp = run_reco(raw_img + 1., helper["fbp_para_288_736"])[:, :, 112:624, 112:624] ``` - 先利用最近邻差值法调整尺寸至 `[72, 736]`. - 然后通过反投影运算得到最终图片. #### **评价模块** ```python output_fbp_npy = model_output_fbp.cpu().detach().numpy() # 对于每一个batch中的元素单独比较误差度量 for j in range(0, args.batch_size): l2loss_value = l2loss(model_output_fbp[j], target_fbp[j]).item() print(f"index:{index[j]}, MSELoss:{l2loss_value}") MSE.append(l2loss_value) ssim_value = ssim(np.squeeze(output_fbp_npy[j]), np.squeeze(target_fbp[j].cpu()), data_range=target_fbp[j].max()-target_fbp[j].min()) psnr_value = psnr(np.squeeze(output_fbp_npy[j]), np.squeeze(target_fbp[j].cpu()), data_range=target_fbp[j].max()-target_fbp[j].min()) print(f"index:{index[j]}, SSIM:{ssim_value}, PSNR:{psnr_value}") SSIM.append(ssim_value); PSNR.append(psnr_value) lpip_value = lpip_loss(model_output_fbp[j], target_fbp[j]) print(f"lpips value={lpip_value.item()}") LPIP.append(lpip_value.item()) ``` 这部分主要是通过一系列图像质量评估标准来衡量预测效果如何接近真实目标: - Mean Squared Error (**L2Loss**) 衡量两幅图像像素之间的平均平方差异; - Structural Similarity Index Measure (**SSIM**) 测算两张图片结构相似程度; - Peak Signal-to-Noise Ratio (**PSNR**) 描述压缩失真情况下的信号强度比例关系; - Learned Perceptual Image Patch Similarity (**LPIPS**) 更贴近人眼感知判断两者间的视觉距离差距。 ### 总结: 该脚本实现了基于深度学习框架下的 CT 成像任务流程:包括预处理、正则化参数设定、应用扩散模型完成超分任务并借助传统FPR技术形成最终重构影像及量化评测体系构建。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值