Comment classer facilement les images de mode avec ConvNets

L'achat de vêtements est une expérience éprouvante. Mes yeux sont bombardés de trop d'informations. Les ventes, les coupons, les couleurs, les enfants en bas âge, les lumières clignotantes et les allées encombrées ne sont que quelques exemples de tous les signaux transmis à mon cortex visuel, que je cherche activement ou non à y prêter attention. Le système visuel absorbe une abondance d'informations. Dois-je aller pour ce pantalon kaki H & M? Est-ce un débardeur Nike? De quelle couleur sont ces baskets Adidas?

Un ordinateur peut-il détecter automatiquement les images de chemises, de pantalons, de robes et de baskets? Il s'avère que classer avec précision les images d'articles de mode est étonnamment simple à réaliser, compte tenu des données de qualité sur la formation. Dans ce didacticiel, nous allons construire un modèle d’apprentissage automatique permettant de reconnaître des images d’objets de mode à l’aide du jeu de données Fashion-MNIST. Nous allons expliquer comment former un modèle, concevoir l’entrée et la sortie pour les classifications par catégorie et enfin afficher les résultats de précision pour chaque modèle.

Classification d'image

Le problème de la classification des images est le suivant: à partir d’un ensemble d’images étiquetées avec une seule catégorie, il nous est demandé de prédire ces catégories pour un nouvel ensemble d’images test et de mesurer la précision des prédictions. Cette tâche comporte une variété de défis, notamment la variation du point de vue, la variation d'échelle, la variation intra-classe, la déformation de l'image, l'occlusion de l'image, les conditions d'éclairage, le bruit de fond, etc.

Comment pourrions-nous écrire un algorithme capable de classer les images en catégories distinctes? Les chercheurs de Computer Vision ont mis au point une approche basée sur les données pour résoudre ce problème. Plutôt que d'essayer de spécifier chaque catégorie d'image d'intérêt directement dans le code, ils fournissent à l'ordinateur de nombreux exemples de chaque classe d'images, puis développent des algorithmes d'apprentissage basés sur ces exemples et sur l'apparence visuelle de chaque classe. . En d'autres termes, ils accumulent d'abord un jeu de données d'apprentissage contenant des images étiquetées, puis l'envoient à l'ordinateur pour qu'il se familiarise avec les données.

De ce fait, le pipeline complet de classification des images peut être formalisé comme suit:

  • Notre entrée est un ensemble de données d'apprentissage composé de N images, chacune étiquetée avec l'une des K classes différentes.
  • Ensuite, nous utilisons cet ensemble d’entraînement pour former un classificateur afin d’apprendre à quoi ressemble chacune des classes.
  • Finalement, nous évaluons la qualité du classificateur en lui demandant de prédire les étiquettes d’un nouvel ensemble d’images qu’il n’a jamais vues auparavant. Nous comparerons ensuite les véritables étiquettes de ces images à celles prédites par le classificateur.

Réseaux de neurones convolutifs

Les réseaux de neurones convolutifs (CNN) sont le modèle de réseau de neurones le plus populaire utilisé pour le problème de classification d'images. La grande idée derrière CNN est qu’une compréhension locale d’une image est suffisante. L'avantage pratique est que le fait de disposer de moins de paramètres améliore considérablement le temps d'apprentissage et réduit la quantité de données nécessaire à la formation du modèle. Au lieu d'un réseau entièrement connecté de poids de chaque pixel, un CNN a juste assez de poids pour regarder une petite partie de l'image. C’est comme lire un livre avec une loupe; finalement, vous lisez toute la page, mais vous ne regardez qu’un petit patch de la page à un moment donné.

Prenons une image de 256 x 256. CNN peut analyser efficacement bloc par bloc - disons une fenêtre 5 × 5. La fenêtre 5 × 5 glisse le long de l'image (généralement de gauche à droite et de haut en bas), comme indiqué ci-dessous. La rapidité avec laquelle il glisse s'appelle sa longueur de foulée. Par exemple, une longueur de foulée de 2 signifie que la fenêtre glissante 5 × 5 se déplace de 2 pixels à la fois jusqu'à couvrir toute l'image.

Une convolution est une somme pondérée des valeurs en pixels de l'image, lorsque la fenêtre glisse sur toute l'image. Il s'avère que ce processus de convolution dans une image avec une matrice de pondération produit une autre image (de même taille, selon la convention). La convergence est le processus d'application d'une convolution.

Les manigances de la fenêtre glissante se produisent dans la couche de convolution du réseau neuronal. Un CNN typique a plusieurs couches de convolution. Chaque couche de convolution génère généralement de nombreuses convolutions alternées. La matrice de pondération est donc un tenseur de 5 × 5 × n, où n est le nombre de convolutions.

