Classifier des images avec Tensorflow

Qu’est-ce que TensorFlow ?

Depuis une dizaine d’années, les librairies et boîtes à outils informatiques destinées à l’intelligence artificielle se multiplient. Nous pouvons notamment citer Scikit-learn, sortie en 2010, qui est l’une des plus célèbres. Depuis, les acteurs majeurs de l’industrie ont décidé de créer et publier leurs propres librairies. TensorFlow est celle créée et rendue publique par Google en 2015. Utilisée entre autres par Ebay, Twitter, Airbus, AirBnb et Intel, cette librairie est performante et son avenir s’annonce prometteur. S’appuyer dessus semble donc être un choix tout à fait cohérent bien qu’il existe des alternatives sérieuses.

Qu’est-ce que la classification d’images ?

Comme son nom l’indique, il s’agit d’une opération visant à classer les images en fonction des sujets, décors, actions ou toutes autres propriétés visibles sur les images. Cette opération correspond à un besoin réel de l’industrie. Nous pouvons citer notamment la modération automatisée d’images de profil, le contrôle parental ou encore la détection d’événements anormaux de toutes sortes.

Préparation et installation de TensorFlow

Avant d’aller plus loin dans cet article, il convient de préciser que celui-ci est inspiré des tutoriels Image recognition et How to Retrain Inception’s Final Layer for New Categories du site officiel de TensorFlow.  Aucun soucis si vous n’avez aucune notion de programmation dans le langage Python. En effet, nous utiliserons uniquement les scripts prêts à l’emploi proposés dans ces tutoriels. L’angle que nous proposerons sera différent de celui des tutoriels initiaux, ce qui rendra, nous l’espérons, cet article plus abordable et en fera un complément idéal de ces tutoriaux.

Nous partons du principe que Python 3.5 est installé sur votre machine, si ce n’est pas le cas vous pouvez télécharger le programme d’installation à l’adresse https://www.python.org/downloads/release/python-352/ .

Cette version de Python contient un gestionnaire de paquets : pip3 permettant d’installer TensorFlow en toute simplicité via la commande :

pip3 install --upgrade tensorflow

Tensorflow est installé. Simple, n’est-ce pas ?

Récupération des modèles

TensorFlow propose une série de modèles préentrainés et prêts à l’emploi. Ces modèles permettent d’effectuer des tâches diverses et variées (classification d’images, extraction de texte d’images, …). Nous allons cloner le dépôt Git qui les contient et que l’on peut trouver à l’adresse :

https://github.com/tensorflow/models

Si vous n’utilisez pas Git, il est possible de télécharger son contenu en cliquant sur “clone or download” puis sur “download zip”, vous pourrez alors décompresser le contenu de l’archive téléchargée dans le dossier de travail de votre choix.

Première classification

Nous allons lancer le script python classify_image.py qui se trouve dans le dossier tutorials/image/imagenet du dépôt cloné.

Le script utilise le modèle Inception entrainé avec la banque d’images ImageNet. Cette base de données d’images est très utilisée dans le domaine de l’intelligence artificielle. Elle est composée de près de 15 millions d’images couvrant toutes sortes de concepts. Cette médiathèque est parcourable à l’adresse http://www.image-net.org/index .

Ce tutoriel étant rédigé sous windows, les séparateurs de dossiers utilisés sont des “\”, bien sûr il convient de les adapter en fonction de votre système d’exploitation.

cd tutorials\image\imagenet
python classify_image.py --model_dir=tmp

A la première exécution, les fichiers relatifs au modèle seront automatiquement téléchargés dans le dossier “tmp” . L’archive contient un total de 5 fichiers.

classify_image_graph_def.pb => Contient le fichier de définition du graph du modèle TensorFlow. C’est le coeur du modèle puisqu’il contient le réseau de noeuds qui traitent les données en entrée.
cropped_panda.jpg => image d’exemple
imagenet_2012_challenge_label_map_proto.pbtxt =>Contient les informations de mapping pointant vers les différents labels.
imagenet_synset_to_human_label_map.txt => Représentation des labels sous forme textuelle.
LICENSE => contient les informations relatives aux conditions d’utilisation

Après avoir téléchargé automatiquement ces fichiers, le script  classify_image.py appliquera un traitement du modèle Inception sur l’image d’exemple cropped_panda.jpg et suggérera des tags classés par score décroissant de probabilité. Nous pouvons voir que le modèle estime reconnaître une photo représentant “giant panda, panda, panda bear, coon bear, Ailuropoda melanoleuca” avec une probabilité supérieure à 89%.

