File size: 4,687 Bytes
ac29da8 |
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 |
import os, sys
currentdir = os.path.dirname(os.path.realpath(__file__))
parentdir = os.path.dirname(currentdir)
sys.path.append(parentdir) # PYTHON > 3.3 does not allow relative referencing
import nibabel as nib
import re
import medpy.metric as medpy_metrics
import pandas as pd
import numpy as np
from tqdm import tqdm
import multiprocessing as mp
IMG_DIRECTORY = '/mnt/EncryptedData1/Laparoscopy/OSLO_COMET_dataset/OSLO_COMET_CT/Volumes_nii/test_set'
VES_SEG_DIRECTORY = '/mnt/EncryptedData1/Laparoscopy/OSLO_COMET_dataset/OSLO_COMET_CT/Vessels'
PAR_SEG_DIRECTORY = '/mnt/EncryptedData1/Laparoscopy/OSLO_COMET_dataset/OSLO_COMET_CT/Parenchyma'
LM_SEG_DIRECTORY = '/mnt/EncryptedData1/Laparoscopy/OSLO_COMET_dataset/OSLO_COMET_CT/LiverMask/test_set'
nii_FILENAME_PATTERN = '(.*)_CT.nii'
LV_VESSEL_FILENAME_PATTERN = '(.*)-vessels.nii'
LV_PARENCHYMA_FILENAME_PATTERN = '(.*)-livermask.nii'
OUT_DIRECTORY = '/mnt/EncryptedData1/Users/javier/ext_datasets/COMET_ai_vs_human'
def process_group(file_list):
# print('Got: ' + ','.join(file_list))
img_file, par_file, ves_file, lm_par_file, lm_ves_file = file_list
img_num = int(re.match(nii_FILENAME_PATTERN, os.path.split(img_file)[-1])[1])
human_par = nib.load(par_file)
header = human_par.header
human_par = np.asarray(human_par.dataobj)
human_ves = np.asarray(nib.load(ves_file).dataobj)
lm_par = np.asarray(nib.load(lm_par_file).dataobj)
lm_ves = np.asarray(nib.load(lm_ves_file).dataobj)
lm_ves[lm_ves > 0] = 1
dsc_par = medpy_metrics.dc(human_par, lm_par)
dsc_ves = medpy_metrics.dc(human_ves, lm_ves)
hd_par = medpy_metrics.hd(human_par, lm_par, voxelspacing=header['pixdim'][1:4])
hd_ves = medpy_metrics.hd(human_ves, lm_ves, voxelspacing=header['pixdim'][1:4])
hd95_par = medpy_metrics.hd95(human_par, lm_par, voxelspacing=header['pixdim'][1:4])
hd95_ves = medpy_metrics.hd95(human_ves, lm_ves, voxelspacing=header['pixdim'][1:4])
return img_num, dsc_par, dsc_ves, hd_par, hd_ves, hd95_par, hd95_ves
if __name__ == '__main__':
img_list = [os.path.join(IMG_DIRECTORY, f) for f in os.listdir(IMG_DIRECTORY) if f.endswith('.nii')]
img_list.sort()
ves_seg_list = [os.path.join(VES_SEG_DIRECTORY, os.path.split(f)[-1]+'.gz') for f in img_list]
ves_seg_list.sort()
par_seg_list = [os.path.join(PAR_SEG_DIRECTORY, os.path.split(f)[-1]+'.gz') for f in img_list]
par_seg_list.sort()
lm_ves_seg_list = [os.path.join(LM_SEG_DIRECTORY, f) for f in os.listdir(LM_SEG_DIRECTORY) if f.endswith('-vessels.nii')]
lm_ves_seg_list.sort()
lm_par_seg_list = [os.path.join(LM_SEG_DIRECTORY, f) for f in os.listdir(LM_SEG_DIRECTORY) if f.endswith('-livermask.nii')]
lm_par_seg_list.sort()
os.makedirs(OUT_DIRECTORY, exist_ok=True)
zip_lists = zip(img_list, par_seg_list, ves_seg_list, lm_par_seg_list, lm_ves_seg_list)
mets = ['DSC', 'DSC', 'HD', 'HD', 'H95', 'H95']
segs = ['Parenchyma', 'Vessels', 'Parenchyma', 'Vessels', 'Parenchyma', 'Vessels']
cols = list(zip(*[mets, segs]))
idx = pd.MultiIndex.from_tuples(cols, names=['Metrics', 'Labels'])
df = pd.DataFrame(index=idx)
print('\nLaunching processes...')
with mp.Pool(11, maxtasksperchild=1) as p:
results = p.map_async(process_group, zip_lists)
for v in results.get():
df[v[0]] = v[1:]
# for i, (img_file, par_file, ves_file, lm_par_file, lm_ves_file) in tqdm(enumerate(zip_lists), total=len(img_list)):
# img_name = re.match(nii_FILENAME_PATTERN, os.path.split(img_file)[-1])[1]
#
# img = nib.load(img_file)
# human_par = nib.load(par_file)
# header = human_par.header
# human_par = np.asarray(human_par.dataobj)
# human_ves = np.asarray(nib.load(ves_file).dataobj)
#
# lm_par = np.asarray(nib.load(lm_par_file).dataobj)
# lm_ves = np.asarray(nib.load(lm_ves_file).dataobj)
# lm_ves[lm_ves > 0] = 1
#
# dsc_par = medpy_metrics.dc(human_par, lm_par)
# dsc_ves = medpy_metrics.dc(human_ves, lm_ves)
#
# hd_par = medpy_metrics.hd(human_par, lm_par, voxelspacing=header['pixdim'][1:4])
# hd_ves = medpy_metrics.hd(human_ves, lm_ves, voxelspacing=header['pixdim'][1:4])
#
# hd95_par = medpy_metrics.hd95(human_par, lm_par, voxelspacing=header['pixdim'][1:4])
# hd95_ves = medpy_metrics.hd95(human_ves, lm_ves, voxelspacing=header['pixdim'][1:4])
#
# df[i] = [dsc_par, dsc_ves, hd_par, hd_ves, hd95_par, hd95_ves]
print('\nResults...')
print(df)
print('\nSummary...')
print(df.describe())
df.to_csv('comparison.csv', sep=';')
|