[PYTHON] Ich möchte Objekte mit OpenCV erkennen

Ich möchte einen bestimmten Objekttyp aus einem Foto erkennen und ausschneiden. (Autos, Fische, Menschen ..) Finden Sie heraus, ob Sie dies mit OpenCV tun können.

Bestätigung der Objekterkennungsmethode mit OpenCV

Referenz: https://www.tech-tech.xyz/haar-cascade.html

Es scheint ungefähr 3 Muster zu geben,

  1. Vorlagenabgleich (Musterabgleich) Es vergleicht die Bilder wie sie sind und extrahiert die Teile mit hoher Ähnlichkeit. Es scheint anfällig für Bildrotation und Skalierungsänderungen zu sein. Es gibt auch den Grad der Ähnlichkeit zurück, so dass ich keine andere Wahl habe, als danach zu urteilen.

  2. Merkmalspunktextraktion Im Gegensatz zu Vorlagenmustern können verschiedene Größen und gedrehte extrahiert werden. Wie bei 1 ist es schwierig, "diese Dinge" zu extrahieren. Dies scheint möglich zu sein, um einzigartige Dinge zu extrahieren, die keine Münzen, bestimmte Gemälde oder subtile Unterschiede aufweisen.

  3. Verwenden Sie den Kaskadenklassifikator Unter Verwendung einer Kaskadendatei, die durch vorheriges Lesen von Hunderten von Lernbilddateien gelernt wurde, werden diese Bilder aus den Bildern extrahiert. Gesicht, Person, Oberkörper, Augen. Es gibt auch verteilte Dateien, sodass Sie sie verwenden können, ohne zu erfahren, ob es sich um ein Gesicht handelt. Kaskadendatei: https://github.com/opencv/opencv/tree/master/data/haarcascades Referenz: http://opencv.jp/opencv-2.2/c/objdetect_cascade_classification.html

Es scheint, dass ein Kaskadenklassifikator benötigt wird, um etwas zu erkennen, das etwas mehrdeutig ist, was ich tun möchte.

Vorlagenmuster, wenn das Bild angegeben ist. Wenn das zu extrahierende Objekt angegeben wird, handelt es sich um eine Merkmalspunktextraktion, andernfalls um einen Kaskadenklassifizierer.

Erstellen eines Kaskadenklassifikators

Referenz: https://www.pro-s.co.jp/blog/system/opencv/6202

Es scheint, dass der im Referenzziel geschriebene Inhalt verwendet werden kann. Es scheint, dass die Anzahl der Lerndateien, die erhöht werden müssen, mit dem Hilfsprogramm erhöht werden kann. * Ich bin mir nicht sicher über die Genauigkeit, aber ...

opencv_createsamples -img ./pos/1/dist/spoon1.png  -vec ./vec/1.vec  -num 10  -bgthresh 0 
opencv_createsamples -img ./pos/1/src/spoon1.png  -vec ./vec/1.vec  -num 500  -bgthresh 0   -maxidev 40 -maxxangle 0.5 -maxyangle 1.5 -maxzangle 1.5

Die folgende Ausgabe wird in jeder Phase während des Lernens während der Ausführung von opencv_traincascade ausgegeben, aber ich bin nicht sicher, was jede bedeutet.

opencv_traincascade -data ./cascade -vec ./vec/spoon1.vec -bg ./neg/jpg/nglist2.t
xt -numPos 50  -numNeg 50  -stagenumStages 12 

===== TRAINING 0-stage =====
<BEGIN
POS count : consumed   200 : 200
NEG count : acceptanceRatio    1000 : 1
Precalculation time: 1
+----+---------+---------+
|  N |    HR   |    FA   |
+----+---------+---------+
|   1|        1|        1|
+----+---------+---------+
|   2|        1|    0.016|
+----+---------+---------+
END>
Training until now has taken 0 days 0 hours 0 minutes 3 seconds.

Fehler 1 aufgetreten

Wenn ich die Eingabedatei vorbereite und "opencv_traincascade ..." ausführe, tritt der folgende Fehler auf.

Train dataset for temp stage can not be filled. Branch training terminated.

In meinem Fall hat es nicht funktioniert, weil ich nicht den Pfad hatte, sondern nur den Dateinamen der negativen Datei. Korrigiert durch Einfügen des relativen Pfads vom Ausführungsort in die Datei. ls -v | grep jpg > nglist.txt

