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

Caricare la rete GoogLeNet preaddestrata e i nomi delle classi corrispondenti utilizzando la funzione imagePretrainedNetwork. 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, è possibile 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 Reti neurali profonde preaddestrate.

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

Visualizzare 10 nomi di classi in modo casuale.

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

Lettura dell'immagine

Leggere e mostrare l’immagine che si desidera classificare.

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

Ridimensionamento e classificazione dell'immagine

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.

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

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.

Utilizzare la rete neurale per fare una previsione. Per fare una previsione con una singola immagine, utilizzare la funzione predict. Il tipo di dati dell'immagine è uint8. Per fare previsioni con la rete neurale, convertire l'immagine nel tipo di dati single. Per utilizzare una GPU, convertire i dati in gpuArray. L'utilizzo di una GPU richiede una licenza Parallel Computing Toolbox™ e un dispositivo GPU supportato. Per informazioni sui dispositivi supportati, vedere GPU Computing Requirements (Parallel Computing Toolbox). In caso contrario, la funzione utilizza la CPU.

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

La funzione predict restituisce le probabilità per ciascuna classe. Per convertire i punteggi di classificazione in un'etichetta categorica, utilizzare la funzione scores2label.

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

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

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

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