Nous avons vu dans un article précédent, que nous pouvons utiliser un classificateur de Haar pour détecter différents objets. Du fait du nombre limité de classificateurs, nous avons vu comment créer notre propre classificateur. La méthode présentée fonctionne bien pour des objets ayant toujours la même apparence (panneaux ou logos). Cependant, les performances seront réduites si l’objet recherché change d’apparence. Nous allons voir dans cet article comment entraîner un classificateur de Haar à partir de plusieurs images d’un objet. Nous tenterons de proposer un classificateur pouvant détecter des bouteilles de bière.

Création d’un détecteur de bouteilles de bière

Le principe de création de ce classificateur de Haar est similaire à celui que nous avons vu la dernière fois. Aussi, je vous invite à lire cet article avant de commencer.

Nous allons commencer par rassembler un ensemble d’images positives et négatives. Contrairement aux panneaux Stop, les bouteilles de bière sont différentes les unes des autres. Il est alors nécessaire d’entraîner le classificateur à partir de différentes images de bouteilles de bière et non à partir d’une seule image.

Puis, nous allons pour chacune des images positives, effectuer l’étape 1 du dernier article : nous allons générer un ensemble d’images positives, ainsi que le fichier descripteur correspondant.

Une fois cette étape effectuée, nous rassemblerons tous les fichiers descripteur en un seul afin d’entraîner le classificateur.

Nous pouvons maintenant démarrer la création de notre détecteur de bouteille de bière.

Étape 1: Rassembler les images

Afin de pouvoir entraîner un nouveau classificateur, nous avons besoin d’un grand nombre d’images contenant l’objet à détecter (images positives) et d’un nombre encore plus grand sans objet (images négatives).

Pour ce faire, je de suivre cet article permettant de télécharger des images de la base de données ImageNet.

Pour ma part, j’ai rassemblé 78 images de bouteilles de bière dans le dossier positives et 515 images négatives dans le dossier negatives. Cependant, je vous invite à en rassembler un plus grand nombre pour affiner la précision de votre classificateur

Images positives

Une fois les images réunies, nous créons deux fichiers comprenant la liste des images.

find ./negatives/ -name '*.jpg' > negatives.txt 
find ./positives/ -name '*.jpg' > positives.txt 

Étape 2: Générer les images positives

Afin d’obtenir de nombreuses images, nous allons générer, pour chaque image positive que nous avons collectée, de nouvelles images annotées.

Pour ce faire, nous pouvons appeler la fonction opencv_createsamples pour chaque image positive. Cela nous permet de générer de nouvelles images puis de générer les fichiers descripteurs. Cependant appeler cette fonction à la main sera extrêmement long.

Pour faciliter cette opération, nous pouvons appeler un script : createsamples.pl. Ce script est disponible ici ou dans les fichiers à la fin de cet article. Cet outil permet, pour chaque image initiale, de générer automatiquement les images positives en appelant plusieurs fois l’outil opencv_createsamples. De plus les fichiers descripteurs sont également générés lors de l’appel de cette fonction.

perl createsamples.pl positives.txt negatives.txt samples 7800 "opencv_createsamples -bgcolor 235 -bgthresh 20 -maxxangle 1.1 -maxyangle 1.1 maxzangle 0 -maxidev 20 -w 20 -h 20"

Nous devons donc fournir lors de l’appel de l’outil un certain nombre d’informations. Tout d’abord, nous spécifions les listes des images positives et négatives. Puis, nous indiquons le chemin vers le dossier où seront stockés les fichiers descripteurs (samples). Enfin nous fxons le nombre d’images positives que nous voulons générer. Dans cet exemple, j’ai décidé de générer 7800 images, soit 100 nouvelles images par image initiale. Nous pouvons également spécifier des options pour la commande opencv_createsamples. Par exemple, le fond des images initiales est relativement claire. C’est pourquoi nous fixons la valeur moyenne proche de 235 (-bgcolor) avec une variation entre 215 et 255 (-bgthresh 20).

Étape 3: Rassembler les fichiers descripteurs

L’appel du script createsamples.pl, nous permet de générer facilement les fichiers descripteurs pour chaque image positive initiale. L’ensemble de ces fichiers descripteurs ont été stockés dans le dossier samples.

Ensemble des fichiers descripteurs pour les images posities de bière
Fichiers descripteurs

Nous devons maintenant ces fichiers dans un seul fichier descripteur afin de pouvoir entrainer le classificateur. Pour ce faire, nous allons appeler le programme mergevec.py qui permet de regrouper tous les fichiers descripteurs. Ce programme est disponible ici ou dans les fichiers à la fin de cet article.

python3 mergevec.py -v samples -o out.vec

Ce programme prend en option le dossier contenant les descripteurs (-v), et le fichier à générer (-o).

Étape 4 : Entrainer le classificateur

Maintenant que nous avons notre fichier descripteur, nous pouvons entraîner le classificateur.

Mais avant cela, créons un dossier qui contiendra notre classificateur et les différents fichiers générés à chaque étape de l’entraînement.

mkdir data

Nous pouvons maintenant appeler l’outil opencv_traincascade afin d’entraîner le classificateur.

opencv_traincascade -data data -vec out.vec -bg negatives.txt -numPos 780 -numNeg 500 -numStages 20 -w 20 -h 20

Entraîner un classificateur prend un certain temps. Cela dépend du nombre d’itérations, de la taille des échantillons ou du nombre d’images.

Étape 5 : Detecter des bouteilles de bière

Afin de pouvoir tester le classificateur, nous reprenons simplement le code que nous avions réalisé dans cet article .

import cv2
stop_cascade = cv2.CascadeClassifier('cascade_biere.xml')
img = cv2.imread('image.jpg')
bieres = stop_cascade.detectMultiScale(img, scaleFactor=1.3, minNeighbors=5)
for (x,y,w,h) in bieres:
	cv2.rectangle(img,(x,y),(x+w,y+h),(255,0,0),10)
cv2.imshow('img',img)
cv2.waitKey(0)
cv2.destroyAllWindows()

Et voilà, nous pouvons utiliser notre classificateur afin de pouvoir détecter des bouteilles de bière dans des images.

Si vous souhaitez entraîner un classificateur pour un type d’objets, vous trouverez dans cette archive l’ensemble des fichiers nécessaires.

Télécharger “Classificateur_classe_objet” Classificateur_classe_objet.zip – Téléchargé 73 fois – 7 KB


0 commentaire

Laisser un commentaire

Votre adresse de messagerie 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.