Main Content

Classificazione di immagini utilizzando GoogLeNet

Questo esempio mostra come classificare un’immagine con la rete neurale convoluzionale profonda preaddestrata GoogLeNet.

GoogLeNet è stata addestrata su oltre un milione di immagini ed è in grado di classificare le immagini in 1000 categorie di oggetti (ad esempio, tastiera, tazza da caffè, matita e molti animali). La rete ha appreso ricche rappresentazioni di feature per un’ampia gamma di immagini. La rete prende un’immagine come input e produce come output un’etichetta per l’oggetto all’interno dell’immagine, insieme alle probabilità che l’oggetto appartenga a ciascuna delle altre categorie di oggetti.

Caricamento della rete preaddestrata

Carica la rete preaddestrata GoogLeNet. Per questa fase è necessario il pacchetto assistenza Deep Learning Toolbox™ Model for GoogLeNet Network. Se non si dispone del pacchetto assistenza necessario installato, il software fornisce un link di download.

Si può anche scegliere di caricare una rete preaddestrata diversa per la classificazione delle immagini. Per provare una rete preaddestrata diversa, aprire questo esempio in MATLAB® e selezionare una rete differente. Ad esempio, si può provare squeezenet, una rete ancora più veloce di googlenet. È possibile eseguire questo esempio con altre reti preaddestrate. Per un elenco di tutte le reti disponibili, vedere Caricamento delle reti neurali preaddestrate.

net = googlenet;

Le dimensioni dell’immagine da classificare devono coincidere con le dimensioni di input della rete. Per GoogLeNet, il primo elemento della proprietà Layers della rete corrisponde al livello di input dell’immagine. La dimensione di input della rete corrisponde alla proprietà InputSize del livello di input dell’immagine.

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

   224   224     3

L’elemento finale della proprietà Layers corrisponde al livello di output della classificazione. La proprietà ClassNames di questo livello contiene i nomi delle classi apprese dalla rete. Visualizzare 10 nomi di classi casuali su un totale di 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'

Lettura e ridimensionamento delle immagini

Leggere e mostrare l’immagine che si desidera classificare.

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

Visualizzare la dimensione dell’immagine. L'immagine ha una dimensione di 384x512 pixel e tre canali di colore (RGB).

size(I)
ans = 1×3

   384   512     3

Ridimensionare l'immagine alla dimensione di input della rete utilizzando imresize. Il ridimensionamento modifica leggermente il rapporto d’aspetto dell’immagine.

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

A seconda dell’applicazione, si potrebbe voler ridimensionare l’immagine in modo diverso. Ad esempio, è possibile ritagliare l’angolo superiore sinistro dell’immagine utilizzando I(1:inputSize(1),1:inputSize(2),:). Se si dispone di Image Processing Toolbox™, è possibile utilizzare la funzione imcrop.

Classificazione dell’immagine

Classificare l’immagine e calcolare le probabilità di classe utilizzando classify. La rete classifica correttamente l'immagine come un peperone. Una rete di classificazione è addestrata per produrre una singola etichetta per ciascuna immagine di input, anche quando l’immagine contiene più oggetti.

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

Visualizzare l’immagine con l’etichetta prevista e la probabilità prevista che l’immagine abbia tale etichetta.

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

Visualizzazione delle previsioni più importanti

Visualizzare le prime cinque etichette previste e le probabilità ad esse associate come un istogramma. Poiché la rete classifica le immagini in un numero elevato di categorie di oggetti e molte categorie sono inoltre simili, è pratica comune considerare la precisione delle prime cinque quando si valutano le reti. La probabilità che la rete classifichi l’immagine come un peperone è alta.

[~,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)

Riferimenti

[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.

Vedi anche

| | | |

Argomenti complementari