Scraper un dataset depuis Google Images

Rémi Connesson
France School of AI
5 min readFeb 7, 2019

github associé à cet article : https://github.com/remiconnesson/tomato_scraper

Intéressé·e par une carrière dans l’IA? Clique ici pour en savoir plus: https://breakintoai.fr

Imaginons que je veux faire un dataset contenant des images de tomates et des images de poivron.

Je peux me diriger sur google image et taper “tomato garden” pour obtenir des images de plantations de tomates.

Ca fait beaucoup, beaucoup de résultats et j’ai la flemme de récolter chaque image à la main.

Comment puis je faire autrement?

Je vais faire du web scraping , c’est à dire utiliser du code informatique pour récolter des résultats automatiquement.

Récupérer les urls de chaque image

Le premier truc à faire c’est de vérifier que le résultat de la recherche retourne des images qui nous intéresse.

Ensuite, on scroll vers le bas pour faire afficher plus d’images. Plus on scroll vers le bas, plus on téléchargera d’images au final.

Quand on a affiché suffisament d’images, on fait clique droit n’importe où dans le navigateur et “Inspecter”.

Sur le côté une fenêtre s’ouvre, on va ouvrir l’onglet “Console”.

N.B.: La méthode pour obtenir le résultat correct varie en fonction de plusieurs facteurs (ex: si tu utilises Mac ou Windows ou Linux, et de quel navigateur tu utilises, quel traitement de texte tu utilises pour ouvrir le fichier). Donc si dans les étapes qui suivent tout ne se passe pas comme tu le souhaites (ex: pas de téléchargment, le fichier s’ouvre mais tout est sur la même ligne, etc…) il va falloir que tu expérimentes jusqu’a obtenir un fichier .txt avec un url par ligne. Ca fait partie du jeu ;)

Ensuite on va copier le code ci-dessous. Il s’agit de JavaScript.

var urls = [];
var count = 0;
[...document.querySelectorAll('.rg_i')].forEach((element, index) => {
let el = element.parentElement.parentElement;
el.click();
count++;
setTimeout(() => {
let google_url = el.href;
let start = google_url.indexOf('=' , google_url.indexOf('imgurl'))+1;
let encoded = google_url.substring(start, google_url.indexOf('&', start));
let url = decodeURIComponent(encoded);
urls.push(url);
console.log(count);
if(--count == 0) {
let textToSave = urls.join('\n');
let hiddenElement = document.createElement('a');
hiddenElement.href = 'data:attachment/text,' + encodeURI(textToSave);
hiddenElement.target = '_blank';
hiddenElement.download = 'urls.txt';
hiddenElement.click();
}
}, 50);});

(Note: le code fourni précemment a cesser de fonctionner, le code ci-dessous fonctionne et est repris de : https://stackoverflow.com/a/60990157)

Et on va le coller dans la console puis appuyer sur la touche “Entrée”.

Ca va télécharger un fichier.

Cliquer dessus et ouvrir ce fichier avec “WordPad”.

On peut voir que le code JavaScript nous a permis de récupérer toutes les urls qui nous intéresse, une par ligne.

On va enregistrer ce fichier sous un nouveau nom: “tomato_urls.txt”.

Maintenant, au tour des poivrons, je vais taper “pepper garden” dans google images. En plus, pour éviter d’avoir des images de tomates dans mes images de poivrons, je vais inscrire un ‘moins’ devant le terme “tomato”.

Ce qui me donne la requête “pepper garden -tomato”

Même manip’ que pour les images de tomates mais cette fois on enregistrera sous le nouveau nom “pepper_urls.txt”

Importer les fichiers .txt dans le cloud avec Jupyter

Il suffit d’ouvrir Jupyter sur notre machine pour faire du deep learning et de naviguer jusqu’à l’endroit où je vais importer mes fichiers contenant les urls.

Puis pour importer les fichiers il suffit de drag & drop les deux fichiers .txt dans la fenêtre Jupyter et de valider l’opération en cliquant sur Upload.

Télécharger les images en utilisant Python et la librairie Fast.AI

Tu peux observer le code en action dans ce notebook ainsi que les fichiers d’exemples “tomato_urls.txt” et “pepper_urls.txt” là.

Trouver le chemin d’accès au fichier dans le cloud

from pathlib import Path
import os

# Get current directory
p = Path('.')

# Provide path to the .txt files with the url inside
tomato_urls_txt = p/"tomato_urls.txt"
pepper_urls_txt = p/"pepper_urls.txt"
# Create the directories to store the images ..
# .. we split images into two folders
# .. because there is two classes.
os.makedirs(p/"tomatoes", exist_ok=True)
os.makedirs(p/"peppers", exist_ok=True)

Télécharger les images grace à la librairie Fast.AI

from fastai.vision import download_imagesprint("  - Downloading Tomato Images -   ") download_images(urls=p/"tomato_urls.txt",dest=p/'tomatoes')print("  - Downloading Pepper Images -   ")
download_images(urls=p/"pepper_urls.txt",dest=p/'peppers')

Enlever les images corrompus lors du scraping

from fastai.vision import verify_images

classes = ['tomatoes', 'peppers']
for c in classes:
print(c)
path_to_class_folder = p/c

# verify images have correct properties for training
verify_images(path_to_class_folder,
delete=True, img_format=f'{c} %d')

Et voilà c’est fini. Tu es prêt à utiliser tes images pour entraîner un réseau de neurones.

P.S.: N’oublie pas de faire le prepocessing nécéssaire avant ;)

Intéressé·e par une carrière dans l’IA? Clique ici pour en savoir plus: https://breakintoai.fr

Articlé basé sur

Cet article est publié dans le cadre d’un groupe d’études créé par Paris School of AI pour terminer Fast.AI. C’est ouvert à tou.te.s et, si tu es intéress.ée.é, tu peux nous rejoindre sur le forum ici.

--

--

Rémi Connesson
France School of AI

I use Roam + Notion along my way of building expertise in marketing and ML ops. You can tag along the journey here https://tinyletter.com/remiconnesson :)