[PYTHON] Kochobjekterkennung durch Yolo + Bildklassifizierung

Diese Daten

git Daten zur Überprüfung des Lernens

Einführung

Ich wollte Objekte in festgelegten Mahlzeiten erkennen und einzelne Gerichtenamen extrahieren, also versuchte ich, Objekte in Gerichten zu erkennen. Dieses Mal dachte ich, dass es schwierig sein würde, die detaillierten Geschirrtypen nur durch Objekterkennung zu trennen, daher denke ich, dass es möglich wäre, feines Geschirr mithilfe von Objekterkennung + Bildklassifizierung und zwei CNNs zu erkennen. Also habe ich beschlossen, "Kocherkennung" und "Kochbildklassifizierung" zu trennen. Dieses Mal werde ich die Objekterkennung mit einem eigenen Datensatz erläutern.

Das verwendete Netzwerk ist

Es gibt zwei.

Google Colaboratory Ich habe Google Colaboratory (im Folgenden: colab) als Hauptumgebung für das diesmalige Lernen verwendet. colab ist eine Python-Ausführungsumgebung, mit der Sie die GPU kostenlos verwenden können. Es ist sehr praktisch, wenn keine Umgebung vorhanden ist, da das Lernen einige Zeit in Anspruch nimmt, wenn es keine GPU-Umgebung gibt, in der Sie lokal lernen können. Da die für maschinelles Lernen erforderliche Umgebung ebenfalls vorhanden ist, dauert der Aufbau der Umgebung nicht lange. Wenn die Laufzeit jedoch nach einer kontinuierlichen Betriebszeit von 12 Stunden getrennt wird, werden auch die Dateien im Colaboratory zurückgesetzt. Weitere Informationen zu Colaboratory finden Sie unter Einführung in Python, ohne eine Umgebung zu erstellen! Leicht verständliche Erklärung zur Verwendung von Google Colaboratory usw.

Umgebung

Wie oben erwähnt, habe ich dieses Mal hauptsächlich Colaboratory verwendet. Da die Vorverarbeitung für das Lernen in Colab jedoch einige Zeit in Anspruch nimmt, wird nur die Vorverarbeitung von Daten in der lokalen Umgebung durchgeführt, und Colab wird zum Zeitpunkt des Lernens verwendet. Ich habe es durch Hochladen und Lernen gemacht. Die diesmal tatsächlich verwendete Ausführungsumgebung ist

Es ist geworden.

YOLO Zunächst lernen wir die Objekterkennung in YOLO und führen tatsächlich die Objekterkennung durch.

Datensatzerstellung

Um mit YOLO zu lernen, benötigen Sie einen Datensatz mit dem zu lernenden Bild und den Koordinatendaten dieses Bildes als Beschriftung. Dieses Mal müssen Sie sich selbst kennzeichnen, um Ihre eigenen Daten zu lernen. Sie können es manuell beschriften, aber es wird viel Zeit in Anspruch nehmen, daher dieses Mal das Tool zum Erstellen von Trainingsdatensätzen für YOLO labelImg. Ich benutzte.

Informationen zur Verwendung von labelImg finden Sie unter Yolo Learning Dataset Creation Tool: labelImg. Sie können effizient vorgehen.

Übrigens ist der Datensatz, der erstellt wurde, um zu lernen, wie man Kochobjekte dieses Mal erkennt

Da sind fünf. Wir haben ungefähr 700 Blatt pro Klasse beschriftet. Wenn Sie die Genauigkeit verbessern möchten, ist es besser, etwa 1000 Blatt pro Klasse zu beschriften und vorzubereiten.

Vorbereitung zum Lernen

Dieses Mal werden wir Yolo von Darknet zum Lernen verwenden, also werden wir eine Vorverarbeitung zum Lernen durchführen.

** 1. Installation von Darknet ** Wir werden das zum Lernen notwendige Darknet herunterladen. Die offizielle Website von darknet ist hier. Download gemäß der offiziellen Website

$ git clone https://github.com/pjreddie/darknet.git
$ cd darknet

Laden Sie as herunter und gehen Sie zum Darknet-Ordner.