Par exemple, supposons qu'une image traverse une couche de convolution sur une matrice de pondération de 5 × 5 × 64. Elle génère 64 convolutions en faisant glisser une fenêtre 5 × 5. Par conséquent, ce modèle a 5 × 5 × 64 (= 1 600) paramètres, ce qui représente remarquablement moins de paramètres qu'un réseau entièrement connecté, 256 × 256 (= 65 536).

La beauté du CNN est que le nombre de paramètres est indépendant de la taille de l’image originale. Vous pouvez exécuter le même CNN sur une image 300 × 300 et le nombre de paramètres ne changera pas dans la couche de convolution.

Augmentation de données

Les jeux de données de recherche sur la classification des images sont généralement très volumineux. Néanmoins, l’augmentation des données est souvent utilisée pour améliorer les propriétés de généralisation. En règle générale, le recadrage aléatoire des images redimensionnées ainsi que le retournement horizontal aléatoire et les décalages aléatoires de couleur et de luminosité RVB sont utilisés. Il existe différents systèmes pour redimensionner et rogner les images (par exemple, formation à une seule échelle ou multi-échelles). L'évaluation multi-cultures au cours de la période de test est également souvent utilisée, bien que plus onéreuse en calcul et avec une amélioration limitée des performances. Notez que l'objectif du redimensionnement et du recadrage aléatoires est d'apprendre les caractéristiques importantes de chaque objet à différentes échelles et positions. Keras n'implémente pas toutes ces techniques d'augmentation de données prêtes à l'emploi, mais elles peuvent facilement être implémentées via la fonction de prétraitement des modules ImageDataGenerator.

Mode MNIST

Les recherches de Zalando ont récemment publié un nouvel ensemble de données, très similaire à la base de données bien connue du MNIST, composée de chiffres manuscrits. Le jeu de données est conçu pour les tâches de classification d’apprentissage automatique et contient au total 60 000 images de formation et 10 000 images de test (échelle de gris) de 28 x 28 pixels. Chaque formation et test est associé à l’une des dix étiquettes (0 à 9). Jusque là, le jeu de données de Zalando est fondamentalement identique aux données manuscrites originales. Cependant, au lieu d’avoir des images des chiffres de 0 à 9, les données de Zalando contiennent (sans surprise) des images avec 10 produits de mode différents. Par conséquent, le jeu de données s'appelle Fashion-MNIST, qui peut être téléchargé à partir de GitHub. Les données sont également présentées sur Kaggle. Quelques exemples sont présentés dans l'image suivante, où chaque ligne contient un article de mode.

Les 10 étiquettes de classe différentes sont:

  • 0 T-shirt / top
  • 1 pantalon
  • 2 pull
  • 3 robe
  • 4 manteau
  • 5 sandales
  • 6 chemise
  • 7 baskets
  • 8 sacs
  • 9 bottines

Selon les auteurs, les données Fashion-MNIST sont destinées à remplacer directement les anciennes données de chiffres manuscrits du MNIST, car il y avait plusieurs problèmes avec les chiffres manuscrits. Par exemple, il était possible de distinguer correctement plusieurs chiffres en regardant simplement quelques pixels. Même avec des classificateurs linéaires, il était possible d'obtenir une précision de classification élevée. Les données Fashion-MNIST promettent d'être plus diverses, de sorte que les algorithmes d'apprentissage automatique (ML) doivent apprendre des fonctionnalités plus avancées afin de pouvoir séparer les classes de manière fiable.

Intégration de la visualisation de la mode MNIST

L'intégration est un moyen de mapper des objets discrets (images, mots, etc.) sur des vecteurs de grande dimension. Les dimensions individuelles dans ces vecteurs n'ont généralement aucune signification inhérente. Il s’agit plutôt des modèles globaux de localisation et de distance entre les vecteurs dont l’apprentissage automatique tire parti. Les embeddings jouent donc un rôle important dans l’apprentissage automatique; puisque les classificateurs et les réseaux de neurones, plus généralement, travaillent sur des vecteurs de nombres réels. Ils s'entraînent mieux sur des vecteurs denses, où toutes les valeurs contribuent à définir un objet.

TensorBoard dispose d'un visualiseur intégré, appelé projecteur d'intégration, pour la visualisation et l'analyse interactives de données de grande dimension, telles que les incorporations. Le projecteur d’intégration lira les incorporations à partir de mon fichier de point de contrôle de modèle. Bien que ce soit très utile pour les plongées, il charge tout tenseur 2D, y compris mes poids d’entraînement.

Ici, je vais essayer de représenter les données Fashion MNIST haute dimension à l’aide de TensorBoard. Après avoir lu les données et créé les étiquettes de test, j’utilise ce code pour construire le projecteur d’incorporation de TensorBoard:

