Contenuto principale

La traduzione di questa pagina non è aggiornata. Fai clic qui per vedere l'ultima versione in inglese.

Estrazione delle feature dell'immagine utilizzando la rete preaddestrata

Questo esempio mostra come estrarre le feature dell'immagine apprese da una rete neurale convoluzionale preaddestrata e come utilizzare tali feature per addestrare un classificatore di immagini. L'estrazione di feature è il modo più semplice e veloce per utilizzare la potenza rappresentativa delle reti profonde preaddestrate. Ad esempio, è possibile addestrare una macchina a vettori di supporto (SVM) utilizzando fitcecoc (Statistics and Machine Learning Toolbox™) sulle feature estratte. Considerando che l’estrazione di feature richiede solo un singolo passaggio attraverso i dati, costituisce un buon punto di partenza se non si dispone di una GPU con cui accelerare l’addestramento della rete.

Caricamento dei dati

Decomprimere e caricare le immagini campione come un datastore di immagini. imageDatastore etichetta automaticamente le immagini in base ai nomi delle cartelle e memorizza i dati come un oggetto ImageDatastore. Un datastore di immagini consente di memorizzare i dati di immagini di grandi dimensioni, compresi quelli che non entrano nella memoria. Dividere i dati in 70% per l’addestramento e 30% per la prova.

unzip('MerchData.zip');
imds = imageDatastore('MerchData','IncludeSubfolders',true,'LabelSource','foldernames');
[imdsTrain,imdsTest] = splitEachLabel(imds,0.7,'randomized');

Sono ora presenti 55 immagini di addestramento e 20 immagini di convalida in questo set di dati molto piccolo. Visualizzare alcune immagini di esempio.

numTrainImages = numel(imdsTrain.Labels);
idx = randperm(numTrainImages,16);
figure
for i = 1:16
    subplot(4,4,i)
    I = readimage(imdsTrain,idx(i));
    imshow(I)
end

Figure contains 16 axes objects. Hidden axes object 1 contains an object of type image. Hidden axes object 2 contains an object of type image. Hidden axes object 3 contains an object of type image. Hidden axes object 4 contains an object of type image. Hidden axes object 5 contains an object of type image. Hidden axes object 6 contains an object of type image. Hidden axes object 7 contains an object of type image. Hidden axes object 8 contains an object of type image. Hidden axes object 9 contains an object of type image. Hidden axes object 10 contains an object of type image. Hidden axes object 11 contains an object of type image. Hidden axes object 12 contains an object of type image. Hidden axes object 13 contains an object of type image. Hidden axes object 14 contains an object of type image. Hidden axes object 15 contains an object of type image. Hidden axes object 16 contains an object of type image.

Caricamento della rete preaddestrata

Caricare una rete ResNet-18 preaddestrata. Se il pacchetto di supporto Deep Learning Toolbox Model for ResNet-18 Network non è installato, il software fornisce un link per il download. ResNet-18 è addestrata su oltre un milione di immagini ed è in grado di classificare le immagini in 1000 categorie di oggetti, come tastiera, mouse, matita e molti animali. Di conseguenza, il modello ha appreso rappresentazioni ricche di feature per un'ampia gamma di immagini.

net = resnet18
net = 
  DAGNetwork with properties:

         Layers: [71×1 nnet.cnn.layer.Layer]
    Connections: [78×2 table]
     InputNames: {'data'}
    OutputNames: {'ClassificationLayer_predictions'}

Analizzare l'architettura di rete. Il primo livello, quello di input delle immagini, richiede immagini di input di dimensioni 224x224x3, dove 3 indica il numero di canali del colore.

inputSize = net.Layers(1).InputSize;
analyzeNetwork(net)

Estrazione delle feature dell’immagine

La rete richiede immagini di input di dimensioni 224x224x3, ma le immagini nel datastore di immagini hanno dimensioni diverse. Per ridimensionare automaticamente le immagini di addestramento e di prova prima di utilizzarle come input di rete, creare dei datastore di immagini aumentate, specificare la dimensione desiderata dell’immagine e utilizzare tali datastore come argomenti di input di activations.

augimdsTrain = augmentedImageDatastore(inputSize(1:2),imdsTrain);
augimdsTest = augmentedImageDatastore(inputSize(1:2),imdsTest);