** 2. Speichern Sie den erstellten Datensatz ** Ich denke, es gibt zwei Typen, das in labelImg verwendete Bild und die txt-Daten, die die erstellten Etikettendaten enthalten. Ich werde diese beiden zum Lernen nach Darknet verschieben. Die Hierarchie der Bild- und TXT-Daten ist

darknet

data

images

images001.jpg images002.jpg ....

labels

images001.txt images002.txt ....

Es wird sein. Selbst wenn mehrere Klassen mit labelImg erstellt werden, werden sie im selben Ordner für Bilder und Laels wie die anderen Klassen gespeichert.

** 3. In Zug teilen und testen ** Der zuvor in Daten gespeicherte Datensatz muss in Trainingsdaten und Testdaten unterteilt werden. Das manuelle Trennen von Trainingsdaten und Testdaten mit Darknet nimmt ebenfalls viel Zeit in Anspruch, daher process.py. Ich werde .py verwenden). Mit diesem Quellcode

percentage_test = 20;

Die Daten werden je nach Bild zufällig durch test20% und train80% geteilt, und diese Pfade werden mit den Dateinamen "test.txt" und "train.txt" ausgegeben. Fügen Sie diese "process.py" in darknet / data ein. danach,

$ python process.py

Erstellt "train.txt" und "test.txt". Wenn Sie das Verhältnis von Trainings- und Testdaten ändern möchten, ändern Sie "Prozent_Test = 20;" auf den gewünschten Wert.

** 4. Vorverarbeitung lernen ** Wir werden verschiedene Parameter in Darknet zum Lernen ändern.

** ・ Einstellung des Klassennamens ** Legen Sie den Namen der Klasse fest, die in Darknet gelernt werden soll. Schreiben Sie in die Dateien mit den Namen obj.names und names.list die zu lernenden Klassennamen zeilenweise. Die Struktur des Ordners ist

darknet

data

images

obj.names images001.jpg images002.jpg ....

labels names.list

Es wird sein. Im Falle der Schalenerkennung wird diesmal verwendet

obj.names/names.list


rice
miso soup
griled fish
salad
noodle

Ich werde schreiben.

** - Legen Sie die Anzahl der Klassen und den Datenpfad fest ** Als eine der Vorverarbeitungen von yolo ist es notwendig, die Anzahl der Klassen und den Datenpfad festzulegen. Wir werden den Inhalt von cfg / obj.data ändern. Der Inhalt von obj.data

obj.data


classes=5 #Anzahl der Klassen
train = data/images/train.txt 
valid = data/images/test.txt 
labels = data/images/obj.names 
backup = backup/

Geben Sie den Pfad der zuvor erstellten Datei ein.

Ändern Sie als Nächstes die Parameter für jede Version, die Sie verwenden möchten. Wenn Sie yolo v2 verwenden möchten, duplizieren Sie darknet / cfg / yolov2-voc.cfg, und wenn Sie v3 verwenden möchten, duplizieren Sie darknet / cfg / yolov3-voc.cfg in cfg. Öffnen Sie diese goro-obj.data

3rd Line Batch=64
4. Zeile Unterteilung=8
   classes=5(Anzahl der Klassen)
      filters=35(Für yolov2(classes + coords + 1) * 5)
                (Für yolov3(classes + +5) * 3)

Bitte wechseln Sie zu.

** ・ Über die Erkennung von Begrenzungsrahmen ** Dieses Mal wollte ich jedes Gericht mit Yolo erkennen und dann ein anderes Netzwerk verwenden, um die Gerichte im Detail zu erkennen. Daher muss ich den Begrenzungsrahmen der Ausgabe erkennen, um jedes Gericht zu erkennen. Bitte ersetzen Sie darknet / src / image.c durch hier, um den Begrenzungsrahmen zu erkennen. Koordinatendaten werden in .txt ausgegeben.