#Am Anfang der Zeile./neg/jpg/Hinzufügen
sed "s#^#./neg/jpg/#" nglist.txt >nglist2.txt

Fehler 2 aufgetreten

Required leaf false alarm rate achieved. Branch training terminated.

Nun, es gibt keine Antwort darauf, aber das Problem ist, dass die Bühne bis zu einem gewissen Grad fortschreitet und die Standardeinstellung 20 Mal nicht erreicht werden kann. Deshalb habe ich beschlossen, die Bühnenbezeichnung auf einen Ort zu senken, an dem sie gelöscht werden kann. Die Anzahl der Stufen, die gelöscht werden können, ändert sich, wenn die Anzahl der Proben zunimmt oder abnimmt, so dass dies ebenfalls betroffen zu sein scheint.

-numStages Standard 20. 10 oder so.

Es erscheint oft. Dies ist nur notwendig, um die Bedeutung zu verstehen. https://taktak.jp/2016/08/26/1618

Fehler 3 aufgetreten

Es ist kein Fehler, aber das Training von "opencv_traincascade" schreitet überhaupt nicht voran ... Wenn ich das Argument -numNeg weglassen würde, wäre es zu spät. Ich weiß nicht genau, was Sie tun, aber der Standardwert ist 1000

Fehler 4 aufgetreten

HOG cascade is not supported in 3.0 in function 'read'

Ich habe einen Kaskadenklassifizierer erstellt, indem ich HOG im Merkmalstyp des Traings angegeben habe. Als ich versuchte, ihn mit openCV zu lesen und zu verwenden, trat der obige Fehler auf. Es scheint, dass HOG nicht mehr unterstützt wird.

Ausführungsskript

import cv2
 
def main():
    #Eingabebild lesen (Testbilddatei)
    img = cv2.imread("Name der Erkennungszieldatei")
    
    #Kaskadentypklassifizierer (selbst erstellter Klassifizierer)
    cascade = cv2.CascadeClassifier("./cascade/cascade.xml") # 

    #Wechseln Sie von Gesicht zu Ball (obwohl Sie es so lassen können, wie es ist)
    objects = cascade.detectMultiScale(img, scaleFactor=1.1, minNeighbors=3, minSize=(0, 0))

    #Umgeben Sie den Gesichtsbereich mit einem roten Rechteck
    for (x, y, w, h) in objects:
        cv2.rectangle(img, (x, y), (x + w, y+h), (0,0,200), 3)

    #Ergebnisbild speichern
    cv2.imwrite("result.png ",img)
    

main()

Aber nicht erkannt ..

Ich frage mich, ob die Eingabedaten nicht gut sind ...

Versuchen Sie, die Beispieldateien zu vergrößern. .. http://mirai-links.com/2018/06/11/opencv-%E7%89%A9%E4%BD%93%E6%A4%9C%E5%87%BA%E3%80%81%E5%88%86%E9%A1%9E%E5%99%A8%E4%BD%9C%E6%88%90%E3%81%A8%E6%A4%9C%E5%87%BA%E3%83%86%E3%82%B9%E3%83%88%E3%80%80%E3%81%9D%E3%81%AE%EF%BC%92/

Bilder vergrößern

● Generieren Sie ein Beispielbild, indem Sie die Originalbilddatei und das Hintergrundbild kombinieren

opencv_createsamples -info ./pos/info/1.txt -img ./pos/spoon1.png   -bg ./neg/jpg/nglist.txt -num 10 -w 24 -h 24  -show -bgthresh 200

⇒ [Achtung] Ich muss die Position des Zielobjekts in der Ausgabedateiliste beschreiben, aber es wird nicht automatisch angepasst und die Größe des gesamten Bildes wird immer angegeben. Wenn Sie diesen Weg gehen, müssen Sie den Hintergrund und die Eingabegröße genau gleich einstellen.

● Erstellen Sie eine Vektordatei aus der Dateiliste

opencv_createsamples -info ./pos/2/dist/poslist.txt  -vec ./vec/3.vec  -num 1700

● Schulung

