Main Content

Klassifizieren von Bildern mit GoogLeNet

Dieses Beispiel veranschaulicht, wie ein Bild mithilfe von GoogLeNet, einem vortrainierten tiefen faltenden neuronalen Netz (Deep Convolutional Neural Network), klassifiziert wird.

GoogLeNet wurde mit über einer Million Bildern trainiert und kann Bilder in 1000 Objektkategorien klassifizieren (z. B. Tastatur, Kaffeebecher, Bleistift und viele Tierarten). Das Netz hat eine Vielzahl von Merkmalen für eine große Bandbreite von Bildern erlernt. Es verwendet ein Bild als Eingang und gibt dann eine Bezeichnung für das Objekt im Bild zusammen mit den Wahrscheinlichkeiten für die einzelnen Objektkategorien aus.

Laden des vortrainierten Netzes

Laden Sie das vortrainierte GoogLeNet-Netz und die entsprechenden Klassennamen mit der imagePretrainedNetwork-Funktion. Für diesen Schritt ist das Supportpaket „Deep Learning Toolbox™ Model for GoogLeNet Network“ erforderlich. Wenn die erforderlichen Supportpakete nicht installiert sind, stellt die Software einen Download-Link zur Verfügung.

Sie können wahlweise auch ein anderes vortrainiertes Netz für die Bildklassifizierung laden. Wenn Sie ein anderes vortrainiertes Netz ausprobieren möchten, öffnen Sie dieses Beispiel in MATLAB® und wählen Sie ein anderes Netz aus. Sie können zum Beispiel SqueezeNet ausprobieren, ein Netz, das noch schneller ist als GoogLeNet. Sie können dieses Beispiel mit anderen vortrainierten Netzen durchführen. Eine Liste aller verfügbaren Netze finden Sie unter Pretrained Deep Neural Networks.

[net,classNames] = imagePretrainedNetwork("googlenet");

Die Größe des zu klassifizierenden Bilds muss mit der Eingangsgröße des Netzes übereinstimmen. Bei GoogLeNet ist das erste Element der Layers-Eigenschaft des Netzes die Bildeingabeschicht. Die Eingabegröße des Netzes ist die InputSize-Eigenschaft der Bildeingabeschicht.

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

   224   224     3

Sehen Sie sich 10 der Klassennamen nach dem Zufallsprinzip an.

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

Lesen von Bildern

Lesen und zeigen Sie das Bild an, das Sie klassifizieren möchten.

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

Ändern der Bildgröße und Klassifizieren von Bildern

Lassen Sie sich die Größe des Bildes anzeigen. Das Bild ist 384 x 512 Pixel groß und hat drei Farbkanäle (RGB).

size(I)
ans = 1×3

   384   512     3

Ändern Sie die Größe des Bildes auf die Eingabegröße des Netzes, indem Sie imresize verwenden. Durch diese Größenänderung wird das Seitenverhältnis des Bilds minimal verändert.

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

Je nach Anwendung müssen Sie die Größe des Bildes möglicherweise anders anpassen. Sie können zum Beispiel die linke obere Ecke des Bildes beschneiden, indem Sie I(1:inputSize(1),1:inputSize(2),:) verwenden. Wenn Sie über die Image Processing Toolbox™ verfügen, können Sie die imcrop-Funktion verwenden.

Verwenden Sie das neuronale Netz, um eine Vorhersage zu treffen. Um eine Vorhersage mit einem einzelnen Bild zu treffen, verwenden Sie die Funktion predict. Der Datentyp des Bilds ist uint8. Um Vorhersagen mit dem neuronalen Netz zu treffen, konvertieren Sie das Bild in den Datentyp single. Um eine GPU zu verwenden, konvertieren Sie die Daten in gpuArray. Die Verwendung einer GPU erfordert eine Parallel Computing Toolbox™-Lizenz und ein unterstütztes GPU-Gerät. Informationen zu unterstützten Geräten finden Sie unter GPU Computing Requirements (Parallel Computing Toolbox). Andernfalls verwendet die Funktion die CPU.

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

Die predict-Funktion gibt die Wahrscheinlichkeiten für jede Klasse zurück. Um die Klassifizierungsergebnisse in eine kategoriale Bezeichnung umzuwandeln, verwenden Sie die scores2label-Funktion.

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

Lassen Sie sich das Originalbild mit der vorhergesagten Bezeichnung und der vorhergesagten Wahrscheinlichkeit, dass das Bild diese Bezeichnung hat, anzeigen.

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

Anzeigen von Top-Vorhersagen

Lassen Sie sich die obersten fünf vorhergesagten Bezeichnungen und die zugehörigen Wahrscheinlichkeiten als Histogramm anzeigen. Da das Netz Bilder in sehr viele Objektkategorien einstuft und viele Kategorien ähnlich sind, wird bei der Bewertung von Netzen in der Regel die Top-Five-Genauigkeit berücksichtigt. Das Netz stuft das Bild mit hoher Wahrscheinlichkeit als Paprika ein.

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

Referenzen

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

Siehe auch

| | | | | |

Verwandte Themen