Get Even More Visitors To Your Blog, Upgrade To A Business Listing >>

Classification d’images avec le Transfer Learning

Selon Wikipédia, « l'apprentissage par transfert (Transfer Learning) est l'un des champs de recherche de l'apprentissage automatique qui vise à transférer des connaissances d'une ou plusieurs tâches sources vers une ou plusieurs tâches cibles. Il peut être vu comme la capacité d'un système à reconnaître et appliquer des connaissances et des compétences, apprises à partir de tâches antérieures, sur de nouvelles tâches ou domaines partageant des similitudes. »

Ce billet se propose d'aborder ce domaine prometteur au travers du sujet de la classification d'images comme son titre l'indique.

Nous vous proposons de voir cela de plus prêt au travers d'une illustration. Je tiens à remercier Xiangzhe Meng actuellement en stage de fin d'étude au sein de Microsoft France pour cette contribution.

Qu'est-ce que le Transfer Learning ?

Ainsi, le Transfer Learning peut se traduire dans la pratique comme une approche puissante qui permet aux utilisateurs de créer rapidement des modèles d'apprentissage profond (Deep Learning) en apprenant à partir de réseaux de neurones pré-entraînés avec de grands ensembles de données.

Autrement dit, nous utilisons un modèle déjà bien entraîné et l'adaptons à notre propre problème. Notre nouveau modèle est pour l'essentiel basé sur les caractéristiques et les concepts appris lors de l'entraînement du modèle de base.

Avec un réseau de neurones convolutifs (CNN), nous utilisons les caractéristiques apprises à partir d'un ensemble des données qui est suffisamment grand, par exemple ImageNet qui contient 1,2 million d'images avec 1000 catégories, et retirons la dernière couche de classification en la remplaçant par une nouvelle couche dense prédisant les étiquettes de classe de notre nouveau domaine.

Pourquoi le Transfer Learning ?

Le Transfer Learning s'avère une technique utile lorsque nous devons classifier certaines images dans différentes catégories, mais que nous ne disposons pas de suffisamment de données pour entraîner un réseau de neurones profonds (DNN) à partir de rien.

En effet, l'entraînement des DNNs nécessite beaucoup de données, toutes étiquetées. Cependant, nous ne disposons pas toujours de ce type de données. Si notre problème est similaire à celui pour lequel un réseau de neurones a déjà été entraîné, nous pouvons utiliser le Transfer Learning pour modifier ce réseau de neurones en fonction de notre problème avec une fraction des images étiquetées nécessaire : nous parlons maintenant de dizaines au lieu de milliers des images.

Il convient de souligner, qu'au-delà de la reconnaissance d'images qui sera notre illustration dans la suite de ce billet, le Transfer Learning est également utilisé avec succès pour adapter les modèles de réseau de neurones existants à la traduction, à la synthèse de la parole et à de nombreux autres domaines. Le Transfer Learning est ainsi notamment utilisé dans la cybersécurité comme en témoigne la session « Transfer Learning: Repurposing ML Algorithms from Different Domains to Cloud Defense » de Mark Russinovich, Directeur technique Azure, lors la dernière conférence RSA en avril dernier.

Comment fonctionne Transfer Learning ?

La figure ci-dessous illustre le principe du Transfer Learning. Le modèle de l'étudiant est initialisé en copiant les N-1 premières couches de l'enseignant. Une nouvelle couche dense est ajoutée pour la classification. Sa taille correspond au nombre de classes dans la tâche d'étudiant. Le modèle de l'étudiant est ensuite entraîné en utilisant son propre jeu de données, tandis que les K premières couches sont « gelées », c'est-à-dire que leurs poids sont fixes et que seuls les poids des N-K couches sont mis à jour.

Les K premières couches sont « gelées » au cours de l'entraînement, parce que les sorties de ces couches représentent déjà des caractéristiques significatives pour la tâche de l'étudiant. Le modèle de l'étudiant peut réutiliser directement ces caractéristiques ; ce qui peut réduire à la fois les coûts de l'entraînement et la quantité de données requises.

