Klassifizieren von Webcam-Bildern mithilfe von Deep Learning
Dieses Beispiel zeigt, wie Sie Bilder einer Webcam mithilfe des vortrainierten Convolutional Neural Networks GoogLeNet in Echtzeit klassifizieren können.
Verwenden Sie MATLAB®, eine einfache Webcam und ein tiefes neuronales Netz, um Objekte in Ihrer Umgebung zu identifizieren. Dieses Beispiel verwendet GoogLeNet, ein vortrainiertes tiefes Convolutional Neural Network (CNN oder ConvNet), das mit über einer Million Bildern trainiert wurde und Bilder in 1000 Objektkategorien (wie Tastatur, Kaffeetasse, Stift und viele Tierarten) klassifizieren kann. Sie können GoogLeNet herunterladen und MATLAB verwenden, um die Kamerabilder kontinuierlich in Echtzeit zu verarbeiten.
GoogLeNet hat eine Vielzahl von Merkmalen für eine große Bandbreite von Bildern erlernt. Es verwendet das Bild als Eingang und gibt eine Kennzeichnung für das Objekt im Bild und die Wahrscheinlichkeit für jede Objektkategorie aus. Experimentieren Sie mit Objekten in Ihrer Umgebung, um festzustellen, wie genau GoogLeNet Bilder klassifizieren kann. Um mehr über die Objektklassifizierung des Netzes zu erfahren, können Sie statt der endgültigen Entscheidung für eine Klasse die Scores für die wahrscheinlichsten fünf Klassen in Echtzeit anzeigen lassen.
Laden der Kamera und das vortrainierten Netzes
Stellen Sie eine Verbindung zur Kamera her und laden Sie ein vortrainiertes GoogLeNet-Netz. In diesem Schritt können Sie ein beliebiges vortrainiertes Netz verwenden. Für dieses Beispiel ist das MATLAB Support Package for USB Webcams und die Deep Learning Toolbox™ Model for GoogLeNet Network erforderlich. Wenn die erforderlichen Supportpakete nicht installiert sind, stellt die Software einen Download-Link zur Verfügung.
camera = webcam; net = googlenet;
Wenn Sie dieses Beispiel erneut ausführen möchten, führen Sie zunächst den Befehl clear camera aus, wobei camera die Verbindung zur Webcam ist. Andernfalls wird Ihnen ein Fehler angezeigt, da Sie keine zweite Verbindung zur selben Webcam aufbauen können.
Klassifizieren der Kameraufnahme
Um ein Bild zu klassifizieren, müssen Sie dessen Größe auf die Eingangsgröße des Netzes ändern. Rufen Sie die ersten zwei Elemente der InputSize-Eigenschaft der Bild-Eingangsschicht des Netzes ab. Die Bild-Eingangsschicht ist die erste Schicht des Netzes.
inputSize = net.Layers(1).InputSize(1:2)
inputSize = 224 224
Zeigen Sie das Kamerabild mit der vorhergesagten Kennzeichnung und Wahrscheinlichkeit an. Sie müssen die Bildgröße auf die Eingangsgröße des Netzes ändern, bevor Sie classify aufrufen.
figure
im = snapshot(camera);
image(im)
im = imresize(im,inputSize);
[label,score] = classify(net,im);
title({char(label),num2str(max(score),2)});