Le projecteur d’intégration dispose de trois méthodes pour réduire la dimensionnalité d’un ensemble de données: deux linéaires et une non linéaire. Chaque méthode peut être utilisée pour créer une vue bidimensionnelle ou tridimensionnelle.

Analyse en composantes principales: Une technique simple pour réduire les dimensions est l'analyse en composantes principales (ACP). Le projecteur d’intégration calcule les 10 principaux composants principaux. Le menu me permet de projeter ces composants sur n'importe quelle combinaison de deux ou trois. PCA est une projection linéaire, souvent efficace pour examiner la géométrie globale.

t-SNE: Une technique populaire de réduction de la dimensionnalité non linéaire est la t-SNE. Le projecteur d’intégration offre des vues t-SNE à deux et à trois dimensions. La mise en page est réalisée côté client en animant chaque étape de l'algorithme. Comme t-SNE préserve souvent une structure locale, il est utile pour explorer les quartiers locaux et trouver des grappes.

Personnalisé: je peux également construire des projections linéaires spécialisées basées sur des recherches de texte pour trouver des directions utiles dans l'espace. Pour définir un axe de projection, entrez deux chaînes de recherche ou des expressions régulières. Le programme calcule les centroïdes des ensembles de points dont les étiquettes correspondent à ces recherches et utilise le vecteur de différence entre les centroïdes comme axe de projection.

Vous pouvez afficher le code complet des étapes de visualisation sur ce bloc-notes: TensorBoard-Visualization.ipynb

Formation des modèles CNN sur la mode MNIST

Passons maintenant à la partie amusante: je vais créer une variété de modèles de classification basés sur CNN pour évaluer les performances sur Fashion MNIST. Je construirai notre modèle en utilisant le cadre de Keras. Pour plus d'informations sur le framework, vous pouvez vous référer à la documentation ici. Voici la liste des modèles que je vais essayer et comparer leurs résultats:

  1. CNN avec 1 couche convolutive
  2. CNN avec 3 couches convolutives
  3. CNN avec 4 couches convolutives
  4. Modèle pré-formé VGG-19

