Neuronest

Classification automatique de plats

Open source

L’intégralité des sources de ce projet sont disponibles ici :
https://github.com/neuronest/food-recognition-azureml

Introduction et problématique

La classification d’images devient une tâche plutôt courante dans le monde dans la Data Science, et les méthodes permettant d’y parvenir sont relativement établies.

Cette tâche s’inscrit pourtant dans un domaine plus vaste, la Computer Vision, où l’objectif est d’analyser et d’exploiter les informations contenues dans une image ou une vidéo par exemple.

Des exemples pratiques parmi les plus connus :

  • la détection de personnes via une caméra de surveillance
  • la détection et l’estimation de la dangerosité de tumeurs sur des radiographies
  • la reconnaissance automatique d’écritures manuscrites sur des formulaires

Ces cas d’application ont vu leur efficacité largement augmenter depuis 2012 via l’adoption des méthodes de Deep Learning.

Un des aspects clés est le fait de pouvoir traiter des images brutes directement, c’est-à-dire avec pas ou peu de prétraitement humain en amont. Ce point en particulier permet d’appliquer plus facilement les méthodes de Deep Learning à une grande multitude de tâches et de métiers différents.

Nous allons ici présenter un cas d’application concret de bout en bout : la classification automatique de plats via leurs photographies.

Ce projet est suffisamment générique pour pouvoir être réadapté à une grande variété de projets de classification d’images.

Description

La tâche ici est de pouvoir automatiquement déterminer le type de plat présent sur une photographie donnée.

Nous allons pour cela entraîner un modèle de type Réseau de Neurones Convolutionnel (CNN) sur un jeu de données composé d’environ 75 000 photographies.

À ce dernier s’ajoute un jeu de données de test d’environ 25 000 photographies, servant uniquement à vérifier la performance de notre modèle après chaque entraînement.

Le jeu de données contient 101 plats différents et est intégralement mis à disposition via Google Drive via ce lien.

Voici un échantillon de 30 images utilisées pour l’entraînement de notre modèle :

Les photographies sont prises dans la nature et avec des angles de vue différents, il existe souvent d’ailleurs une grande diversité au sein des exemples d’un même plat, rendant la tâche de reconnaissance plus difficile.

Technologies utilisées et résolution du problème

Nous avons pour ce projet choisi d’utiliser l’environnement Microsoft Azure, en particulier Azure Machine Learning Service.
Cela nous permet de profiter des fonctionnalités suivantes :

  • Nos données peuvent être stockées et organisées sur Azure Blob Storage
  • Nous avons un accès à un cluster d’entraînement, c’est-à-dire un ensemble de machines avec GPU permettant d’entraîner différentes versions de notre modèle
  • Nous bénéficions d’une interface et d’une possibilité de conserver l’historique de nos différentes expériences : nous pouvons ainsi facilement comparer différentes configurations ainsi que leur performance
  • Nous pouvons déployer notre modèle entraîné sur Azure Kubernetes Service et y avoir accès en permanence

L’implémentation du modèle sera faite en Python via TensorFlow, une librairie parmi les plus utilisées en Deep Learning.

Schéma technique global du projet

La pipeline du projet s’articule en trois temps :

  • La récupération et la préparation des données : celles-ci vont être collectées depuis Google Drive puis mises en place sur Azure Blob Storage.
  • L’entraînement du modèle : plusieurs expériences vont être lancées, profitant de la puissance de calcul mise à disposition sur Azure Machine Learning.
    Les différentes expériences vont être historisées, pour que les versions du modèle puissent être comparées entre elles.
  • Le déploiement du modèle : la meilleure version du modèle va être choisie et déployée sur Azure Kubernetes Service (AKS), le modèle est maintenant prêt à être utilisé.

Expériences et résultats

Expérience simple

L’interface d’Azure Machine Learning nous permet de visualiser l’évolution d’une expérience en temps réel, ainsi que la performance de celle-ci sur le jeu de test :

Nous avons ainsi accès entre autres à la durée de l’expérience et au score obtenu : environ 81% de bonnes prédictions et plus de 12h d’entraînement.

Cela signifie que dans 81% de cas et sur les 25 000 images de test, le bon type de plat a été détecté parmi les 101 possibilités.

Expériences multiple - optimisation du modèle

Azure Machine Learning offre également la possibilité de faire concourir plusieurs expériences en parallèle avec différentes configurations.

Cela a pour principal intérêt d’automatiser la recherche du meilleur modèle pour la résolution de cette tâche : les modèles les moins prometteurs sont arrêtés prématurément dans un souci de gain de temps.

Nous pouvons ensuite sélectionner l’expérience ayant la meilleure performance :

Nous aurons accès à l’identifiant de cette expérience, mis en brillance sur la capture d’écran ci-dessus.

Cet identifiant permettra de cibler l’instance du modèle à déployer sur Azure Kubernetes Service.

Résultats

Nous arrivons ainsi à un pourcentage de bonnes réponses de 81.75% pour un temps d’entraînement divisé par deux par rapport à l’expérience de la précédente partie.

D’autres métriques ont également été calculées, comme le temps de prédiction par image, largement inférieur à 1 seconde ici.

L’accuracy peut être encore augmentée via Testing Time Augmentation (TTA).

Cela consiste à générer plusieurs transformations différentes pour une même image à prédire, d’obtenir les prédictions du modèle pour celles-ci, puis d’inférer la classe majoritaire.

On arrive ainsi à un pourcentage de bonnes réponses supérieur à 84%, au prix d’un plus long temps de prédiction.

Test de la solution

Nous pouvons maintenant utiliser notre modèle via une requête HTTP en lui envoyant une photographie d’un plat à classifier