Kontinuierliches Klassifizieren von Bildern der Kamera
Um Bilder der Kamera kontinuierlich zu klassifizieren, nehmen Sie die vorherigen Schritte in eine Schleife auf. Führen Sie die Schleife aus, während die Abbildung geöffnet ist. Um die Live-Vorhersage zu stoppen, schließen Sie einfach die Abbildung. Verwenden Sie nach jeder Iteration drawnow, um die Abbildung zu aktualisieren.
h = figure; while ishandle(h) im = snapshot(camera); image(im) im = imresize(im,inputSize); [label,score] = classify(net,im); title({char(label), num2str(max(score),2)}); drawnow end
Anzeigen von Top-Vorhersagen
Die vorhergesagten Klassen können sich schnell ändern. Daher kann es nützlich sein, die wahrscheinlichsten Vorhersagen zusammen anzuzeigen. Sie können die fünf wahrscheinlichsten Vorhersagen und deren Wahrscheinlichkeit anzeigen, indem Sie die Klassen mit den höchsten Vorhersage-Scores darstellen.
Klassifizieren Sie eine Aufnahme der Kamera. Zeigen Sie das Kamerabild mit der vorhergesagten Kennzeichnung und Wahrscheinlichkeit an. Über den Ausgang score der classify-Funktion können Sie ein Histogramm der Wahrscheinlichkeiten der fünf wahrscheinlichsten Vorhersagen anzeigen.
Erstellen Sie das Abbildungsfenster. Ändern Sie die Größe des Fensters, sodass es doppelt so breit ist und erstellen Sie zwei Unterdiagramme.
h = figure; h.Position(3) = 2*h.Position(3); ax1 = subplot(1,2,1); ax2 = subplot(1,2,2);
Zeigen Sie im linken Unterdiagramm das Bild und die Klassifizierung zusammen an.
im = snapshot(camera);
image(ax1,im)
im = imresize(im,inputSize);
[label,score] = classify(net,im);
title(ax1,{char(label),num2str(max(score),2)});
Wählen Sie die fünf wahrscheinlichsten Vorhersagen aus, indem Sie die Klassen mit den höchsten Scores auswählen.
[~,idx] = sort(score,'descend');
idx = idx(5:-1:1);
classes = net.Layers(end).Classes;
classNamesTop = string(classes(idx));
scoreTop = score(idx);
Zeigen Sie die fünf wahrscheinlichsten Vorhersagen als Histogramm an.
barh(ax2,scoreTop) xlim(ax2,[0 1]) title(ax2,'Top 5') xlabel(ax2,'Probability') yticklabels(ax2,classNamesTop) ax2.YAxisLocation = 'right';

Kontinuierliches Klassifizieren von Bildern und Anzeigen der wahrscheinlichsten Vorhersagen
Um Bilder der Kamera kontinuierlich zu klassifizieren und die wahrscheinlichsten Vorhersagen anzuzeigen, nehmen Sie die vorherigen Schritte in eine Schleife auf. Führen Sie die Schleife aus, während die Abbildung geöffnet ist. Um die Live-Vorhersage zu stoppen, schließen Sie einfach die Abbildung. Verwenden Sie nach jeder Iteration drawnow, um die Abbildung zu aktualisieren.
Erstellen Sie das Abbildungsfenster. Ändern Sie die Größe des Fensters, sodass es doppelt so breit ist und erstellen Sie zwei Unterdiagramme. Um eine Größenänderung der Achsen zu verhindern, setzen Sie die Eigenschaft PositionConstraint auf 'innerposition'.
h = figure;
h.Position(3) = 2*h.Position(3);
ax1 = subplot(1,2,1);
ax2 = subplot(1,2,2);
ax2.PositionConstraint = 'innerposition';
Klassifizieren Sie Bilder kontinuierlich und zeigen Sie sie zusammen mit einem Histogramm der fünf wahrscheinlichsten Vorhersagen an.
while ishandle(h) % Display and classify the image im = snapshot(camera); image(ax1,im) im = imresize(im,inputSize); [label,score] = classify(net,im); title(ax1,{char(label),num2str(max(score),2)}); % Select the top five predictions [~,idx] = sort(score,'descend'); idx = idx(5:-1:1); scoreTop = score(idx); classNamesTop = string(classes(idx)); % Plot the histogram barh(ax2,scoreTop) title(ax2,'Top 5') xlabel(ax2,'Probability') xlim(ax2,[0 1]) yticklabels(ax2,classNamesTop) ax2.YAxisLocation = 'right'; drawnow end
Siehe auch
imagePretrainedNetwork | dlnetwork | trainingOptions | trainnet