In Tribune expert

Aujourd’hui nous allons voir ensemble comment réaliser simplement une application de classification d’images dans le but de l’exposer sur un site web. L’idée n’est pas tant de proposer un code complet mais bien de comprendre le rôle des différents modules et d’aboutir à un produit fini en s’imposant une contrainte de limiter l’écriture de code au maximum : une grande partie de ce tutoriel est réalisable sans écrire la moindre ligne de code !

Au vu du contexte sanitaire actuel, on a choisi un sujet tendance ! Et si votre webcam ou autre caméra placée à l’entrée de votre bâtiment pouvait alerter dès qu’une personne rentre sans porter de masque ? Partons là-dessus : nous allons donc bâtir une application annonçant la probabilité de porter un masque en temps réel ! Et comme nous allons le voir, par la suite il vous sera extrêmement simple de déployer ce même projet sur un sujet tout à fait différent !

Et si on commençait par tester l’application afin de visualiser les résultats attendus avec notre modèle ?

Lien vers l’application : https://facemask-classification.avisia-tools.fr/

Après avoir appuyé sur « Start Predicting » ou « Capture », patientez quelques secondes que le modèle se charge puis de voir apparaître les images de votre webcam ou de votre module photo depuis un smartphone. La fonction « Capture » permet de capturer l’image lorsqu’on appuie sur le bouton puis calcule les probabilités des 2 classes.

Présentation des modules GCP et initialisation

Commençons par regarder ensemble le schéma fonctionnel du projet attendu et définissons ensemble les modules qui interviennent dans la réalisation de celui-ci.

AutoML

Depuis quelques mois, Google permet d’entraîner très simplement des modèles d’intelligence artificielle via leur solution AutoML. L’objectif est clair : délivrer au plus vite les modèles les plus performants sans la moindre ligne de code. Plusieurs cas d’usages sont possibles tels que la détection d’objets dans une image, la classification binaire ou multi classes d’une image. Tout ce qu’il vous reste à faire, c’est de compiler les images de votre dataset sur le sujet souhaité.

App Engine

App Engine est un des outils pivots de la solution Google Cloud Plateform. Grâce à celui-ci, vous pourrez facilement déployer une application ou déclencher des tâches dans un environnement entièrement auto-managé : ce n’est pas vous qui gérez les machines et ce peu importe la volumétrie de requêtes à traiter. Vous pouvez y déployer facilement vos applications écrites en Python, Node.JS, Java, etc.

Cloud Shell

Cloud Shell est un environnement strictement personnel sur une machine Unix permettant de stocker tous types de fichiers (5Go max.) et d’interagir avec les modules GCP via des lignes de commandes. Pour y accéder, il suffit simplement de cliquer sur  en haut à droite de la page depuis la console GCP. Une fois la machine initialisée, vous pourrez lancer vos lignes de commandes dans la partie basse de la fenêtre et accéder à Cloud Shell Editor qui permet de visualiser et d’interagir facilement avec les objets (uploader un fichier, supprimer, modifier le contenu, etc.). Pour ouvrir Editor, cliquer sur « Open Editor ».

Initialisation de l’environnement

Avant de commencer, il vous faudra disposer d’un projet GCP où la facturation est activée. Pour ceux ne souhaitant pas dépenser, Google offre plusieurs centaines d’euros de crédit à l’ouverture d’un compte GCP. Profitez-en pour tester ce tutoriel via ce crédit ! Si vous travaillez sur un projet existant, assurez-vous de disposer des droits suffisants sur Cloud Storage et AutoML.

Pour la suite du processus, AutoML nécessite la création d’un espace de stockage Cloud Storage situé aux US. Pour ce faire, rien de plus simple : rendez-vous via le menu dans Storage puis Create bucket. Nous avons créé un bucket sur une seule région nommé « avisia-images-dataset » situé dans la zone « us-central1 » (Iowa).

Création du dataset AutoML

Préparation des images

Pour ceux n’ayant pas à disposition un dataset d’images sous la main, il est possible d’automatiser la récupération d’images directement via un scrapping de GoogleImages. Pour cela, il est possible d’utiliser ce script Python qui téléchargera les 50, 100 ou 200 premières images renvoyées par Google selon les mots clés de votre recherche.

https://github.com/singh08prashant/Image-Scrapping-with-python-and-selenium

