Niveau
Expert
Env.
Google Colab
Code
Shell
Sources

YOLO (Partie 7) Créer son modèle avec YOLO : Entraînement & résultat

Dans les deux articles précédents nous avons annoté nos images puis nous avons configuré darknet afin de pouvoir créer notre propre modèle de détection de documents. Dans ce dernier article de la série YOLO v4 nous allons lancer l’entrainement de notre modèle avec darknet, puis nous allons bien sur le tester.

Entraînement du modèle

Nous y voilà ! après toutes ces configurations nous allons pouvoir – enfin – déclencher l’entrainement de notre modèle YOLO sur des images personnalisées afin de détecter des documents dans toute image.

Pour ce faire, continuez à utiliser le même Notebook dans Google colab et ajoutez-y une cellule:

%cd "/content/drive/MyDrive/Colab Notebooks/YOLO/darknet"
!chmod +rwx ./*

Nous allons ensuite lancer la commande (en mode ligne de commande) qui permet d’indiquer à darknet de lancer l’entrainement d’un nouveau modèle:

!./darknet detector train doc_data/document.data doc_data/document_yolov4.cfg doc_data/yolov4.conv.137 -dont_show -map

Remarquez les parametres :

Une fois lancée le traitement peut durer des heures (voire plus selon le nombre de classes et de fichier d’entraînement).

Suivi d’exécution de l’entraînement

Il y a deux façon de suivre le traitement. Bien sur dans Google colab vous allez voir bon nombre de logs défiler.

Regardez de plus près et vous y trouverez notament:

  • Le numéro d’itération (epochs). Ci-dessous nous en sommes à l’itération N°1906
  • Le taux de perte: avg Loss
 (next mAP calculation at 2000 iterations) 
 1906: 0.756686, 1.466187 avg loss, 0.000013 rate, 22.043027 seconds, 114360 images, 1.476337 hours left
Loaded: 11.882894 seconds - performance bottleneck on CPU or Disk HDD/SSD
v3 (iou loss, Normalizer: (iou: 0.07, obj: 1.00, cls: 1.00) Region 139 Avg (IOU: 0.361245), count: 1, class_loss = 0.201240, iou_loss = 0.875642, total_loss = 1.076881 
v3 (iou loss, Normalizer: (iou: 0.07, obj: 1.00, cls: 1.00) Region 150 Avg (IOU: 0.766196), count: 13, class_loss = 1.758310, iou_loss = 3.690968, total_loss = 5.449277 
v3 (iou loss, Normalizer: (iou: 0.07, obj: 1.00, cls: 1.00) Region 161 Avg (IOU: 0.822551), count: 40, class_loss = 1.684688, iou_loss = 3.024157, total_loss = 4.708845 
 total_bbox = 3317, rewritten_bbox = 0.000000 % 

L’autre manière de suivre les traitement mais surtout aussi de vérifier la courbe d’apprentissage de notre modèle est d’ouvrir l’image que darknet dépose régulièrement dans la racine de darknet.

Le fichier en question se nomme chart_document_yolov4.png :

La courbe en bleu présente l’erreur (Loss) et c’est la courbe que vous allez pouvoir suivre tout au long du traitement. Inutile de préciser qu’il serait bon qu’elle décroissent très rapidement comme la mienne ci-dessus.

En cas d’erreur ?

En cas d’erreur, typiquement ce qui risque de vous arriver est que Google colab stoppe le traitement en vous signifiant que votre temps d’utilisation de GPU est fini et que vous devez attendre (jusque quand, ce n’est pas précisé mais en général au moins une journée). Bref, votre traitement est dans les choux ! la bonne nouvelle est que darknet effectue des sauvegardes régulièrement. Pour modifier ces paramètres de backup automatique il suffit de modifier le fichier cfg que nous avons créé dans l’article précédent :

  • burn_in=1000 (permet créer une copie du le fichier de poids après la millième itération)
  • max_batches = 2000 (précise a darknet de s’arreter après 2000 itérations)

L’autre bonne nouvelle, en cas d’erreur est qu’il suffit de lancer la ligne de commande pour que darknet reprenne (presque) où il en était. Attention ce n’est pas exactement la même commande, tapez celle-ci:

!./darknet detector train doc_data/document.data doc_data/document_yolov4.cfg backup/document_yolov4_last.weights -dont_show -map

En effet, le dernier fichier de poids mis de coté par darknet se nomme document_yolov4_last.weights

Traitement terminé ?

Une fois l’entraînement terminé, vous devez avoir affiché dans Google colab quelque chose comme ceci :

0.789124, total_loss = 1.830107 
 total_bbox = 51907, rewritten_bbox = 0.050090 % 

 (next mAP calculation at 2000 iterations) 
 2000: 0.973554, 1.223958 avg loss, 0.000013 rate, 22.242532 seconds, 120000 images, 0.775685 hours left
Resizing to initial size: 416 x 416  try to allocate additional workspace_size = 124.60 MB 
 CUDA allocate done! 

 calculation mAP (mean average precision)...
 Detection layer: 139 - type = 28 
 Detection layer: 150 - type = 28 
 Detection layer: 161 - type = 28 
60
 detections_count = 317, unique_truth_count = 98  
class_id = 0, name = document, ap = 78.59%   	 (TP = 75, FP = 16) 

 for conf_thresh = 0.25, precision = 0.82, recall = 0.77, F1-score = 0.79 
 for conf_thresh = 0.25, TP = 75, FP = 16, FN = 23, average IoU = 63.93 % 

 IoU threshold = 50 %, used Area-Under-Curve for each unique Recall 
 mean average precision (mAP@0.50) = 0.785907, or 78.59 % 
Total Detection Time: 40 Seconds

Set -points flag:
 `-points 101` for MS COCO 
 `-points 11` for PascalVOC 2007 (uncomment `difficult` in voc.data) 
 `-points 0` (AUC) for ImageNet, PascalVOC 2010-2012, your custom dataset

 mean_average_precision (mAP@0.50) = 0.785907 
New best mAP!
Saving weights to backup/document_yolov4_best.weights
Saving weights to backup/document_yolov4_2000.weights
Saving weights to backup/document_yolov4_last.weights
Saving weights to backup/document_yolov4_final.weights
If you want to train from the beginning, then use flag in the end of training command: -clear 

Clairement vous voyez que ma précision est de 78% (0.785907), ce qui n’est pas terrible en réalité et c’est surtout du au fait que mon jeu d’apprentissage n’était pas terrible. Nous allons quand même voir ce que ça donne. Remarquez aussi que darknet propose plusieurs fichiers de poids dont celui ayant le meilleur score (document_yolov4_best.weight).

Test du résultat

Nous pouvons bien sur tester notre nouveau modèle. Pour cela il suffit de créer une nouvelle cellule dans Google colab :

%cd "/content/drive/MyDrive/Colab Notebooks/YOLO/darknet"
!chmod +rwx ./*
!./darknet detector test doc_data/document.data "/content/drive/MyDrive/Colab Notebooks/YOLO/darknet/doc_data/document_yolov4.cfg"  "/content/drive/MyDrive/Colab Notebooks/YOLO/oc_data/yolov4_document.weights"  "/content/drive/MyDrive/Colab Notebooks/YOLO/darknet/doc_data/doc_images/(1).jpg" 

Le résultat peut paraitre pas mal à première vue. Le cadre est bien positionné et on voit que le document a score plutot élevé (100%) … en fait si le score est excellent ici, faites quelques autres essais et vous constaterez vite que 78% n’est pas un score terrible pour ce type de modèle.

Conclusion

A ceux qui esperaient avoir un modèle YOLO v4 opérationnel pour la détection de documents dans une image, j’image votre déception ! mais ne vous en faites pas car si le score n’est terrible il peut être considérablement amélioré avec de bonnes données pour l’entrainement. En fait la véritable clé d’un bon modèle c’est le tuple gagnant : Bonnes données, annotations de qualité et bon modèle.

N’hésitez pas a jeter un coup d’œil sur le Notebook que j’ai utilisé ici.

Partager cet article

One Reply to “YOLO (Partie 7) Créer son modèle avec YOLO : Entraînement & résultat”

  1. Bonjour,
    Merci pour les explications claires de la démarche à suivre !
    Une fois que j’ai obtenu mon modèle entrainé avec une précision convenable, je souhaite pouvoir l’exploiter directement sur le flux vidéo d’une caméra mais je ne sais pas tellement comment faire… (je découvre la programmation et les CNN depuis environ un mois donc cela fait beaucoup d’infos…^^)

    Merci pour le retour 😉

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur comment les données de vos commentaires sont utilisées.