Un premier article vous a appris à reconnaître des objets avec notre Raspberry Pi et OpenCV. Ce nouveau tutoriel vous explique comment aborder la reconnaissance d’objets par apprentissage de votre propre modèle. Nous le ferons en 2 étapes, la collecte de données et la construction de notre réseau de neurones. Au final, le Raspberry Pi sera capable de distinguer 3 races de chats à partir d’une image !
Étape 1
Le sujet de reconnaissance
Tout d’abord, meilleurs vœux pour l’année 2019 !
Dans ce tutoriel, les images de 3 trois types de chats de race bien connues, seront utilisées.
Il faudra dans un premier temps, télécharger un nombre important d’images de chats. Nous utiliserons la console de développement du navigateur Chrome. A termes, le réseau de neurone artificiel devra être capable de différencier les spécificités morphologiques, des 3 races de matous.
Le chat des forêts Norvégiennes
Le Bengal
Le Chartreux
Le matériel & logiciels.
Nous utiliserons ici, un PC équipé de Ubuntu 18.04 avec Python 3 installé.
Créez 3 dossiers dans le répertoire de votre choix. Nommez chacun des dossiers, recherche_google_norvegien puis recherche_google_chartreux et recherche_google_bengal. Dans chaque répertoire, ouvrez un fichier texte vide et nommez le download_images.py. Le fichier urls.txt sera le résultat de nos recherches de Google image.
cliquez sur l’image pour agrandir
Téléchargez les fichiers textes des urls de milliers d’images.
Il nous faut établir une banque d’images (environ 1000) pour chaque type de chat.Nous utiliserons une fonction du navigateur Chrome de Google, pour télécharger les adresses internet des images et créer un fichier texte.
Un script écrit en Python, se servira du fichier urls.txt pour alimenter chacun des dossiers.
Chrome et sa console de développement
Le navigateur Chrome (tout comme Firefox ou Safari) est équipé d’un outil de développement, qui permet d’exécuter des programmes écrit en JavaScript.
Pourquoi Chrome ? Grâce au puissant moteur de recherche de Google, il est optimisé pour télécharger des milliers d’images d’un sujet précis.
Tapez dans l’onglet image, “chat des forêts norvégiennes”. Cliquez sur le bouton en haut à droite du navigateur, Plus d’outils et Outils de développement.
cliquez sur l’image pour agrandir
La console apparaît:
cliquez sur l’image pour agrandir
Faites défiler les images du haut vers la bas, à l’aide du bouton “scroll” de votre souris. Il faut récupérer 1000 photos de chaque matou. N’hésitez pas à prendre le temps de “scroller” le maximum de photos des chats.
Pour créer ce fameux fichier urls.txt, écrivez dans le menu console, (ligne par ligne) chaque étape du programme JavaScript, avec le module jquery.
var script = document.createElement('script'); script.src = "https://ajax.googleapis.com/ajax/libs/jquery/2.2.0/jquery.min.js"; document.getElementsByTagName('head')[0].appendChild(script);
Récupérez les adresse URL de chaque image.
var urls = $('.rg_di .rg_meta').map(function() { return JSON.parse($(this).text()).ou; });
Le script ci-dessous écrira chaque URL dans un fichier texte, nommé urls.txt
var textToSave = urls.toArray().join('\n'); var hiddenElement = document.createElement('a'); hiddenElement.href = 'data:attachment/text,' + encodeURI(textToSave); hiddenElement.target = '_blank'; hiddenElement.download = 'urls.txt'; hiddenElement.click();
cliquez sur l’image pour agrandir
urls.txt sera téléchargé dans le répertoire de téléchargement d’Ubuntu (/home/votre_id/Téléchargement). Allez dans le répertoire Téléchargement d’Ubuntu et faites un copier/coller urls.txt dans celui crée par vos soins, recherche_google_norvégiens.
Enregistrez vos images dans un dossier avec Python.
Votre dossier contient le fichier urls.txt, le fichier download_images.py vide de code et un dossier images composé d’un sous dossier norvegiens. Le programme download_images.py va donc utiliser urls.txt pour télécharger les images du norvégien.
Enregistrez le code ci dessous dans download_images.py
#Lancez cette commande avec le terminal dans le dossier des fichiers #python3 download_images.py --urls urls.txt --output images/norvegiens # importez les ingrédients from imutils import paths import argparse import requests import cv2 import os # ajoutez les arguments ap = argparse.ArgumentParser() ap.add_argument("-u", "--urls", required=True, help="path to file containing image URLs") ap.add_argument("-o", "--output", required=True, help="path to output directory of images") args = vars(ap.parse_args()) # récupérez la liste des URL à partir du fichier d'entrée rows = open(args["urls"]).read().strip().split("\n") total = 0 # la boucle for des URLs for url in rows: try: # essai de téléchargement des images r = requests.get(url, timeout=60) # sauvegarde des images en mémoire p = os.path.sep.join([args["output"], "{}.jpg".format( str(total).zfill(6))]) f = open(p, "wb") f.write(r.content) f.close() # mise à jour du compteur print("[INFO] downloaded: {}".format(p)) total += 1 # gestion des erreurs de téléchargement except: print("[INFO] error downloading {}...skipping".format(p)) # boucle d'écriture des images dans le répertoire associé for imagePath in paths.list_images(args["output"]): # initialisation si les images doivent être effacées ou pas delete = False try: image = cv2.imread(imagePath) # si une image est corrompue, il faut l'effacer if image is None: delete = True # si OpenCV reçoit une image corrompue, il faut aussi l'effacer except: print("Except") delete = True # vérification que les images sont bien effacées if delete: print("[INFO] deleting {}".format(imagePath)) os.remove(imagePath)
Lancer la commande suivante dans le répertoire recherche_google_norvegiens :
python3 download_images.py --urls urls.txt --output images/norvegiens
Voici le résultat:
cliquez sur l’image pour agrandir
Effectuez la même opération, du téléchargement de urls.txt avec Google, jusqu’au programme Python, pour chaque race de chat.
Optimisez vos téléchargements et renommez vos fichiers avec Pyrenammer.
Afin d’avoir de meilleurs résultats en matière de prédiction, il vaut mieux collecter au minimum 1000 images dans chaque répertoire. Si par exemple, votre “scrolling” sur Google n’obtient que 600 images, il faut en télécharger 400 autres. Une astuce consiste à effectuer une deuxième recherche en changeant les mots clés. Par exemple, “skogkatt” l’équivalent de “chat des forêt norvégiennes” dans la langue scandinave. Du coup, vous allez télécharger avec le code Javascript, un autre fichier urls.txt avec les liens d’images différentes.
Dans le fichier download_images.py, remplacez le chiffre 6 en fin ligne :
# sauvegarde des images p = os.path.sep.join([args["output"], "{}.jpg".format( str(total).zfill(6))])
par :
# sauvegarde des images p = os.path.sep.join([args["output"], "{}.jpg".format( str(total).zfill(4))])
Ce chiffre correspond au format d’incrémentation des images. En écrivant 6 nous obtenons un format de ce type : 000000.jpg , 000001.jpg , 000002.jpg … Avec 4 ce sera, 0000.jpg , 0001.jpg …
Donc nous aurons un répertoire avec plus de milles images, en totalisant les deux formats.
Nous allons à présent renommer tout les fichiers des répertoires afin d’obtenir un format unique. Cette manipulation permet d’avoir une liste “cohérente” pour le futur modèle d’entraînement.
Pour cela, installez un utilitaire bien pratique, nommé “pyrenammer”. Le paquet deb est disponible à cette adresse
cliquez sur l’image pour agrandir
Nous souhaitons renommez l’équivalent de 1000 images (ou plus). Pour notre cas, le format serait, en partant de la première image : 0000.jpg et la dernière 9999.jpg. A condition d’avoir 10000 images téléchargées, dans chaque dossier des chats. Double cliquez sur un des répertoires, vous verrez à gauche, la liste des fichiers dans les deux formats. Allez en bas à gauche de la fenêtre, renommez la règle du nom de fichier renommé par : {num4}.jpg. Cliquez sur le bouton Aperçu en bas à droite. Si tout est cohérent, cliquez sur Renommer.
Conclusion.
Nous avons désormais, toutes les images pour établir notre propre modèle. Ici, nous avons utilisé Ubuntu 18.04, mais vous pouvez tenter les manips avec Windows et MacOS. On peut aussi tentez le coup avec Chromium sur Raspbian.
Pour la deuxième partie du tutoriel, il nous faudra une machine suffisamment puissante, pour construire le modèle de prédiction. Les essais ont été effectués avec un PC 64 bits équipé d’un processeur Intel Core3 et 6 Go de mémoire vive. (entre nous, mon ordi pédale…)
Nous ne sommes pas sur Framboise 314 pour rien, alors nous évoquerons bien sur, le portage du programme sur la Raspberry Pi. Du moins, une fois que le modèle sera créé sur une machine plus puissante comme un PC et sa propre architecture.
Voilà ! J’espère que cette première partie, vous a permis de télécharger la quantité d’images nécessaire au modèle. A plus tard, dans le prochain tutoriel sur Framboise 314.
Bonne manip dans le labo de l’I.A !
Cet article I.A : Créez votre propre modèle de reconnaissance d’objets (1er partie) a été publié en premier sur Framboise 314, le Raspberry Pi à la sauce française.....