Skip to content
Snippets Groups Projects
count_misclassified_instance.py 5.32 KiB
Newer Older
  • Learn to ignore specific revisions
  • Vajay Mónika's avatar
    Vajay Mónika committed
    import numpy 
    import json
    import os
    import pandas as pd
    
    # megnezni hogy hogy megy a kimentese...
    # megszamolni, hogy hany elem van a key-ek kozott
    # ha at kell irni a kimentest: csak a rosszul klasszifalt fajl nevet kiirni, minden más csak sub dolog legyen
    AXIS_CONVERTION = {
        '0': "axial",
        '1': "coronial",
        '2': "sagittal"
    }
    #file_name = "comparision_N1_N2_N3_graphs/resnet18_basic_N1_misclassified_test_set_N3.json"
    
    folder_path = "comparision_N1_N2_N3_graphs/misclassified_data/"
    for item in os.listdir(folder_path):
        file_name = os.path.join(folder_path, item)  # Get full path
        print(file_name)
        with open(file_name, 'r') as file:
                data = json.load(file) 
    
        all_mistake = 0
        individual_mistakes = 0
    
        mistake_positions = {"sagittal": [], "axial": [], "coronial": []}
        good_positions = {"sagittal": [], "axial": [], "coronial": []}
        mistakes = {"sagittal": 0, "axial": 0, "coronial": 0}
        mistakes_all = {"sagittal": 0, "axial": 0, "coronial": 0}
        mistake_types = {"FLAIR": 0, "FLAIRCE": 0, "OTHER": 0, "T1w": 0, "T1wCE": 0, "T2star": 0, "T2w": 0}
    
        if not "averaging" in file_name:  
            for ground_truth, base_names in data.items():
                for base_name, axes in base_names.items():
                    individual_mistakes += 1
                    for axis, axis_data in axes.items():
                        slice_positions = axis_data["slice_position"]
    
                        if isinstance(slice_positions, str):
                            slice_positions = int(slice_positions)
                            mistake_count = 1
                            mistake_positions[axis].append(slice_positions)
                        else:
                            mistake_count = len(slice_positions)
                            for i in range(mistake_count):
                                mistake_positions[axis].append(int(slice_positions[i]))
                                print(f"{int(slice_positions[i])},len: {mistake_count} type: {type(int(slice_positions[i]))}")
                        
                        all_mistake += mistake_count
                        mistakes_all[axis] += mistake_count
                        mistake_types[ground_truth] += mistake_count
    
                        if len(axes) != 3:
                            mistakes[axis] += mistake_count
            print("Mistakes by axis: ", mistakes)
            print("Mistakes by axis: ", mistakes_all)
            
            #Mistakes by axis: {'sagittal': 378, 'axial': 118, 'coronial': 260}
            #Mistakes by axis: {'sagittal': 460, 'axial': 209, 'coronial': 355}
        else:
            for base_name, values in data.items():
                individual_mistakes += 1
                gt = values["gt"]
                each_pred = values["each_pred"]
                indexes = [index for index, element in enumerate(each_pred) if element == gt]
                for i in range(len(each_pred)):
                    axis = AXIS_CONVERTION[values["axis"][i]]
                    slice_pos = int(values["slice_position"][i])
    
                    if i in indexes:
                        good_positions[axis].append(slice_pos)
                    else:
                        all_mistake += 1
                        mistake_positions[axis].append(slice_pos)
                        mistakes_all[axis] += 1
    
            for key in good_positions:
                good_positions[key] = sorted(good_positions[key], key=int)
    
            print("Good slice positions by axis:",good_positions)
    
        for key in mistake_positions:
            mistake_positions[key] = sorted(mistake_positions[key], key=int)
    
        print("Mistake slice positions by axis:", mistake_positions)
    
        print("All mistakes:", all_mistake)
        print("Individual mistake: ", individual_mistakes)
    
        attributes = ["file_name","all_mistake", "individual_mistakes", "mistakes_sagittal", "mistakes_axial" ,"mistakes_coronial",
                        "mistakes_all_sagittal", "mistakes_all_axial" ,"mistakes_all_coronial", "FLAIR", "FLAIRCE", "OTHER", "T1w", 
                        "T1wCE", "T2star", "T2w"]
        new_row = {
            "file_name": item,
            "all_mistake": all_mistake,
            "individual_mistakes": individual_mistakes,
            "mistakes_sagittal":mistakes["sagittal"],
            "mistakes_coronial":mistakes["coronial"],
            "mistakes_axial":mistakes["axial"],
            "mistakes_all_sagittal":mistakes_all["sagittal"],
            "mistakes_all_coronial":mistakes_all["coronial"],
            "mistakes_all_axial":mistakes_all["axial"],
            "FLAIR": mistake_types["FLAIR"],
            "FLAIRCE": mistake_types["FLAIRCE"], 
            "OTHER": mistake_types["OTHER"], 
            "T1w": mistake_types["T1w"], 
            "T1wCE": mistake_types["T1wCE"], 
            "T2star": mistake_types["T2star"], 
            "T2w": mistake_types["T2w"]
        }
    
        table_name = "comparision_N1_N2_N3_graphs/misclassified_evaluation.xlsx"
        if os.path.exists(table_name):
            existing_df = pd.read_excel(table_name)
        else:
            existing_df = pd.DataFrame(columns=attributes)
    
        existing_df = pd.concat([existing_df, pd.DataFrame([new_row])], ignore_index=True)
        existing_df.to_excel(table_name, index=False)
    
        print(f"Table updated and saved to {table_name}")
    
        all_slices = {"good_positions": good_positions, 
                    "mistake_positions": mistake_positions}
    
        with open("comparision_N1_N2_N3_graphs/slices_evaluation/"+item[:-5] + "slices_ev.json", "w") as file:
            json.dump(all_slices, file, indent=4)  
        print("Multiple dictionaries saved to multiple_dicts.json")