Classification d'Images avec des Modèles d'Apprentissage Profond en MATLAB

L'utilisation de MATLAB pour la classification d'images par apprentissage profond représente un processus puissant et relativement intuitif, même pour les débutants qui peuvent rapidement construire et déployer des modèles avec son aide.

Les étapes principales et les fonctions clés impliquées dans la classification d'images par apprentissage profond avec MATLAB :

Étape Fonctions/Outils principaux Description
Préparation et chargement des données imageDatastore Crée un objet de stockage de données d'images, récupérant automatiquement les étiquettes à partir de la structure des dossiers
splitEachLabel Divise les ensembles de données en ensembles d'entraînement, de validation et de test selon des proportions
Prétraitement et augmentation des données augmentedImageDatastore Effectue le redimensionnement des images, la normalisation et l'augmentation des données (comme la rotation, la retournement)
Construction du modèle réseau À partir de zéro Construction couche par couche en utilisant imageInputLayer, convolution2dLayer, reluLayer, etc.
Apprentissage par transfert Chargement de modèles pré-entraînés comme googlenet, resnet50, etc.
Configuration des options d'entraînement trainingOptions Définition des paramètres tels que l'optimiseur, le taux d'apprentissage, le nombre d'itérations, les données de validation, etc.
Entraînement du modèle trainNetwork Entraîne le réseau en utilisant les données d'entraînement
Évaluation des performances classify Effectue des prédictions de classification sur l'ensemble de test
confusionmat Calcule la précision de classification ou la matrice de confusion
Prédiction avec le modèle classify Effectue des prédictions sur de nouvelles images individuelles ou des ensembles d'images

Préparation et prétraitement des données

Une bonne qualité de données est la base essentielle pour un entraînement de modèle réussi.

  1. Organisation des données : Placez les images dans des sous-dossiers distincts pour chaque catégorie, où le nom du dossier correspond à l'étiquette de la catégorie. Par exemple :
jeu_donnees/
    entrainement/
        chat/
            chat001.jpg
            ...
        chien/
            chien001.jpg
            ...
    validation/
        chat/
            ...
        chien/
            ...
    test/
        chat/
            ...
        chien/
            ...


Cette approche permet à imageDatastore de récupérer automatiquement les étiquettes. 2. Chargement des données : Utilisez imageDatastore pour charger les données d'images.

imds = imageDatastore('chemin/vers/vos/donnees', ...
    'IncludeSubfolders', true, ...
    'LabelSource', 'foldernames');


  1. Division de l'ensemble de données : Divisez les données en ensembles d'entraînement, de validation et de test.
[imdsEntrainement, imdsValidation, imdsTest] = splitEachLabel(imds, 0.7, 0.15, 0.15, 'randomized');


  1. Prétraitement et augmentation des données : Utilisez augmentedImageDatastore pour le redimensionnement des images et l'augmentation, ce qui aide à augmenter la diversité des données et à prévenir le surapprentissage.
tailleImage = [224 224 3]; % Taille d'entrée courante pour les réseaux, comme ImageNet
augimdsEntrainement = augmentedImageDatastore(tailleImage, imdsEntrainement, ...
    'ColorPreprocessing', 'gray2rgb', ... % Conversion en RGB tricanal si les images originales sont en niveaux de gris
    'DataAugmentation', imageDataAugmenter('RandRotation',[-20,20], ... % Rotation aléatoire
    'RandXReflection', true, ... % Retournement horizontal aléatoire
    'RandXTranslation',[-10 10], 'RandYTranslation',[-10 10])); % Translation aléatoire


Pour les ensembles de validation et de test, on effectue généralement seulement un redimensionnement et une normalisation, sans augmentation des données.

Construction du modèle d'apprentissage profond

Vous pouvez choisir de construire un réseau de neurones convolutionnel (CNN) à partir de zéro ou d'utiliser l'apprentissage par transfert avec des modèles pré-entraînés.

  • Construction d'un CNN à partir de zéro (adapté aux tâches simples ou lorsque la quantité de données est faible) :
couches = [
    imageInputLayer([28 28 1]) % Couche d'entrée, spécifiant la taille des images
    convolution2dLayer(3, 8, 'Padding', 'same') % Couche de convolution
    batchNormalizationLayer   % Couche de normalisation par lots
    reluLayer                 % Couche d'activation ReLU
    maxPooling2dLayer(2, 'Stride', 2) % Couche de max pooling
    convolution2dLayer(3, 16, 'Padding', 'same')
    batchNormalizationLayer
    reluLayer
    fullyConnectedLayer(10)   % Couche entièrement connectée, nombre de nœuds de sortie correspondant au nombre de classes
    softmaxLayer              % Couche Softmax
    classificationLayer];     % Couche de classification


