Application du Deep Learning sur les petits datasets

Justine NOSLIER, Sandy VASLON, Thibaut LOUPIAS, Rija RANTOANINA

1. Introduction

Dans le domaine du Deep Learning, les performances potentielles d’un algorithme sont étroitement liées au volume des données d’entraînement. Cependant, il n’est pas toujours possible de collecter de grands datasets. Il faut alors se tourner vers des solutions alternatives pour contourner cette limitation.

Pour donner un exemple, si nous entrainons un modèle à détecter les chiffres sur des images (dataset MNIST) avec seulement 100 images, les performances sont divisées par 4 par rapport à un entrainement avec les 60 000 images du dataset. En effet, avec 60 000 images, la précision du modèle est supérieure à 0.9 alors que on tombe à peine plus de 0.2 avec 100 images…

dataset MNIST
Dataset MNIST

2. Contexte

Actuellement, SII Toulouse et SII Canada travaillent sur un projet : développer un drone SAV (Save And Rescue) destiné à apporter assistance aux secours lors de leurs missions de recherche de personne en détresse en conditions difficiles et notamment en zones montagneuses.

Dans cet article, nous souhaitons nous focaliser sur l’algorithme de détection des personnes en détresse. A ce jour, pour simplifier le problème nous émettons trois hypothèses :

  • Le drone détecte la personne de face : le drone se positionne devant la personne en la centrant dans l’objectif
  • Le drone détecte la personne verticalement : la personne est debout
  • Une personne est dite potentiellement en détresse lorsqu’elle a les bras au-dessus des épaules

