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.
Referenz: https://www.tech-tech.xyz/haar-cascade.html
Es scheint ungefähr 3 Muster zu geben,
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.
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.
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.
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.
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
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
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
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.
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()
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/
● 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
Die an dem durch -info angegebenen Speicherort generierte Dateiliste wird ausgegeben. Erstellen Sie mehrere und führen Sie sie zu einer Datei zusammen, um sie als Eingabe für die Vektorerstellung zu verwenden.
Zu diesem Zeitpunkt kann der Inhalt von nglist nur der Dateiname sein. Kein Dateipfad erforderlich.
⇒ [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
Von hier aus habe ich den Eindruck, dass es keine andere Wahl gibt, als die Eingabedaten ein wenig anzuordnen ... Fortsetzung. ..
Recommended Posts