Étiquettes : , ,

Pour entrainer un réseau de neurone à la détection et à la reconnaissance d’objet, il faut une banque d’image sur laquelle travailler. Nous allons voir comment télécharger un grand nombre d’images à partir de Google avec Python. Pour pouvoir entrainer un réseau de neurones, il est nécessaire d’avoir un grand nombre de données. Plus il y a de données, meilleur sera l’entrainement. Dans notre cas nous souhaitons entrainer un réseau de neurones à reconnaitre un objet en particulier. Pour cela, nous créons un script Python qui va venir télécharger les fichiers sur internet et les placer dans un dossier.

Configurer Python3

Téléchargez les librairies Selenium et OpenCV (optional)

python3 -m pip install selenium
python3 -m pip install opencv-python

Téléchargez le fichier geckodriver, décompressez-le et copier le .EXE à l’endroit que vous voulez. Notez bien le chemin d’accès du fichier geckodriver.exe

N.B.: Nous n’utilisons la librairie OpenCV seulement pour vérifier que OpenCV peut ouvrir et utiliser les images afin de ne pas encombrer le dossier inutilement

Script Python de téléchargement d’image

Ce script lance une recherche sur Google Image et enregistre les images trouvées dans le dossier spécifié pour la banque d’images.

N.B.: N’oubliez pas de préciser le chemin du fichier geckodriver GECKOPATH, le chemin vers le dossier de destination et les mot-clés pour la recherche Google.

import sys
import os
import time 

#Imports Packages
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
from selenium.common.exceptions import TimeoutException,WebDriverException
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By

import cv2

########################################################################
GECKOPATH = "PATH-TO-GECKODRIVER"
parent_dir = "PATH-TO-FOLDER"
search='coffee mug'
########################################################################

# path 
folderName=search.replace(" ","_")
directory = os.path.join(parent_dir, folderName,'img') 
   
# Create the directory 
try: 
	if not os.path.exists(directory):
		os.makedirs(directory) #os.mkdir(directory)
except OSError as error: 
	print("ERROR : {}".format(error)) 


sys.path.append(GECKOPATH)  
#Opens up web driver and goes to Google Images
browser = webdriver.Firefox()#Firefox(firefox_binary=binary)

#load google image
browser.get('https://www.google.ca/imghp?hl=en')

delay = 10 # seconds
try:
	btnId="L2AGLb"
	myElem = WebDriverWait(browser, delay).until(EC.presence_of_element_located((By.ID , btnId))) #id info-address-place-wrapper 
	#elm=browser.find_element_by_id(btnId)
	elm=browser.find_element(By.ID,btnId)
	elm.click()
	print("Popup is passed!")
except TimeoutException as e:
	print("Loading took too much time!")

time.sleep(30) #loading

# get and fill search bar
#box = browser.find_element_by_xpath('//*[@id="sbtc"]/div/div[2]/input')
#box = browser.find_element(By.XPATH,'//*[@id="sbtc"]/div/div[2]/input')
box = browser.find_element(By.TAG_NAME, "textarea")
box.send_keys(search)
box.send_keys(Keys.ENTER)
print("key enter is pressed")
time.sleep(10) #loading

#Will keep scrolling down the webpage until it cannot scroll no more
last_height = browser.execute_script('return document.body.scrollHeight')
while True:
	browser.execute_script('window.scrollTo(0,document.body.scrollHeight)')
	time.sleep(20)
	new_height = browser.execute_script('return document.body.scrollHeight')
	try:
		#browser.find_element_by_xpath('//*[@id="islmp"]/div/div/div/div/div[5]/input').click()
		browser.find_element(By.XPATH,'//*[@id="islmp"]/div/div/div/div/div[5]/input').click()
		
		time.sleep(10)
	except:
		print("button not found")
		pass
		
	if new_height == last_height:
		break
	last_height = new_height

#find all images on page
imgList=[]
try:
	#imgs = browser.find_elements(By.TAG_NAME, "img")
	#imgs = browser.find_elements(By.CLASS_NAME, "rg_i")
	imgs = browser.find_elements(By.XPATH,"//img[contains(@class,'rg_i')]")
	print("found {} images".format(len(imgs)))
	for i,img in enumerate(imgs):
		#src=img.get_attribute("src") # get source of image
		#urllib.request.urlretrieve(str(src),directory+"\{}.png".format(i)) # download source
		img.screenshot(directory+'\{}.png'.format(i)) # or screenshot
		imgList.append(directory+'\{}.png'.format(i))	
except:
	print("imagenot found")
	pass
		
browser.quit()
 
#Test images with OpenCV
for img in imgList:
	try:   
		cv2.imread(img)
	except Exception as e:
		os.remove(img)
		print("remove {}".format(img))

N.B.: update avec nouvelle version de selenium find_element_by_id(thisId) –> find_element(By.Id,thisId)

BONUS: Gestion d’une popup

Dans le code j’ai rajouté une commande permettant de gérer la popup qui apparait à l’ouverture de la page internet. Il va attendre que le bouton avec le bon identifiant soit chargé avant d’appuyer dessus.

delay = 10 # seconds
try:
	btnId="L2AGLb"
	myElem = WebDriverWait(browser, delay).until(EC.presence_of_element_located((By.ID , btnId))) #id info-address-place-wrapper 
	elm=browser.find_element_by_id(btnId)
	elm.click()
	print("Popup is passed!")
except TimeoutException as e:
	print("Loading took too much time!")

Résultat

Le script va parcourir les résultats de Google et faire des captures d’écran de chaque image pour les placer dans notre base de données et former une banque d’images.

downloads-image-from-internet-python-result Créer votre banque d'image avec Python

Vous avez désormais une banque d’image que vous pouvez utiliser pour de la reconnaissance visuelle par exemple ou faire du traitement d’image.

Applications

  • Développer des algorithmes de traitement d’image
  • Entrainer des réseaux de neurones à la détection et reconnaissance d’objet

Sources