Je veux faire quelque chose comme ça.
Autrement dit, s'il y a quelque chose que vous souhaitez détecter sur la photo, spécifiez les coordonnées.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.
--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
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]
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 ...
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.
{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
{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.
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