Résumé de section

      • Une fois l’entrainement terminé, vous pourrez retrouver vos résultats dans le dossier “runs/detect/train” (à part si vous aviez configuré un autre nom pour votre dossier de résultats).

        Dans ce dossier on retrouve toutes les choses ci-dessous (peut varier légèrement) :

            
        On va voir ce que représente chaque élément un a un.
      • Le dossier “Weights” correspond au fruit de votre labeur car dedans il y a les poids de votre modèle. C'est votre cerveau après apprentissage.

        Il y a deux fichiers dedans : “best.pt” et “last.pt”. Cela se comprend de la manière suivante : les poids des neurones changent de manière régulière lors de l’entrainement et la qualité des poids est évaluée grâce à une fonction spécifique. Donc last.pt correspond aux derniers poids en date et best.pt correspond aux meilleurs poids qu’il y a eu de tout l’entrainement. On verra la subtilité d'avoir deux fichiers plus tard.

      • args.yaml contient tous les paramètres qu’a utilisé YOLO pour son entrainement incluant tous ceux qui avaient des valeurs par défaut que vous n’avez pas modifié et tous ceux sans argument (donc à 0).

      • En vision par ordinateur, on utilise beaucoup l’outil “matrice de confusion” et on peut en déduire beaucoup de statistiques pertinentes pour évaluer un modèle.

        On va devoir passer par une partie théorique avant de pouvoir comprendre ce que l’on voit dans les fichiers ci-dessus.

        Pour notre partie théorique, nous nous mettrons dans le cas où nous essayons de détecter des pièces anglaise appelées "penny".

            

          • Matrice de confusion

        Une matrice de confusion est un tableau qui va synthétiser et trier les prédictions du modèle pour pouvoir les analyser.

        Ici, il faut faire la distinction entre ce qui vrai et ce qui a été prédit. Un objet appartient à une classe, c'est ce qu'on appelle la vérité terrain (un chat appartient à la classe "chat").
        D'autre part, le modèle va faire des prédictions en attribuant une classe à un objet. Mais le modèle peut se tromper, ce qu'il prédit ne correspond pas forcément à la réalité (le chat peut finir dans la classe "chien" par exemple).
            
        On va donc distinguer :
        • la vérité terrain : la vraie classe des objets
        • les prédictions : les résultats du modèle

        Dans chacune de ces deux catégories on a deux résultats possibles : positif (présence de penny) et négatif (absence de penny).

        Cela crée quatre combinations possibles :
         
                        

        Pour une lecture plus simple, ces quatre combinaisons sont rassemblées dans un tableau à deux entrées. Les lignes correspondent à ce que le modèle a prédit et les colonnes correspondent à la vérité terrain.   

        • TP : True Positive (vrai positif)
          • Ce qui était à détecter et qui a bien été détecté.
          • Exemple : il y avait un “penny” et il a bien été détecté.

            

        • TN : True Negative (vrai négatif)
          • Ce qui n’était pas à détecter et qui n’a pas été détecté.
          • Exemple : il n’y avait pas de “penny” et aucun “penny” n’a été détecté.

             

        • FP : False Positive (faux positif)
          • Ce qui aurait dû être détecté comme négatif mais a été détecté comme positif.
          • Exemple : il n’y avait pas de “penny” mais un “penny” a été détecté.

            

        • FN : False Negative (faux négatif)
          • Ce qui aurait dû être détecté comme positif mais a été détecté comme négatif.
          • Exemple : il y avait un “penny” mais il n’a pas été détecté.

            

        Dans chaque case de cette matrice, on va compter le nombre d'instances de l'occurrence en question.

         

            

        Exemple

        L'image ci-dessous correspond à la vérité terrain, c’est-à-dire aux annotations faites à la main donc ce que le modèle est censé trouver :

             

        L'image suivante correspond aux détections faites par le modèle sur la même image après l’entrainement :

             

        Si on fait le jeu des 7 erreurs entre les deux images :

            

        On remplit ensuite la matrice de confusion avec chaque instance :

               

        On remplit chaque case en comptant le nombre total d'occurrence de chaque évènement, donc dans le cas très scolaire ci-dessous, il y en une de chaque. Concernant les vrais négatifs, on ne les compte pas. En effet, pour de la détection, un vrai négatif n’a pas vraiment de sens, ça revient à dire : il n’y avait rien à détecter et rien n’a été détecté, mais à l’échelle d’une image, cela se transforme vite en bruit, c’est-à-dire que chaque pixel pourrait être un vrai négatif avec cette définition, donc on ne les prend pas en compte.

        À partir de cette matrice, on peut tirer plusieurs métriques pour caractériser notre modèle. Ultralytics nous sort 4 courbes : précision-confiance, rappel-confiance, précision-rappel et score F1. On va voir comment les interpréter, mais commençons par définir chaque terme.

             

          • Confiance

        Lorsque le modèle fait une prédiction, il fourni avec sa détection une valeur traduisant la certitude de sa prédiction, une probabilité. Cette valeur, comprise entre 0 et 1 est ce qu’on appelle la confiance (1 étant la certitude absolue).

        Il y a donc une nécessité de choisir une valeur seuil pour permettre au modèle de trancher. Si la confiance de la détection est supérieure, la détection est acceptée (l’objet est labellisé “penny”), sinon, elle est rejeté (l’objet est labellisé “background”/negative).

            

        Prenons le graphique ci-dessous comme exemple : 

             

        Lecture du graphique : le point “1” correspond à la prédiction faite sur l’image 1. Le point est vert donc sur l’image il y a un penny. On peut lire en ordonnée que le modèle détecte la présence d’un penny avec une confiance d’environ 0.55.

        Autre exemple : le point “2” correspond à la prédiction faite sur l’image 2. Le point est rouge donc sur l’image il n’y a pas de penny. On peut lire en ordonnée que le modèle détecte la présence d’un penny avec une confiance d’environ 0.6.

            

        Choisissons arbitrairement un seuil à 0.5. Visuellement, cela revient à tracer un trait horizontal là où la confiance vaut 0.5, puis on “accepte” tous les points au dessus et on “rejette” tous les points en dessous :

                

        Comment remplir la matrice :

        • le point “1” est au dessus du seuil de confiance donc prédit positif (contenant un penny) et est vert (contient bien un penny) → vrai positif (True Positive, TP)
        • le point “2” est au dessus du seuil de confiance donc prédit positif (contenant un penny) et est rouge (ne contient pas de penny) → faux positif (False Positive, FP)
        • le point “3” est en dessous du seuil de confiance donc prédit négatif (ne contenant pas de penny) et est vert (contient bien un penny) → faux négatif (False Negative, FN)
        • le point “4” est en dessous du seuil de confiance donc prédit négatif (ne contenant pas de penny) et est rouge (ne contient pas de penny) → vrai négatif (True Negative, TN)
        • le point “5” est au dessus du seuil de confiance donc prédit positive (contenant un penny) et est vert (contient bien un penny) → vrai positif (True Positive, TP)

                

        Maintenant, prenons un seuil de 0.75, par le même procédé, on aura :

               

        • le point “1” est en dessous du seuil donc prédit négatif mais vert → faux négatif (False Negative, FN)
        • le point “2” est en dessous du seuil donc prédit négatif et est rouge → vrai négatif (True Negative, TN)
        • le point “3” est en dessous du seuil donc prédit négatif mais est vert → faux négatif (False Negative, FN)
        • le point “4” est en dessous du seuil donc prédit négatif et est rouge → vrai négatif (True Negative, TN)
        • le point “5” est au dessus du seuil donc prédit positive et est vert → vrai positif (True Positive, TP)

               

        Enfin, prenons un seuil de 0.35 :

               

        • le point “1” est au dessus du seuil donc prédit positif et est vert → vrai positif (True Positive, TP)
        • le point “2” est au dessus du seuil donc prédit positif mais est rouge → faux positif (False Positive, FP)
        • le point “3” est au dessus du seuil donc prédit positif et est vert → vrai positif (True Positive, TP)
        • le point “4” est en dessous du seuil donc prédit négatif et est rouge → vrai négatif (True Negative, TN)
        • le point “5” est au dessus du seuil donc prédit positive et est vert → vrai positif (True Positive, TP)

                     

               

        Pour un même modèle, on peut donc voir qu’il y a plusieurs matrices de confusion possibles, directement liées à la valeur du seuil de confiance choisi :

             

        Pour pousser la logique jusqu’au bout, on a un nombre infini de matrice de confusion car on en a autant qu’il y a de nombres décimaux entre 0 et 1.

        Donc cette matrice est un indicateur de la qualité du seuil de confiance choisi. Un des enjeux à la fin de l’entrainement de notre modèle est de choisir le meilleur seuil de confiance pour déployer le modèle.

        Mais comment savoir si on a une bonne ou une mauvaise matrice de confusion ? On peut la voir simplement de manière binaire : il y a la bonne diagonale (la classe prédite est identique à la vraie classe) et la mauvaise diagonale (la classe prédite est différente de la vraie classe):

               

        Intuitivement, on comprend qu’il faut faire en sorte de baisser les valeurs de la mauvaise diagonale, mais si vous regardez les matrices de la page précédente, vous pouvez observer que ce n’est pas évidement de mettre les deux cases à 0 simultanément.

        Alors des fois il faut choisir lequel des deux facteurs est le plus important et “mettre de côté” l’autre. Par exemple, en médecine, on ne veut surtout pas de faux négatifs (ne pas détecter un cancer bien présent) donc on va minimiser au maximum les faux négatifs aux dépens des faux positifs qui sont moins graves (détecter un cancer alors qu’il n’y a rien).

        Sachant qu’une matrice est propre à un seuil de confiance, comment savoir quel seuil de confiance est le meilleur ? On va utiliser des mesures pour pouvoir savoir !

      • Visualisons ces mesures grâce à un schéma :

               

        En utilisant le dernier schéma, on peut écrire la précision et le rappel comme ci-dessous :

                 

        Donc mathématiquement, on peut formaliser de la façon suivante :

                      

        Il est donc possible d'en faire des courbes pour voir l'évolution des ces mesures en fonction du seuil de confiance.

                   

              • Précision-confiance

               

        Comment la construire ? Pour tous les seuils de confiance compris entre 0 et 1 :

        • on établit la matrice de confusion pour ce seuil
        • on calcule la précision associée à cette matrice spécifique
        • on place le point dans le graphique

              

        À l’inverse, comment la lire ? Par exemple, pour un seuil de confiance de 0.4, on lit une précision de 0.92, on en déduit que pour un tel seuil on a assez peu de faux positifs.

            

        À retenir : plus la courbe est haute, meilleure est la précision du modèle.

                                                                                                          

        Pour aller plus loin :

        Il faut faire attention avec cette courbe car elle ne prend pas du tout en compte les faux négatifs, mais surtout, plus le seuil monte, de moins en moins de valeur sont prises en compte donc la montée de la précision est “artificielle”.

        Cela s’explique car le modèle n’accepte quasiment plus rien, donc si il ne détecte que un vrai positif avec 98% de confiance et c’est tout, il aura donc 100% de précision. Mais dans ce cas, plein de “vrais positifs”, jugé négatifs car sous le seuil de confiance, seront oubliés.

                                                                                                          

               

              • Rappel-confiance

               

        Comment la construire ? Pour tous les seuils de confiance compris entre 0 et 1 :

        • on établit la matrice de confusion pour ce seuil
        • on calcule le rappel associé à cette matrice spécifique
        • on place le point dans le graphique

             

        À l’inverse, comment la lire ? Par exemple, pour un seuil de confiance de 0.8, on lit un rappel de 0.78, on en déduit que pour un tel seuil on a beaucoup de faux négatifs.

               

        À retenir : plus la courbe est haute et met du temps à descendre, meilleur est le rappel du modèle.

                                                                                                          

        Pour aller plus loin :

        La courbe finira nécessairement à 0 car plus on augmente le seuil de confiance, plus le modèle est “strict”, il n’accepte que des prédictions dont il est sûr, donc le nombre de faux négatifs augmente drastiquement ce qui annule la fraction.

                                                                                                          

                

        La précision et le rappel sont deux métriques intéressantes et complémentaires, c’est à dire que pour avoir une vision globale du modèle il faut regarder les deux en même temps mais surtout voir comment l’une évolue par rapport à l’autre.

        Pour éviter de faire des va-et-vient entre les deux graphiques, des métriques les combinent directement, donc on introduit la courbe de précision-rappel et le score-F1 dans la prochaine section.

              • Précision-rappel

         La courbe de précision-rappel permet de voir l’évolution simultanément de la précision et du rappel selon le seuil de confiance. Elle est construite de manière très spéciale.

                   

        Comment la construire ? Cette courbe est construite point par point car une troisième dimension est cachée, le seuil de confiance.

        On commence par le point le plus à gauche : ce point correspond à la valeur de la précision et du rappel lorsque le seuil de confiance est à 1. 

        On trace ensuite celui juste à sa droite : on prend le seuil 0.99 et on calcule la précision et le rappel depuis la matrice de confusion. Et ainsi de suite.

              

        À l’inverse, comment la lire ? Prenons le point où le seuil de confiance est à 0.5 (si on prend la courbe à ses extrémités avec nos doigts et qu’on la tend, ce sera le milieu), on peut lire qu’à ce seuil, la précision est de 0.65 et le rappel à 0.67 (approximativement).

              

        À retenir : plus la courbe monte dans le coin en haut à droite, meilleur est le modèle (le modèle ici est plutôt mauvais, ne vous y referez pas).

                                                                                                                                                                   

        Pour aller plus loin :

        La courbe de précision-rappel est utilisée pour calculer une autre métrique que vous retrouverez à quelques endroits dans les résultats : Average Precision (AP). Cette métrique correspond à l’aire sous la courbe de précision-rappel. C’est la valeur décimal que l’on peut lire à côté du nom de la classe dans la légende.

                

        Par extension la mAP correspond à la mean Average Precision donc à la moyenne des AP quand on a plusieurs classes (nous en reparlerons plus tard). 

        Quel est l'utilité de cette mesure ? Comme mentionné dans le point "à retenir", plus la courbe monte en haut à droite, meilleur est le modèle mais "monter en haut à droite" est subjectif alors l'Average Precision a été introduite pour quantifier à quelle point la courbe monte donc à quel point l'aire sous la courbe est grande. Donc plus la valeur de la AP ou de la mAP est grande, meilleur est le modèle.

                                                                                                                                                                   

        Pour aller encore plus loin :

        Juste après “mAP”, vous pouvez lire “@0.5” ce qui correspond à la valeur seuil pour “l’Intersection over Union” (IoU). 

        Pour comprendre ce que c’est, il faut le voir comme l’outil de vérification du modèle : le modèle prédit une boite pour englober un objet et d’autre part, il a la boite de vérité terrain. Mais il a besoin de quantifier si sa boite à lui est bien placée par rapport à l’endroit exact où elle devait être, donc on introduit un nouvel outil que l’on va expliquer, l'IoU.

        Prenons ces deux boites :

               

        La boite verte correspond à la vérité terrain et la boite orange a la prédiction du modèle. Elle n’est pas placée idéalement pourtant elle semble quand même englober le même objet. 

        Donc pour avoir une valeur attestant de la précision du placement de la boite, on va calculer le rapport entre l’intersection des deux boites et leur union, comme schématisé ci-dessous :

               

        Il est nécessaire de choisir un seuil qui permet de rejeter ou garder une prédiction. Dans le cas précédent où on avait un seuil d'IoU à 0.5, cela revient à dire que si une boîte de prédiction ne recouvre pas la boite vérité terrain à au moins 50%, c’est qu’elle est mal placée donc non acceptée.

             

        Quel est la différence entre la confiance et l'IoU ?

        La confiance sert lorsque le modèle prédit alors que le seuil d'IoU sert lorsque le modèle vérifie ses prédictions.

        Prenons le processus d'entrainement étape par étape :

             

        Étape 1 : choix des valeurs des seuils de confiance et de IoU (arbitrairement) :

        • seuil de confiance = 0.5
        • seuil d’IoU = 0.5

        Étape 2 : le modèle commence à s’entrainer, donc il regarde une image, puis fait des prédictions qui sont accompagnées chacune d’une confiance.

        Étape 3 : d’après le seuil de confiance donné (0.5), le modèle accepte toutes les prédictions dont la confiance est supérieure et rejette les autres.

        Étape 4 : vient ensuite la vérification des boîtes, donc comme pour le jeu des 7 erreurs de tout à l’heure, le modèle prend l’image avec les prédiction d’un côté et l’image avec la vérité terrain de l’autre puis compare. Chacune des boites prédites est comparée via l’IoU aux boites de vérité terrain, et si le ratio dépasse le seuil d'IoU (0.5), alors la boite est validée en tant que “vrai positif”. Sinon, si l’IoU est inférieure, la boite est rejetée mais comme elle avait passé le test de confiance, alors c’est une fausse alerte donc “faux positif”.

        Étape 5 : enfin, une fois que tout est vérifié, les boites de la vérité terrain qui n’ont pas trouvé détection à leur pied se retrouve dans les “faux négatifs”.

             

        La différence principale réside dans le fait que le seuil d'IoU ne sert que lors de l'entrainement car une fois déployé, le modèle ne se supervisera plus, il ne pourra pas. Alors que le seuil de confiance est crucial pour le déploiement du modèle.

        L'étape 4 utilise la méthode de l'Intersection over Union comme juge de ses prédictions. Cette étape remplace une intervention humaine qui jugerait de la qualité de la prédiction.

        Le schéma ci-dessous tente de synthétiser le processus d'entrainement d'un modèle : 

        Sachez que vous pouvez choisir votre seuil d'IoU, donc en fonction de la précision nécessaire à votre projet, prenez un seuil plus ou moins haut. Un bonne fourchette est [0.5; 0.8], Ultralytics conseille de prendre une valeur comprise dans cet intervalle.

                

        Enfin, il existe une dernière métrique que vous pourrez observer plus tard : la mAP50-95. Elle consiste à calculer la mAP pour toutes les valeurs de seuils d’IoU comprises entre 0.5 et 0.95 avec un pas de 0.05 (donc : 0.5, 0.55, 0.6, ..., 0.9, 0.95) et à en faire la moyenne.

        Cette métrique est particulièrement intéressante car elle est exigeante en termes de précision de placement de la boite donc en regardant l’évolution de cette valeur, on peut voir si notre modèle englobe correctement. C’est une métrique très commune dans l’industrie de la vision par ordinateur.

                                                                                                                                                             

                                  

              • F1-score

        Le F1-score est la moyenne harmonique de la précision et du rappel en fonction du seuil de confiance, donc correspond à la formule suivante : 

                    

        Cette courbe est utilisée pour trouver le seuil de confiance optimal pour déployer votre modèle. 

        Un des principaux avantages de cette mesure par rapport à la courbe de précision-rappel est sa sensibilité aux valeurs extrêmes. En tant que moyenne harmonique, le score F1 pénalise fortement les valeurs très basses. Un modèle avec une précision parfaite mais un rappel proche de zéro aura un score F1 très faible, ce qui n'est pas toujours flagrant en regardant simplement une courbe.

        Cette courbe sert à trouver quel est le seuil de confiance optimal, c’est-à-dire celui qui permet de maximiser la précision et le rappel en même temps. Ce seuil est l’abscisse du maximum de la courbe comme dessiné sur la courbe ci-dessous :

                                     

        On trouve donc ici qu’un seuil de 0.1 de confiance serait optimal pour maximiser rappel et précision en même temps. (C’est un très mauvais modèle mais c’est juste pour l’exemple!)

        À retenir : l'abscisse du maximum offre une bonne option de seuil de confiance.

                             

        Lorsque la courbe F1 présente un plateau plutôt qu'un pic unique, le choix du seuil de confiance idéal dépend de vos objectifs spécifiques :

                      

        Priorité à la précision (éviter les faux positifs) : choisissez la valeur à l'extrémité droite du plateau (seuil plus élevé). Cela garantit que le modèle ne prédit que lorsqu'il est très sûr, minimisant les erreurs de détection.

        Priorité au rappel (éviter les faux négatifs) : choisissez la valeur à l'extrémité gauche du plateau (seuil plus bas). Cela permet de capturer un maximum d'objets réels, quitte à accepter quelques fausses alertes.

        Équilibre : Si aucune contrainte ne prévaut, le centre du plateau est souvent un choix robuste.

      • Qu’est-ce que le multi-classe ? C’est quand vous avez plus d’une classe à détecter, par exemple vous avez penny, dime et nickel (trois types de pièces différents).

        Dans votre matrice de confusion, vous aurez donc autant de ligne et de colonne que de classe, auxquelles on rajoute la ligne et la colonne “negative” (”background”) qui correspond à l’absence de classe.

        Voyons à quoi elle ressemble :

                               

        Les lignes correspondent aux prédictions et les colonnes à la vérité terrain selon chaque classe.

                  

        On retrouve bien la bonne diagonale qui correspond toujours au fait que la classe de la prédiction est la même classe que la vérité terrain.

        En revanche, il n’y a plus de mauvaise diagonale. Les mauvaises prédictions couvrent maintenant le reste des cases de la matrice.

        La colonne tout à droite correspond aux objets qui ont été détecté mais faisaient en fait partie du fond. Inversement, la dernière ligne correspond aux choses non détectés qui faisaient en fait partie d’une classe.

              

        Avec la nouvelle forme de matrice de confusion que nous venons de voir, il va être nécessaire de définir qui sont les vrais positifs, vrais négatifs, faux positifs et faux négatifs. Cela permettra de sortir les calculs de précision, rappel et F1-score pour trouver le meilleur seuil de confiance pour le déploiement de notre modèle.

        Pour ramener une matrice multi-classe à une matrice 2x2, on va fonctionner classe par classe. À la fin on devrait avoir autant de matrice de confusion 2x2 que de classe (sans compter "background") à détecter.

        Pour les remplir, on va voir ensemble comment déterminer qui correspond à quoi.

             

        Déjà, nous n’avons pas besoin des vrais négatifs comme vu tout à l'heure.

        Voyons comment trouver les trois restantes en prenant encore une fois la classe “Penny” comme exemple.

                           

        Les vrais positifs sont ceux prédit “penny” qui en était bien donc on a qu’une seule case, celle qui est verte à l'intersection de la ligne "penny" et de la colonne "penny".

        Ensuite, les cases de la même ligne correspondent aux objets que le modèle a prédit comme “penny” mais qui n’en était pas donc les faux positifs (les cases sur la même ligne que la case verte).

        Enfin, les cases de la même colonne correspondent aux objets que le modèle a prédit comme tout sauf “penny” mais qui était bien un “penny” donc les faux négatifs (les cases sur la même colonne que la case verte).

        Pour les faux négatifs et les faux positifs, on va sommer les valeurs de toutes les cases concernées.

                                      

        Une fois qu’on a nos 3 valeurs (TP, TN, FP), on va pouvoir calculer la précision et le rappel, et en déduire les deux autres courbes précision-rappel et F1-score. Comme vu précédemment, on va refaire ce processus avec tous les seuils de confiance pour pouvoir tracer les courbes de précision et de rappel en fonction de ce seuil.

        Puis quand les courbes d’une classe sont tracées, on fait avec la classe d’après et ainsi de suite jusqu’à ce qu’elles soient toutes faites. On se retrouve donc avec autant de courbe que de classe.

        Pour avoir une vue d’ensemble, on fait une moyenne de toutes ces courbes, c’est la courbe en gras que l’on voit sur la courbe du F1-score ci-dessous.

                               

        Et le “0.40 at 0.146” à côté de “all classes” correspond au pic de la courbe : le maximum est 0.40 et son abscisse est 0.146, donc dans cette expérience, il faudrait choisir un seuil de confiance de 0.146.

                                      

          • Matrice de confusion multi-classe normalisée

        Enfin, il reste la matrice de confusion normalisée. Elle permet d’avoir une vision globale car au lieu de donner les chiffres, elle donne des pourcentages.

                               

        Comment la lire ? 

        La matrice de confusion normalisée permet de voir les pourcentages de détection pour chaque classe donc elle se lit colonne par colonne. Par exemple, pour les “Penny” de haut en bas :

        • 1% ont été pris pour des “Dime”
        • 5% ont été confondu avec des “Nickel”
        • 82% des “Penny” ont bien été reconnu
        • 12% n’ont pas du tout été détecté

        On a bien 100% en faisant la somme donc c’est bon.

      • labels.jpg est une image avec quatre graphiques similaires à l’image ci-dessous :

                                   

        En haut à gauche : la répartition des différentes classes.

        En haut à droite : superposition de toutes boites englobantes.

        En bas à gauche : les coordonnées du centre des boites englobantes.

        En bas à droite : les dimensions des boites englobantes.

        Ce sont des statistiques sur les données annotées, ce fichier est indépendant de l’entrainement.

      • Ces documents contiennent les mêmes métriques, l’un sous forme de tableau csv, l’autre sous forme de graphiques.

                           

        • les  six courbes de gauche (les loss) : le modèle apprend et fait moins d’erreurs

             

                           

        Ces 6 courbes correspondent à l’erreur entre les prédictions et la vérité terrain, en haut pour l’entrainement et en bas pour la validation.

        Lors d’un entrainement, il y a un phénomène auquel il faut faire attention : le surapprentissage (overfitting). Pour faire simple, cela signifie que le modèle est en train d’apprendre par cœur les données d’entrainement. 

        Pourquoi cela est un problème ? Car le modèle ne saura pas généraliser, ne saura pas se débrouiller sur des données différentes de sa base d'entraînement.

        Comment savoir si notre modèle a surappris ? Cela se voit avec les données de validation car le modèle ne surapprend pas sur celles là pour la simple et bonne raison qu'il ne s'entraine pas avec, il les utilise juste pour s'évaluer.

        Donc quand vous regardez les courbes d’erreur, si celles de l’entrainement (celles en haut) continuent de descendre alors que celles de la validation (celles en bas) remontent au bout d’un moment, c’est signe que votre modèle surapprend car les pertes liées à la validation ré-augmentent.

        Par exemple ci-dessus, on voit que les courbes de validation ne font que décroitre, donc c’est un signe que notre modèle généralise bien pour l’instant.

        Si on constate du surapprentissage, quelles sont les conséquences ?

        Comme vu précédemment, YOLO enregistre deux modèles : best.pt et last.pt. Dans last.pt vous retrouverez votre modèle qui a surappris. En revanche, dans best.pt, YOLO stocke les poids qui donnaient le meilleur résultat combiné de l’entrainement et de la validation, donc avant que le surapprentissage entre en jeu.

        Donc si on a les poids avant le surapprentissage dans best.pt, quel est le problème du surapprentissage ? On peut le voir comme une consommation de ressource inutile car le modèle va trop loin. Ainsi, pour remédier à cela, on peut utiliser le paramètre “patience” qui permet de dire au modèle “si après x époques le modèle ne s’améliore plus (donc les poids de best.pt ne changent pas), alors arrête de t’entrainer” en passant x (un entier positif) comme paramètre de patience.

                                 

        • les quatre courbes de droite (precision, recall, mAP50, mAP50-95) : le modèle devient plus performant

             

        Elles permettent de voir si notre modèle a atteint son plein potentiel.

        Ces courbes permettent de visualiser si le modèle s’améliore, donc un bon indicateur que le modèle est arrivé en fin de course est de regarder si ces courbes ont atteint un plateau. Dans ce cas là, on saura que notre modèle a atteint son état le plus performant et n’a plus de perspective d’amélioration.

        Par exemple, dans le cas ci-dessus, on voit qu’après 20 époques, nos courbes sont encore en train de croitre donc on comprend que le modèle aurait besoin de plus d’époque pour se stabiliser.

      • Le nombre d'images de ce type dépend de la taille de votre dataset.

              

        • train_batchx.jpg” sont des exemples des images que le modèle reçoit pour son entraînement, donc des images labellisées

                   

        • val_batchx_labels.jpg” c’est la même chose, donc c’est l’entrée du modèle mais cette fois pour faire de la validation.

                      

        • val_batchx_pred.jpg” sont les images aves les labels en sortie du modèle donc des prédictions faites par le modèle. Donc vous pouvez y voir des boites pas forcément au bon endroit, avec ou non le bon label de classe etc, permet d’avoir un retour visuel de ce que fait le modèle.
      • Si les fichiers de résultats de votre modèle sont satisfaisant, vous pourrez ensuite tester votre modèle sur d’autres données, notamment votre dossier “test”.

        Mais comment savoir si son modèle est bien ? Ouvrez votre dossier de résultats et repassons sur les points importants à aller vérifier :

        • le score mAp50-95 :
          • où le trouver : dans le fichier results.csv. Point important : dans ce fichier, le séparateur est une virgule "," alors que si vous utilisez Excel, il s'attend à des point-virgule donc le fichier sera illisible. Pour pallier ce problème, ouvrez d'abord votre fichier dans un éditeur de texte, et rajoutez une première ligne où vous écrirez "sep=," comme dans l'image ci dessous :

              

          • enregistrez la modification, fermez le fichier puis vous pouvez l'ouvrir dans Excel.
          • chaque ligne correspond à une époque et chaque colonne contient les valeurs des différentes mesures de pertes, de métriques et du taux d'apprentissage pour l'époque donnée. La colonne qui nous intéresse est celle appelée : metrics/mAP50-95(B).
          • descendez tout en bas de votre document pour pouvoir avoir la valeur de cette métrique lors de la dernière époque de votre modèle.
          • quelle valeur est une bonne valeur
            • inférieur à 0.3 : mauvais
            • supérieur à 0.5 : pour des objets complexes : bien
            • supérieur à 0.7 : excellent

                         

        • les courbes de pertes (loss) :
          • où les trouver : dans le fichiers results.png pour pouvoir visualiser directement les courbes pour voir leur tendance.
          • ce qu'il faut observer :
            • si les deux courbes descendent et se stabilisent, votre modèle est bien
            • si les courbes de validation (val) remontent alors que celles de l'entrainement (train) descendent, votre modèle est mauvais (signe de surapprentissage)

                          

        • la courbe du score F1 :
          • où la trouver : c'est le fichier BoxF1_curve.png 
          • ce qu'il faut vérifier :
            • il faut que le courbe monte haut, le plus proche de 1.0.
          • ce qu'il faut récupérer :
            • récupérez l'abscisse du maximum car c'est la valeur optimale à donner à votre seuil de confiance. C'est la valeur qui est écrite dans la légende à côté de "all classes". On y lit : "all classes valeur_max at seuil_optimal" donc vous récupérez la deuxième valeur pour la mettre dans la variable "conf" au moment du déploiement de votre modèle.

                     

        • les images valbatchXpred.jpg :
          • ces images correspondent à la sortie du modèle, donc cela vous permet d'avoir un retour visuel de votre entrainement. Vous pouvez y vérifier que la détection se passe bien, que les boites sont au bon endroit et qu'aucun objet n'est oublié.

                         

        Si votre modèle vous semble satisfaisant, vous pouvez donc le tester sur vos données du dossier "test" pour voir comment il se débrouille. Pour cela, vous devez d’abord charger votre modèle tout juste entrainé. Il se trouve dans le dossier runs/detect/trainx/weights normalement et c’est le fichier best.pt :

        from ultralytics import YOLO

        model = YOLO(“chemin/vers/votre/fichier/best.pt)

        (n’hésitez pas à mettre le chemin absolu sauf si vous êtes sur le cluster)

                               

        Puis vous pourrez lancer un processus de validation mais en précisant bien que vous voulez que ce soit les données de test qui soient utilisée. N’oubliez pas d’aller rajouter le chemin test dans votre fichier data.yaml au préalable (il faut que ce soit le même fichier data.yaml que lors de l'entrainement pour que le modèle trouve le chemin, sinon, vous pouvez créer un nouveau fichier en changeant le nom, comme data_test.yaml par exemple, mais dans ce cas là, il faudra le préciser dans la fonction ci-dessous comme un autre paramètre, donc data=data_test.yaml).

        metrics = model.val(split=”test”)

        Vous retrouverez ensuite les résultats dans runs/detect/valx, que vous pourrez analyser comme nous venons de le faire.

                             

        Si ces nouveaux résultats vous conviennent aussi, parfait. Sinon, il sera sûrement nécessaire d’entrainer à nouveau votre modèle. Peut être il serait judicieux de changer quelques paramètres d’entrainement, mais rajouter des époques peut suffire.

        On va donc partir dans cette direction. Pour reprendre un entraînement afin de le prolonger, commencez par charger les derniers poids et non les meilleurs (très important!) , à savoir last.pt :

        from ultralytics import YOLO

        model = YOLO(“chemin/vers/votre/fichier/last.pt)

        Lancez ensuite un entraînement comme au début mais avec le paramètre resume=True. Concernant le nombre d’époque, le nombre que vous mettrez là est le nombre total d’époques que le modèle fera, donc si votre last.pt est issu d’un entrainement de 100 époques, la commande ci-dessous permettra d’aller jusqu’à 150, donc d’en rajouter 50 et non d'en rajouter 150.

        results = model.train(epochs=150, resume=True)

        Enfin, si les résultats ne vous conviennent toujours pas, vous pouvez songer à changer quelques paramètres du modèle, donc pour ça nous avons fait une partie dédiée que vous trouverez juste à la suite, dans la prochaine section.