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=';')