Pour réaliser cette tâche, nous avons cherché un dataset composé de deux classes : une personne est en détresse (agite les bras au-dessus de sa tête), une personne n’est pas en détresse (bras le long du corps). Malheureusement, peu de jeux de données sont disponibles pour cette problématique, nous avons tout de même réussi à trouver un dataset pertinent : «KTH human activity recognition dataset » (https://www.csc.kth.se/cvap/actions/) . Ce dataset est composé de vidéos de personnes réalisant différents mouvements dont lever et agiter les bras. Il y a au total 25 acteurs différents sur ce dataset.

Grâce à ces vidéos, nous avons créé un dataset avec deux classes :

  • Classe « en détresse » composée de 533 images
  • Classe « normale » composée de 225 images
KTH dataset

Nous avons fait le choix, au vu de la petite quantité de donnée, de garder celles-ci pour l’entrainement et la validation ; le test sera effectué avec d’autres données. Ce choix va aussi nous permettre de mesurer la capacité du modèle à généraliser. Les images du dataset de tests ont été réalisées grâce à des étudiants et des salariés, nous en avons 52. Evidemment, ces données sont converties en nuances de gris pour correspondre aux images de l’entrainement.

Jeu de test

Ainsi, nous avons entrainé notre algorithme de classification (CNN – Convolutionnal Neural Network) grâce aux images rassemblées. Pour ce projet, nous avons choisi une architecture plutôt « simple » de CNN pour aller étape par étape vers l’amélioration de notre modèle.

Architecture de notre modèle de classification

La performance obtenue sur le jeu de test a été de 0.72. Cette valeur va nous permettre d’avoir un objectif minimum pour la suite de nos expérimentations.

Nous sommes conscients que notre jeu de données n’est ni balancé, ni assez riche pour nous permettre d’avoir de meilleurs résultats : similarité élevée entre les vidéos (fond unique). Nous nous sommes donc penchés sur l’enrichissement de notre dataset d’entrainement.

3. Méthodes

Pour réaliser cette tâche, nous avons pensé à plusieurs méthodes. La première est sûrement la plus intuitive : l’augmentation de données par transformations classiques. Lorsque l’on parle de transformations classiques sur les images, ce sont celles typiquement utilisées dans le domaine de la vision par ordinateur lorsque l’on parle de data augmentation : légères rotations, décalages, zooms, changements de luminosité, ajout de bruit gaussien, etc.

Nous avons principalement utilisé ImageDataGenerator de Keras pour réaliser les transformations les plus basiques et nous avons réalisé notre propre fonction « add_noise » pour complexifier le bruit appliqué.

Fonction Keras pour générer des transformations simples sur nos images

Pour réaliser la fonction « add_noise », nous avons utilisé une autre librairie nommée Imgaug. Cette librairie trouvable sur Github fournie de nombreuses fonctions de bruitages d’images avec un degré intéressant de personnalisation. En effet, elle permet évidemment de modifier l’intensité du bruit appliqué mais elle permet aussi d’obtenir un dataset diversifié grâce à des fonctions comme « SomeOf », « random_order », « Oneof », etc. Voici la fonction que nous avons codé pour obtenir notre bruit final, nous avons tenté de reproduire des formes qui pourraient s’apparenter à un fond (désunifier le décor) ou un mauvais temps (pluie, neige, etc.).

Fonctions utilisant la librairie Imgaug pour transformer nos images

Le mérite de cette fonction, hormis sa diversité, est sa rapidité d’application ! Ainsi, nous avons multiplié, via ses augmentations, notre classe « en détresse » par 3 et notre classe « normale » par 6. A noter que la différence dans le facteur multiplicateur est pour réduire le déséquilibre entre les classes. Il nous a suffi que de quelques secondes pour effectuer ceci sur tout notre dataset.

Voici quelques exemples d’images que nous obtenons en sortie.

Images du dataset produit par la data augmentation via Imgaug

Avec ce nouveau dataset plus riche en images, nous avons tenté de ré-entrainer notre modèle de classification pour voir l’évolution des résultats. En gardant la même architecture de modèle, nous passons d’une performance de 0.72 à 0.83 ! ! La diversité des images nous a donc permis de largement améliorer la qualité de classification de notre modèle.

Ce gain de performance notable est très encourageant pour notre problématique, nous avons donc souhaité mettre en place les autres idées émises pour améliorer les performances.

La seconde méthode imaginée est l’utilisation de personnages virtuels. Cette méthode va nous permettre, d’une part, d’avoir un dataset avec des personnages sur des fonds très différents les uns des autres, et d’autre part, d’augmenter les populations représentées. Ainsi, nous espérons avoir un modèle plus robuste par la suite.  Nous avons donc récupéré un dataset de personnages virtuels disponible sur internet et nous les avons placés sur des décors : ces images proviennent d’un dataset partagé sur Kaggle (https://www.kaggle.com/arnaud58/landscape-pictures).

Exemples d’images provenant du dataset Kaggle

Avec cette méthode, nous avons généré 436 images pour la classe « en détresse » et 702 pour la classe « normale ». Encore une fois, cette différence tente de gommer le déséquilibre initial entre ces deux classes. Nous avons donc ré-entrainer le même modèle mais cette fois avec les images initiales et ces nouvelles images. Nous obtenons alors sur le dataset de test (inchangé) une performance de 0.77. Cette performance est meilleure que celle du modèle qui s’est uniquement entrainé sur les images initiales mais moins bonne que celle du modèle entrainé avec les images bruitées. Il est vrai que même si on améliore la diversité des images, peut-être que le format « virtuel » de la personne est un peu trop éloigné du jeu de test. Cependant nous sommes convaincus que cette méthode reste très intéressante et peut notamment permettre d’avoir des meilleurs scores sur des groupes de personnes peu représentées dans le dataset initial.

La dernière méthode que nous avons testée est celle incluant les GANs : entrainer un modèle capable d’augmenter le nombre d’images dans notre jeu d’entrainement. L’architecture choisie pour cet exercice se veut basique.

Architecture du modèle qui vérifie les images générées. Les valeurs correspondent à la taille des images et à leur profondeur pour chaque étape.

Notre GAN est donc la combinaison des deux.

Nous avons donc entrainé ce modèle sur 10 000 epoch grâce aux images initiales et nous lui avons aussi fourni quelques images augmentées légèrement (luminosité, inclinaison, …).

 Suite à cet entraînement, nous avons obtenu alors des images plutôt satisfaisantes : nous sommes partis du principe que leur « imperfection » allait d’autant plus rendre le modèle robuste (même principe que le bruit de la méthode 1).

Echantillon d’images générées par le GAN

Comme pour les méthodes précédentes, nous avons donc tenter d’entrainer notre classifier sur ces images uniquement : nous avons donc 10 000 images générées pour la classe « en détresse » et 10 000 autres pour la classe « normale ». A la fin de l’entrainement, nous obtenons alors 0.67 de performance sur nos images tests (inchangées). Ce résultat est en-deçà de nos attentes, mais nous avons émis quelques hypothèses pour expliquer cette performance : les images sont encore plus éloignées du dataset de tests car les personnages sont parfois très approximatifs et les images de l’entrainement se ressemblent quand même beaucoup entre elles. Le réseau GAN nous apporte donc uniquement une diversité intra-classe ce qui n’est pas suffisant dans notre cas pour améliorer de manière significatives l’algorithme de classification. De plus, la qualité initiale des données ne nous aide pas à obtenir des images de qualité. 

4. Conclusion

Voici donc les 3 méthodes principales que nous avons explorées pour tenter de combattre la faible quantité d’images d’entrainement : modifications des images initiales pour en créer des différentes, création d’un dataset complémentaire grâce à des personnages virtuels, génération d’un nouveau dataset grâce aux GANs. Les résultats restent encourageants et nous allons donc continuer à travailler sur le sujet. La suite de ce projet sera certainement l’optimisation des hyperparamètres pour tenter d’améliorer notre modèle.

5. Sources

Zdnet, “L’IA se heurte à un problème massif de données dans le diagnostic du Covid-19“, https://www.zdnet.fr/actualites/l-ia-se-heurte-a-un-probleme-massif-de-donnees-dans-le-diagnostic-du-covid-19-39901817.htm

The Effectiveness of Data Augmentation in Image Classification using Deep Learning“, https://arxiv.org/abs/1712.04621

“Improved Relation Classification by Deep Recurrent Neural Networks with Data Augmentation”, https://arxiv.org/pdf/1601.03651.pdf

“Understanding data augmentation for classification: when to warp?”, https://arxiv.org/abs/1609.08764

“Effective Techniques of the Use of Data Augmentation in Classification Tasks”, https://rua.ua.es/dspace/bitstream/10045/76988/1/Tecnicas_efectivas_del_uso_del_aumentado_de_datos_en_tare_Garay_Maestre_Unai.pdf

1 thought on “Application du Deep Learning sur les petits datasets”

  1. En vrai, j’adore.
    De ce que je retiens c’est que la quantité de données reste vraiment importante dans un entraînement de RNN.
    Néanmoins, vous avez bien mis en évidence l’importance de l’augmentation des données.
    Les GAN me semblent aussi très pertinents, le seul problème semble la qualité de la production. Pour les améliorer, faudrait-il plus de données ? :-p
    Avez-vous essayé les GAN avec par la suite une augmentation des données ?

    Pensez-vous qu’il pourrait être pertinent d’utiliser un package de détection des corps ? Peut-être OpenCV. L’idéal serait qu’un package nous donne la position des bras (main ou avant-bras ou bras) par rapport à la tête et au corps. S’ils sont au-dessus ils ont les bras levé et sont « prédis » comme en détresse. Cela permettrait, dans notre cas, d’avoir une adaptation « facile » et de nouvelles images.

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *

onze + 5 =