Main Content

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é et les noms des classes correspondantes avec la fonction imagePretrainedNetwork. 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 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 Pretrained Deep Neural Networks.

[net,classNames] = imagePretrainedNetwork("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

Affichez 10 noms de classes au hasard.

numClasses = numel(classNames);
disp(classNames(randperm(numClasses,10)))
    "hartebeest"
    "streetcar"
    "hair slide"
    "entertainment center"
    "wreck"
    "Siamese cat"
    "racket"
    "purse"
    "marmoset"
    "fountain"

Lire une image

Lisez et affichez l’image que vous voulez classer.

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

Redimensionner et classer une image

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.

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

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.

Utilisez le réseau de neurones pour faire une prédiction. Pour faire une prédiction avec une seule image, utilisez la fonction predict. Le type de données de l’image est uint8. Pour réaliser des prédictions avec le réseau de neurones, convertissez l’image en type de données single. Pour utiliser un GPU, convertissez les données en gpuArray. L’utilisation d’un GPU nécessite une licence Parallel Computing Toolbox™ et un dispositif GPU supporté. Pour plus d'information sur les dispositifs supportés, veuillez consulter GPU Computing Requirements (Parallel Computing Toolbox). Sinon, la fonction utilise le CPU.

X = single(X);
if canUseGPU
    X = gpuArray(X);
end
scores = predict(net,X);

La fonction predict renvoie les probabilités pour chaque classe. Pour convertir les scores de classification en étiquette de catégorie, utilisez la fonction scores2label.

[label,score] = scores2label(scores,classNames);

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

figure
imshow(I)
title(string(label) + ", " + score)

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 = 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