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.
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