opencv_traincascade -data ./cascade_harrlike/3/  -vec ./vec/3.vec  -bg ./neg/jpg/nglist2.txt -numPos 1500  -numNeg 1500  -numStages 10 -precalcValBufSize 2024 -precalcIdxBufSize 2024

Noch nicht erkannt ..

Von hier aus habe ich den Eindruck, dass es keine andere Wahl gibt, als die Eingabedaten ein wenig anzuordnen ... Fortsetzung. ..

Recommended Posts

Ich möchte Objekte mit OpenCV erkennen
Ich habe versucht, mit OpenCV Bewegungen schnell zu erkennen
Ich möchte mit Jubatus (1) eine nicht autorisierte Anmeldung bei Facebook erkennen.
Ich möchte ○○ mit Pandas machen
Ich möchte mit Python debuggen
Ich möchte einen Blog mit Jupyter Notebook schreiben
Ich möchte eine Pip-Installation mit PythonAnywhere durchführen
Ich möchte Protokolle mit Python analysieren
Ich möchte mit aws mit Python spielen
Ich möchte die Position meines Gesichts mit OpenCV überprüfen!
Katze zurück mit OpenCV erkennen
Ich möchte MATLAB feval mit Python verwenden
Ich möchte datetime.datetime.now () auch mit pytest verspotten!
Ich möchte mehrere Bilder mit matplotlib anzeigen.
Ich möchte 100 Datenwissenschaften mit Colaboratory schlagen
Ich möchte ein Spiel mit Python machen
Ich möchte OREMO mit setParam sein!
Ich möchte Temporäres Verzeichnis mit Python2 verwenden
Ich habe versucht, ein Objekt mit M2Det zu erkennen!
Ich möchte -inf nicht mit np.log verwenden
#Unresolved Ich möchte Gobject-Introspection mit Python3 kompilieren
Ich möchte ip vrf mit SONiC verwenden
Ich möchte APG4b mit Python lösen (Kapitel 2)
Ich möchte mit Djangos Migrate von vorne beginnen
Ich möchte mit Python in eine Datei schreiben
Versuchen Sie, Fische mit Python + OpenCV2.4 (unvollendet) zu erkennen.
Ich möchte ein Bild mit Lollipop in WebP konvertieren
Ich möchte Bilder von Katzen von Instagram erkennen
Ich habe versucht, Funktionen mit SIFT von OpenCV zu extrahieren
Ich möchte mit einem Knopf am Kolben übergehen
Ich möchte die Optimierung mit Python und CPlex behandeln
Ich möchte mit verstärkendem Lernen einen Berg besteigen
Ich möchte SUDOKU lösen
Ich möchte mit Python-Datenklasse nach hinten erben
Ich möchte mit einem Roboter in Python arbeiten.
Ich möchte eine Zeichenkette mit Hiragana teilen
Ich möchte Lambda mit Python auf Mac AWS!
Ich möchte manuell eine Legende mit matplotlib erstellen
[TensorFlow] Ich möchte Fenster mit Ragged Tensor verarbeiten
Ich möchte einen Quantencomputer mit Python betreiben
Ich möchte eine lokale Variable mit Lambda binden
Ich möchte Pythons ungelöste Importwarnung mit vsCode entfernen
Ich möchte R-Funktionen einfach mit ipython notebook verwenden
Ich möchte eine andere Version von Python mit pyvenv angeben
Ich möchte Daten mit Python analysieren können (Teil 1)
Ich möchte einen Blog-Editor mit dem Administrator von Django erstellen
Ich möchte eine Jupyter-Umgebung mit einem Befehl starten
[NetworkX] Ich möchte nach Knoten mit bestimmten Attributen suchen
Ich möchte ein Klickmakro mit pyautogui (Wunsch) erstellen.
Ich möchte mit Numpy die japanische Flagge in die Palau-Flagge ändern
Ich möchte Daten mit Python analysieren können (Teil 4)
Ich möchte mit GAN Schwarzweißfotos von Erinnerungen ausmalen
Ich möchte Daten mit Python analysieren können (Teil 2)
Ich möchte automatisch an Online-Kursen mit Python + Selen teilnehmen!
Ich möchte ein Klickmakro mit pyautogui (Outlook) erstellen.
[Python] Ich möchte die Option -h mit argparse verwenden
Ich möchte eine virtuelle Umgebung mit Jupyter Notebook verwenden!