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
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
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
fitcecoc
(Statistics and Machine Learning Toolbox) | imagePretrainedNetwork