Main Content

La traduction de cette page n'est pas à jour. Cliquez ici pour voir la dernière version en anglais.

Classer une image avec GoogLeNet

Cet exemple indique comment classer une image avec le réseau de neurones à convolution préentraîné GoogLeNet.

GoogLeNet a été entraîné sur plus d’un million d'images et peut classer des images dans 1 000 catégories d’objets (par exemple un clavier, une tasse à café, un crayon et de nombreux animaux). Ce réseau a appris des représentations avec de nombreuses caractéristiques pour une grande variété d’images. Le réseau utilise une image comme entrée puis produit une étiquette pour l’objet dans l’image avec les probabilités pour chaque catégorie d’objet.

Charger un réseau préentraîné

Chargez le réseau GoogLeNet préentraîné. Cette opération nécessite le support package Deep Learning Toolbox™ Model for GoogLeNet Network. Si les support packages requis ne sont pas installés, le logiciel propose un lien de téléchargement.

Vous pouvez également choisir de charger un autre réseau préentraîné pour la classification des images. Pour essayer un autre réseau préentraîné, ouvrez cet exemple dans MATLAB® et sélectionnez un réseau différent. Par exemple, vous pouvez essayer squeezenet, un réseau qui est encore plus rapide que googlenet. Vous pouvez exécuter cet exemple avec d’autres réseaux préentraînés. Pour une liste de tous les réseaux disponibles, veuillez consulter Load Pretrained Neural Networks.

net = googlenet;

L’image que vous voulez classer doit avoir la même taille que la taille en entrée du réseau. Pour GoogLeNet, le premier élément de la propriété Layers du réseau est la couche d’entrée des images. La taille des entrées du réseau est la propriété InputSize de la couche d’entrée des images.

inputSize = net.Layers(1).InputSize
inputSize = 1×3

   224   224     3

L’élément final de la propriété Layers est la couche de sortie de classification. La propriété ClassNames de cette couche contient les noms des classes apprises par le réseau. Affichez 10 noms de classes aléatoires sur un total de 1000.

classNames = net.Layers(end).ClassNames;
numClasses = numel(classNames);
disp(classNames(randperm(numClasses,10)))
    'papillon'
    'eggnog'
    'jackfruit'
    'castle'
    'sleeping bag'
    'redshank'
    'Band Aid'
    'wok'
    'seat belt'
    'orange'

Lire et redimensionner une image

Lisez et affichez l’image que vous voulez classer.

I = imread('peppers.png');
figure
imshow(I)

Affichez la taille de l’image. L’image a une taille de 384 x 512 pixels et présente trois canaux de couleur (RGB).

size(I)
ans = 1×3

   384   512     3

Redimensionnez l’image à la taille en entrée du réseau avec imresize. Ce redimensionnement modifie légèrement le ratio d’aspect de l’image.

I = imresize(I,inputSize(1:2));
figure
imshow(I)

En fonction de votre application, vous devrez peut-être redimensionner l’image différemment. Par exemple, vous pouvez rogner le coin supérieur gauche de l’image avec I(1:inputSize(1),1:inputSize(2),:). Si vous avez Image Processing Toolbox™, vous pouvez utiliser la fonction imcrop.

Classer une image

Classez l’image et calculez les probabilités de la classe avec classify. Le réseau classe correctement l’image en tant que poivron. Un réseau de classification est entraîné pour sortir une seule étiquette pour chaque image en entrée, même si l’image contient plusieurs objets.

[label,scores] = classify(net,I);
label
label = categorical
     bell pepper 

Affichez l’image avec l’étiquette prédite et la probabilité prédite que l’image ait cette étiquette.

figure
imshow(I)
title(string(label) + ", " + num2str(100*scores(classNames == label),3) + "%");

Afficher les meilleures prédictions

Affichez les cinq meilleures étiquettes prédites et leur probabilité associée sous forme d’histogramme. Comme le réseau classe les images dans de nombreuses catégories et que certaines catégories sont similaires, il est courant de prendre en compte la précision des cinq meilleures lors de l’évaluation des réseaux. Le réseau classe l’image en tant que poivron avec une probabilité élevée.

[~,idx] = sort(scores,'descend');
idx = idx(5:-1:1);
classNamesTop = net.Layers(end).ClassNames(idx);
scoresTop = scores(idx);

figure
barh(scoresTop)
xlim([0 1])
title('Top 5 Predictions')
xlabel('Probability')
yticklabels(classNamesTop)

Références

[1] Szegedy, Christian, Wei Liu, Yangqing Jia, Pierre Sermanet, Scott Reed, Dragomir Anguelov, Dumitru Erhan, Vincent Vanhoucke, and Andrew Rabinovich. "Going deeper with convolutions." In Proceedings of the IEEE conference on computer vision and pattern recognition, pp. 1-9. 2015.

Voir aussi

| | | |

Sujets associés