En fonction du nombre de couches gelées (K) pendant le processus de l'entraînement, le Transfer Learning est classifié dans les trois types suivants :

  • Extracteur de caractéristiques de couches profondes (Deep-layer Feature Extractor) :

    N-1 couches sont gelées pendant l'entraînement du modèle de l'étudiant et seule la dernière couche de classification est mise à jour. Ceci est préférable lorsque la tâche de l'étudiant est très similaire à la tâche de l'enseignant et qu'elle nécessite un coût de l'entraînement minimal.

  • Extracteur de caractéristiques de couche intermédiaire (Mid-layer Feature Extractor) :

    Les K premières couches sont gelées, où K

  • Extracteur de caractéristiques de réglage (Full Model Fine-tuning) :

    Toutes les couches sont dégelées et ajustées pendant l'entraînement du modèle de l'étudiant (K = 0). Cela nécessite beaucoup plus de données d'apprentissage et est approprié lorsque la tâche de l'étudiant diffère de manière significative de la tâche de l'enseignant.

En général, l'entraînement avec les poids de modèle de l'enseignant permet au modèle de l'étudiant de converger plus rapidement et d'obtenir potentiellement de meilleures performances que d'entraîner à partir de zéro.

L'outillage

Aujourd'hui, de plus en plus de plates-formes de Machine Learning et de bibliothèques de Deep LeEarning commencent à recommander le Transfer Learning à leurs utilisateurs. Beaucoup d'entre elles proposent à cet effet des tutoriels détaillés pour guider les utilisateurs dans le processus de Transfer Learning.

C'est en particulier le cas de notre bibliothèque Microsoft Cognitive Toolkit (CNTK), une bibliothèque de Deep Learning open source déjà abordée sur ce même blog que nous utiliserons dans la suite de ce billet pour notre illustration et pour construire notre modèle de Transfer Learning.

Le tutoriel « Build your own image classifier using Transfer Learning » de CNTK décrit une tâche de classification des fleurs et recommande le modèle ResNet_18 comme le modèle de base et « Full Model Fine-tuning » comme la configuration par défaut.

CNTK fournit également des paramètres de contrôle pour passer en mode « Deep-layer Feature Extractor ». Cependant, le mode « Mid-layer Feature Extractor » n'est pas (encore) disponible à ce stade.

En termes d'outillage, d'aucun pourrait également citer PyTorch ou d'autres bibliothèques encore.

Notre illustration

Le but de notre illustration consiste à créer un pipeline de classification d'images avec le Transfer Learning. Ainsi, nous nous proposons de construire un modèle de Transfer Learning pour classifier les images de cinq sortes de fruits : pomme, banane, raisin, orange, fraise.

Nous allons pour cela suivre les 8 étapes ci-dessous :

  1. Créer des dossiers en respectant une structure spécifique.
  2. Obtenir des données (images) (optionnel).
  3. Télécharger et consulter les modèles de base.
  4. Définir les paramètres généraux et choisir le type de Transfer Learning à utiliser.
  5. Entraîner le modèle.
  6. Évaluer le modèle avec une seule image.
  7. Évaluer le modèle avec un groupe d'images.
  8. Afficher les images mal-classifiées.

Voyons ce qu'il en est dans le détail.

Le code source et le pipeline complet sont disponibles dans un Jupyter Notebook ici. Vous disposez ainsi de tous les éléments nécessaires pour reproduire ce qui suit 

1. Créer des dossiers en respectant une structure spécifique

Afin de réutiliser le pipeline de classification d'images proposé, vous devez commencer par créer des dossiers selon une structure spécifique et placer nos données (images) dans les dossiers correspondants.

L'approche proposée dans le cahier Jupyter Notebook vise à créer ces dossiers automatiquement. Il reste simplement à définir le nom du jeu de données et des classes différentes pour la tâche.

Voici la structure de dossiers utilisée ainsi pour ce pipeline de classification d'images :

2. Obtenir des données (images) (optionnel)

Cette seconde étape est une étape optionnelle.

