Expand source code
# import os
# import numpy as np
# import pandas as pd
# from PIL import Image
# from pathlib import Path
# class ValidationDataExaminer(object):
# def __init__(self,predicted_labels,true_labels,predicted_scores,imgs,output_dir):
# self.imgs = imgs
# self.index_df = pd.DataFrame({"predicted":predicted_labels,"true":true_labels,"score":predicted_scores,"index":list(range(len(predicted_scores)))})
# self.output_dir = f"{output_dir}/misclassified"
# #
# def filter_model_results(self,predicted_label=None,true_label=None,ascending_order=True,n=32,misclassified_only=False):
# call_output_dir = f"{self.output_dir}/true_{true_label if true_label is not None else 'all'}_pred_{predicted_label if predicted_label is not None else 'all'}_{'asc' if ascending_order else 'desc'}"
# Path(call_output_dir).mkdir(parents=True, exist_ok=True)
# if predicted_label is None and true_label is None:
# filtered_df = self.index_df
# elif predicted_label is None and true_label is not None:
# filtered_df = self.index_df[self.index_df.true == true_label]
# elif true_label is None and predicted_label is not None:
# filtered_df = self.index_df[self.index_df.predicted == predicted_label]
# else:
# filtered_df = self.index_df[(self.index_df.predicted == predicted_label) & (self.index_df.true == true_label)]
# #
# if misclassified_only:
# filtered_df = filtered_df[filtered_df.true != filtered_df.predicted]
# filtered_df = filtered_df.sort_values(by="score",ascending = ascending_order)
# #
# counter = 0
# print(f"saving samples to {call_output_dir}")
# for i in range(n):
# row = filtered_df.iloc[i,:]
# pred = row["predicted"]
# true = row["true"]
# img = self.imgs[row["index"],:,:,0].reshape((self.imgs.shape[1],self.imgs.shape[2])).astype(np.uint8)
# im = Image.fromarray(img)
# im.save(f"{call_output_dir}/{counter}_score_{row['score']}_pred_{pred}_true_{true}.png")
# counter += 1