C'est un exemple simple, vous pouvez augmenter le nombre de couches de convolution, couches entièrement connectées, etc. selon vos besoins.

  • Apprentissage par transfert (fortement recommandé, surtout si vous n'avez pas une quantité de données particulièrement importante) :
net = googlenet; % Chargement du modèle GoogLeNet pré-entraîné, d'autres options comme resnet50, efficientnetb0, etc.
grapheCouches = layerGraph(net); % Obtention du graphe des couches du réseau
% Modification des dernières couches entièrement connectées et de classification pour s'adapter à votre nombre de classes
nbClasses = numel(categories(imdsEntrainement.Etiquettes));
nouvelleCoucheFC = fullyConnectedLayer(nbClasses, 'Name', 'nouvelle_fc');
nouvelleCoucheClassif = classificationLayer('Name', 'nouvelle_sortie_classif');
grapheCouches = replaceLayer(grapheCouches, 'loss3-classifier', nouvelleCoucheFC);
grapheCouches = replaceLayer(grapheCouches, 'output', nouvelleCoucheClassif);
% Configuration des options d'entraînement, généralement avec un taux d'apprentissage plus faible pour le réglage fin
options = trainingOptions('adam', ...
    'InitialLearnRate', 0.0001, ... % Le taux d'apprentissage est généralement plus faible pour le réglage fin
    ... % Autres options
    );


Configuration des options d'entraînement et entraînement du modèle

Utilisez la fonction trainingOptions pour configurer les paramètres d'entraînement.

options = trainingOptions('sgdm', ... % Algorithme d'optimisation, peut aussi être 'adam', 'rmsprop', etc.
    'MaxEpochs', 10, ...              % Nombre maximal d'époques d'entraînement
    'MiniBatchSize', 32, ...          % Taille des mini-lots
    'InitialLearnRate', 0.001, ...    % Taux d'apprentissage initial
    'ValidationData', augimdsValidation, ... % Spécification des données de validation
    'ValidationFrequency', 50, ...    % Validation effectuée à quelle fréquence (en itérations)
    'Verbose', false, ...             % Affichage ou non du processus d'entraînement dans la fenêtre de commande
    'Plots', 'training-progress');    % Affichage du graphique de progression d'entraînement


Utilisez la fonction trainNetwork pour commencer l'entraînement du modèle.

net = trainNetwork(augimdsEntrainement, couches, options); % Pour l'entraînement à partir de zéro
% Ou pour l'apprentissage par transfert
net = trainNetwork(augimdsEntrainement, grapheCouches, options);


Pendant l'entraînement, MATLAB affiche un graphique de progression où vous pouvez observer en temps réel les changements de précision et de perte sur les ensembles d'entraînement et de validation.

Évaluation des performances et prédiction

Une fois l'entraînement terminé, vous devez évaluer les performances finales du modèle sur un ensemble de test indépendant.

% Effectue des prédictions de classification sur l'ensemble de test
[YPrevue, scores] = classify(net, augimdsTest);
YTest = imdsTest.Etiquettes; % Récupère les étiquettes réelles de l'ensemble de test

% Calcule la précision
precision = mean(YPrevue == YTest);
fprintf('Précision du test : %.2f%%\n', precision * 100);

% Dessine une matrice de confusion pour analyser la classification de chaque catégorie
figure;
confusionchart(YTest, YPrevue);
title('Matrice de confusion pour les données de test');


Le modèle entraîné peut être utilisé pour prédire de nouvelles images.

% Prédiction pour une image unique
img = imread('chemin/vers/votre_nouvelle_image.jpg');
imgRedimensionnee = imresize(img, net.Couches(1).TailleEntree(1:2)); % Redimensionnement à la taille d'entrée du réseau
[etiquette, score] = classify(net, imgRedimensionnee);

% Affichage de l'image et du résultat de prédiction
figure;
imshow(img);
title(['Prédit : ', char(etiquette), ', Confiance : ', num2str(max(score)*100, '%.2f'), '%']);


Conseils pratiques et points d'attention

  • Les données sont essentielles : La qualité, la quantité et la diversité des données influencent directement les performances du modèle. L'augmentation des données est un moyen efficace d'améliorer la capacité de généralisation du modèle.
  • Commencez par l'apprentissage par transfert : Sauf si vous disposez d'une quantité massive de données, commencer avec des modèles pré-entraînés (comme GoogLeNet, ResNet, EfficientNet, etc.) pour le réglage fin est généralement plus rapide et plus efficace que l'entraînement à partir de zéro.
  • Utilisez l'accélération GPU : Si vous avez un GPU, MATLAB essaie automatiquement de l'utiliser pour accélérer l'entraînement (nécessite la Parallel Computing Toolbox).
  • Ajustement des hyperparamètres : Le taux d'apprentissage (InitialLearnRate), la taille de lot (MiniBatchSize), le nombre d'époques (MaxEpochs) sont des hyperparamètres importants qui doivent être ajustés selon la situation. Vous pouvez utiliser l'application Experiment Manager de MATLAB pour effectuer systématiquement l'ajustement des hyperparamètres.
  • Comprendre le surapprentissage : Si la précision d'entraînement est élevée mais que la précision de validation/test est faible, le modèle est probablement en surapprentissage. Vous pouvez y remédier en augmentant l'augmentation des données, en ajoutant des couches Dropout, en utilisant une régularisation L2, en réduisant la complexité du modèle ou en arrêtant l'entraînement prématurément.
  • Visualisation et interprétabilité : Utilisez des outils comme Grad-CAM pour visualiser les régions de l'image que le réseau prend en compte, ce qui aide à comprendre les décisions du modèle et à le déboguer.

Exploration avancée

Lorsque vous maîtrisez le processus de base, vous pouvez également explorer :

  • Utilisation de l'application Deep Network Designer : Concevoir, modifier et entraîner des réseaux via une interface graphique en mode glisser-déposer, très adoptée aux débutants pour comprendre visuellement la structure des réseaux.
  • Autres tâches de vision par ordinateur : Comme la détection d'objets (en utilisant trainFasterRCNNObjectDetector ou trainYOLOv2ObjectDetector), la segmentation sémantique, etc.
  • Déploiement du modèle : Déployer le modèle entraîné sur des dispositifs embarqués, des systèmes d'entreprise ou générer du code.

Étiquettes: apprentissage profond MATLAB classification d'images CNN apprentissage par transfert

Publié le 7 octobre à 17h51