Métrique sur les objets 0
Pour les classes représentant des objets "finis" (bâtiments, ponts, sursol perenne, ...), comparer les objets représentés/détectés pour chaque classe entre une classification de référence et un classification à comparer.
Cette comparaison est faite à l'aide de cartes de classes / cartes d'occupation post-traitée, et de détection de contours sur cette carte.
Métrique intrinsèque (calculée indépendemment pour le nuage de référence et le nuage classé à comparer)
-
Calcul de la carte de classe binaire (
occupancy_map
) pour chaque classe dans le nuage (voir métrique MPLA0). -
Opérations topologiques pour simplifier les formes des objets détectés et se débarrasser du bruit au niveau des limites d'objets. Une fermeture et une ouverture sont réalisées sur les rasters.
-
Vectorisation des contours de la carte débruitée et une simplification des formes pour éliminer encore du bruit sur les géométries.
Résultat : pour chaque nuage, un fichier geojson contenant un polygone par objet, qui a un attribut "layer" correspondant à l'indice de la classe correspondante dans la liste (ordonnée alphabétiquement) des classes définies dans le fichier de configuration.
Pour chaque classe, appairage des polygones entre le geojson issu de la référence et celui issu du nuage à comparer.
L'appairage se fait de la façon suivante :
- parmi les polygones de la référence, trouver les polygones qui ont une intersection avec au moins un des polygones du nuage à comparer
- parmi les polygones du nuage à comparer, trouver les polygones qui n'ont aucune intersection avec des polygones de la référence.
Les valeurs de sortie (dans un fichier csv) sont pour chaque classe :
ref_object_count
: nombre total d'objets dans le nuage de référencepaired_count
: nombre d'objets de la référence qui ont au moins une intersection avec un polygone du nuage à comparernot_paired_count
: nombre d'objets non appairés, ie. somme de :- nombre d'objets dans la référence qui n'ont pas d'intersection avec les polygones du nuage à comparer
- nombre d'objets dans le nuage à comparer qui n'ont pas d'intersection avec les polygones de la référence
On utilise comme intermédiaire de calcul la variable metric
qui dépend du nombre d'objets détectés dans le nuage de référence (ref_object_count
) :
- si
ref_object_count
est en dessous d'un certain seuil (ref_object_count_threshold
), la note est calculée à partir du nombre d'objets non appairésnot_paired_count
- sinon elle est calculée à partir du ratio liant le nombre de paires trouvées et le nombre
d'objets non appairés (
paired_count
/ (paired_count
+not_paired_count
)) Dans chacun des cas, la note finale (note
) est dérivée demetric
à partir d'une fonction affine bornée. C'est-à-dire une fonction du type :
max ________
/
/
/
_____ min
ou
______min
\
\
\
max _______
En dessous d'une valeur min
de metric
et au dessus d'une valeur max
de metric
, la note vaut 0 ou 1, entre les 2 on utilise une fonction
affine pour calculer la valeur de note
.
Dans le fichier de configuration.yaml, il faut indiquer les poids de chacune des classes dans le calcul des métriques comme ci dessous :
mobj0: # Nom de la métrique
weights:
"2": 28 # La classe 2 a un poids de 28
"4_5": 16 # La classe composée des classes 4 et 5 a un poids de 16
Dans le fichier de configuration.yaml, il faut indiquer les paramètres de calcul de la note comme ci-dessous :
notes:
# Seuil (nombre d'objets dans la référence) qui fait basculer la variable `metric` entre les 2 méthodes de calcul
ref_object_count_threshold: 20
under_threshold:
# Définition de la fonction affine bornée lorsque le nombre de pixels pour la classe donnée est EN DESSOUS de`ref_object_count_threshold`
# On utilise alors directement `not_paired_count` comme valeur de `metric`
min_point:
# Coordonnées du point correspondant à la borne min (valeur de `metric` en dessous de laquelle `note` vaut toujours la valeur précisée ici)
# Dans l'exemple, si `not_paired_count` vaut 0, la note est à 1
metric: 0
note: 1
# Coordonnées du point correspondant à la borne max (valeur de `metric` au dessus de laquelle `note` vaut toujours la valeur précisée ici)
# Dans l'exemple, si `not_paired_count` est supérieur à 4, la note est à 0
max_point:
metric: 4
note: 0
# Définition de la fonction affine bornée lorsque le nombre de'objets dans la référence pour la classe donnée est AU DESSUS de`ref_object_count_threshold`
# On utilise alors `ratio` = `(paired_count / (paired_count + not_paired_count))` comme valeur de `metric`
above_threshold:
# Coordonnées du point correspondant à la borne min (valeur de `metric` en dessous de laquelle `note` vaut toujours la valeur précisée ici)
# Dans l'exemple, si `ratio` est inférieur à 0.8, la note est à 0
min_point:
metric: 0.8
# Coordonnées du point correspondant à la borne max (valeur de `metric` au dessus de laquelle `note` vaut toujours la valeur précisée ici)
# Dans l'exemple, si `ratio` vaut 1, la note est à 1
max_point:
metric: 1
note: 1