[PYTHON] Erstellen Sie einen Kaskadenklassifizierer mit Google Colaboratory

Ich habe angefangen, OpenCV-Bilderkennung zu studieren und wollte meinen eigenen Kaskadenklassifikator erstellen, aber ich kann es mir nicht leisten, meinen eigenen PC zu verwenden. Als ich darüber nachdachte, erfuhr ich von der GPU-Bereitstellung von Google Colaboratory und beschloss, die Berechnung zu übernehmen.

0. Dieses Ziel

Erstellen Sie mithilfe von Google Colaboratory einen Kaskadenklassifizierer, der die Geigenfamilie anhand der folgenden Fotos erkennt. Idealerweise sollten Sie in der Lage sein, zwischen Violine, Bratsche, Cello und Kontrabass zu unterscheiden, aber es ist schwer zu fordern, dass selbst Leute (die nicht viel über klassische Musik wissen) schwierige Dinge tun, sodass die Hürden gering sind. tun.

instruments.jpg

1. Vorbereitung

1-1. Vorbereiten der Google Colab-Umgebung 1-2. Vorbereitung der Bilddaten 1-3. Laden Sie mergevec.py herunter

1-1. Vorbereiten der Google Colab-Umgebung

goole colab erstellt ein neues Notizbuch in einem beliebigen Ordner auf Google Drive. Dieses Mal werde ich in / drive / Colab Notebooks / opencv / tools / arbeiten.

Die Struktur des Instrumentenordners ist wie folgt.

instruments


<DIR>  pos          #Speichern Sie das richtige Bild
<DIR>  vec          #Erstellen Sie eine VEC-Datei aus dem richtigen Bild und speichern Sie sie
<DIR>  neg          #Speichern Sie ein falsches Bild
<DIR>  neglist      #Erstellen und speichern Sie eine Liste aus falschen Bildern
<DIR>  cascade      #Trainingsergebnisse ausgeben
       mergevec.py  #Wird zum Kombinieren von VEC-Dateien verwendet
       train_flow   #Erstellen Sie ein neues Colab-Notizbuch

1-2. Vorbereitung der Bilddaten

** Richtiges Bild **

Heben Sie es selbst oder aus dem Netz auf. Dieses Mal habe ich 6 verarbeitete JPG-Dateien mit 200 x 300 Pixel vorbereitet und in pos gespeichert.

Va003.jpg

** Falsches Bild **

