cascade MRI reconstruction: dataset.py--1


首先配置文件不能少config.yaml

# Model Parameters
network:
        num_cascades: 6
        num_layers: 5 # Number of layers in the CNN per cascade
        num_filters: 64
        kernel_size: 3
        stride: 1
        padding: 1 #A padding of 1 is needed to keep the image in the same size
        noise: null #Noise in the measurements. To be used in the data consistency step

#Dataset parameters
dataset:
        data_path: 'data1/'
        acceleration_factor: 4.0
        fraction: 0.8 #train set size
        shuffle: 3 #Seed for numpy random generator
        sample_n: 10
        acq_noise: 0 #acquisation noise
        centred: False
        norm: 'ortho'  #norm: 'ortho' or null. if 'ortho', performs unitary transform, otherwise normal dft

# Training parameters
train:
        batch_size: 1
        num_epochs: 5
        early_stop: 100

        # Adam Optimizer Parameters
        learning_rate: 0.001
        b_1: 0.9
        b_2: 0.999
        l2: 0.0000001

        # Miscellaneous
        output_path: 'logs'
        cuda: False

单步执行

import os
import torch
import numpy as np
from math import ceil
from helpers_1 import *
from scipy.io import loadmat
from numpy.lib.stride_tricks import as_strided
import yaml
args = yaml.load(open('config.yaml', 'r'), Loader=yaml.FullLoader)

在这里插入图片描述
dataset = OCMRDataset(fold=‘train’, **args[‘dataset’])

        self.evalset = evalset
        self.data_path = data_path
        self.acc = acceleration_factor
        self.sample_n = sample_n
        self.noise = acq_noise
        self.centred = centred
        self.norm = norm
        self.files = os.listdir(self.data_path)
        if shuffle: # shuffle=None
            np.random.seed(shuffle)
            np.random.shuffle(self.files) 
        if fold == 'train':
            self.files = self.files[:int(len(self.files) * fraction)]

在这里插入图片描述

    def __getitem__(self, idx):
        if self.evalset and idx == 0: # evalset=False
            np.random.seed(9001)
        data = loadmat(os.path.join(self.data_path, self.files[idx]))['xn'] * 1e3

在这里插入图片描述
plt.imshow(np.abs(data))
在这里插入图片描述

import scipy.io as scio
import matplotlib.pyplot as plt
path_mat = 'data1/fs_0050_1_5T_0_0.mat'
data_mat = scio.loadmat(path_mat)
plt.imshow(np.abs(data_mat['xn']))
plt.show()

在这里插入图片描述

‘full’: data_gnd

        data = np.expand_dims(data, 0) #扩展维度,np.expand_dims(a,axis=)即在 a 的相应的axis轴上扩展维度

在这里插入图片描述

        data_gnd = format_data(data)
def format_data(data, mask=False):
    if mask: 
        data = data * (1+1j)
    data = complex2real(data)
def complex2real(x):
	x_real = np.real(x) #np.real取实部数值

在这里插入图片描述
plt.imshow(x_real[0,:,:],cmap=‘Greys’)
在这里插入图片描述

x_imag = np.imag(x) # np.imag取虚步数值

在这里插入图片描述
plt.imshow(x_imag[0,:,:],cmap=‘Greys’)
在这里插入图片描述

y = np.array([x_real, x_imag]).astype(np.float)

在这里插入图片描述

    if x.ndim >= 3: # x.ndim=3
        y = y.swapaxes(0, 1)
    return y

在这里插入图片描述

def format_data(data, mask=False):

    data = complex2real(data)
    return data.squeeze(0) #将数组中维度0移除

在这里插入图片描述
data_gnd = data.squeeze(0) #2代表频域数据的实部和虚部, 图片的宽高(256 x 256)
在这里插入图片描述

‘mask’: mask.transpose(1,2,0)

        mask = self.cartesian_mask(data.shape)
    def cartesian_mask(self, shape):
        N, Nx, Ny = int(np.prod(shape[:-2])), shape[-2], shape[-1]
        pdf_x = normal_pdf(Nx, 0.5/(Nx/10.)**2)

shape[:-2]为(1, 256),shape[:-2]为(1,)
np.prod为sum操作
在这里插入图片描述
pdf_x:
在这里插入图片描述

def normal_pdf(length, sensitivity):
    return np.exp(-sensitivity * (np.arange(length) - length / 2)**2)

在这里插入图片描述
在这里插入图片描述

        lmda = Nx/(2.*self.acc) # self.acc = acceleration_factor=4.0, lmda=32
        n_lines = int(Nx / self.acc) # 64

        # add uniform distribution
        pdf_x += lmda * 1./Nx

