Niveau
Débutant
Env.
Google Colab
Code
Python
Libs
cv2, darknet
Sources

YOLO (Partie 6) Créer son modèle avec YOLO : Préparer le modèle

Dans l’article précédent nous nous somme focalisé sur la préparation des données d’entrainement, c’est à dire la phase de labellisation (ou d’annotation) des images nécessaires pour faire apprendre à notre modèle YOLO. Dans cet article nous allons voir comment configurer YOLO v4 (avec darknet) afin qu’il soit en mesure d’apprendre de nouvelles images à détecter, et ainsi construire notre propre modèle personnalisé.

L’environnement

La phase d’entrainement d’un modèle YOLO est plutôt lourde, et si vous avez beaucoup d’images (ce qui serait vraiment un plus), il va aussi falloir beaucoup de ressources machines (c’est à dire de GPUs) pour que le modèle puisse apprendre dans des délais convenables. Dans cet article je n’ai que 300 images (mais vous verrez que c’est déjà pas mal en temps de traitement) et je vais utiliser des GPUs proposées gratuitement par Google via Google colab. Personnellement j’aime beaucoup cet environnement même si il a quelques limites comme:

  • Le temps de « prêt » des GPUs n’est pas précisé et à tout moment Google peut décider de vous les retirer (même en plein traitement !)
  • L’environnement colab est volatile, je vous conseille donc de faire comme moi: copiez vos fichiers (dont ceux de darknet) sur Google Drive et faite un pont entre colab & Drive (Cf. article sur colab)

Pour le 1er soucis ce que je vous conseille c’est soit de payer un abonnement Google Cloud, soit de faire ce que j’ai fait pour ce petit Tuto. Car en effet mon temps de traitement a dépassé les 10 heures et j’ai été éjecté plusieurs fois par Google Colab qui m’a tout simplement dit que mon temps d’utilisation des GPUs était expiré. Le pire dans tout cela c’est que vous ne savez pas quand vous pourrez réutiliser votre GPU ! Fort heureusement darknet fait des sauvegardes (par défaut toutes les 1000 epochs), ouf !

L’astuce (gratuite) est plutôt simple pour contourner ce problème de GPUs limitées:

  • Créez plusieurs comptes Google (j’ai du en créer trois pour cet article)
  • Partagez le répertoire darknet du Google Drive d’un des uitilisateurs Google avec les autres
  • Partagez le Notebook aussi
  • Vous n’aurez plus qu’à exécuter tour à tour selon les utilisateurs Google le même Notebook … le tour est joué 😉

Vous l’aurez compris, il ne vous reste qu’à créer un Notebook dans Google colab …

Récupération des fichiers darknet

Dans colab, faites juste ces imports au tout début:

import cv2
from google.colab.patches import cv2_imshow # colab does not support cv2.imshow()

Ensuite faites le lien avec votre Drive Google (Cf. article), puis créez un répertoire YOLO et allez dedans. Ce répertoire va contenir tous vos fichiers nécessaires à ce projet.

%cd "/content/drive/MyDrive/Colab Notebooks/YOLO"

Dans ce répertoire créez:

  • le répertoire [doc_dataset], et copiez-y vos images, fichier classes et les fichiers contenant les coordonnées des annotations réalisées précédemment.
  • un répertoire [oc_data] qui contient les fichiers de configurations, poids, et classes préentrainés.

Maintenant nous allons récupérer les fichiers de darknet via une commande git directement dans une cellule colab:

!git clone https://github.com/AlexeyAB/darknet
Cloning into 'darknet'...
remote: Enumerating objects: 15308, done.
remote: Total 15308 (delta 0), reused 0 (delta 0), pack-reused 15308
Receiving objects: 100% (15308/15308), 13.69 MiB | 6.35 MiB/s, done.
Resolving deltas: 100% (10399/10399), done.
Checking out files: 100% (2044/2044), done.

l’instruction télécharge le réseaux darknet et le copie sur votre lecteur Drive directement dans le répertoire darknet.

Compilation de darknet

Et oui, il va falloir compiler les sources de darknet, mais ne vous inquiétez pas ça ne sera pas compliqué d’une part et ça ne prendra pas bien longtemps non plus. Mais avant tout il faut modifier le fichier makefile afin de prendre en compte la GPU qui est à notre disposition.

Pour cela éditer dans colab le fichier makefile (qui se trouve dans la racine de darknet, double cliquez dessus et vous pourrez l’éditer directement dans le volet à droite), et changer les valeurs comme suit:

GPU=1
CUDNN=1
OPENCV=1

Maintenant nous pouvons compiler le réseaux de neurones darknet, tapez dans une nouvelle cellule puis exécutez:

%cd ./darknet
!chmod +rwx ./*
!make

La compilation va prendre quelques minutes et surtout retourner pas mal de warning … ne vous en faites pas c’est parfaitement normal !

Maintenant que la compilation est terminée nous allons tester si tout fonctionne, mais avant n’oubliez pas de copier les fichiers de configuration (yolov4.cfg) et de poids (yolov4.weights) sur votre Drive. Vous pouvez les récupérer ici.

Testons notre réseau en ligne de commande directement dans une cellule colab:

!./darknet detector test cfg/coco.data "/content/drive/MyDrive/Colab Notebooks/YOLO/oc_data/yolov4.cfg"  "/content/drive/MyDrive/Colab Notebooks/YOLO/oc_data/yolov4.weights"  "/content/drive/MyDrive/Colab Notebooks/YOLO/yoloimg.jpg" 

Rien ne s’affiche mais si tout s’est bien passé un nouveau fichier (predictions.jpg) a du être créé dans la racine de darknet comme suit. Ce dernier montre votre image avec les détections réalisées:

Maintenant sélectionnez comme type d’exécution de votre Notebook le mode GPU (Cf. Article)

Création du fichier de configuration (cfg) personnalisé

Nous n’allons pas utiliser le fichier de configuration (fichier cfg) qui doit d’ailleurs correspondre au fichier des poids du réseau de neurones (fichier weights). Nous devons créer notre propre fichier car au lieu d’avoir 80 classes nous n’en n’aurons qu’une seule.

Faites donc une copie du fichier yolov4.cfg, et renommez la copie en document_yolov4.cfg.

Ensuite ouvrez le fichier et faites les modifications suivantes :

  • Ligne 3 : subdivisions=12
  • Ligne 7: width=416
  • Ligne 8: height=416
  • Ligne 19: max_batches = 2000
  • Ligne 21: steps=1600,1800
  • Ligne 961,1049,1137: filters=18 # (classes+5)*3
  • Ligne 968,1056,1144: classes=1

Découpage de votre jeu de données (entraînement/Test)

Maintenant nous allons juste découper notre jeu de données (nos 300 images) afin de disposer d’un jeu de données d’entraînement (80%) et d’un jeu de test (20%). Nous aurons donc a la fin de ce chapitre :

  • Un jeu de données d’entrainement (80%), soit la liste des 240 images dans un fichier document_training.txt
  • Un jeu de données de test (20%), soit la liste des 60 images dans un fichier document_test.txt

Nous allons créer via quelques lignes Python ces deux fichiers:

from os import listdir
from os.path import isfile, join
mydirectory = "/content/drive/MyDrive/Colab Notebooks/YOLO/darknet/doc_data/doc_images"
allfiles = [f for f in listdir(mydirectory) if isfile(join(mydirectory, f))]

rootdir = "doc_data/doc_images/"
counter = 1
images_files = []

# put all the images files into a list
for file in allfiles:
  if (file[len(file)-3:len(file)] != "txt"):
    images_files.append(rootdir +  file)

# Set the size of the test (20%) & train data (80%)
training_limit = int(len(images_files) * 80 / 100)
test_limit = len(images_files) - training_limit

# Build the two lists
images_training_files = []
images_test_files = []
for file in images_files:
  if (counter <= training_limit):
    images_training_files.append(file)
  else:
    images_test_files.append( file)
  counter = counter + 1

# Put the two list into two files
with open('/content/drive/MyDrive/Colab Notebooks/YOLO/darknet/doc_data/document_test.txt', 'w') as f:
    for item in images_test_files:
        f.write("%s\n" % item)

with open('/content/drive/MyDrive/Colab Notebooks/YOLO/darknet/doc_data/document_training.txt', 'w') as f:
    for item in images_training_files:
        f.write("%s\n" % item)

Création des fichiers de configuration d’entraînement

Deux petites choses encore avant d’entraîner notre modèle:

  1. Créons un fichier document.names dans ./darknet/doc_data et ajoutons juste dedans notre classe (document).
  2. Créons un autre dichier document.data qui référence en quelque sorte les autres fichiers de configuration du réseau.

Le fichier document.data respecte précisément ces entrées:

classes = 1
valid = doc_data/document_test.txt
train = doc_data/document_training.txt
names = doc_data/document.names
backup = backup

Explications:

  • classes: nombre précisant le nombre de classes du modèle (ici une seule: document)
  • valid: chemin du fichier référençant les images de test
  • train: chemin du fichier référençant les images d’entrainement
  • names: fichier contenant la liste des classes (ici une seule entrée)
  • backup (non utilisé ici)

Suite

Voilà notre réseau darknet est prêt à être entraîné. Nous verrons cette phase cruciale dans le prochain article de cette série.

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

Lire la suite

Dans l’article suivant nous allons lancer l’entrainement du modèle et le tester.

Partager cet article

5 Replies to “YOLO (Partie 6) Créer son modèle avec YOLO : Préparer le modèle”

  1. Bonjour,

    Merci pour votre tuto.
    En voulant effectuer la préparation du modèle, j’ai rentré les lignes de code en les adaptant à mon cas mais je ne renvoie qu’unenoir avec predictions.jpg

    Ce problème est-il dû à un problème passé avec un manque de données pour la labellisation ou bien une prédiction qui ets impossible car les objets labellisés ne sont pas assez bien distincts ?

    Cordialement

  2. bonjour,
    je rencontre un problème, quand j’exécute la commande :
    !./darknet detector test cfg/coco.data « /content/drive/MyDrive/Colab Notebooks/YOLO/oc_data/yolov4.cfg » « /content/drive/MyDrive/Colab Notebooks/YOLO/oc_data/yolov4.weights » « /content/drive/MyDrive/Colab Notebooks/YOLO/yoloimg.jpg »

    j’ai comme erreur:
    CUDA status Error: file: ./src/dark_cuda.c : () : line: 38 : build time: Apr 7 2022 – 14:03:24
    CUDA Error: no CUDA-capable device is detected
    Darknet error location: ./src/dark_cuda.c, check_error, line #69
    CUDA Error: no CUDA-capable device is detected: Bad file descriptor

    Je ne comprend pas pourquoi et je n’arrive à la régler, sauriez quel en est la cause et comment la résoudre.

    Merci d’avance.

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.