Classification avec des images personnelles :

Le premier test est intéressant, mais pas réellement bluffant puisqu’il a été exécuté sur une image fournie avec le modèle. C’est avec une image personnelle que l’on se rend mieux compte de la puissance du modèle. Nous avons donc téléchargé quelques images sous licence WikiCommons afin d’effectuer des tests :

Commençons par créer un dossier appelé “imagespersonnelles” afin d’y mettre les images que nous souhaitons soumettre au modèle :

Voici une image représentant un Rafale au décollage :

Rafale au décollage

 

python classify_image.py --model_dir=tmp --image_file=imagespersonnelles/rafale_decollage.jpg

Voici le résultat obtenu :

aircraft carrier, carrier, flattop, attack aircraft carrier (score = 0.71103)
warplane, military plane (score = 0.08506)
projectile, missile (score = 0.04319)
missile (score = 0.03181)
wing (score = 0.00225)

Le modèle estime donc avec une probabilité de 71% que l’image représente un porte avion et avec une probabilité de 8,5% qu’il représente un avion de chasse. Le résultat est donc satisfaisant. La photo représente bien un avion de chasse décollant d’un porte avion.

On peut toutefois se demander pourquoi le score de probabilité du porte avion est supérieur à celui de l’avion de chasse alors que le Rafale est le sujet principal de la photo. Il peut sembler beaucoup plus évident de distinguer l’avion que le porte avion, qui pour un oeil humain viendra probablement dans un second temps lors de l’analyse de l’image. Nous le voyons d’ailleurs moins que nous le devinons. Mais si nous réfléchissons en terme de concept représenté et non simplement d’objet présent dans l’image, la raison pour laquelle le porte avion obtient un score supérieur est plus évidente : L’image est caractéristique d’une image de porte avion : nous y voyons la mer, un avion de chasse et le bout du pont d’envol. L’ordinateur pourrait facilement être trompé et estimer que l’avion décolle d’un quai en bord de mer. Mais il travaille par analogie avec les images qu’il a eu “l’habitude de voir” pendant sa phase d’entraînement.

Les deux seules propositions erronées sont “projectile” et “missile” mais elles restent tout à fait dans la thématique.

Essayons désormais une image de Boulangerie pâtisserie:

bakery, bakeshop, bakehouse (score = 0.93632)
confectionery, confectionary, candy store (score = 0.02727)
grocery store, grocery, food market, market (score = 0.00348)
restaurant, eating house, eating place, eatery (score = 0.00074)
French loaf (score = 0.00068)

Le modèle est encore plus confiant sur son interprétation de l’image et estime avec un taux de confiance de 93% qu’il s’agit d’une boulangerie et l’ensemble des propositions reste dans la thématique.

Et maintenant une image de Rugby :

python classify_image.py --model_dir=tmp --image_file=imagespersonnelles\rugby.jpg

Voici le résultat que nous obtenons :

volleyball (score = 0.42767)
scoreboard (score = 0.06410)
pole (score = 0.05476)
horizontal bar, high bar (score = 0.01910)
ballplayer, baseball player (score = 0.01608)

Comme nous pouvons le voir, le résultat est ici beaucoup moins pertinent. Le modèle estime qu’il s’agit avec une probabilité de 42% d’une image de volleyball et ne propose pas “rugby”. Comment expliquer cela ? Outre les performances du modèle en lui même et la ressemblance des postures et tenues des joueurs avec celles de joueurs de volley, peut être le modèle n’a-t-il tout simplement pas suffisamment été entraîné à reconnaître des images de rugby.

Cela nous montre l’importance de la qualité du jeu d’entraînement d’un modèle d’intelligence artificielle et la nécessité de son adaptation à l’utilisation que l’on souhaite en faire. ImageNet est une excellente banque d’images, mais elle reste très généraliste.

Conclusion

Comme vous pouvez le voir il est très simple de classifier des images en utilisant TensorFlow. Le fait de pouvoir utiliser des modèles préentrainés permet l’intégration des fonctionnalités de classification au sein d’une application existante en quelques dizaines de minutes. Biensûr, nous avons utilisé un script python prêt à l’emploi ce qui simplifie énormément les choses. Cependant, le fichier classify_image.py est constitué de moins de de 200 lignes de code. N’hésitez d’ailleurs pas à le parcourir et essayer de le comprendre. Nous verrons dans un prochain article comment il est possible d’améliorer les performances obtenues en spécialisant notre modèle dans des domaines spécifiques.

Vous avez une question sur ce tuto, une remarque ou un problème ? N’hésitez pas à laisser un commentaire.