[PYTHON] Créez un classificateur en cascade avec Google Colaboratory

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.

0. Cet objectif

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.

instruments.jpg

1. Préparation

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

1-1. Préparation de l'environnement google colab

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

1-2. Préparation des données d'image

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

Va003.jpg

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

1-3. Téléchargez mergevec.py

Téléchargement depuis page github maergevec.

2. Créez un cahier

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

2-1. Changement environnemental

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

3. Préparation du dossier de formation

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

3-1. Création d'un fichier de données de réponse correct

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.

3-2. Création d'un fichier de données incorrect

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.

4. Créer un classificateur

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.

5. Historique de l'exécution

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.

6. Évaluation

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.

6000-3000-140-210.jpg

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.

6000-2000-140-210.jpg

7. Résumé

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

Sites auxquels j'ai fait référence

É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

Créez un classificateur en cascade avec Google Colaboratory
Étudiez Python avec Google Colaboratory
Faites une loterie avec Python
Essayez OpenCV avec Google Colaboratory
Création d'un classificateur en cascade avec opencv
Créons facilement un gif mathématique en utilisant Google Colaboratory
Faire un feu avec kdeplot
Créer un identifiant Santa à partir d'une image du Père Noël
Faisons une interface graphique avec python.
Faites un son avec le notebook Jupyter
Faisons une rupture de bloc avec wxPython
Créer un système de recommandation avec python
Détection des fonctionnalités OpenCV avec Google Colaboratory
Créer un filtre avec un modèle django
Faisons un graphe avec python! !!
Faisons un spacon avec xCAT
Créer un itérateur de modèle avec PySide
Détection de visage à l'aide d'un classificateur en cascade
Faire un joli graphique avec plotly
Collaboratoire Google
Faisons un jeu de shiritori avec Python
Créez un simulateur de gacha rare avec Flask
Créez un pipeline de notebook avec Kedro + Papermill
Faire une figure partiellement zoomée avec matplotlib
Créez un quiz de dessin avec kivy + PyTorch
Faisons la voix lentement avec Python
Comment rechercher Google Drive dans Google Colaboratory
Faisons un langage simple avec PLY 1
Faire un circuit logique avec Perceptron (Perceptron multicouche)
Utilisation du noyau Jupyter de Java avec Google Colaboratory
Utilisez TPU et Keras avec Google Colaboratory
Faire Oui Non Popup avec Kivy
Faire une minuterie de lavage-séchage avec Raspberry Pi
Créer une animation GIF avec surveillance des dossiers
Créez un framework Web avec Python! (1)
Faisons une IA à trois yeux avec Pylearn 2
Créez une application de bureau avec Python avec Electron
Faisons un bot Twitter avec Python!
Créez un framework Web avec Python! (2)
Un mémorandum pour faire WebDAV uniquement avec nginx
Fabriquer un appareil de surveillance avec un capteur infrarouge
Créez un simple générateur d'images par points avec Flask
Comment créer un dictionnaire avec une structure hiérarchique.
Je veux faire un jeu avec Python
Essayez de créer un code de "décryptage" en Python
Remplaçons UWSC par Python (5) Faisons un robot
Essayez de créer un groupe de dièdre avec Python
[Chat De Tornado] Créez un chat en utilisant WebSocket dans Tornado
Transformez les données de vacances en une trame de données avec les pandas
Créer un bot LINE WORKS avec Amazon Lex
(Mémorandum) Créer un diagramme de dispersion 3D avec matplodlib
Cheet sheet lors du scraping avec Google Colaboratory (Colab)
Faire un bot d'analyse morphologique de manière lâche avec LINE + Flask
Faisons un outil de veille de commande avec python
Faire une copie d'un fichier Google Drive à partir de Python