** ・ Anfangsgewicht ** Beim ersten Lernen können die Lernergebnisse leicht konvergieren, indem geeignete Gewichte heruntergeladen werden. Für das anfängliche Gewicht des Lernens yolov2 Anfangsgewichtsdatei https://pjreddie.com/media/files/darknet19_448.conv.23 yolov3 Anfangsgewichtsdatei https://pjreddie.com/media/files/darknet53.conv.74 Bitte laden Sie es von hier herunter und legen Sie es im Darknet-Ordner ab.

Gehen Sie zum Lernen und Erkennen in ein Labor

Zu diesem Zeitpunkt ist die Vorverarbeitung endgültig abgeschlossen, und wir werden endlich mit dem Lernen im Labor beginnen.

** 1. Ordner hochladen ** Zunächst werde ich den Darknet-Ordner hochladen, der dieses Mal vorverarbeitet und beschriftet und festgelegt wurde. Es gibt ein 12-Stunden-Limit für das Labor, und alle Dateien im Labor werden zurückgesetzt. Anstatt also direkt auf colab hochzuladen, laden Sie es auf Google Drive hoch und mounten Sie es auf dem Laufwerk auf colab, um die Mühe zu vermeiden, jedes Mal hochzuladen (ich denke, das Hochladen dauert eine beträchtliche Zeit. .). Melden Sie sich daher in Ihrem Google-Konto an und laden Sie jeden Darknet-Ordner ** auf das von Ihnen verwendete Laufwerk hoch. Es ist möglich, colab zu komprimieren und dann hochzuladen und zu dekomprimieren. Da der Dekomprimierungscode jedoch nicht in dem diesmal verwendeten Code für colab enthalten ist, können Sie ihn ohne Komprimierung hochladen, wenn Sie die Quelle unverändert verwenden Vielen Dank.

** 2. Auf Colab lernen und erkennen ** Laden Sie zum Lernen und Erkennen den ** Quellcode von hier als .ipynd herunter, laden Sie ihn auf das Laufwerk hoch, starten Sie ihn und führen Sie ihn von oben aus ** aus. Sie sollten in der Lage sein, Objekte mit zu lernen und zu erkennen. Legen Sie das zu erkennende Bild in den Darknet-Ordner und ändern Sie den Dateipfad und den Namen im Teil "Objekterkennung durchführen" des Quellcodes. (Möglicherweise ist dies aufgrund der auf colab heruntergeladenen Version von cuda usw. nicht möglich. In diesem Fall wechseln Sie bitte zur neuesten Version und führen Sie pip usw. durch.) Da es auf dem Laufwerk bereitgestellt ist, ändert sich der Dateipfad je nach Laufwerkslayout usw. ** Bitte achten Sie auf den Dateipfad! ** ** **

Außerdem werden die während des Lernens ausgegebenen Lerngewichte automatisch in Darknet / Backup gespeichert. Wenn Sie die einmal erlernten Gewichte lernen möchten, ändern Sie den Gewichtspfad des Teils "Lernen mit Yolo" in Ihre eigenen ** Buckup / Yolo-XXX.Gewichte **.

Schneiden Sie das erkannte Bild

Wenn Sie mit dem ipynd-Quellcode fortfahren, wird das zugeschnittene Bild gespeichert. Bei der Ausführung wird die Position der Koordinaten aus dem für die Objekterkennung verwendeten Bild unter Verwendung der zum Zeitpunkt der Objekterkennung ausgegebenen Begrenzungsrahmenkoordinaten abgeschnitten und das Bild im Bildordner gespeichert.

Individuelles Kochen lernen

Dieses Mal führten wir eine Bildklassifizierung durch, indem wir mit VGG-16 lernten, das mit einem Datensatz namens UEC-FOOD100 übertragen wurde. Grundsätzlich können Sie es verwenden, indem Sie es gemäß dem Quellcode von oben ausführen. Diesmal haben wir jedoch Transferlernen zur Überprüfung des Kochens durchgeführt. Bitte haben Sie Verständnis dafür, dass diejenigen, die von 0 lernen, einen Datensatz dafür erstellen müssen. Wenn Sie die diesmal erstellten Gewichte überprüfen möchten, achten Sie bitte auf den Dateipfad.

Tatsächliches Erkennungsergebnis

