paired_mrus_brain.demo_data   A
last analyzed

Complexity

Total Complexity 0

Size/Duplication

Total Lines 240
Duplicated Lines 0 %

Importance

Changes 0
Metric Value
wmc 0
eloc 182
dl 0
loc 240
rs 10
c 0
b 0
f 0
1
import os
2
import shutil
3
import zipfile
4
5
import nibabel as nib
6
import numpy as np
7
from tensorflow.keras.utils import get_file
8
from tqdm import tqdm
9
10
DOWNLOAD_FULL_DATA = False
11
DATA_PATH = "dataset"
12
main_path = os.getcwd()
13
14
project_dir = os.path.join(main_path, r"demos/paired_mrus_brain")
15
os.chdir(project_dir)
16
17
######## PARTIAL PREPROCESSED DATA DOWNLOAD (COMMENT OUT) ########
18
# Please comment out this code block if full data needs to be used
19
url = "https://github.com/ucl-candi/dataset_resect/archive/master.zip"
20
fname = "dataset.zip"
21
get_file(os.path.join(os.getcwd(), fname), url)
22
23
# unzip to a temporary folder
24
tmp_folder = "dataset_tmp"
25
with zipfile.ZipFile(fname, "r") as zip_ref:
26
    zip_ref.extractall(tmp_folder)
27
28
if os.path.exists(DATA_PATH):
29
    shutil.rmtree(DATA_PATH)
30
os.mkdir(DATA_PATH)
31
32
# move needed data
33
shutil.move(
34
    os.path.join(tmp_folder, "dataset_resect-master", "paired_mr_us_brain", "test"),
35
    os.path.join("dataset", "test"),
36
)
37
shutil.move(
38
    os.path.join(tmp_folder, "dataset_resect-master", "paired_mr_us_brain", "train"),
39
    os.path.join("dataset", "train"),
40
)
41
42
# remove temporary folder
43
os.remove(fname)
44
shutil.rmtree(tmp_folder)
45
46
######## DOWNLOAD MODEL CKPT FROM MODEL ZOO ########
47
url = "https://github.com/DeepRegNet/deepreg-model-zoo/raw/master/paired_mrus_brain_demo_logs.zip"
48
fname = "pretrained.zip"
49
get_file(os.path.join(os.getcwd(), fname), url)
50
51
with zipfile.ZipFile(fname, "r") as zip_ref:
52
    zip_ref.extractall(os.path.join("dataset", "pretrained"))
53
54
# remove pretrained.zip
55
os.remove(fname)
56
57
# download full data
58
if not DOWNLOAD_FULL_DATA:
59
    exit()
60
print("Code for downloading full data is not tested.")
61
62
if os.path.exists("dataset_resect") is not True:
63
    os.mkdir("dataset_resect")
64
    os.mkdir(r"dataset_resect/paired_mr_us_brain")
65
url = "https://ns9999k.webs.sigma2.no/10.11582_2020.00025/EASY-RESECT.zip"
66
fname = "EASY-RESECT.zip"
67
path_to_zip_file = "dataset_resect"
68
get_file(os.path.join(os.getcwd(), path_to_zip_file, fname), url)
69
with zipfile.ZipFile(os.path.join(path_to_zip_file, fname), "r") as zip_ref:
70
    zip_ref.extractall(os.path.join(path_to_zip_file, "paired_mr_us_brain"))
71
path_to_nifti = os.path.join(
72
    path_to_zip_file, "paired_mr_us_brain", "EASY-RESECT", "NIFTI"
73
)
74
all_folders = os.listdir(path_to_nifti)
75
for folder in all_folders:
76
    source = os.path.join(path_to_nifti, folder)
77
    destination = "dataset_resect/paired_mr_us_brain"
78
    shutil.move(source, destination)
79
print("Files restructured!")
80
test_ratio = 0.25
81
path_to_data = "dataset_resect/paired_mr_us_brain"
82
cases_list = os.listdir(path_to_data)
83
os.mkdir(os.path.join(path_to_data, "test"))
84
os.mkdir(os.path.join(path_to_data, "train"))
85
num_test = round(len(cases_list) * test_ratio)
86
for folder in cases_list[:num_test]:
87
    source = os.path.join(path_to_data, folder)
88
    destination = os.path.join(path_to_data, "test")
89
    shutil.move(source, destination)
90
for folder in cases_list[num_test:]:
91
    source = os.path.join(path_to_data, folder)
92
    destination = os.path.join(path_to_data, "train")
93
    shutil.move(source, destination)
94
folders = os.listdir(path_to_data)
95
for folder in folders:
96
    sub_folders = os.listdir(os.path.join(path_to_data, folder))
97
    for sub_folder in tqdm(sub_folders):
98
        if "DS_St" in sub_folder:
99
            os.remove(os.path.join(path_to_data, folder, sub_folder))
100
        else:
101
            files = os.listdir(os.path.join(path_to_data, folder, sub_folder))
102
            for file in files:
103
                if "T1" in file:
104
                    arr = nib.load(
105
                        os.path.join(path_to_data, folder, sub_folder, file)
106
                    ).get_data()
