Nous avons vu, dans un précédent article, comment utiliser les classificateurs de Haar afin de détecter différents objets. Cependant, le nombre de classificateurs proposé par OpenCV est réduit et nous pouvons avoir envie de créer un nouveau classificateur pour détecter d’autres types d’objets. Cependant, avant de pouvoir entraîner un classificateur, il est nécessaire de réunir un grand nombre d’images contenant et ne contenant pas notre objet d’intérêt. ImageNet est une base de données contenant plus de 14 millions d’images séparées dans plus de 21 000 catégories tels que personne, maison ou encore nourriture. C’est donc un endroit de choix pour réunir les images dont nous avons besoin pour entraîner nos classificateurs. ImageNet peut nous fournir une liste d’URL d’image. Nous allons donc voir dans cet article comment télécharger les images à partir d’URLs.

Étape 1 : Récupérer la liste des URL d’images

Dans un prochain article, nous allons créer un classificateur permettant de détecter les panneaux stop dans une image. Afin de réaliser cela, nous aurons besoin d’une image contenant un panneau stop et d’un grand nombre d’images n’en contenant pas. C’est ce que l’on appelle des images négatives, afin d’avoir un classificateur performant’ il est intéressant que ces images soient proches des images que nous traiterons, c’est pourquoi, nous chercherons des images de route. En effet, il est plus probable de rencontrer des panneaux stop dans la rue que dans des cafés.

Nous allons donc sur le site d’ImageNet pour télécharger des images de routes, c’est-à-dire des images étiquetées comme road.

Différentes catégories de la base ImageNet
Différentes catégories de la base ImageNet

En cliquant dans la catégorie road, nous pouvons accéder à un onglet « Downloads » et nous pouvons obtenir les URLs des 1288 images de cette catégorie :

liste des URLs de la catégorie road fournie par ImageNet que nous utilisons pour télécharger des images à partir d'URLs
Listes des URLs des images de la catégorie roads

Nous aurons besoin de l’URL de cette page afin de pouvoir récupérer la liste des URLs des images. Dans le cas des routes, l’URL de cette catégorie est : http://image-net.org/api/text/imagenet.synset.geturls?wnid=n04096066

Étape 2: Téléchargement des images à partir d’URLs

Maintenant que nous avons le lien vers la liste d’images, nous allons pouvoir passer au téléchargement de ces différentes images

Nous commençons par créer un répertoire où nous stockerons les images « Images ». Puis, nous pouvons créer un programme recup_imape.py.

La bibliothèque urllib sera utilisée afin de pouvoir interagir avec les URLs. NumPy permettra de convertir des séquences d’octets en tableaux NumPy lors du téléchargement.

import urllib.request
import cv2
import numpy as np

Étape 2-1: Création d’un fonction de téléchargement d’image

Nous créons ensuite une fonction image_from_url, qui nous permettra de télécharger les images à partir d’une URL.

Nous récupérons les données contenues à l’URL fournie ligne 6. Cette fonction nous renvoyant des octets, nous devons les convertir grâce à la fonction np.asarray (l.7) afin d’obtenir un tableau exploitable avec OpenCV. Cependant, le tableau que nous obtenons est un tableau à une dimension. C’est pourquoi nous appelons la fonction cv2.imdecode, en prenant en compte que nous avons une image couleur(l.8). Enfin, nous retournons l’image obtenue à partir de l’URL.

def image_from_url(url):
	rep = urllib.request.urlopen(url).read()
	image = np.asarray(bytearray(rep), dtype="uint8")
	image = cv2.imdecode(image, cv2.IMREAD_COLOR)
	return image

Nous avons maintenant une fonction qui nous permet de télécharger une image à partir d’une URL. Il ne nous reste plus qu’à télécharger toutes les images provenant de notre liste d’URL.

Étape 2-2: Parcours des différentes URLs

Pour ce faire, nous commençons par initialiser 2 variables: repertoire (l.11), qui permet de spécifier dans quel dossier nous voulons stocker les images et lien_img (l.12) qui est notre URL générale, identifiée à l’étape 1.

repertoire='Images/'
lien_img="http://www.image-net.org/api/text/imagenet.synset.geturls?wnid=n04096066"

img_url=urllib.request.urlopen(lien_img).read().decode()
i=0
for url in img_url.split('\n'):
	chemin=repertoire+'image_'+str(i)+'.jpg'
	image=image_from_url(url)
	cv2.imwrite(chemin,image)
	i+=1

Nous récupérons ensuite la liste des URLs sur la page lien_url ligne 14.

Puis nous parcourons chacune de ces URL grâce à la ligne 16. Pour chacune de ces URL, nous commençons par affecter un nom (et nous associons le répertoire afin d’obtenir le chemin où sauvegarder l’image) à chaque nouvelle image (l.17) en utilisant une variable i qui est incrémentée à chaque itération (l.20).

Enfin, il ne nous reste plus qu’à appeler notre fonction image_from_url à la ligne 18 et à sauvegarder l’image à la ligne 19.

Tout est prêt, nous pouvons lancer notre programme pour télécharger les images à partir d’URLs.

Étape 2-3: Et si un lien est mort ?

Et au bout de quelques temps, nous rencontrerons un problème.

Erreur 404: Une URL à un problème

L’erreur retournée nous indique qu’une des images de notre liste n’existe plus (erreur 404). En effet, il est possible que certains liens fournis par ImageNet ne fonctionnent plus.

Nous allons donc modifier notre code afin de passer outre ces erreurs.

for url in img_url.split('\n'):
	try:
		chemin=repertoire+'image_'+str(i)+'.jpg'
		image=image_from_url(url)
		cv2.imwrite(chemin,image)
		i+=1
	except:
		pass

Nous intégrons donc un bloc try (l.17), qui nous permet d’essayer de récupérer une image. Si une URL n’est plus valide (l. 22), ce n’est pas grave, nous passons à la suivante (l. 23). De cette façon, notre programme ne s’arrêtera pas si une image est introuvable.

Étape 3: Finir à la main

Nous avons dans cet article comment récupérer un ensemble d’images à partir d’URLs. Cependant, dans l’optique d’entraîner un classificateur, nous devons être sûr qu’aucune image ne contient l’objet que nous souhaitons détecter.

Une solution serait de pouvoir détecter automatiquement si une image contient notre objet ou non. Cependant, si nous pouvons réaliser cela, pourquoi voulons-nous entraîner un nouveau classificateur ? Nous l’avons déjà.

La seule solution existante et fiable sera de visualiser chaque image pour être sûre que notre objet n’y est pas.

Image incorrecte pour entraîner un classificateur de panneau stop
Image à supprimer: deux panneaux stop sont présents

Avant de passer à l’entraînement du classificateur, je vous invite donc à mettre de côté les images non désirées, elles nous servirons pour tester notre classificateur.

Télécharger “Téléchargement d'image à partir d'URL” Téléchargement-dimages-1.zip – Téléchargé 73 fois – 2 KB

Catégories : Tutoriel

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.