[PYTHON] Reconnaissance d'objets avec openCV par traincascade

que vas-tu faire?

Je veux faire quelque chose comme ça.

スクリーンショット 2016-10-24 23.32.49.png Autrement dit, s'il y a quelque chose que vous souhaitez détecter sur la photo, spécifiez les coordonnées.

Comment faites-vous?

Avec openCV, créez plusieurs apprenants faibles en utilisant les fonctionnalités HOG (fonctionnalités créées par le gradient de luminosité), les fonctionnalités Haar-Like (fonctionnalités créées par la luminosité de l'image), et corrigez les étiquettes, et améliorez pour distinguer .. openCV peut être entré rapidement avec conda install -c https://conda.binstar.org/jjhelmus opencv à partir de l'installation anaconda avec pyenv. Si vous google pyenv ou anaconda, il existe de nombreuses façons de le faire.

Essayons

--0 Structure du répertoire ―― 1 Créez des informations de données de réponse correctes pour l'apprentissage --2 Créer des informations de données incorrectes pour l'apprentissage --3 Création de vecteurs positifs ―― 4 Création d'appareil d'apprentissage

0 Structure du répertoire

Annuaire arbitraire/
 ├data/
 │ ├pos/               [Collecter à l'étape 1]
 │ │ ├xxx001.jpg
 │ │ ├xxx002.jpg
 │ │ ├ ...
 │ │ └xxx100.jpg
 │ └neg/               [Collecté à l'étape 2]
 │ │ ├yyy001.jpg
 │ │ ├yyy002.jpg
 │ │ ├ ...
 │ │ └yyy100.jpg
 │ └model/
 │   ├param.xml       [Créé à l'étape 4]
 │   ├stage0.xml      [Créé à l'étape 4]
 │   ├stage1.xml      [Créé à l'étape 4]
 │   ├stage2.xml      [Créé à l'étape 4]
 │   └stageX.xml      [Créé à l'étape 4]
 └src/
   ├positive.dat       [Créé à l'étape 1]
   ├negative.dat       [Créé à l'étape 2]
   ├positive.vec       [Créé à l'étape 3]
   └create_cascade.sh  [Étape 3-Utilisé dans 4]

1 Créez des informations de données de réponse correctes pour l'apprentissage

Les informations suivantes sont nécessaires pour des données de réponse correctes.

Enregistrez-le dans un fichier [positif.dat] séparé par des espaces demi-largeur.

{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

Si vous voyez deux choses que vous souhaitez identifier, le format est le suivant. Chemin de l'image 2 1ère coordonnée x 1ère coordonnée y 1ère largeur 1ère hauteur 2ème coordonnée x 2ème coordonnée y 2ème largeur 2ème hauteur

La manière de collecter les images d'apprentissage est enthousiaste. .. .. Il semble y avoir un outil auxiliaire ...

2 Créer des informations de données incorrectes pour l'apprentissage

Des données incorrectes n'ont pas besoin d'être aussi compliquées que des données correctes. Listez les chemins des images qui n'indiquent pas ce que vous voulez reconnaître dans un fichier [négatif.dat] et vous avez terminé.

{negative.dat}


/Path/To/negative/yyy001.jpg
/Path/To/negative/yyy002.jpg
・ ・ ・
/Path/To/negative/yyy100.jpg

Il n'y a pas de problème même s'il y a une différence dans le nombre de positifs et de négatifs. Si possible, il est conseillé d'inclure des images de différentes tailles ainsi que des images de la même taille que le cadre que vous souhaitez détecter avec un positif. En effet, lors de la détection en cascade, il est possible de distinguer ce qui est réfléchi tout en rendant les carrés de différentes tailles.

3 Création de vecteurs positifs

{create_cascade.sh}


# positive.commande de création vec
opencv_createsamples -info positive.dat -vec positive.vec -num 100 -w 40 -h 40

--- info: spécifiez le fichier dat créé à l'étape 1. --- vec: spécifiez le nom du fichier vectoriel de sortie --- num: Nombre de lignes positives.dat (nombre d'images positives) --- w: Largeur --- h: Hauteur

4 Créer un apprenant

{create_cascade.sh}


#commande de création de modèle
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: spécifiez l'emplacement de stockage du fichier modèle --- vec: spécifiez l'emplacement de positive.vec --- bg: Spécifiez l'emplacement de negative.dat --- numPos: spécifiez le nombre de positifs --- numNeg: Spécifiez le nombre de négatifs --- featureType: Utilisez la fonction HOG pour HOG, la fonction LBP pour LBP, la fonction Haar-Like si elle n'est pas spécifiée. --- maxFalseAlarmRate: taux de faux positifs autorisé à chaque étape d'apprentissage --- w: Largeur --- h: Hauteur --- minHitRate: Taux de détection minimum autorisé à chaque étape d'apprentissage --- numStages: nombre d'étapes à créer

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

Avec cela, de nombreux stageX.xml seront créés dans / Path / To / model tout en crachant la sortie suivante.

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

Dans le tableau, N représente le taux de succès basé sur le seuil d'étape (v_hitrate / numpos) et FA représente la fausse alarme basée sur le seuil d'étape (v_falsealarm / numneg).

Enfin, un fichier appelé cascade.xml est créé, qui est utilisé pour la prédiction.

5 Discrimination utilisant un apprenant

Si vous écrivez le code à déterminer en python, cela ressemble à ceci.

import cv2
import numpy as np

#Apprenant(cascade.xml)Désignation de
Cascade = cv2.CascadeClassifier('../model/2/cascade.xml')
#Spécifier l'image à prédire
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)

Dans le fichier détecté.jpg enregistré, l'image entourée par le cadre est créée. Si vous souhaitez enregistrer uniquement l'image dans le cadre, vous devriez pouvoir le faire ci-dessous.

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)

Le point de retour de Cascade.detect MultiScale est x, y, w, h.

--x: coordonnée supérieure gauche du carré --y: coordonnée supérieure gauche du carré --w: Largeur --h: largeur verticale

Par conséquent, vous pouvez le rogner en le spécifiant avec img [y: y + h, x: x + w].

Recommended Posts

Reconnaissance d'objets avec openCV par traincascade
Reconnaissance faciale avec OpenCV de Python
Reconnaissance faciale / coupe avec OpenCV
Reconnaissance d'image avec Keras + OpenCV
Reconnaissance faciale en temps réel avec vidéo acquise par getUserMedia [HTML5, openCV]
Essayez la reconnaissance faciale avec python + OpenCV
Reconnaissance faciale avec caméra avec opencv3 + python2.7
J'ai essayé la reconnaissance faciale avec OpenCV
Extraction d'objets dans l'image par correspondance de modèles en utilisant OpenCV avec Python
Enregistrer la vidéo image par image avec Python OpenCV
[python, openCV] base64 Reconnaissance faciale dans les images
Reconnaissance faciale avec Edison
Détecter le retour du chat avec OpenCV
Binarisation avec OpenCV / Python
Reconnaissance d'image avec keras
Faire pivoter les sprites avec OpenCV
Génération d'images JPEG en spécifiant la qualité avec Python + OpenCV
Augmentation des données avec openCV
TopView facile avec OpenCV
Trébucher avec opencv3 de homebrew
Découpez une image d'une vidéo toutes les secondes avec Python + OpenCV
Correspondance de modèle par OpenCV (CUDA)
Reconnaissance vocale par Python MFCC
"Traitement Apple" avec OpenCV3 + Python3
Essayez la détection des bords avec OpenCV
Édition d'image avec python OpenCV
Capture de caméra avec Python + OpenCV
Reconnaissance faciale par Amazon Rekognition
[Python] Utilisation d'OpenCV avec Python (basique)
Transformation affine par OpenCV (CUDA)
Binariser les données photo avec OpenCV
Chargement de la vidéo en boucle avec opencv
Détection des bords en temps réel avec OpenCV
Détection de visage avec Python + OpenCV
Co-localisation d'objets pour la reconnaissance faciale
Obtenez des fonctionnalités d'image avec OpenCV
Essayez la reconnaissance faciale avec Python
Essayez OpenCV avec Google Colaboratory
Création d'un classificateur en cascade avec opencv
Utiliser OpenCV avec Python @Mac
Détection de visage d'anime avec OpenCV
ZOOM en remplaçant votre visage par une icône Twitter avec la reconnaissance faciale openCV