Es wird die Erkennung des Objektbereichs unserer Küche sein. Erstens ist Verlust (Verlustfunktion). キャプチャ.JPG Es sieht aus wie das. Die Anzahl der Lernvorgänge betrug 4073 und der Verlustwert betrug "0,09". Es wurde gesagt, dass es auf ungefähr 0,06 fallen würde, also denke ich, dass es in Ordnung gewesen wäre, ein bisschen mehr zu lernen.

Als nächstes ist hier die tatsächliche Eingabe des Bildes, um das Objekt zu erkennen.

図1.jpg

Ist es nicht schlimm Dies ist ein Beispiel für so etwas. Ich denke, es ist ein gutes Beispiel dafür, dass Reis, Misoso-Up, gegrillter Fisch und das diesmal gelernte Etikett fest erkannt werden konnten. Das Folgende ist das Ergebnis einer detaillierteren Erkennung dieser mithilfe des Vgg-Net-Transfer-Lernens.

図2.png

図3.png

図4.png

Es sieht aus wie das. Da es als weißer Reis aus der als Reis ausgedrückten Objektbereichserkennung wieder erkannt wurde, scheint es, dass die Feinklassifizierung aus der rauen Bereichserkennung des Zwecks dieses Mal erfolgreich war. Der letzte gegrillte Fisch hat jedoch ein völlig anderes Erkennungsergebnis wie Omuraisu.

Wenn Sie nur anhand der trainierten Gewichte überprüfen möchten

Wenn Sie das Gewicht des obigen Ergebnisses der Kochobjekterkennung verwenden möchten, um nur die Erkennung durchzuführen https://drive.google.com/open?id=1F8hbp5OGM5syGDQLpFPxbP1n9yFz804K Entpacken Sie diese Daten, laden Sie sie auf das Laufwerk hoch und führen Sie die Objekterkennung .ipynd von oben aus. Ich denke, wir können die Objekte der Gerichte erkennen, die wir gelernt haben. Beachten Sie auch, dass Sie den ** Dateipfad selbst ändern müssen! ** ** **

Verweise

Katzen, Raum, Musik und Zählen von Objekten mit Darknet (YOLO) in Google Colab [Bilderkennung] https://wakuphas.hatenablog.com/entry/2018/09/19/025941#Google-Colaboratory%E3%81%A8%E3%81%AF offizielle Darknet-Website https://pjreddie.com/darknet/yolo/ YOLO V3: Originaldaten lernen http://demura.net/misc/14458.html

Recommended Posts

Kochobjekterkennung durch Yolo + Bildklassifizierung
Gesichtserkennung mit YOLO Face (Windows10, Python3.6)
Bildklassifizierung mit Weitwinkel-Fundusbilddatensatz
Bildklassifizierung mit Keras-Von der Vorverarbeitung zum Klassifizierungstest-
Versuchen Sie die Objekterkennung mit Raspberry Pi 4 + Coral
Ich habe versucht, Objekte mit YOLO v3 (TensorFlow 2.0) auf einer Windows-CPU zu erkennen!
Ich habe versucht, Objekte mit YOLO v3 (TensorFlow 2.1) auf der GPU von Windows zu erkennen!
MNIST-Bildklassifizierung (handschriftliche Nummer) mit mehrschichtigem Perzeptron
Fordern Sie die Bildklassifizierung mit TensorFlow2 + Keras 3 heraus ~ Visualisieren Sie MNIST-Daten ~
[Zusammenfassung] Objekterkennungsmodell "End-to-End-Objekterkennung mit Transformatoren" mit Transformer
Bildverarbeitung mit MyHDL
Bildverarbeitung mit PIL
2020/02 Python 3.7 + TensorFlow 2.1 + Keras 2.3.1 + YOLOv3 Objekterkennung mit der neuesten Version
Bildklassifizierung mit selbst erstelltem neuronalen Netzwerk von Keras und PyTorch
"Müll nach Bild klassifizieren!" App-Erstellungstagebuch Tag2 ~ Feinabstimmung mit VGG16 ~
[Deep Learning] Bildklassifizierung mit Faltungsnetz [DW Tag 4]