Afin d’importer vos images sous GCP, 2 solutions s’offrent à nous :

  • Vos images sont déjà labellisées et séparées dans 2 dossiers distincts, notamment si vous avez fait 2 recherches Google avec des mots clés opposés : « portrait » vs. « masques covid ». Il ne vous reste plus qu’à zipper vos 2 dossiers. Pour plus de simplicité, voici notre set d’images à télécharger contenant directement les 2 archives zip en question !

Astuce : Pour notre exemple, nous avons légèrement modifié le programme python de scrapping afin de passer une url de recherche plutôt que des mots clés. Cela permet d’être plus précis que les résultats proposés via les mots clés, en utilisant notamment la fonction « images similaires » de Google.

  • Vous n’avez qu’un dossier contenant l’ensemble des images : pas de soucis, vous pourrez labelliser vos images une fois importées dans AutoML. Dans ce cas, il faut simplement créer un fichier zip à partir de votre dossier contenant toutes les images.

Chargement dans AutoML Vision

Une fois vos images prêtes, rendez-vous sur la page Datasets de l’AutoML Vision. Une fois sur la page, il vous sera demandé d’activer l’API.

Activez l’API si ce n’est pas encore fait puis cliquez sur CREATE DATASET. Dans la fenêtre qui s’ouvre, entrez le nom de votre dataset puis choisissez Multi-Label Classification.

Le type de modélisation dépend évidemment du sujet à traiter. Ici nous aurions pu utiliser la « Single-Label Classification » pour simplement renvoyer un résultat binaire (une probabilité que la photo soit une personne portant un masque). Dans notre cas, nous aurons 2 probabilités correspondant aux 2 cas possibles : probabilité qu’il y ait une personne sans masque sur l’image et la probabilité qu’il y ait bien une personne avec un masque sur l’image. Pour présenter le 3ème cas, « Object detection », nous aurions pu seulement identifier la présence d’un masque quelconque sur une image mais nous n’aurions pas eu d’information qu’un visage est bien présent sur la photo.

Sur la fenêtre suivante, nous allons préciser que les images sont à télécharger depuis notre PC (vos 2 fichiers zip), les sélectionner via SELECT FILES et renseigner la destination correspondant au bucket Cloud Storage créé au début de l’article via le bouton BROWSE. Cliquez ensuite sur CONTINUE.

Vérification des labels et nettoyage

Une fois importées, vous devriez pouvoir visualiser facilement vos images selon le groupe de label. Pour les personnes qui n’ont qu’un dossier contenant leurs images non labellisées, il est possible de les importer puis de les labelliser directement via cette dernière page.

Nous pouvons valider que toutes les images sont bien labellisées. Si certaines d’entre-elles ne vous semblent pas pertinentes pour l’apprentissage, comme c’est le cas ici, vous pouvez les supprimer ou modifier le label associé !

 

Entraînement du modèle

Échantillonnage automatique

A partir de l’ensemble de vos 2 groupes d’images, l’AutoML Vision réalise automatiquement un échantillonnage afin de respecter les proportions train/validation/test: 80% des images de chaque groupe seront conservées pour l’apprentissage, 10% pour la validation du modèle et les 10% restant pour le calcul des performances réelles sur l’échantillon test.

Paramètres d’entrainement

Afin de procéder à l’entrainement, cliquer sur TRAIN puis sur START TRAINING. Après avoir saisi le nom de votre modèle, pensez à bien choisir le type de modèle « Edge« . Cela vous permettra de télécharger votre modèle afin de l’utiliser sans connexion internet et de l’insérer directement sur votre page web.

La prochaine étape consiste à sélectionner le rapport performance/taille du modèle selon si vous désirez un modèle qui se charge rapidement et permet des prédictions rapides en temps réel ou à l’inverse un modèle plus robuste mais pas forcément adapté à des flux continus d’images. Conservons le choix médian « Best trade-off » pour notre exemple.

La dernière étape permet de limiter la durée d’apprentissage et les coûts liés à celui-ci. Une fois encore, ce réglage dépend de la performance souhaitée et le nombre d’images dans votre dataset. Plus vous aurez un nombre important d’images, plus il faudra allonger la durée d’entraînement. Choisissons 4h mais il est fort probable que l’entrainement se termine bien avant.

Il ne vous reste plus qu’à cliquer sur « START TRAINING » et attendre un email vous informant de la fin de l’entraînement. Dans notre cas, avec près de 700 images, l’entrainement s’est fait en moins d’une heure et pour un coût extrêmement raisonnable : moins d’1,50€ !

