Ich möchte so etwas tun.
Wenn auf dem Foto etwas zu erkennen ist, geben Sie die Koordinaten an.Erstellen Sie mit openCV mehrere schwache Lernende mithilfe von HOG-Funktionen (Funktionen, die durch den Helligkeitsgradienten erstellt werden), haarähnlichen Funktionen (Funktionen, die durch die Bildhelligkeit erstellt werden) und korrekten Beschriftungen und verbessern Sie die Unterscheidung ..
openCV kann schnell mit conda install -c https://conda.binstar.org/jjhelmus opencv
aus der Anaconda-Installation mit pyenv eingegeben werden.
Wenn Sie pyenv oder anaconda googeln, gibt es viele Möglichkeiten, dies zu tun.
--0 Verzeichnisstruktur ―― 1 Erstellen Sie korrekte Antwortdateninformationen zum Lernen --2 Erstellen Sie falsche Dateninformationen zum Lernen --3 Positive Vektorerstellung ―― 4 Erstellung von Lerngeräten
Beliebiges Verzeichnis/
├data/
│ ├pos/ [Sammeln Sie in Schritt 1]
│ │ ├xxx001.jpg
│ │ ├xxx002.jpg
│ │ ├ ...
│ │ └xxx100.jpg
│ └neg/ [In Schritt 2 gesammelt]
│ │ ├yyy001.jpg
│ │ ├yyy002.jpg
│ │ ├ ...
│ │ └yyy100.jpg
│ └model/
│ ├param.xml [Erstellt in Schritt 4]
│ ├stage0.xml [Erstellt in Schritt 4]
│ ├stage1.xml [Erstellt in Schritt 4]
│ ├stage2.xml [Erstellt in Schritt 4]
│ └stageX.xml [Erstellt in Schritt 4]
└src/
├positive.dat [Erstellt in Schritt 1]
├negative.dat [Erstellt in Schritt 2]
├positive.vec [Erstellt in Schritt 3]
└create_cascade.sh [Schritt 3-Verwendet in 4]
Die folgenden Informationen sind für korrekte Antwortdaten erforderlich.
Speichern Sie dies in einer Datei [positive.dat], die durch Leerzeichen halber Breite getrennt ist.
{positive.dat}
/Path/To/positive/xxx001.jpg 1 200 50 50 50
/Path/To/positive/xxx002.jpg 2 150 30 40 36 230 300 55 60
・ ・ ・
/Path/To/positive/xxx100.jpg 1 150 30 40 36
Wenn Sie zwei Dinge sehen, die Sie identifizieren möchten, lautet das Format wie folgt. Bildpfad 2 1. x-Koordinate 1. y-Koordinate 1. Breite 1. Höhe 2. x-Koordinate 2. y-Koordinate 2. Breite 2. Höhe
Die Art und Weise, die Lernbilder zu sammeln, ist begeistert. .. .. Es scheint ein [Hilfstool] zu geben (http://shkh.hatenablog.com/entry/2012/11/03/052251) ...
Falsche Daten müssen nicht so kompliziert sein wie korrekte Daten. Listen Sie die Pfade von Bildern, die nicht anzeigen, was Sie erkennen möchten, in einer Datei [negative.dat] auf, und Sie sind fertig.
{negative.dat}
/Path/To/negative/yyy001.jpg
/Path/To/negative/yyy002.jpg
・ ・ ・
/Path/To/negative/yyy100.jpg
Es gibt kein Problem, auch wenn es einen Unterschied in der Anzahl der positiven und negativen Ergebnisse gibt. Wenn möglich, ist es ratsam, Bilder in verschiedenen Größen sowie Bilder in derselben Größe wie der Rahmen aufzunehmen, den Sie mit Positiv erkennen möchten. Dies liegt daran, dass beim Erkennen mit Kaskade unterschieden werden kann, was reflektiert wird, während die Quadrate in verschiedenen Größen erstellt werden.
{create_cascade.sh}
# positive.vec Erstellungsbefehl
opencv_createsamples -info positive.dat -vec positive.vec -num 100 -w 40 -h 40
--- info: Geben Sie die in Schritt 1 erstellte Datendatei an. --- vec: Geben Sie den Namen der Ausgabevektordatei an --- num: Anzahl der positiven.dat-Zeilen (Anzahl der positiven Bilder) --- w: Breite --- h: Höhe
{create_cascade.sh}
#Befehl zur Modellerstellung
opencv_traincascade -data /Path/To/model -vec /Path/To/src/positive.vec -bg /Path/To/src/negative.dat -numPos 100 -numNeg 100 -featureType HOG -maxFalseAlarmRate 0.1 -w 50 -h 50 -minHitRate 0.97 -numStages 17
--- data: Geben Sie den Speicherort der Modelldatei an --- vec: Geben Sie den Speicherort von positive.vec an --- bg: Geben Sie den Speicherort von negative.dat an --- numPos: Geben Sie die Anzahl der Positiven an --- numNeg: Geben Sie die Anzahl der Negative an --- featureType: Verwenden Sie die HOG-Funktion für HOG, die LBP-Funktion für LBP und die haarähnliche Funktion, falls nicht angegeben. --- maxFalseAlarmRate: Zulässige Falsch-Positiv-Rate in jeder Lernphase --- w: Breite --- h: Höhe --- minHitRate: In jeder Lernphase zulässige Mindesterkennungsrate --- numStages: Anzahl der zu erstellenden Stufen
{opencv_traincascade_error.log}
OpenCV Error: Bad argument (Can not get new positive sample. The most possible reason is insufficient count of samples in given vec-file.
Damit werden viele stageX.xml in / Path / To / model erstellt, während die folgende Ausgabe ausgespuckt wird.
{opencv_traincascade.log}
PARAMETERS:
cascadeDirName: ../../../model
vecFileName: positive.vec
bgFileName: negative.dat
numPos: 150
numNeg: 200
numStages: 17
precalcValBufSize[Mb] : 256
precalcIdxBufSize[Mb] : 256
stageType: BOOST
featureType: HOG
sampleWidth: 50
sampleHeight: 50
boostType: GAB
minHitRate: 0.97
maxFalseAlarmRate: 0.1
weightTrimRate: 0.95
maxDepth: 1
maxWeakCount: 100
===== TRAINING 0-stage =====
<BEGIN
POS count : consumed 150 : 150
NEG count : acceptanceRatio 200 : 1
Precalculation time: 0
+----+---------+---------+
| N | HR | FA |
+----+---------+---------+
| 1| 1| 1|
+----+---------+---------+
| 2| 1| 0.285|
+----+---------+---------+
| 3| 1| 0.285|
+----+---------+---------+
| 4| 0.993333| 0.135|
+----+---------+---------+
| 5| 1| 0.145|
+----+---------+---------+
| 6| 1| 0.095|
+----+---------+---------+
In der Tabelle repräsentiert N die Trefferquote basierend auf der Stufenschwelle (v_hitrate / numpos) und FA repräsentiert den Fehlalarm basierend auf der Stufenschwelle (v_falsealarm / numneg).
Schließlich wird eine Datei mit dem Namen cascade.xml erstellt, die zur Vorhersage verwendet wird.
Wenn Sie den zu bestimmenden Code in Python schreiben, sieht er so aus.
import cv2
import numpy as np
#Lerner(cascade.xml)Bezeichnung von
Cascade = cv2.CascadeClassifier('../model/2/cascade.xml')
#Angabe des vorherzusagenden Bildes
img = cv2.imread('image.jpg', cv2.IMREAD_COLOR)
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
point = Cascade.detectMultiScale(gray, 1.1, 3)
if len(point) > 0:
for rect in point:
cv2.rectangle(img, tuple(rect[0:2]), tuple(rect[0:2]+rect[2:4]), (0, 0,255), thickness=2)
else:
print "no detect"
cv2.imwrite('detected.jpg', img)
In der gespeicherten Datei erkannt.jpg wird das vom Rahmen umgebene Bild erstellt. Wenn Sie nur das Bild im Rahmen speichern möchten, sollten Sie dies unten tun können.
img = img[point[0][1]:point[0][1]+point[0][3], point[0][0]:point[0][0]+point[0][2]]
cv2.imwrite('out.jpg', img)
Der Rückgabepunkt von Cascade.detect MultiScale ist x, y, w, h.
--x: Obere linke Koordinate des Quadrats --y: Obere linke Koordinate des Quadrats --w: Breite --h: Vertikale Breite
Daher können Sie es zuschneiden, indem Sie es mit img [y: y + h, x: x + w] angeben.
Recommended Posts