[PYTHON] Objekterkennung mit openCV durch traincascade

was wirst du tun?

Ich möchte so etwas tun.

スクリーンショット 2016-10-24 23.32.49.png Wenn auf dem Foto etwas zu erkennen ist, geben Sie die Koordinaten an.

Wie machst du das?

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.

Lass es uns versuchen

--0 Verzeichnisstruktur ―― 1 Erstellen Sie korrekte Antwortdateninformationen zum Lernen --2 Erstellen Sie falsche Dateninformationen zum Lernen --3 Positive Vektorerstellung ―― 4 Erstellung von Lerngeräten

0 Verzeichnisstruktur

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]

1 Erstellen Sie korrekte Antwortdateninformationen zum Lernen

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) ...

2 Erstellen Sie falsche Dateninformationen zum Lernen

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.

3 Positive Vektorerstellung

{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

4 Erstellen Sie einen Lernenden

{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.

5 Diskriminierung durch einen Lernenden

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

Objekterkennung mit openCV durch traincascade
Gesichtserkennung mit OpenCV von Python
Gesichtserkennung / Schneiden mit OpenCV
Bilderkennung mit Keras + OpenCV
Gesichtserkennung in Echtzeit mit von getUserMedia [HTML5, openCV] aufgenommenem Video
Versuchen Sie die Gesichtserkennung mit Python + OpenCV
Gesichtserkennung mit Kamera mit opencv3 + python2.7
Ich habe versucht, das Gesicht mit OpenCV zu erkennen
Objektextraktion im Bild durch Mustervergleich mit OpenCV mit Python
Speichern Sie Videos Frame für Frame mit Python OpenCV
[python, openCV] base64 Gesichtserkennung in Bildern
Gesichtserkennung mit Edison
Katze zurück mit OpenCV erkennen
Binarisierung mit OpenCV / Python
Bilderkennung mit Keras
Sprites mit OpenCV drehen
JPEG-Bilderzeugung durch Angabe der Qualität mit Python + OpenCV
Datenerweiterung mit openCV
Einfache TopView mit OpenCV
Stolpern Sie mit opencv3 von Homebrew
Schneiden Sie mit Python + OpenCV jede Sekunde ein Bild aus einem Video aus
Template Matching von OpenCV (CUDA)
Spracherkennung durch Python MFCC
"Apple-Verarbeitung" mit OpenCV3 + Python3
Versuchen Sie die Kantenerkennung mit OpenCV
Bildbearbeitung mit Python OpenCV
Kameraerfassung mit Python + OpenCV
Gesichtserkennung durch Amazon Rekognition
[Python] Verwenden von OpenCV mit Python (Basic)
Affine Transformation durch OpenCV (CUDA)
Binarisieren Sie Fotodaten mit OpenCV
Loop-Video-Laden mit opencv
Echtzeit-Kantenerkennung mit OpenCV
Gesichtserkennung mit Python + OpenCV
Objekt-Co-Lokalisierung zur Gesichtserkennung
Holen Sie sich Bildfunktionen mit OpenCV
Versuchen Sie die Gesichtserkennung mit Python
Probieren Sie OpenCV mit Google Colaboratory aus
Erstellung eines Kaskadenklassifikators mit opencv
Verwenden von OpenCV mit Python @Mac
Anime-Gesichtserkennung mit OpenCV
ZOOM, indem Sie Ihr Gesicht durch ein Twitter-Symbol mit openCV-Gesichtserkennung ersetzen