107
                    img = nib.Nifti1Image(arr, affine=np.eye(4))
108
                    img.to_filename(
109
                        os.path.join(
110
                            path_to_data,
111
                            folder,
112
                            sub_folder,
113
                            file.split(".nii")[0] + "_resized.nii.gz",
114
                        )
115
                    )
116
                elif "US" in file:
117
                    img = nib.load(os.path.join(path_to_data, folder, sub_folder, file))
118
                    nib.save(
119
                        img,
120
                        os.path.join(
121
                            path_to_data,
122
                            folder,
123
                            sub_folder,
124
                            file.split(".ni")[0] + ".nii.gz",
125
                        ),
126
                    )
127
shutil.rmtree(r"dataset_resect/paired_mr_us_brain/train/EASY-RESECT")
128
shutil.rmtree(r"dataset_resect/paired_mr_us_brain/train/__MACOSX")
129
130
# Preprocess the downloaded data
131
if os.path.exists("dataset_resect/README.md"):
132
    os.remove("dataset_resect/README.md")
133
134
data_folder = "dataset_resect/paired_mr_us_brain"
135
folders = os.listdir(os.path.join(project_dir, data_folder))
136
137
# Move files into correct directories
138
for folder in folders:
139
    sub_folders = os.listdir(os.path.join(project_dir, data_folder, folder))
140
    if (
141
        os.path.exists(os.path.join(project_dir, data_folder, folder, "fixed_images"))
142
        is not True
143
    ):
144
        os.mkdir(os.path.join(project_dir, data_folder, folder, "fixed_images"))
145
        os.mkdir(os.path.join(project_dir, data_folder, folder, "moving_images"))
146
    for sub_folder in sub_folders:
147
        files = os.listdir(os.path.join(project_dir, data_folder, folder, sub_folder))
148
        for file in files:
149
            if "T1" in file:
150
                source = os.path.join(
151
                    project_dir, data_folder, folder, sub_folder, file
152
                )
153
                destination = os.path.join(
154
                    project_dir, data_folder, folder, "fixed_images", file
155
                )
156
                shutil.move(source, destination)
157
            elif "US" in file:
158
                source = os.path.join(
159
                    project_dir, data_folder, folder, sub_folder, file
160
                )
161
                destination = os.path.join(
162
                    project_dir, data_folder, folder, "moving_images", file
163
                )
164
                shutil.move(source, destination)
165
166
print("Files moved into correct directories")
167
168
# Remove unused files
169
for folder in folders:
170
    sub_folders = os.listdir(os.path.join(project_dir, data_folder, folder))
171
    for sub_folder in sub_folders:
172
        if "Case" in sub_folder:
173
            shutil.rmtree(os.path.join(project_dir, data_folder, folder, sub_folder))
174
print("Unused files removed")
175
176
# Rename files to match names
177
for folder in folders:
178
    sub_folders = os.listdir(os.path.join(project_dir, data_folder, folder))
179
    for sub_folder in sub_folders:
180
        files = os.listdir(os.path.join(project_dir, data_folder, folder, sub_folder))
181
        for file in files:
182
            source = os.path.join(project_dir, data_folder, folder, sub_folder, file)
183
            destination = os.path.join(
184
                project_dir,
185
                data_folder,
186
                folder,
187
                sub_folder,
188
                file.split("-")[0] + ".nii.gz",
189
            )
190
            im = nib.load(source)
191
            nib.save(im, destination)
192
            os.remove(source)
193
print("files renamed to match each other")
194
195
# Rescale images
196
c = 0
197
for folder in folders:
198
    sub_folders = os.listdir(os.path.join(project_dir, data_folder, folder))
199
    for sub_folder in sub_folders:
200
        files = os.listdir(os.path.join(project_dir, data_folder, folder, sub_folder))
201
        for file in files:
202
            try:
203
                if "fixed" in sub_folder:
204
                    im_data = np.asarray(
205
                        nib.load(
206
                            os.path.join(
207
                                project_dir, data_folder, folder, sub_folder, file
208
                            )
209
                        ).dataobj,
210
                        dtype=np.float32,
211
                    )
212
213
                    im_data = ((im_data + 150) / (1700 + 150)) * 255.0  # rescale image
214
215
                    img = nib.Nifti1Image(im_data, affine=None)
216
                    nib.save(
217
                        img,
218
                        os.path.join(
219
                            project_dir, data_folder, folder, sub_folder, file
220
                        ),
221
                    )
222
                    img = nib.load(
223
                        os.path.join(
224
                            project_dir, data_folder, folder, "moving_images", file
225
                        )
226
                    )
227
            except nib.filebasedimages.ImageFileError:
228
                os.remove(
229
                    os.path.join(project_dir, data_folder, folder, "fixed_images", file)
230
                )
231
                os.remove(
232
                    os.path.join(
233
                        project_dir, data_folder, folder, "moving_images", file
234
                    )
235
                )
236
                c = c + 1
237
print("Images rescaled")
238
print("All done!")
239
print("Number of files removed due to not loading properly:", c)
240