pdf_x:
在这里插入图片描述

        if self.sample_n: # sample_n=10
            pdf_x[Nx//2-self.sample_n//2:Nx//2+self.sample_n//2] = 0 #pdf_x[123:133]

在这里插入图片描述

            pdf_x /= np.sum(pdf_x)
            n_lines -= self.sample_n #54

pdf_x:
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

        mask = np.zeros((N, Nx))
        for i in range(N):
#numpy.random.choice(a, size=None, replace=True, p=None)
#从a(只要是ndarray都可以,但必须是一维的)中随机抽取数字,并组成指定大小(size)的数组
#replace:True表示可以取相同数字,False表示不可以取相同数字
#数组p:与数组a相对应,表示取数组a中每个元素的概率,默认为选取每个元素的概率相同。
            idx = np.random.choice(Nx, n_lines, False, pdf_x)
            mask[i, idx] = 1

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

        if self.sample_n:
            mask[:, Nx//2-self.sample_n//2:Nx//2+self.sample_n//2] = 1 # [123:133] shape(1, 256)

未执行=1时:
在这里插入图片描述
执行=1后:
在这里插入图片描述

        size = mask.itemsize # 8 float64
        mask = as_strided(mask, (N, Nx, Ny), (size * Nx, size, 0)) # (1, 256, 256)

在这里插入图片描述
plt.imshow(mask[0,:,:],cmap=‘Greys’)
在这里插入图片描述

mask = mask.reshape(shape) #(1, 256, 256)

reshape之后可视化条形图没变化
在这里插入图片描述

        if not self.centred:
            mask = ifftshift(mask, axes=(-1, -2))

        return mask

在这里插入图片描述
plt.imshow(mask[0,:,:],cmap=‘Greys’)
在这里插入图片描述
在这里插入图片描述

#这句要放到最后,否则后面代码assert x.shape == mask.shape会报错
        mask = format_data(mask, mask=True) 
def format_data(data, mask=False):
    if mask: 
        data = data * (1+1j)

    data = complex2real(data)
    return data.squeeze(0)
def complex2real(x):
    x_real = np.real(x)
    x_imag = np.imag(x)
    y = np.array([x_real, x_imag]).astype(np.float)
    # re-order in convenient order
    if x.ndim >= 3:
        y = y.swapaxes(0, 1)
    return y

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
data = complex2real(data)即等于y
在这里插入图片描述
mask = data.squeeze(0)
在这里插入图片描述
图是一样的, 因为mask * (1+1j),这样实部和虚部数值一样
在这里插入图片描述

‘image’&‘k’:首先准备data_und, k_und

        data_und, k_und = self.undersample(data, mask)

在这里插入图片描述

        assert x.shape == mask.shape
        # zero mean complex Gaussian noise
        noise_power = self.noise # 0
        nz = np.sqrt(.5)*(np.random.normal(0, 1, x.shape) + 1j * np.random.normal(0, 1, x.shape)) # nz.shape(1, 256, 256),x.shape(1, 256, 256)       

在这里插入图片描述

 nz = nz * np.sqrt(noise_power)

nz:
在这里插入图片描述
nz的可视化图是空白的,因为noise_power=0,所以min、max都是0j
在这里插入图片描述

        if self.norm == 'ortho':
            # multiplicative factor
            nz = nz * np.sqrt(np.prod(mask.shape[-2:])) #mask.shape[-2:]:(256, 256), np.prod():65536, np.sqrt():256.0

nz可视化图是空白的,因为上一个nz=0,相乘=0
在这里插入图片描述

        if self.centred: # centred=False
            x_f = fft2c(x, norm=self.norm)
            x_fu = mask * (x_f + nz)
            x_u = ifft2c(x_fu, norm=self.norm)
            return x_u, x_fu
        else:
            x_f = fft2(x, norm=self.norm) # norm='ortho'
            x_fu = mask * (x_f + nz)
            x_u = ifft2(x_fu, norm=self.norm)
            return x_u, x_fu

plt.imshow(np.log(np.abs(x_f[0,:,:])+1e-7),cmap=‘Greys’)
在这里插入图片描述
plt.imshow(np.log(np.abs(x_fu[0,:,:])+1e-7),cmap=‘Greys’)
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
data_und, k_und = x_u, x_fu
在这里插入图片描述
在这里插入图片描述
plt.imshow(np.abs(x_u[0,:,:]),cmap=‘Greys’)
在这里插入图片描述
plt.imshow(np.abs(data[0,:,:]),cmap=‘Greys’)
在这里插入图片描述
上面的流程总结如下:
在这里插入图片描述

‘image’: data_und

        data_und = format_data(data_und)
def format_data(data, mask=False):

    data = complex2real(data)
    return data.squeeze(0)
def complex2real(x):
    x_real = np.real(x)
    x_imag = np.imag(x)
    y = np.array([x_real, x_imag]).astype(np.float)
    # re-order in convenient order
    if x.ndim >= 3:
        y = y.swapaxes(0, 1)  #由(2,1,256,256)变(1,2,256,256)
    return y

data = complex2real(data)即等于y
在这里插入图片描述
在这里插入图片描述
plt.imshow(x_real[0,:,:],cmap=‘Greys’)
在这里插入图片描述
在这里插入图片描述
plt.imshow(x_imag[0,:,:],cmap=‘Greys’)
在这里插入图片描述

在这里插入图片描述
data_und = data.squeeze(0)
在这里插入图片描述

‘k’: k_und.transpose(1,2,0)

        k_und = format_data(k_und)
def format_data(data, mask=False):

    data = complex2real(data)
    return data.squeeze(0)
def complex2real(x):
    x_real = np.real(x)
    x_imag = np.imag(x)
    y = np.array([x_real, x_imag]).astype(np.float)
    # re-order in convenient order
    if x.ndim >= 3:
        y = y.swapaxes(0, 1)
    return y

在这里插入图片描述
在这里插入图片描述
plt.imshow(x_real[0,:,:],cmap=‘Greys’)
在这里插入图片描述
在这里插入图片描述
plt.imshow(x_imag[0,:,:],cmap=‘Greys’)
在这里插入图片描述

在这里插入图片描述
k_und = data.squeeze(0)
在这里插入图片描述

        return {
            'image': data_und,
            'k': k_und.transpose(1,2,0),
            'mask': mask.transpose(1,2,0),
            'full': data_gnd
        }

sample = dataset[0]即4个tensor
第一个tensor。‘image’: data_und
第二个tensor。‘k’: k_und.transpose(1,2,0)
在这里插入图片描述
第三个tensor。‘mask’: mask.transpose(1,2,0)
在这里插入图片描述
第四个tensor。‘full’: data_gnd

输出:
Sample image shape: (2, 256, 256)
Sample full shape: (2, 256, 256)
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值