Pour tous les modèles (à l'exception du modèle pré-formé), voici mon approche:

  • Divisez les données de formation d'origine (60 000 images) en 80% de formation (48 000 images) et 20% de validation (12 000 images) optimisez le classificateur, tout en conservant les données de test (10 000 images) pour enfin évaluer la précision du modèle sur les données qu'il contient. n'a jamais vu. Cela permet de voir si je suis trop en phase avec les données d’entraînement et si je dois baisser le taux d’apprentissage et m'entraîner pour plus de périodes si la précision de la validation est supérieure à la précision de la formation ou arrêter le surentraînement si la précision de la formation est supérieure à la validation.
  • Entraînez le modèle pour 10 périodes avec une taille de lot de 256, compilées avec la fonction de perte categorical_crossentropy et Adam optimizer.
  • Ajoutez ensuite une augmentation des données, qui génère de nouveaux échantillons d'apprentissage en faisant pivoter, en décalant et en zoomant sur les échantillons d'apprentissage, et formez le modèle à l'aide de données mises à jour pour 50 autres époques.

Voici le code pour charger et diviser les données:

Après avoir chargé et fractionné les données, je les traite à nouveau en les transformant dans la forme attendue par le réseau et en les redimensionnant de sorte que toutes les valeurs se trouvent dans l'intervalle [0, 1]. Auparavant, par exemple, les données d'apprentissage étaient stockées dans un tableau de formes (60000, 28, 28) de type uint8 avec des valeurs comprises dans l'intervalle [0, 255]. Je le transforme en un tableau float32 de forme (60000, 28 * 28) avec des valeurs comprises entre 0 et 1.

1 - 1-Conv CNN

Voici le code pour le CNN avec 1 couche convolutionnelle:

Après avoir appris le modèle, voici le test de perte et de précision du test:

Après l’augmentation des données, voici la perte et la précision du test:

À des fins visuelles, je trace la formation et la validation de la précision et de la perte:

Vous pouvez afficher le code complet de ce modèle sur le bloc-notes suivant: CNN-1Conv.ipynb

2 - 3-CNN CNN

Voici le code pour le CNN avec 3 couches de convolution:

Après avoir appris le modèle, voici le test de perte et de précision du test:

Après l’augmentation des données, voici la perte et la précision du test:

À des fins visuelles, je trace la formation et la validation de la précision et de la perte:

Vous pouvez afficher le code complet de ce modèle sur le bloc-notes suivant: CNN-3Conv.ipynb

3 - 4-CNN CNN

Voici le code pour le CNN avec 4 couches de convolution:

Après avoir appris le modèle, voici le test de perte et de précision du test:

Après l’augmentation des données, voici la perte et la précision du test:

À des fins visuelles, je trace la formation et la validation de la précision et de la perte:

Vous pouvez afficher le code complet de ce modèle sur le bloc-notes suivant: CNN-4Conv.ipynb

4 - Apprentissage par transfert

Une approche commune très efficace d’apprentissage en profondeur sur de petits ensembles de données d’image consiste à utiliser un réseau pré-formé. Un réseau pré-formé est un réseau sauvegardé ayant déjà été formé sur un grand jeu de données, généralement sur une tâche de classification d'images à grande échelle. Si cet ensemble de données d'origine est suffisamment volumineux et assez général, la hiérarchie spatiale des caractéristiques apprises par le réseau pré-formé peut efficacement servir de modèle générique du monde visuel. Ses caractéristiques peuvent donc s'avérer utiles pour de nombreux problèmes de vision par ordinateur. Même si ces nouveaux problèmes peuvent impliquer des classes complètement différentes de celles de la tâche initiale.

J'ai tenté d'implémenter le modèle pré-formé VGG19, qui est une architecture ConvNets largement utilisée pour ImageNet. Voici le code que vous pouvez suivre:

Après avoir appris le modèle, voici le test de perte et de précision du test:

À des fins visuelles, je trace la formation et la validation de la précision et de la perte:

Vous pouvez afficher le code complet de ce modèle sur le bloc-notes suivant: VGG19-GPU.ipynb

Les nanonettes facilitent l'apprentissage par transfert

Ayant rencontré le problème de précision avec l’apprentissage par transfert, j’ai décidé de le résoudre en construisant un service Deep Learning facile à utiliser basé sur le cloud qui utilise Transfer Learning. Il contient un ensemble de modèles pré-formés ayant été formés sur des millions de paramètres. Je peux télécharger des données Fashion MNIST, puis le service sélectionne le meilleur modèle à utiliser pour la tâche. Enfin, il crée un nouveau NanoNet en plus du modèle pré-formé existant et adapte le NanoNet aux données.

Les modèles NanoNets étant fortement pré-formés, j'ai utilisé un jeu de données de formation beaucoup plus petit, composé d'environ ~ 100 images par classe. Avec ce modèle, j'ai obtenu une précision de test de 83,3%. C'est 7% de plus que le modèle VGG19 malgré l'utilisation de 1 / 60ème des données! La raison pour laquelle le modèle NanoNets fonctionne mieux est la suivante: grande quantité de formation préalable, sélection optimale de l'hyper-paramètre et augmentation du nombre de données.

L'avantage des NanoNets est que tout le monde peut télécharger des données et créer ses propres modèles. Vous pouvez créer des modèles de 2 manières:

1. Utilisation d’une interface graphique: https://app.nanonets.com/ImageCategorization/

2. Utilisation de l’API NanoNets: https://github.com/NanoNets/fashion_mnist

Ci-dessous, nous vous donnerons un guide étape par étape pour former votre propre modèle à l’aide de l’API Nanonets, en 9 étapes simples.

Étape 1: cloner le repo

clone git https://github.com/NanoNets/fashion_mnist.git
cd nanonets_fashion_mnist
demandes d'installation pip sudo

Étape 2: Obtenez votre clé API gratuite

Obtenez votre clé API gratuite à l'adresse http://app.nanonets.com/user/api_key

Étape 3: définir la clé d'API en tant que variable d'environnement

exporter NANONETS_API_KEY = YOUR_API_KEY_GOES_HERE

Étape 4: Créer un nouveau modèle

python ./code/create-model.py
Remarque: Ceci génère un MODEL_ID dont vous avez besoin pour l'étape suivante.

Étape 5: Ajouter un identifiant de modèle en tant que variable d'environnement

export NANONETS_MODEL_ID = YOUR_MODEL_ID

Étape 6: Télécharger les données de formation

Recueillir les images de l'objet que vous souhaitez détecter. Une fois que vous avez prêt le jeu de données dans les images de dossier (fichiers image), commencez à télécharger le jeu de données.

python ./code/upload-training.py

Étape 7: Modèle de train

Une fois les images téléchargées, commencez à former le modèle.

python ./code/train-model.py

Étape 8: Obtenir l'état du modèle

Le modèle prend environ 30 minutes pour s’entraîner. Vous recevrez un email une fois le modèle formé. En attendant, vous vérifiez l'état du modèle

regarder -n 100 python ./code/model-state.py

Étape 9: Faire une prédiction

Une fois le modèle formé. Vous pouvez faire des prédictions en utilisant le modèle

python ./code/prediction.py PATH_TO_YOUR_IMAGE.jpg

Il existe 10 images de test pour chaque classe dans le dossier «images / test» que vous pouvez utiliser pour la prédiction.