J'ai commencé à étudier la reconnaissance d'images OpenCV et je voulais créer mon propre classificateur en cascade, mais je ne peux pas me permettre la puissance de calcul de mon propre PC. Quand j'y pensais, j'ai découvert la fourniture de GPU de google Colaboratory et j'ai décidé de reprendre le calcul.
Créez un classificateur en cascade qui reconnaît la famille de violons à partir des photos ci-dessous à l'aide de google colaboratory. Idéalement, vous devriez être capable de faire la distinction entre le violon, l'alto, le violoncelle et la contrebasse, mais il est difficile d'exiger que même les gens (qui ne connaissent pas grand chose à la musique classique) fassent des choses difficiles, donc les obstacles sont faibles. faites.
1-1. Préparation de l'environnement google colab 1-2. Préparation des données d'image 1-3. Téléchargez mergevec.py
goole colab crée un nouveau bloc-notes dans n'importe quel dossier sur google drive. Cette fois, je travaillerai dans / drive (My Drive) / Colab Notebooks / opencv / instruments /.
La structure du dossier instruments est la suivante.
instruments
<DIR> pos #Enregistrer l'image correcte
<DIR> vec #Créez un fichier vec à partir de l'image correcte et enregistrez-le
<DIR> neg #Enregistrer l'image incorrecte
<DIR> neglist #Créer et enregistrer une liste à partir d'images incorrectes
<DIR> cascade #Résultats de la formation en sortie
mergevec.py #Utilisé pour combiner des fichiers vec
train_flow #Créer un nouveau notebook Colab
** Image correcte **
Ramassez-le vous-même ou sur le net. Cette fois, j'ai préparé 6 fichiers jpg traités de 200 x 300 pixels et les ai stockés en pos.
** Image incorrecte **
Beaucoup d'images en couleurs pour le moment. Cette fois, j'ai téléchargé "2017 Val images" à partir de 50 jeux de données d'apprentissage automatique gratuits: jeux de données d'image. Au total, environ 8 000 feuilles sont préparées.
Ceci est stocké dans neg, mais le téléchargement prend du temps et utilise plus de 1 Go de capacité du disque, il est donc recommandé de réduire la quantité en fonction de la situation.
Téléchargement depuis page github maergevec.
Créez une nouvelle note colab appelée train_flow et créez le contenu. Je veux utiliser le GPU, alors définissez le bloc-notes à partir de l'onglet d'édition. La vitesse de calcul peut varier en fonction du type de GPU attribué, mais elle est omise ici.
2-1. Changement environnemental 2-2. Création d'un fichier de réponses correct 2-3. Création de fichier incorrecte
Il y a trois choses à faire. ・ Version down d'OpenCV ・ Support de lecteur -Changer le répertoire courant
** Version down d'OpenCV **
Étant donné qu'openCV4, qui est installé en standard dans colab, ne peut pas utiliser la création d'échantillons et le train en cascade décrits plus loin, rétrograder vers openCV3.
Cellule 1
#Désinstaller openCV
#Deux fois'y'Entrer
!pip3 uninstall opencv-python opencv-contrib-python
Cellule 2
#installer openCV
!pip3 install opencv-python==3.4.4.19 opencv-contrib-python==3.4.4.19
#Redémarrer la session
exit()
** support de lecteur **
Procédez comme suit pour faire entrer et sortir des données entre la note colab et le lecteur
Cellule 3
from google.colab import drive
drive.mount('/content/drive')
** Changer le répertoire courant **
Réglez en fonction de votre structure de répertoire. Ici, les instruments sont définis sur le répertoire courant.
Cellule 4
import os
os.chdir('/content/drive/My Drive/Colab Notebooks/opencv/instruments')
Créez des fichiers de formation à partir des images correctes et incorrectes.
3-1. Création d'un fichier de données de réponse correct 3-2. Création d'un fichier de données incorrect
La production en masse de données de réponses correctes à l'aide d'openCV crée des échantillons et les enregistre dans un fichier séparé. Il existe deux méthodes.
** Comment spécifier l'image directement ** Créez 1000 données de réponse correctes à partir d'une image avec la commande suivante. La largeur et la hauteur sont ajustées au rapport hauteur / largeur de l'image correcte, mais je ne sais pas si c'est efficace.
Cellule 5-1
#Créez 1000 données de réponse correctes à partir d'images et exportez-les sous forme de fichier vec
!opencv_createsamples -img pos/Va001.jpg -vec vec/Va001.vec -num 1000 -w 40 -h 60
Out
Info file name: (NULL)
Img file name: drive/My Drive/Colab Notebooks/opencv/instruments/pos/Va006.jpg
Vec file name: drive/My Drive/Colab Notebooks/opencv/instruments/vec/Va006.vec
BG file name: (NULL)
Num: 1000
BG color: 0
BG threshold: 80
Invert: FALSE
Max intensity deviation: 40
Max x angle: 1.1
Max y angle: 1.1
Max z angle: 0.5
Show samples: FALSE
Width: 40
Height: 60
Max Scale: -1
Create training samples from single image applying distortions...
Done
** Comment spécifier une liste d'images **
Cela n'a pas fonctionné parce que ma méthode était fausse, mais je vais l'écrire. Comme indiqué ci-dessous, spécifiez l'emplacement du fichier de réponses correct, spécifiez le nombre d'objets de réponse correcte et placez la liste des coordonnées d'objet de réponse correctes (point de départ de l'axe x, point de départ de l'axe y, point de fin de l'axe x, point de fin de l'axe y) dans le dossier pos. Préparez-le.
poslist.txt
#Créer dans le dossier pos
#Nom du fichier Number Coordinate
pos/Va001.jpg 1 0 0 200 300
pos/Va002.jpg 1 0 0 200 300
pos/Va003.jpg 1 0 0 200 300
pos/Va004.jpg 1 0 0 200 300
pos/Va005.jpg 1 0 0 200 300
pos/Va006.jpg 1 0 0 200 300
Cellule 5-2
!opencv_createsamples -info pos/poslist.txt -vec vec/pos.vec -num 6000 -w 40 -h 60
Je m'attendais à ce que cela crée un total de 6000 données de réponses correctes à partir des images écrites en txt, mais cela n'a pas fonctionné sur Colaboratory.
Bien qu'il ne soit pas impossible d'apprendre par une méthode telle que la cellule 5-1, il semble difficile d'amener l'image originale à une précision de reconnaissance suffisante avec une seule feuille. J'ai donc étudié comment y faire face, et il semble qu'il existe un code qui combine plusieurs fichiers vec.
** Combinez plusieurs fichiers vec ensemble **
Après avoir créé chaque fichier vec à partir des images placées dans le dossier pos comme dans la cellule 5-1, exécutez mergevec.py sous instruments.
Cellule 6
!opencv_createsamples -img pos/Va002.jpg -vec vec/Va002.vec -num 1000 -w 40 -h 60
!opencv_createsamples -img pos/Va003.jpg -vec vec/Va003.vec -num 1000 -w 40 -h 60
!opencv_createsamples -img pos/Va004.jpg -vec vec/Va004.vec -num 1000 -w 40 -h 60
!opencv_createsamples -img pos/Va005.jpg -vec vec/Va005.vec -num 1000 -w 40 -h 60
!opencv_createsamples -img pos/Va006.jpg -vec vec/Va006.vec -num 1000 -w 40 -h 60
Cellule 7
#Combinez les données dans le dossier vec et pos.Enregistrer sous vec
!python mergevec.py -v vec -o vec/pos.vec
Vous avez maintenant créé un fichier image correct de 1000 x 6.
neg Vous devez créer nglist.txt avec l'emplacement du fichier image.
Cellule 8
#nglist le contenu du dossier neg.Exporter vers txt
!ls neg | xargs -I {} echo neg/{} > neglist/nglist.txt
neglist
neg/000000000139.jpg
neg/000000000285.jpg
neg/000000000632.jpg
...
Ceci termine toutes les préparations.
Exécutez le code suivant.
Cellule 9
!opencv_traincascade -data cascade -vec vec/pos.vec -bg neglist/nglist.txt -numPos 5500 -numNeg 3000 -numStages 20 -featureType LBP -w 40 -h 60
numPos: Nombre d'images utilisées pour la bonne réponse. Si toutes les images sont épuisées, l'apprentissage peut être interrompu, alors réglez-le un peu. numNeg: Cela semble bien si les réponses correctes et incorrectes sont d'environ 2: 1. featureType: HAAR, LBP, etc. peuvent être sélectionnés. HAAR prend énormément de temps. w, h: défini sur la même valeur que lors de la création du fichier de réponses correct.
Le GPU colab fonctionne en continu jusqu'à 12 heures. J'ai essayé de le calculer du jour au lendemain, mais le calcul n'était terminé que jusqu'à l'étape 14/20, et c'était une augmentation exponentielle qui doublait le temps de calcul pour chaque étape, j'ai donc décidé qu'il était nécessaire d'ajuster les paramètres.
Out
PARAMETERS:
cascadeDirName: cascade/trained_data/
vecFileName: vec/pos.vec
bgFileName: neglist/nglist.txt
numPos: 5500
numNeg: 3000
numStages: 20
precalcValBufSize[Mb] : 1024
precalcIdxBufSize[Mb] : 1024
acceptanceRatioBreakValue : -1
stageType: BOOST
featureType: LBP
sampleWidth: 40
sampleHeight: 60
boostType: GAB
minHitRate: 0.995
maxFalseAlarmRate: 0.5
weightTrimRate: 0.95
maxDepth: 1
maxWeakCount: 100
Number of unique features given windowSize [40,60] : 153400
===== TRAINING 0-stage =====
<BEGIN
POS count : consumed 5500 : 5500
NEG count : acceptanceRatio 3000 : 1
tcmalloc: large alloc 1073758208 bytes == 0x5650ef23e000 @ 0x7f54c034f1e7 0x7f54bf549382 0x7f54bf64821b 0x5650e5fc5608 0x5650e5fc5d42 0x5650e5fc5e1a 0x5650e5fcf1a9 0x5650e5fbbfff 0x7f54be80cb97 0x5650e5fbcc1a
Precalculation time: 20
+----+---------+---------+
| N | HR | FA |
+----+---------+---------+
| 1| 1| 1|
+----+---------+---------+
| 2| 0.997818| 0.225333|
+----+---------+---------+
END>
Training until now has taken 0 days 0 hours 5 minutes 21 seconds.
...
===== TRAINING 14-stage =====
<BEGIN
POS count : consumed 5500 : 5725
NEG count : acceptanceRatio 3000 : 2.41651e-06
Precalculation time: 17
+----+---------+---------+
| N | HR | FA |
+----+---------+---------+
| 1| 1| 1|
+----+---------+---------+
| 2| 1| 1|
+----+---------+---------+
| 3| 0.998364| 0.712667|
+----+---------+---------+
| 4| 0.997455| 0.632|
+----+---------+---------+
| 5| 0.996545| 0.449|
+----+---------+---------+
END>
Training until now has taken 0 days 6 hours 59 minutes 8 seconds.
Par conséquent, lorsque numStage était réglé sur 15, l'apprentissage était terminé car la précision était suffisamment améliorée sans atteindre l'étape 15, et le temps requis était d'un peu plus d'une heure. Étrange.
Il semble que colab ne puisse pas afficher les images avec openCV, donc travaillez localement. Parmi les multiples fichiers sortis en cascade, vous pouvez télécharger cascade.xml.
Cellule 10
import cv2
img = cv2.imread('instruments.jpg')
cascade = cv2.CascadeClassifier('cascade.xml')
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
#Envisagez de changer minSize lorsque la précision de la reconnaissance est mauvaise
Va = cascade.detectMultiScale(gray, scaleFactor=1.1, minNeighbors=3, minSize=(140,210))
#Marquer la cible avec un cadre rouge
for(x,y,w,h) in Va:
cv2.rectangle(img, (x,y), (x+w, y+h), (0,0,200),3)
#result.Jpg de sortie
cv2.imwrite("result.jpg ", img)
#Afficher l'image dans une fenêtre séparée
cv2.imshow('image', img)
cv2.waitKey(0)
Le résultat de sortie est le suivant. C'est dommage que le violoncelle ait été jugé à deux endroits et que seul le contrebus était hors du groupe.
Quand je me suis entraîné avec 2000 images incorrectes, c'est devenu comme suit. Cymbale Euphonium? J'ai trouvé intéressant que les courbes entre les espaces et le violoncelle d'alto ressemblent à des instruments de musique. Il semble logique d'augmenter le nombre d'images incorrectes.
・ J'ai pu créer un classificateur pour reconnaître les instruments de violon. ・ J'ai appris à créer un classificateur avec colabratory. ・ J'ai vaguement compris la méthode de calcul et les paramètres de reconnaissance d'image.
Étudier OpenCV ③ (Créer un classificateur) (https://qiita.com/takanorimutoh/items/5bd88f3d17239a147581)
Apprenez le classificateur OpenCV Cascade avec plusieurs images de position (https://pfpfdev.hatenablog.com/entry/20200715/1594799186)
Recommended Posts