/
make_ibis.py
157 lines (111 loc) · 5.58 KB
/
make_ibis.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
import numpy as np
import os, csv, time, h5py, subprocess
import nibabel as nib
from collections import defaultdict
from skimage.exposure import adjust_log, adjust_sigmoid
import pickle as pkl
import matplotlib as mpl
mpl.use('Agg')
import matplotlib.pyplot as plt
import matplotlib.cm as cm
from make_datasets import normalise_zero_one, resize_image_with_crop_or_pad
data_dir = '/data1/users/adoyle/IBIS/'
label_file = data_dir + 't1_ibis_QC_labels.csv'
target_size = (160, 256, 224)
def make_ibis_qc():
data_points = []
with open(label_file, 'r') as labels_csv:
qc_reader = csv.reader(labels_csv)
next(qc_reader)
lines = list(qc_reader)
for line in lines:
data_point = {}
data_point['candidate_id'] = line[0]
data_point['visit_label'] = line[1]
data_point['t1_filename'] = line[3][9:]
data_point['qc_label'] = line[4]
try:
t1 = nib.load(data_dir + data_point['t1_filename'])
data_points.append(data_point)
except:
print('Missing', data_point['t1_filename'])
print('Found', len(data_points), 'T1w MRI scans of', len(lines), 'QC ratings')
total_subjects = len(data_points)
with h5py.File(data_dir + 'IBIS_QC.hdf5', 'w') as f:
f.create_dataset('MRI', (total_subjects, 1, target_size[0], target_size[1], target_size[2]), dtype='float32')
f.create_dataset('qc_label', (total_subjects,), dtype='float32')
dt = h5py.special_dtype(vlen=bytes)
f.create_dataset('filename', (total_subjects,), dtype=dt)
# f.swmr_mode = True
os.makedirs(data_dir + '/examples/', exist_ok=True)
for i, data_point in enumerate(data_points):
if 'Pass' in data_point['qc_label']:
pass_fail = 1
else:
pass_fail = 0
f['qc_label'][i] = pass_fail
t1_data = nib.load(data_dir + data_point['t1_filename']).get_data()
if not t1_data.shape == target_size:
# print('resizing from', t1_data.shape)
t1_data = resize_image_with_crop_or_pad(t1_data, img_size=target_size, mode='constant')
print('Original size', t1_data.shape)
image_to_save = np.reshape(normalise_zero_one(t1_data), (1,) + (target_size))
print('Reshaped', image_to_save.shape)
plt.imshow(image_to_save[0, target_size[0] // 2 + 5, :, :])
plt.savefig(data_dir + '/examples/' + data_point['qc_label'] + '_' + data_point['candidate_id'] + '.png')
plt.axis('off')
plt.tight_layout()
plt.clf()
image_to_save = adjust_sigmoid(image_to_save)
print('Log normalized', image_to_save.shape)
f['MRI'][i, ...] = image_to_save
f['filename'][i] = data_point['t1_filename']
plt.imshow(image_to_save[0, target_size[0] // 2 + 5, :, :])
plt.savefig(data_dir + '/examples/' + data_point['qc_label'] + '_' + data_point['candidate_id'] + '_log_normalized.png')
plt.axis('off')
plt.tight_layout()
plt.clf()
print(str(i+1), 'of', total_subjects, data_point['candidate_id'])
def ibis_bids(source_dir, label_file):
ibis_dir = '/data1/users/adoyle/IBIS/'
# sample_nifti_file = 'E:/brains/MRBrainS18/training/1/orig/FLAIR.nii.gz'
#
# sample_nii = nib.load(sample_nifti_file)
#
# sample_header = sample_nii.get_header()
ibis_files = []
for participant_level in os.listdir(ibis_dir):
if os.path.isdir(ibis_dir + participant_level):
for session_level in os.listdir(ibis_dir + participant_level):
if os.path.exists(ibis_dir + participant_level + '/' + session_level + '/mri/native/') and not 'sub' in session_level:
# print(session_level)
for filename in os.listdir(ibis_dir + participant_level + '/' + session_level + '/mri/native/'):
if '.mnc' in filename and not 'phantom' in filename.lower():
minc_filepath = ibis_dir + participant_level + '/' + session_level + '/mri/native/' + filename
ibis_files.append(minc_filepath)
# print(minc_filepath)
for ibis_img in ibis_files:
tokens = ibis_img.split('_')
subj_id = tokens[1]
session = tokens[2]
run = tokens[4][:-4]
full_path = ibis_dir + '/BIDS/sub-' + subj_id + '/ses-' + session.upper() + '/anat/'
os.makedirs(full_path, exist_ok=True)
new_filename = 'sub-' + subj_id + '_ses-' + session.upper() + '_run-' + run + '_T1w'
subprocess.run('mnc2nii -nii ' + ibis_img + ' ' + full_path + new_filename, shell=True, check=True)
def redo_extension():
ibis_dir = '/data1/users/adoyle/IBIS/BIDS/'
for subject_level in os.listdir(ibis_dir):
if 'sub' in subject_level:
for session_level in os.listdir(ibis_dir + subject_level):
for t1_filename in os.listdir(ibis_dir + subject_level + '/' + session_level + '/anat/'):
if '.nii.gz.nii' in t1_filename:
os.rename(ibis_dir + subject_level + '/' + session_level + '/anat/' + t1_filename, ibis_dir + subject_level + '/' + session_level + '/anat/' + t1_filename[:-7])
if __name__ == '__main__':
print('Creating IBIS HDF5 file for quality control training')
# source_dir = 'E:/brains/IBIS/'
# label_file = 'ibis_t1_qc.csv'
make_ibis_qc()
# ibis_bids(source_dir, label_file)
# redo_extension()
print('Done!')