Si nous voulons essayer ce pipeline de classification d'images sans cible spécifique, il est possible de simplement définir le nombre total d'images à télécharger et la partition des images pour chaque classe. Ensuite, il suffit de lancer le programme de téléchargement, qui téléchargera automatiquement les images à partir de la bibliothèque Google Image sur GitHub, séparera ces images de manière aléatoire en deux groupes (ensemble des données d'apprentissage et de test) et les stockera dans les dossiers correspondants précédemment créés.

Remarque : Les mots-clés de recherche que nous utilisons pour télécharger des images à partir de Google sont les noms de classe définis dans la partie précédente. Dans notre cas, les mots-clés de recherche sont donc pomme, banane, raisin, orange, fraise.

Voici un exemple de l'exécution pour télécharger les images :

3. Télécharger et consulter les modèles de base

Avant d'entraîner notre modèle de Transfer Learning, nous devons télécharger le modèle de base que nous nous proposons d'utiliser et choisir les couches que nous allons conserver en inspectant la structure des réseaux de neurones.

4. Définir les paramètres généraux et choisir le type de Transfer Learning à utiliser

Avant d'exécuter notre programme de l'entraînement, il est nécessaire de :

  1. Définir les paramètres généraux liés au processus d'apprentissage, aux propriétés de l'image d'entrée, et aux emplacements et caractéristiques du modèle et des données.
  2. Choisir les types de Transfer Learning.

CNTK supporte à date les modes « Deep-layer Feature Extractor » et « Full Model Fine-tuning » comme évoqué précédemment. Nous devons donc choisir l'un de ces deux modes :

5. Entraîner le modèle

Pour cette illustration, nous avons choisi ResNet_18 comme le modèle de base.

Ce modèle sera adapté à l'aide du Transfer Learning pour la classification des fruits. Ce modèle est un réseau de neurones convolutifs (CNN) construit à l'aide de techniques de réseau résiduel. Les réseaux de neurones convolutifs construisent des couches de convolutions, transforment une image d'entrée et la distillent jusqu'à ce qu'ils commencent à reconnaître les caractéristiques composites. Avec des couches de convolutions plus profondes, ils peuvent même reconnaître des caractéristiques complexes.

Le réseau résiduel est une technique issue de Microsoft Research (MSR). Il consiste à passer par le signal principal des données d'entrée, de sorte que le réseau finisse par apprendre uniquement sur les portions résiduelles qui diffèrent d'une couche à l'autre. Dans la pratique, cela permet d'entraîner des réseaux beaucoup plus profonds en évitant les problèmes qui entravent la descente de gradient sur des réseaux plus vastes. Ces cellules contournent les couches de convolution et reviennent plus tard avant ReLU.

6. Évaluer le modèle avec une seule image

Nous avons deux façons d'évaluer notre modèle. Tout d'abord, nous l'évaluons avec une image choisie et montrons la prédiction avec les probabilités de chaque classe comme ci-dessous.

7. Évaluer le modèle avec un groupe d'images

Après avoir collecté toutes les images de test, nous pouvons également évaluer notre modèle avec toutes ces images une par une, placer la prédiction avec les probabilités de chaque classe dans une table et calculer la précision de la classification.

8. Afficher les images mal-classifiées

Après avoir évalué les modèles avec l'ensemble des données de test, nous pouvons afficher toutes les prédictions erronées afin de trouver une raison potentielle concernant la classification erronée de ces images.

Dans notre cas, par exemple, l'image ci-dessous est mal classifiée car les formes de pomme et d'orange sont assez similaires et ils peuvent avoir la même couleur (verte). C'est peut-être une des raisons pour lesquelles cette image orange est reconnue comme une pomme.

En guise de conclusion

Le Transfer Learning est une approche puissante. Cependant, il a aussi des limites.

Par exemple, nous avons ré-entraîné un modèle qui avait été entraîné sur les images de ImageNet. Cela signifie qu'il connaissait déjà les images et avait une bonne idée des concepts allant du niveau bas (rayures, cercles etc.) au niveau élevé (les petits points sur la surface de fraise etc.).

Ré-entraîner un tel modèle pour classifier les fruits a du sens, mais le ré-entraîner pour détecter les véhicules à partir d'images aériennes serait plus difficile. Nous pouvons toujours utiliser le Transfer Learning dans ces cas, mais il vaut mieux de réutiliser juste les couches précédentes du modèle, c'est-à-dire les couches convolutifs qui ont appris des concepts plus primitifs. Nous aurons donc probablement besoin de beaucoup plus de données d'apprentissage.

Share the post

Classification d’images avec le Transfer Learning

×

Subscribe to Msdn Blogs | Get The Latest Information, Insights, Announcements, And News From Microsoft Experts And Developers In The Msdn Blogs.

Get updates delivered right to your inbox!

Thank you for your subscription

×