- Introduction
- Table des matières
- Utilisation de CNNs pour classer des chiffres écrits à la main sur le jeu de données MNIST
- Identification des images du jeu de données CIFAR-10 en utilisant des CNN
- Voici ce que j’ai changé dans le modèle :
- Catégoriser les images d’ImageNet en utilisant des CNN
- A propos du jeu de données ImageNet
- C’est là qu’intervient le jeu de données Imagenette de Fast.ai
- Télécharger le jeu de données Imagenette
- Chargement d’images à l’aide de ImageDataGenerator
- Construction d’un modèle CNN de base pour la classification d’images
- Utilisation de l’apprentissage par transfert (VGG16) pour améliorer la précision
- Downloading weights of VGG16
- Générer des caractéristiques à partir de VGG16
- Où aller maintenant ?
Introduction
Les réseaux neuronaux convolutifs (CNN) – le concept derrière les récentes percées et développements dans l’apprentissage profond.
Les CNN ont brisé le moule et sont montés sur le trône pour devenir la technique de pointe en matière de vision par ordinateur. Parmi les différents types de réseaux neuronaux (les autres comprennent les réseaux neuronaux récurrents (RNN), la mémoire à long terme (LSTM), les réseaux neuronaux artificiels (ANN), etc.), les CNN sont facilement les plus populaires.
Ces modèles de réseaux neuronaux convolutifs sont omniprésents dans l’espace des données d’image. Ils fonctionnent phénoménalement bien sur les tâches de vision par ordinateur comme la classification d’images, la détection d’objets, la reconnaissance d’images, etc.
Alors – où pouvez-vous pratiquer vos compétences CNN ? Eh bien, vous êtes au bon endroit !
Il existe différents ensembles de données que vous pouvez exploiter pour appliquer les réseaux neuronaux convolutifs. Voici trois jeux de données populaires :
- MNIST
- CIFAR-10
- ImageNet
Dans cet article, nous allons construire des modèles de classification d’images en utilisant des CNN sur chacun de ces jeux de données. Eh oui ! Nous allons explorer MNSIT, CIFAR-10 et ImageNet pour comprendre, de manière pratique, comment les CNN fonctionnent pour la tâche de classification d’images.
Vous pouvez tout apprendre sur les réseaux neuronaux convolutifs(CNN) dans ce cours gratuit : Convolutional Neural Networks (CNN) from Scratch
Mon inspiration pour écrire cet article est d’aider la communauté à appliquer les connaissances théoriques de manière pratique. C’est un exercice très important car il vous aide non seulement à construire une compréhension plus profonde du concept sous-jacent, mais vous enseignera également des détails pratiques qui ne peuvent être appris qu’en mettant en œuvre le concept.
Si vous êtes nouveau dans le monde des réseaux neuronaux, des CNN, de la classification des images, je vous recommande de passer par ces excellents tutoriels approfondis :
- Introduction aux réseaux neuronaux (cours gratuit !)
- Démystifier les mathématiques derrière les réseaux neuronaux convolutifs (CNNs)
- Construire votre premier modèle de classification d’images en seulement 10 minutes
Et si vous cherchez à apprendre la vision par ordinateur et l’apprentissage profond en profondeur, vous devriez consulter nos cours populaires :
- Vision par ordinateur à l’aide de l’apprentissage profond
- Programme certifié AI & ML Blackbelt+
Table des matières
- Utilisation de CNN pour classer les chiffres écrits à la main.écrites à la main sur le jeu de données MNIST
- Identifier les images du jeu de données CIFAR-10 en utilisant des CNN
- Catégoriser les images du jeu de données ImageNet en utilisant des CNN
- Où aller maintenant ?
Note : Je vais utiliser Keras pour démontrer la classification d’images à l’aide de CNNs dans cet article. Keras est un excellent framework à apprendre lorsque vous débutez dans l’apprentissage profond.
Utilisation de CNNs pour classer des chiffres écrits à la main sur le jeu de données MNIST
MNIST (Modified National Institute of Standards and Technology) est un jeu de données bien connu utilisé en vision par ordinateur qui a été construit par Yann Le Cun et. al. Il est composé d’images qui sont des chiffres écrits à la main (0-9), divisé en un ensemble de formation de 50 000 images et un ensemble de test de 10 000 où chaque image est de 28 x 28 pixels en largeur et en hauteur.
Ce jeu de données est souvent utilisé pour pratiquer tout algorithme fait pour la classification d’images comme le jeu de données est assez facile à conquérir. Par conséquent, je recommande que ce soit votre premier jeu de données si vous ne faites qu’une incursion dans le domaine.
MNIST est livré avec Keras par défaut et vous pouvez simplement charger les fichiers de formation et de test en utilisant quelques lignes de code :
Voici la forme de X (caractéristiques) et y (cible) pour les données de formation et de validation :
X_train shape (60000, 28, 28) y_train shape (60000,) X_test shape (10000, 28, 28) y_test shape (10000,)
Avant de former un modèle CNN, construisons un réseau neuronal de base entièrement connecté pour le jeu de données. Les étapes de base pour construire un modèle de classification d’images à l’aide d’un réseau neuronal sont :
- Aplatir les dimensions de l’image d’entrée à 1D (pixels de largeur x pixels de hauteur)
- Normaliser les valeurs des pixels de l’image (diviser par 255)
- Un-.Hot Encoder la colonne catégorielle
- Construire une architecture de modèle (Séquentielle) avec des couches denses
- Entraîner le modèle et faire des prédictions
Voici comment vous pouvez construire un modèle de réseau neuronal pour MNIST. J’ai commenté les parties pertinentes du code pour une meilleure compréhension :
Après avoir exécuté le code ci-dessus, vous auriez réalisé que nous obtenons une bonne précision de validation d’environ 97% facilement.
Modifions le code ci-dessus pour construire un modèle CNN.
Un avantage majeur de l’utilisation des CNN par rapport aux NN est que vous n’avez pas besoin d’aplatir les images d’entrée à 1D car ils sont capables de travailler avec des données d’image en 2D. Cela aide à conserver les propriétés « spatiales » des images.
Voici le code complet du modèle CNN :
Même si notre précision de validation maximale en utilisant un modèle de réseau neuronal simple était d’environ 97%, le modèle CNN est capable d’obtenir 98%+ avec une seule couche de convolution !
Vous pouvez aller de l’avant et ajouter plus de couches de Conv2D, et aussi jouer avec les hyperparamètres du modèle CNN.
Identification des images du jeu de données CIFAR-10 en utilisant des CNN
MNIST est un jeu de données convivial pour les débutants en vision par ordinateur. Il est facile d’obtenir un score de 90%+ sur la validation en utilisant un modèle CNN. Mais que se passe-t-il si vous êtes au-delà du débutant et que vous avez besoin de quelque chose de stimulant pour mettre vos concepts en pratique ?
C’est là que le jeu de données CIFAR-10 entre en scène !
Voici comment les développeurs derrière CIFAR (Canadian Institute For Advanced Research) décrivent le jeu de données :
Le jeu de données CIFAR-10 se compose de 60 000 images couleur 32 x 32 dans 10 classes, avec 6 000 images par classe. Il y a 50 000 images d’entraînement et 10 000 images de test.
Les points importants qui distinguent ce jeu de données de MNIST sont :
- Les images sont colorées dans CIFAR-10 par rapport à la texture noir et blanc de MNIST
- Chaque image est de 32 x 32 pixels
- 50 000 images d’entraînement et 10 000 images de test
Maintenant, ces images sont prises dans des conditions d’éclairage variables et sous différents angles, et comme il s’agit d’images colorées, vous verrez qu’il existe de nombreuses variations dans la couleur même d’objets similaires (par exemple, la couleur de l’eau de l’océan). Si vous utilisez l’architecture CNN simple que nous avons vue dans l’exemple MNIST ci-dessus, vous obtiendrez une faible précision de validation d’environ 60%.
C’est une raison clé pour laquelle je recommande CIFAR-10 comme un bon ensemble de données pour pratiquer vos compétences de réglage des hyperparamètres pour les CNN. La bonne chose est que, tout comme MNIST, CIFAR-10 est également facilement disponible dans Keras.
Vous pouvez simplement charger le jeu de données en utilisant le code suivant :
from keras.datasets import cifar10# loading the dataset (X_train, y_train), (X_test, y_test) = cifar10.load_data()
Voici comment vous pouvez construire un modèle CNN décent (environ 78-80% sur la validation) pour CIFAR-10. Remarquez comment les valeurs de forme ont été mises à jour de (28, 28, 1) à (32, 32, 3) en fonction de la taille des images:
Voici ce que j’ai changé dans le modèle :
- Augmentation du nombre de couches Conv2D pour construire un modèle plus profond
- Augmentation du nombre de filtres pour apprendre plus de caractéristiques
- Ajout de Dropout pour la régularisation
- Ajout de couches plus denses
Exactitude de l’entraînement et de la validation à travers les époques :
Vous pouvez facilement éclipser cette performance en réglant le modèle ci-dessus. Une fois que vous avez maîtrisé CIFAR-10, il y a également CIFAR-100 disponible dans Keras que vous pouvez utiliser pour une pratique supplémentaire. Comme il a 100 classes, ce ne sera pas une tâche facile à réaliser !
Catégoriser les images d’ImageNet en utilisant des CNN
Maintenant que vous avez maîtrisé MNIST et CIFAR-10, prenons ce problème un cran plus haut. Ici, nous allons jeter un coup d’œil au célèbre jeu de données ImageNet.
ImageNet est la principale base de données derrière le défi de reconnaissance à grande échelle ImageNet (ILSVRC). C’est un peu comme les Jeux olympiques de la vision par ordinateur. C’est la compétition qui a rendu les CNN populaires la première fois et chaque année, les meilleures équipes de recherche à travers les industries et les universités rivalisent avec leurs meilleurs algorithmes sur des tâches de vision par ordinateur.
A propos du jeu de données ImageNet
Le jeu de données ImageNet compte plus de 14 millions d’images, étiquetées à la main à travers 20 000 catégories.
De plus, contrairement aux jeux de données MNIST et CIFAR-10 dont nous avons déjà parlé, les images d’ImageNet ont une résolution décente (224 x 224) et c’est ce qui nous pose un défi : 14 millions d’images, chacune de 224 x 224 pixels. Le traitement d’un ensemble de données de cette taille nécessite une grande puissance de calcul en termes de CPU, GPU et RAM.
L’inconvénient – cela pourrait être trop pour un ordinateur portable de tous les jours. Alors quelle est la solution alternative ? Comment un passionné peut-il travailler avec le jeu de données ImageNet ?
C’est là qu’intervient le jeu de données Imagenette de Fast.ai
Imagenette est un jeu de données extrait de la grande collection d’images ImageNet. La raison derrière la publication d’Imagenette est que les chercheurs et les étudiants peuvent s’exercer sur des images de niveau ImageNet sans avoir besoin de tant de ressources de calcul.
Dans les mots de Jeremy Howard lui-même :
« J’ai (Jeremy Howard, c’est-à-dire) principalement fait Imagenette parce que je voulais un petit ensemble de données de vision que je pouvais utiliser pour voir rapidement si mes idées d’algorithmes pourraient avoir une chance de fonctionner. Normalement, elles ne le font pas, mais les tester sur Imagenette prend vraiment beaucoup de temps pour que je le découvre, surtout parce que je m’intéresse aux algorithmes qui sont particulièrement performants à la fin de l’entraînement.
Mais je pense que cela peut être un jeu de données utile pour d’autres aussi. »
Et c’est ce que nous allons également utiliser pour nous entraîner !
Télécharger le jeu de données Imagenette
Voici comment vous pouvez récupérer le jeu de données (commandes pour votre terminal) :
$ wget https://s3.amazonaws.com/fast-ai-imageclas/imagenette2.tgz$ tar -xf imagenette2.tgz
Une fois que vous avez téléchargé le jeu de données, vous remarquerez qu’il a deux dossiers – « train » et « val ». Ceux-ci contiennent respectivement l’ensemble de formation et de validation. À l’intérieur de chaque dossier, il y a des dossiers séparés pour chaque classe. Voici le mappage des classes:
Ces classes ont le même ID dans le jeu de données ImageNet original. Chacune des classes a environ 1000 images, donc dans l’ensemble, c’est un jeu de données équilibré.
Chargement d’images à l’aide de ImageDataGenerator
Keras a cette fonctionnalité utile pour charger de grandes images (comme nous avons ici) sans maximiser la RAM, en le faisant par petits lots. ImageDataGenerator en combinaison avec fit_generator fournit cette fonctionnalité:
L’ImageDataGenerator lui-même déduit les étiquettes des classes et le nombre de classes à partir des noms de dossiers.
Construction d’un modèle CNN de base pour la classification d’images
Construisons un modèle CNN de base pour notre jeu de données Imagenette (dans le but de classifier les images) :
Lorsque nous comparons la précision de validation du modèle ci-dessus, vous réaliserez que même s’il s’agit d’une architecture plus profonde que celle que nous avons utilisée jusqu’à présent, nous ne sommes capables d’obtenir une précision de validation que d’environ 40-50%.
Il peut y avoir de nombreuses raisons à cela, comme le fait que notre modèle n’est pas assez complexe pour apprendre les modèles sous-jacents des images, ou peut-être que les données d’entraînement sont trop petites pour généraliser avec précision entre les classes.
Étape supérieure – l’apprentissage par transfert.
Utilisation de l’apprentissage par transfert (VGG16) pour améliorer la précision
VGG16 est une architecture CNN qui a été la première finaliste du 2014 ImageNet Challenge. Il est conçu par le Visual Graphics Group d’Oxford et comporte 16 couches au total, dont 13 couches convolutives elles-mêmes. Nous allons charger les poids pré-entraînés de ce modèle afin de pouvoir utiliser les caractéristiques utiles que ce modèle a apprises pour notre tâche.
Downloading weights of VGG16
from keras.applications import VGG16# include top should be False to remove the softmax layerpretrained_model = VGG16(include_top=False, weights='imagenet')pretrained_model.summary()
Générer des caractéristiques à partir de VGG16
Extrayons des caractéristiques utiles que VGG16 connaît déjà à partir des images de notre jeu de données :
from keras.utils import to_categorical# extract train and val featuresvgg_features_train = pretrained_model.predict(train)vgg_features_val = pretrained_model.predict(val)
# OHE target columntrain_target = to_categorical(train.labels)val_target = to_categorical(val.labels)
Notez la rapidité avec laquelle votre modèle commence à converger. En seulement 10 époques, vous avez une précision de validation de 94%+. N’est-ce pas incroyable ?
Au cas où vous auriez maîtrisé le jeu de données Imagenette, fastai a également publié deux variantes qui incluent des classes que vous trouverez difficiles à classer :
- Imagewoof : 10 classes de races de chiens, un problème plus difficile à classifier
- Image网 (« wang ») : Une combinaison d’Imagenette et d’Imagewoof et quelques astuces qui en font un problème plus difficile
Où aller maintenant ?
En dehors des ensembles de données que nous avons ci-dessus, vous pouvez également utiliser les ensembles de données ci-dessous pour construire des algorithmes de vision par ordinateur. En fait, considérez ceci comme un défi. Pouvez-vous appliquer vos connaissances en matière de CNN pour battre le score de référence sur ces jeux de données ?
- Fashion MNIST – Jeu de données de type MNIST de vêtements et d’habillement. Au lieu de chiffres, les images montrent un type de vêtement (T-shirt, pantalon, sac, etc.)
- Caltech 101 – Un autre jeu de données difficile que j’ai trouvé pour la classification d’images
Je suggère également qu’avant de vous lancer dans l’apprentissage par transfert, essayez d’améliorer vos modèles CNN de base. Vous pouvez apprendre des architectures de VGG16, ZFNet, etc. pour quelques indices sur le réglage des hyperparamètres et vous pouvez utiliser le même ImageDataGenerator pour augmenter vos images et augmenter la taille du jeu de données.
Vous pouvez également lire cet article sur notre APP mobile.