La rete costruisce una rappresentazione gerarchica delle immagini di input. I livelli più profondi contengono feature di livello superiore, costruite utilizzando le feature di livello inferiore dei livelli precedenti. Per ottenere le rappresentazioni delle feature delle immagini di addestramento e di prova, utilizzare activations sul livello di pooling globale 'pool5', , alla fine della rete. Il livello di pooling globale raggruppa le feature di input su tutte le posizioni spaziali fornendo, in totale, 512 feature.

layer = 'pool5';
featuresTrain = activations(net,augimdsTrain,layer,'OutputAs','rows');
featuresTest = activations(net,augimdsTest,layer,'OutputAs','rows');

whos featuresTrain
  Name                Size              Bytes  Class     Attributes

  featuresTrain      55x512            112640  single              

Estrarre le etichette delle classi dai dati di addestramento e di prova.

YTrain = imdsTrain.Labels;
YTest = imdsTest.Labels;

Classificatore di immagini adatte

Utilizzare le feature estratte dalle immagini di addestramento come variabili predittive e adattare una macchina a vettori di supporto (SVM) multiclasse utilizzando fitcecoc (Statistics and Machine Learning Toolbox).

classifier = fitcecoc(featuresTrain,YTrain);

Classificazione delle immagini di prova

Classificare le immagini di prova utilizzando il modello SVM addestrato utilizzando le feature estratte dalle immagini di prova.

YPred = predict(classifier,featuresTest);

Visualizzare quattro immagini di prova di esempio con le etichette previste.

idx = [1 5 10 15];
figure
for i = 1:numel(idx)
    subplot(2,2,i)
    I = readimage(imdsTest,idx(i));
    label = YPred(idx(i));
    imshow(I)
    title(char(label))
end

Figure contains 4 axes objects. Hidden axes object 1 with title MathWorks Cap contains an object of type image. Hidden axes object 2 with title MathWorks Cube contains an object of type image. Hidden axes object 3 with title MathWorks Playing Cards contains an object of type image. Hidden axes object 4 with title MathWorks Screwdriver contains an object of type image.

Calcolare la precisione della classificazione sul set di prova. La precisione è la frazione di etichette che la rete predice correttamente.

accuracy = mean(YPred == YTest)
accuracy = 
1

Addestramento del classificatore su feature più superficiali

È inoltre possibile estrarre le feature da un livello precedente della rete e addestrare un classificatore su di esse. I livelli precedenti estraggono in genere un numero minore di feature, più superficiali, con una risoluzione spaziale più elevata e un numero maggiore di attivazioni totali. Estrarre le feature dal livello 'res3b_relu'. Questo è il livello finale che produce 128 feature, le cui attivazioni hanno una dimensione spaziale di 28x28.

layer = 'res3b_relu';
featuresTrain = activations(net,augimdsTrain,layer);
featuresTest = activations(net,augimdsTest,layer);
whos featuresTrain
  Name                Size                      Bytes  Class     Attributes

  featuresTrain      28x28x128x55            22077440  single              

Le feature estratte utilizzate nella prima parte di questo esempio sono state raggruppate su tutte le posizioni spaziali dal livello di pooling globale. Per ottenere lo stesso risultato quando si estraggono le feature nei livelli precedenti, è necessario effettuare una media manuale delle attivazioni su tutte le posizioni spaziali. Per ottenere le feature nella forma N-by-C, dove N è il numero di osservazioni e C è il numero di feature, rimuovere le dimensioni singole e trasporre.

featuresTrain = squeeze(mean(featuresTrain,[1 2]))';
featuresTest = squeeze(mean(featuresTest,[1 2]))';
whos featuresTrain
  Name                Size             Bytes  Class     Attributes

  featuresTrain      55x128            28160  single              

Addestrare un classificatore SVM sulle feature più superficiali. Calcolare la precisione del test.

classifier = fitcecoc(featuresTrain,YTrain);
YPred = predict(classifier,featuresTest);
accuracy = mean(YPred == YTest)
accuracy = 
0.9500

Entrambe le SVM addestrate presentano una precisione elevata. Se la precisione non è sufficientemente alta con l'estrazione di feature, si può provare con il transfer learning. Per un esempio, vedere Retrain Neural Network to Classify New Images. Per un elenco e un confronto delle reti preaddestrate, vedere Reti neurali profonde preaddestrate.

Vedi anche

(Statistics and Machine Learning Toolbox) |

Argomenti