Vorerst viele Farbbilder. Dieses Mal habe ich "2017 Val images" von [50 kostenlosen Datensätzen für maschinelles Lernen: Bilddatensätze] heruntergeladen (https://blog.cambridgespark.com/50-free-machine-learning-datasets-image-datasets-241852b03b49). Insgesamt werden ca. 8000 Blatt vorbereitet.

Dies wird in neg gespeichert, das Hochladen dauert jedoch einige Zeit und es wird mehr als 1 GB Laufwerkskapazität verwendet. Daher wird empfohlen, die Menge je nach Situation zu reduzieren.

1-3. Laden Sie mergevec.py herunter

Download von github maergevec Seite.

2. Erstellen Sie ein Notizbuch

Erstellen Sie eine neue Colab-Notiz mit dem Namen train_flow und erstellen Sie den Inhalt. Ich möchte eine GPU verwenden, also stellen Sie das Notebook auf der Registerkarte Bearbeiten ein. Die Berechnungsgeschwindigkeit kann je nach Art der zugewiesenen GPU unterschiedlich sein, wird hier jedoch weggelassen.

2-1. Umweltveränderungen 2-2. Erstellen einer korrekten Antwortdatei 2-3. Falsche Dateierstellung

2-1. Umweltveränderungen

Es gibt drei Dinge, die Sie tun müssen. ・ Down-Version von openCV ・ Laufwerkshalterung -Ändern Sie das aktuelle Verzeichnis

** Down-Version von openCV **

Da openCV4, das standardmäßig in colab installiert ist, keine später beschriebenen Beispiele zum Erstellen von Beispielen und Zugkaskaden verwenden kann, muss ein Downgrade auf openCV3 durchgeführt werden.

Zelle 1


#Deinstallieren Sie openCV
#Zweimal'y'Eingeben
!pip3 uninstall opencv-python opencv-contrib-python

Zelle 2


#installiere openCV
!pip3 install opencv-python==3.4.4.19 opencv-contrib-python==3.4.4.19
#Sitzung neu starten
exit()

** Laufwerkshalterung **

Gehen Sie wie folgt vor, um Daten zwischen der Colab-Note und dem Laufwerk ein- und auszutauschen

Zelle 3


from google.colab import drive
drive.mount('/content/drive')

** Aktuelles Verzeichnis ändern **

Stellen Sie entsprechend Ihrer Verzeichnisstruktur ein. Hier wird Instrumente auf das aktuelle Verzeichnis gesetzt.

Zelle 4


import os
os.chdir('/content/drive/My Drive/Colab Notebooks/opencv/instruments')

3. Vorbereitung der Trainingsdatei

Erstellen Sie Trainingsdateien aus den richtigen und falschen Bildern.

3-1. Erstellen einer korrekten Antwortdatendatei 3-2. Erstellen einer falschen Datendatei

3-1. Erstellen einer korrekten Antwortdatendatei

Erstellen Sie korrekte Antwortdaten in Massenproduktion mit openCV-Erstellungsbeispielen und speichern Sie sie als separate Datei. Es gibt zwei Methoden.

** Wie man das Bild direkt spezifiziert ** Erstellen Sie mit dem folgenden Befehl 1000 korrekte Antwortdaten aus 1 Bild. Die Breite und Höhe werden an das Seitenverhältnis des richtigen Bildes angepasst, aber ich bin mir nicht sicher, ob es effektiv ist.

Zelle 5-1


#Erstellen Sie 1000 korrekte Antwortdaten aus Bildern und geben Sie sie als VEC-Datei aus
!opencv_createsamples -img pos/Va001.jpg -vec vec/Va001.vec -num 1000 -w 40 -h 60

Out


Info file name: (NULL)
Img file name: drive/My Drive/Colab Notebooks/opencv/instruments/pos/Va006.jpg
Vec file name: drive/My Drive/Colab Notebooks/opencv/instruments/vec/Va006.vec
BG  file name: (NULL)
Num: 1000
BG color: 0
BG threshold: 80
Invert: FALSE
Max intensity deviation: 40
Max x angle: 1.1
Max y angle: 1.1
Max z angle: 0.5
Show samples: FALSE
Width: 40
Height: 60
Max Scale: -1
Create training samples from single image applying distortions...
Done

** So legen Sie eine Liste von Bildern fest **

Es hat nicht funktioniert, weil meine Methode falsch war, aber ich werde es aufschreiben. Geben Sie wie unten gezeigt den Speicherort der richtigen Antwortdatei an, geben Sie die Anzahl der richtigen Antwortobjekte an und fügen Sie die Liste der richtigen Antwortobjektkoordinaten (Startpunkt der x-Achse, Startpunkt der y-Achse, Endpunkt der x-Achse, Endpunkt der y-Achse) in den Ordner pos ein. Halten Sie es bereit.

poslist.txt


#Im pos-Ordner erstellen
#Dateiname Nummernkoordinate
pos/Va001.jpg 1 0 0 200 300
pos/Va002.jpg 1 0 0 200 300
pos/Va003.jpg 1 0 0 200 300
pos/Va004.jpg 1 0 0 200 300
pos/Va005.jpg 1 0 0 200 300
pos/Va006.jpg 1 0 0 200 300

Zelle 5-2


!opencv_createsamples -info pos/poslist.txt -vec vec/pos.vec -num 6000 -w 40 -h 60

Ich hatte erwartet, dass dies insgesamt 6000 korrekte Antwortdaten aus den in txt geschriebenen Bildern erzeugen würde, aber es funktionierte nicht in Colaboratory.

Obwohl es nicht unmöglich ist, mit einer Methode wie Zelle 5-1 zu lernen, scheint es schwierig zu sein, das Originalbild mit einem Blatt auf eine ausreichende Erkennungsgenauigkeit zu bringen. Also habe ich untersucht, wie ich damit umgehen soll, und es scheint, dass es Code gibt, der mehrere VEC-Dateien kombiniert.

** Kombiniere mehrere VEC-Dateien zusammen **

Führen Sie nach dem Erstellen jeder VEC-Datei aus den Bildern im Ordner pos wie in Zelle 5-1 mergevec.py unter Instrumente aus.

Zelle 6


!opencv_createsamples -img pos/Va002.jpg -vec vec/Va002.vec -num 1000 -w 40 -h 60
!opencv_createsamples -img pos/Va003.jpg -vec vec/Va003.vec -num 1000 -w 40 -h 60
!opencv_createsamples -img pos/Va004.jpg -vec vec/Va004.vec -num 1000 -w 40 -h 60
!opencv_createsamples -img pos/Va005.jpg -vec vec/Va005.vec -num 1000 -w 40 -h 60
!opencv_createsamples -img pos/Va006.jpg -vec vec/Va006.vec -num 1000 -w 40 -h 60

Zelle 7


#Kombinieren Sie die Daten im vec-Ordner und pos.Als vec speichern
!python mergevec.py -v vec -o vec/pos.vec

Sie haben jetzt eine 1000x6-korrekte Bilddatei erstellt.

3-2. Erstellen einer falschen Datendatei

neg Sie müssen nglist.txt mit dem Speicherort der Bilddatei erstellen.

Zelle 8


#nglisten Sie den Inhalt des Ordners neg.Export nach txt
!ls neg | xargs -I {} echo neg/{} > neglist/nglist.txt

neglist


neg/000000000139.jpg
neg/000000000285.jpg
neg/000000000632.jpg

...

Damit sind alle Vorbereitungen abgeschlossen.

4. Erstellen eines Klassifikators

Führen Sie den folgenden Code aus.

Zelle 9


!opencv_traincascade -data cascade -vec vec/pos.vec -bg neglist/nglist.txt -numPos 5500 -numNeg 3000 -numStages 20 -featureType LBP -w 40 -h 60

numPos: Anzahl der Bilder, die für die richtige Antwort verwendet wurden. Wenn alle Bilder aufgebraucht sind, kann das Lernen unterbrochen werden. Stellen Sie daher einen kleinen Betrag ein. numNeg: Es scheint gut, wenn die richtigen und falschen Antworten etwa 2: 1 sind. featureType: HAAR, LBP usw. können ausgewählt werden. HAAR ist überwiegend zeitaufwändig. w, h: Auf den gleichen Wert setzen wie bei der Erstellung der richtigen Antwortdatei.

5. Ausführungsverlauf

Die colab GPU läuft bis zu 12 Stunden ununterbrochen. Ich habe versucht, es über Nacht zu berechnen, aber die Berechnung wurde erst bis zur Stufe 14/20 abgeschlossen, und es war eine exponentielle Zunahme, die die Berechnungszeit für jede Stufe verdoppelte, sodass ich entschied, dass die Parameter angepasst werden mussten.

Out



PARAMETERS:
cascadeDirName: cascade/trained_data/
vecFileName: vec/pos.vec
bgFileName: neglist/nglist.txt
numPos: 5500
numNeg: 3000
numStages: 20
precalcValBufSize[Mb] : 1024
precalcIdxBufSize[Mb] : 1024
acceptanceRatioBreakValue : -1
stageType: BOOST
featureType: LBP
sampleWidth: 40
sampleHeight: 60
boostType: GAB
minHitRate: 0.995
maxFalseAlarmRate: 0.5
weightTrimRate: 0.95
maxDepth: 1
maxWeakCount: 100
Number of unique features given windowSize [40,60] : 153400

===== TRAINING 0-stage =====
<BEGIN
POS count : consumed   5500 : 5500
NEG count : acceptanceRatio    3000 : 1
tcmalloc: large alloc 1073758208 bytes == 0x5650ef23e000 @  0x7f54c034f1e7 0x7f54bf549382 0x7f54bf64821b 0x5650e5fc5608 0x5650e5fc5d42 0x5650e5fc5e1a 0x5650e5fcf1a9 0x5650e5fbbfff 0x7f54be80cb97 0x5650e5fbcc1a
Precalculation time: 20
+----+---------+---------+
|  N |    HR   |    FA   |
+----+---------+---------+
|   1|        1|        1|
+----+---------+---------+
|   2| 0.997818| 0.225333|
+----+---------+---------+
END>
Training until now has taken 0 days 0 hours 5 minutes 21 seconds.

...

===== TRAINING 14-stage =====
<BEGIN
POS count : consumed   5500 : 5725
NEG count : acceptanceRatio    3000 : 2.41651e-06
Precalculation time: 17
+----+---------+---------+
|  N |    HR   |    FA   |
+----+---------+---------+
|   1|        1|        1|
+----+---------+---------+
|   2|        1|        1|
+----+---------+---------+
|   3| 0.998364| 0.712667|
+----+---------+---------+
|   4| 0.997455|    0.632|
+----+---------+---------+
|   5| 0.996545|    0.449|
+----+---------+---------+
END>
Training until now has taken 0 days 6 hours 59 minutes 8 seconds.

Wenn numStage auf 15 eingestellt war, wurde das Lernen abgeschlossen, da die Genauigkeit ausreichend verbessert wurde, ohne Stufe 15 zu erreichen, und die erforderliche Zeit etwas mehr als eine Stunde betrug. Seltsam.

6. Bewertung

Es scheint, dass colab mit openCV keine Bilder anzeigen kann. Arbeiten Sie also lokal. Von den mehreren Dateien, die in cascade ausgegeben werden, können Sie cascade.xml herunterladen.

Zelle 10


import cv2
img = cv2.imread('instruments.jpg')
cascade = cv2.CascadeClassifier('cascade.xml')
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

#Ziehen Sie in Betracht, minSize zu ändern, wenn die Erkennungsgenauigkeit schlecht ist
Va = cascade.detectMultiScale(gray, scaleFactor=1.1, minNeighbors=3, minSize=(140,210))

#Markieren Sie das Ziel mit einem roten Rahmen
for(x,y,w,h) in Va:
  cv2.rectangle(img, (x,y), (x+w, y+h), (0,0,200),3)

#result.Ausgabe jpg
cv2.imwrite("result.jpg ", img)
#Bild in einem separaten Fenster anzeigen
cv2.imshow('image', img)
cv2.waitKey(0)

Das Ausgabeergebnis ist wie folgt. Es ist schade, dass das Cello an zwei Stellen beurteilt wurde und dass nur der Kontrabus aus der Gruppe war.

6000-3000-140-210.jpg

Als ich mit 2000 falschen Bildern trainierte, wurde es wie folgt. Becken-Euphonium? Ich fand es interessant, dass die Kurven zwischen den Räumen und dem Bratschencello wie Musikinstrumente aussahen. Es scheint sinnvoll, die Anzahl der falschen Bilder zu erhöhen.

6000-2000-140-210.jpg

7. Zusammenfassung

・ Ich konnte einen Klassifikator zur Erkennung von Geigeninstrumenten erstellen. ・ Ich habe gelernt, wie man einen Klassifikator mit Colabratory erstellt. ・ Ich habe die Berechnungsmethode und die Parameter der Bilderkennung vage verstanden.

Websites, auf die ich mich bezog

Studieren von OpenCV ③ (Erstellen eines Klassifikators) (https://qiita.com/takanorimutoh/items/5bd88f3d17239a147581)

Lernen Sie den OpenCV Cascade-Klassifikator mit mehreren Pos-Bildern (https://pfpfdev.hatenablog.com/entry/20200715/1594799186).

Recommended Posts

Erstellen Sie einen Kaskadenklassifizierer mit Google Colaboratory
Lernen Sie Python mit Google Colaboratory
Machen Sie eine Lotterie mit Python
Probieren Sie OpenCV mit Google Colaboratory aus
Erstellung eines Kaskadenklassifikators mit opencv
Lassen Sie uns mit Google Colaboratory ganz einfach ein mathematisches GIF erstellen
Machen Sie ein Feuer mit kdeplot
Machen Sie eine Santa-Kennung aus einem Santa-Bild
Lassen Sie uns eine GUI mit Python erstellen.
Machen Sie einen Sound mit Jupyter Notebook
Machen wir einen Blockbruch mit wxPython
Erstellen Sie ein Empfehlungssystem mit Python
OpenCV-Funktionserkennung mit Google Colaboratory
Machen Sie einen Filter mit einer Django-Vorlage
Lassen Sie uns ein Diagramm mit Python erstellen! !!
Machen wir mit xCAT einen Spacon
Erstellen Sie mit PySide einen Modelliterator
Gesichtserkennung mit einem Kaskadenklassifikator
Machen Sie eine schöne Grafik mit Plotly
Google-Labor
Lassen Sie uns mit Python ein Shiritori-Spiel machen
Machen Sie einen seltenen Gacha-Simulator mit Flask
Erstellen Sie eine Notebook-Pipeline mit Kedro + Papermill
Machen Sie mit matplotlib eine teilweise gezoomte Figur
Machen Sie ein Zeichnungsquiz mit kivy + PyTorch
Lassen Sie uns mit Python langsam sprechen
So suchen Sie in Google Colaboratory nach Google Drive
Lassen Sie uns mit PLY 1 eine einfache Sprache erstellen
Machen Sie eine Logikschaltung mit Perceptron (Multilayer Perceptron)
Verwendung des Jupyter-Kernels von Java mit Google Colaboratory
Verwenden Sie TPU und Keras mit Google Colaboratory
Machen Sie Ja Nein Popup mit Kivy
Machen Sie einen Waschtrocknungs-Timer mit Raspberry Pi
Erstellen Sie eine GIF-Animation mit Ordnerüberwachung
Erstellen Sie ein Webframework mit Python! (1)
Machen wir mit Pylearn 2 eine dreiäugige KI
Erstellen Sie eine Desktop-App mit Python mit Electron
Machen wir einen Twitter-Bot mit Python!
Erstellen Sie ein Webframework mit Python! (2)
Ein Memorandum, um WebDAV nur mit Nginx zu erstellen
Stellen Sie ein Überwachungsgerät mit einem Infrarotsensor her
Erstellen Sie mit Flask einen einfachen Punktbildgenerator
So erstellen Sie ein Wörterbuch mit einer hierarchischen Struktur.
Ich möchte ein Spiel mit Python machen
Versuchen Sie, in Python einen "Entschlüsselungs" -Code zu erstellen
Ersetzen wir UWSC durch Python (5) Machen wir einen Roboter
Versuchen Sie, mit Python eine Diedergruppe zu bilden
[Chat De Tornado] Erstellen Sie einen Chat mit WebSocket in Tornado
Machen Sie Urlaubsdaten mit Pandas zu einem Datenrahmen
Erstellen Sie mit Amazon Lex einen LINE WORKS-Bot
(Memorandum) Erstellen Sie mit matplodlib ein 3D-Streudiagramm
Cheet Sheet beim Schaben mit Google Colaboratory (Colab)
Machen Sie mit LINE + Flask einen morphologischen Analyse-Bot
Lassen Sie uns ein Befehls-Standby-Tool mit Python erstellen
Erstellen Sie eine Kopie einer Google Drive-Datei aus Python