Analyse des performances obtenues

Après avoir patienté quelques minutes ou heures, vous avez certainement hâte de découvrir les performances de prédiction de votre tout premier modèle AutoML Vision ? Rendez-vous simplement dans l’onglet « EVALUATE » de votre dataset et jugez-en par vous même ! Alors satisfait ?

Google propose les statistiques classiques afin de valider ou non les performances de votre modèle. Vous trouverez notamment la précision, le recall ainsi que la matrice de confusion en pourcentages ou en volumes. Dans notre cas, avec un seuil à 0.5, toutes nos images de l’échantillon test sont bien prédites.

Dans l’onglet TEST, vous pouvez une fois encore tester votre modèle sur de nouvelles images en les téléchargeant depuis votre PC.

Export du modèle

Et bien félicitations à vous ! Il s’agit peut-être de votre premier modèle de classification d’images ! Ne nous arrêtons pas en si bon chemin et essayons d’exploiter ce modèle via les images de votre webcam par exemple !

Il est désormais très simple de déployer votre modèle pour divers usages : déploiement pour des prédictions en ligne, l’exporter sous format Tensorflow ou le packager dans un container Docker. Dans notre cas, nous aurons besoin du modèle dans sa version « TensorFlow.js » à télécharger depuis l’onglet TEST & USE du dataset.

Après avoir choisit TensorFlow.js, exportez votre modèle sur le bucket Cloud Storage initial aux US. Vous pourrez alors visualiser les différents fichiers créés contenant toutes les informations de votre modèle afin de calculer les probabilités de vos 2 classes d’appartenances.

Déploiement de l’application via App Engine

Pour rappel, la finalité du projet est de mettre en place une application web qui, à partir d’une webcam, indique si l’individu porte un masque ou non. Le modèle étant désormais à notre disposition, il ne nous reste plus qu’à construire une application web simple faisant appel à notre modèle fraîchement entraîné. Pour cela, nous allons utiliser le module App Engine via Python.

Voici l’architecture cible de notre application permettant un déploiement via App Engine :

Dans votre environnement Cloud Shell Editor, créer un dossier nommé ici « app-images-detection » puis copier ou déposer les fichiers suivants :

  • Un fichier de configuration App Engine nommé « app.yaml » placé à la racine du répertoire.
  • Un répertoire nommé « www » contenant divers fichiers :
    • index.html : page web à customiser selon vos goûts : titres, emplacement de l’image, boutons, chargement de scripts, etc.
    • index.js  : programme JavaScript permettra de déclencher la webcam, de capturer une image via votre webcam et de charger le modèle AutoML utilisé pour la prédiction de l’image.
    • Les fichiers exportés relatifs à votre modèle : model.json, dict.txt, group1-shardxxx.bin, etc. à récupérer depuis Cloud Storage.

Vous pouvez simplement télécharger cette archive contenant ces 3 fichiers. Il ne vous restera plus qu’à placer dans le répertoire « www » vos propres fichiers contenant les informations du modèle entraîné et exporté : avisia-facemask-detection.zip

Déployer et tester votre application

Toujours depuis votre environnement Cloud Shell Editor, uploadez l’archive ou déplacez-vous dans le répertoire de votre application via la commande linux cd puis lancez le code ci-dessous :

gcloud app deploy (« Y » puis attendre quelques secondes jusqu’à la fin du déploiement).

gcloud app browse

Cela lancera votre application dans un nouvel onglet de votre navigateur, puis cliquez sur « Start Predicting ». Vous pouvez aussi y accéder depuis le menu via APP ENGINE. Et voilà, vous avez bâti une application détectant le port du masque en temps réel grâce au Machine Learning et aux fonctionnalités AutoML de Google !

De notre côté, avec seulement 700 images téléchargées automatiquement, nous obtenons des résultats tout à fait satisfaisant : les probabilités avec et sans masque tournent autour de 95%. On pourrait ajouter certaines règles dans nos pages HTML afin de ne pas afficher de probabilités lorsque celles-ci sont inférieures à 85% ce qui correspond à une situation où aucun visage n’est détecté avec certitude. Il faudrait aussi plus de variétés dans les images injectées notamment en intégrant des images de personnes entières avec ou sans masque pour que l’application fonctionne avec plus de recul.

Comme nous vous l’évoquions au début de l’article, ce type de projet est entièrement réutilisable sur des d’autres problématiques de classifications ou de détection d’objets.

Recommended Posts
AVISIA