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.
[2] BVLC GoogLeNet Model. https://github.com/BVLC/caffe/tree/master/models/bvlc_googlenet
Vedi anche
DAGNetwork
| googlenet
| classify
| predict
| squeezenet