File size: 5,532 Bytes
64ea7b2
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
from tqdm import tqdm

import aix
from aix import AIX_DATASETS, AIX_EVALS, MATURE, IMMATURE
from aix.np_metrics import hard_dice, dice, rel_size_diff
import cv2
import pandas as pd
import json

all_measures = {
        "dice": dice,
        "hard_dice": hard_dice,
        "rel_size_diff": rel_size_diff
    }

OOCYTE = "oocyte"
REFERENCE = "reference"
COMPARED = "compared"


def load_csv(filename):
    csv_file_path = AIX_EVALS / filename
    if csv_file_path.is_file():
        print("Loaded")
        return pd.read_csv(csv_file_path, dtype={OOCYTE: str})
    else:
        print("NOT FOUND!!!")
        print(csv_file_path)
    return None


def compare_masks(reference: str, alternatives: str, measures=all_measures,
                  in_csv_metrics="eval.csv", out_csv_metrics="out.csv"):
    df_old = load_csv(in_csv_metrics)
    print(df_old)
    reference_dataset = aix.Dataset.from_file(AIX_DATASETS / reference)
    alt_datasets = {}
    for alt in alternatives:
        alt_datasets[alt] = aix.Dataset.from_file(AIX_DATASETS / alt)
    l = []
    for item_mask in tqdm(reference_dataset.iterate_mask_items()):
        ref_mask_img = item_mask.norm_image(cv2.IMREAD_GRAYSCALE)
        for alt, alt_d in alt_datasets.items():
            if item_mask.index in alt_d.oocytes:
                alt_mask = aix.Item(alt_d, mask=item_mask.mask, stage=item_mask.stage, index=item_mask.index)
                alt_mask_img = alt_mask.norm_image(cv2.IMREAD_GRAYSCALE)
                d = {OOCYTE: item_mask.index,
                     MATURE: item_mask.stage,
                     REFERENCE: reference_dataset.name,
                     COMPARED: alt_d.name}
                for measure_name, measure in measures.items():
                    m = measure(ref_mask_img, alt_mask_img)
                    d[measure_name] = m
                l.append(d)
            else:
                print("Ignoring oocyte " + str(item_mask.index) + " for dataset " + alt_d.name)
        #break
    df = pd.DataFrame(l)
    if df_old is not None:
        index_fields = [OOCYTE, MATURE, REFERENCE, COMPARED]
        df = df_old.merge(df, how='outer', on=index_fields, suffixes=("_x", None))
        print("After merge")
        print(df[COMPARED].unique())
        for measure_name in measures:
            index_fields.append(measure_name)
            df[measure_name].fillna(df[measure_name + "_x"], inplace=True)
        df = df[index_fields]
    out_csv_file_path = AIX_EVALS / out_csv_metrics
    out_csv_file_path.parent.mkdir(parents=True, exist_ok=True)
    print(out_csv_file_path)
    df.to_csv(out_csv_file_path, index=False)

    return df


def make_dict(df: pd.DataFrame):
    d = {}

    metrics = df.columns
    for index, row in df.iterrows():
        name = "-".join(index)
        for i, val in enumerate(row):
            namem = name + "-" + metrics[i]
            d[namem] = val
    return d

def summarize_comparison(df:pd.DataFrame, metrics_file="eval.json"):
    print(df)
    gb = df.drop([MATURE,OOCYTE], axis=1).groupby([REFERENCE, COMPARED])
    print(gb)
    means = make_dict(gb.mean())
    medians = make_dict(gb.median())
    d = {"MEANS": means, "MEDIANS": medians}
    filepath = AIX_EVALS/metrics_file
    with filepath.open("w") as f:
        json.dump(d, f)
    # df.groupby([REFERENCE, COMPARED, MATURE])
    # df.mean()
    # df.median()
    #
    # measures = df.columns[4:]
    # labelings = np.unique(df[])
    # for alt in alternatives:
    #     print("==", alt)
    #
    #     for measure_name in measures:
    #         condition = (df["reference"] == reference_dataset.name) & (df["compared"] == alt_datasets[alt].name)
    #         measure_slice = df[condition][measure_name].to_numpy()
    #         print("   Mean " + measure_name + ": %4.4f" % np.mean(measure_slice))
    #         print("   Median " + measure_name + ": %4.4f" % np.median(measure_slice))
    #         for mature in [False,True]:
    #             condition_mature = condition & (df[MATURE]==mature)
    #             measure_slice = df[condition_mature][measure_name].to_numpy()
    #             mature_txt = MATURE if mature else IMMATURE
    #             print("   Mean " + measure_name + " " + mature_txt + ": %4.4f" % np.mean(measure_slice))
    #             print("   Median " + measure_name + " " + mature_txt + ": %4.4f" % np.median(measure_slice))

            
            
def evaluate_scale_loss(reference: str, dim, interpolation=cv2.INTER_AREA, extrapolation=cv2.INTER_CUBIC, measures=all_measures):
    reference_dataset = aix.Dataset.from_file(reference)
    measure_vals = {}
    for measure_name in measures:
        measure_vals[measure_name] = []
    for item_mask in tqdm(reference_dataset.iterate_mask_items()):
        ref_mask_img = item_mask.uint_norm_image()
        
        resized = cv2.resize(ref_mask_img, dim, interpolation=interpolation)
        back_area = cv2.resize(resized, (ref_mask_img.shape[1], ref_mask_img.shape[0]), interpolation=extrapolation)
        back_area[back_area<0.]=0.
        back_area[back_area>1.]=1.
        for measure_name, measure in measures.items():
            measure_vals[measure_name].append(measure(ref_mask_img, back_area))
         
    print("\nReference: " + reference + "\n")
    
    first_measure_name = next(iter(measures))
    n_masks = len(measure_vals[first_measure_name])
    print("   N.Images : %4d" % n_masks)
    for measure_name in measures:
        print("   " + measure_name + ": %4.2f" % (sum(measure_vals[measure_name]) / n_masks))