|
import os, sys |
|
currentdir = os.path.dirname(os.path.realpath(__file__)) |
|
parentdir = os.path.dirname(currentdir) |
|
sys.path.append(parentdir) |
|
|
|
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): |
|
|
|
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:] |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
print('\nResults...') |
|
print(df) |
|
|
|
print('\nSummary...') |
|
print(df.describe()) |
|
|
|
df.to_csv('comparison.csv', sep=';') |
|
|