diff --git a/OBIA/OBIABase.py b/OBIA/OBIABase.py index 113697a5f6bd6ed90c4f869971e627bb5ce2002a..ff0bd8d8f78e1a9a116e2411c1190b0a1f9ee6be 100644 --- a/OBIA/OBIABase.py +++ b/OBIA/OBIABase.py @@ -332,12 +332,29 @@ class OBIABase: obj.SetParameterOutputImagePixelType('out', otb.ImagePixelType_uint16) obj.ExecuteAndWriteOutput() - def true_pred_bypixel(self, labels, predicted_classes): #TOBECHANGED - pred_c = np.zeros(np.max(self.ref_obj_layer)+1) + def true_pred_bypixel(self, labels, predicted_classes): + pred_c = np.zeros(np.max(self.ref_db['orig_label']).astype(int)+1) pred_c[labels] = predicted_classes - pred = pred_c[self.ref_obj_layer] + support = [] + for tn, t in self.tiled_objects(on_ref=True): + support.append(t[np.isin(t, labels)]) + support = np.concatenate(support) + pred = pred_c[support] true_c = np.zeros(np.max(self.ref_db['orig_label']).astype(int)+1) # ATTENTION: works if "labels" is sorted (as provided by get_reference_...) true_c[labels] = self.ref_db.loc[self.ref_db['orig_label'].isin(labels),'class'].to_numpy(dtype=int) - true = true_c[self.ref_obj_layer] + true = true_c[support] return pred[pred>0], true[pred>0] + + def tiled_objects(self, on_ref=False): + assert(self.tiles is not None) + idx = -1 if on_ref else 0 + r = otb.itkRegion() + for tn, t in self.tiles.items(): + r['index'][0], r['index'][1] = t[0], t[1] + r['size'][0], r['size'][1] = t[2], t[3] + self.ref_obj_layer_pipe[idx].PropagateRequestedRegion('out', r) + arr = self.ref_obj_layer_pipe[idx].GetImageAsNumpyArray('out').astype(np.uint32) + yield tn, arr + +