Source code for EMCqMRI.core.utilities.dataset_utilities
from __future__ import absolute_import
from __future__ import division
from __future__ import print_function
import datetime
import logging
import numpy as np
from numpy.random import RandomState
import torch
from scipy.ndimage import gaussian_filter
[docs]def get_rand_seed(tag):
if tag:
tim = datetime.datetime.now()
randseed = tim.hour*10000+tim.minute*100+tim.second+tim.microsecond
return RandomState(randseed)
else:
return RandomState(11723555)
[docs]def smooth_maps(kappa, args):
if args.engine.signalModel == 'looklocker':
sigma = [0.4, 0.0, 0.4]
if args.engine.signalModel == 'fse':
sigma = [0.4, 0.4]
kappaSmooth = []
for i, k_patch in enumerate(kappa):
kappaSmooth.append([gaussian_filter(k, sigma[i], 0) for k in k_patch])
kappaSmooth = np.moveaxis(np.stack(kappaSmooth), 1, 0)
return np.stack(kappaSmooth)
[docs]def apply_gt_noise(kappa, pngr, args):
#TODO noise should be proportional per tissue.
if args.engine.signalModel == 'looklocker':
k = [0.05, 0.0, 0.1]
# k = [0.0, 0.0, 0.0]
if args.engine.signalModel == 'fse':
k = [0.05, 0.01]
noisyKappa = []
for i, kmap in enumerate(kappa):
patch_kappa = []
for patch in kmap:
if not args.dataset.useRandomSeed:
pngr = get_rand_seed(args.dataset.useRandomSeed)
noise_map = pngr.normal(0, k[i], np.shape(kmap[0]))
patch_kappa.append(patch + noise_map)
noisyKappa.append(patch_kappa)
return np.stack(noisyKappa)
[docs]def add_artefacts(kappa):
kappa[:,-1, 136,93:99] = 1.2
kappa[:,-1, 126:132,92] = 1.2
kappa[:,-1, 130, 84] = 1.2
kappa[:,-1, 137, 84] = 0.4
return kappa
[docs]class ExtractPatch(object):
def __init__(self, args):
self.args = args
[docs] def get_patch(self, data):
mask = data > 1
patch_coordinates = self.__getCoordinates__(mask, self.args.dataset.patchSize, self.args.engine.batchSize, self.args.dataset.pngr, self.args.dataset.useRandomSeed)
patch_data = self.__extractPatch__(patch_coordinates, data)
return patch_data
def __find__(self, target, myList, pngr, use_random_seed):
for _ in range(len(myList)):
r = pngr.randint(1, int(len(myList)), 1)
if myList[r] == target and use_random_seed:
yield r
elif not use_random_seed:
yield [int(len(myList)/3)]
def __getCoordinates__(self, mask_data, patch_size, number_of_patches, pngr, use_random_seed):
init_patch_coord = []
end_patch_coord = []
mask_index_find = self.__find__(1, mask_data.ravel(), pngr, use_random_seed)
for _ in range(number_of_patches):
indx = np.unravel_index(next(mask_index_find), mask_data.shape)
for coord in range(3):
if indx[coord][0] < patch_size:
diff = (patch_size - indx[coord][0]) + 1
indx[coord][0] = indx[coord][0] + diff
if indx[coord][0] > (np.shape(mask_data)[coord]-patch_size):
diff = (indx[coord][0] - np.shape(mask_data)[coord] + patch_size) + 1
indx[coord][0] = indx[coord][0] - diff
random_mask_coord_init = [coord - patch_size for coord in indx]
random_mask_coord_end = [coord + patch_size for coord in random_mask_coord_init]
init_patch_coord.append(random_mask_coord_init)
end_patch_coord.append(random_mask_coord_end)
return init_patch_coord, end_patch_coord
def __extractPatch__(self, coord_patches, data):
initial_coord = coord_patches[0]
end_coord = coord_patches[1]
all_patches = []
for c in range(len(initial_coord)):
patch = data[initial_coord[c][0][0]:end_coord[c][0][0], initial_coord[c][1][0]:end_coord[c][1][0], initial_coord[c][2][0]:end_coord[c][2][0]]
all_patches.append(patch)
return np.stack(all_patches)