Après avoir touché du doigt l’aspect concret du Deep Learning, il est intéressant de savoir que Google propose depuis cette année, une solution clef en main pour faire du Deep Learning en trois clics de souris: « AutoML« .
Le fonctionnement consiste à charger son jeu de données puis à le labelliser. Google se charge de l’entraînement de façon entièrement automatique et met à disposition une API de prédiction.
Jeu de données
Notre but sera de différencier un Airbus A380 d’un Boing 747. Deux gros avions de lignes quadri-réacteurs, donc assez similaire physiquement. La principale différence visuelle étant que le premier étage de l’A380 est présent sur toute sa longueur contrairement au 747 où il est limité à l’avant.
Constitution du jeu de données
Nous allons constituer nous-même notre dataset (jeu de données) en utilisant Google Image. Il y a un outil Python bien pratique pour cela : google-image-download
Nous faisons une recherche sur les A380 et une sur les 747 en plaçant bien les images dans deux dossiers différents.
cd {PATH}/747 && googleimagesdownload --keywords "Boing 747" --limit 1000 --chromedriver /usr/local/bin/chromedriver cd {PATH}/A380 && googleimagesdownload --keywords "Airbus A380" --limit 1000 --chromedriver /usr/local/bin/chromedriver
Puis nous supprimons rapidement les éventuelles images qui ne correspondent pas, comme les vues intérieures ou trop partielles.
Ensuite nous gardons de côté un peu plus de 150 images de chaque catégorie pour valider la pertinence du modèle que nous allons entraîner.
Ce qui laisse 650 images pour le jeu d’entraînement.
Utilisation
Je ne m’attarderais pas sur l’interface qui est intuitive, mais c’est une « beta » qui souffre encore de quelques défauts :
- Non tolérant aux « , » dans les noms de fichiers
- Pas possible d’uploader trop d’images à la fois : il faut passer par Google Cloud Storage
- Pas possible d’annoter plus de 200 images à la fois
- N’accepte pas les images avec une extension incorrecte (001-jpg au lieu de 001.jpg par exemple)
- Bug sur label numérique : « 747 », génère en plus un « a_747 » et une confusion côté Google
La préparation du jeu de données et l’utilisation de l’API n’est pas triviale, si vous n’êtes pas familier de GCP (Google Cloud Platform) :
Vous devez commencer par installer le SDK GCP.
La copie des fichiers vers Storage se fait par :
gsutil cp [LOCAL DATASSET ] gs://[BUCKET DISTANT]
La génération du « CSV » peut sembler une tâche nécessitant l’écriture d’un programme, mais elle est en réalité très simple :
gsutil ls gs://[BUCKET DISTANT]/train/[CLASSE] > label-[CLASSE].csv gsutil cp label*.csv gs://[BUCKET DISTANT]
Ce n’est donc pas un csv mais juste un fichier texte avec la liste des fichiers. Google aurait pu prévoir la possibilité d’indiquer un chemin de Storage pour faire cela à notre place…
Il suffit ensuite d’indiquer les chemins des fichiers « csv » dans l’interface et de labelliser vos images.
Labellisation
Elle se limite à sélectionner les images et à leur affecter une classe. C’est rapide si vous chargez toutes les images d’une classe, puis les labellisez en masse avant de passer à la classe suivante :
Réaliser l’entrainement
Consulter le rapport de performance
Mise en œuvre pour un lot d’images
Nous avons pris soin de garder de côté un lot d’images pour la validation : 150 images de chaque label.
Nous allons appeler l’API pour chacune d’elle, afin d’obtenir la « matrice de corrélation ».
Pour utiliser l’API en local, il faut passer par la création d’un serviceAccount et générer la clef d’accès qu’il faudra référencer dans le code :
gcloud iam service-accounts create myautomml gcloud projects add-iam-policy-binding [PROJECT_ID] --member "serviceAccount:myautomml@[PROJECT_ID].iam.gserviceaccount.com" --role "roles/owner" gcloud iam service-accounts keys create ~/.gsutil/credentials-automl.json --iam-account=myautomml@[PROJECT_ID].iam.gserviceaccount.com
Le code complet de l’appel est sur mon Github.
Le principe est de boucler sur la liste des images, afin d’appeler l’API pour chacune des images. En cas d’erreur de prédiction, est incrémenté automatiquement un compteur et l’image est affichée.
Un fichier CSV est créé à des fins de statistiques en cas de besoin.
def check_prediction(classe): error = 0 files = get_file_list(f'{PATH}valid/' + classe) print("Input images number : ", len(files)) csv = "" for image in files: #print(image) with open(image, 'rb') as ff: content = ff.read() pred = get_prediction(content, "causal-plating-174112", "ICN1845979794395276XXX") for result in pred.payload: if classe != result.display_name: print("PREDICTION ERROR for", image, "with score", str(result.classification.score)) error += 1 img=mpimg.imread(image) imgplot = plt.imshow(img) plt.show() csv += image + ";" + classe + ";" + result.display_name + ";" + str(result.classification.score) + ";0\n" else: csv += image + ";" + classe + ";" + result.display_name + ";" + str(result.classification.score) + ";1\n" f = open("autoML-"+classe+"-result.csv", "w") f.write(csv) f.close() print(error, "errors on", len(files), "predictions for", classe) return error, len(files)
La matrice de confusion est la suivante :
On constate que dans les images mal classifiées certaines le sont à juste titre, comme cet avion qui n’est pas un 747, ni un A380 :
Nous pourrons la comparer à celle obtenue par notre propre solution qui fera l’objet d’un prochain article.
Bilan
Avantages
- Très simple
- Pas besoin de connaissances en programmation
- Avertissement des doublons dans le contenu des images
- Mise à disposition d’une API de prédiction
- Possibilité de faire appel à des humains pour réaliser la labellisation du jeu de données directement dans l’interface
Inconvénients
- Ils sont principalement liés à l’usage du cloud :
- Les données doivent être envoyées à Google.
- Il faut payer le stockage, l’entraînement et surtout les appels à l’API de prédiction qui peuvent représenter un coût important pour une application grand public.
- Temps de latence réseau pour les prédictions
- On peut souligner également :
- Limité à de la classification d’un seul label par image
- Pas de segmentation sémantique
- Pas d’accès aux paramétrages ni au type de modèle
En tout cas, on ne peut que saluer l’existence de cette solution qui met à la portée de tous, la possibilité de créer sa propre « intelligence artificielle ».