def createConfusionMatrix(self, otbmatrix): """Create a multi-level confusion matrix (pandas DataFrame) otbmatrix : csv file an OTB confusionMatrix file Return ------ pandas.core.frame.DataFrame vector or raster QML style file """ mat = fu.confCoordinatesCSV(otbmatrix) d = defaultdict(list) for k, v in mat: d[k].append(v) csv_f = list(d.items()) # get matrix from csv matrix = fu.gen_confusionMatrix(csv_f, self.getCode(self.level)) # MultiIndex Pandas dataframe cmdf = DataFrame(matrix, index=self.HierarchicalNomenclature, \ columns=self.HierarchicalNomenclature) cmdf.sort_index(level=self.level - 1, inplace=True, axis=1) cmdf.sort_index(level=self.level - 1, inplace=True, axis=0) return cmdf
def merge_confusions(csv_in, labels, csv_out): """ from a list of confusion matrix, generate an unique one Parameters ---------- csv_in : list paths to csv confusion matrix labels : list all possible labels csv_out : string output path """ csv = fu.confCoordinatesCSV(csv_in) csv_f = fu.sortByFirstElem(csv) conf_mat = fu.gen_confusionMatrix(csv_f, labels) write_csv(conf_mat, labels, csv_out)
def confusion_fusion(input_vector: str, data_field: str, csv_out: str, txt_out: str, csv_path: str, runs: int, crop_mix: bool, annual_crop: List[str], annual_crop_label_replacement: int) -> None: """merge otb tile confusion matrix Parameters ---------- input_vector: str input database data_field: str data field csv_out: str output csv file which will contains the merge of matrix txt_out: str diretory which will contains the resulting file of merged matrix csv_path: str path to the directory which contains all *.csv files to merge runs: int number of random learning/validation samples-set crop_mix: bool inform if cropMix workflow is enable annual_crop: list list of annual labels annual_crop_label_replacement: int replace annual labels by annual_crop_label_replacement """ for seed in range(runs): #Recherche de toute les classes possible all_class = [] all_class = fu.getFieldElement(input_vector, "ESRI Shapefile", data_field, "unique") all_class = sorted(all_class) #Initialisation de la matrice finale all_conf = fu.FileSearch_AND(csv_path, True, "seed_" + str(seed) + ".csv") csv = fu.confCoordinatesCSV(all_conf) csv_f = fu.sortByFirstElem(csv) conf_mat = fu.gen_confusionMatrix(csv_f, all_class) if crop_mix: write_csv( conf_mat, all_class, csv_out + "/MatrixBeforeClassMerge_" + str(seed) + ".csv") conf_mat, all_class = replace_annual_crop_in_conf_mat( conf_mat, all_class, annual_crop, annual_crop_label_replacement) write_csv(conf_mat, all_class, csv_out + "/Classif_Seed_" + str(seed) + ".csv") else: write_csv(conf_mat, all_class, csv_out + "/Classif_Seed_" + str(seed) + ".csv") nbr_good = conf_mat.trace() nbr_sample = conf_mat.sum() if nbr_sample > 1: overall_acc = float(nbr_good) / float(nbr_sample) else: overall_acc = 0.0 kappa = compute_kappa(conf_mat) precision = compute_precision_by_class(conf_mat, all_class) recall = compute_recall_by_class(conf_mat, all_class) f_score = compute_fscore_by_class(precision, recall, all_class) write_results( f_score, recall, precision, kappa, overall_acc, all_class, txt_out + "/ClassificationResults_seed_" + str(seed) + ".txt")