[PYTHON] Je veux détecter des objets avec OpenCV

Je souhaite détecter et découper un type d'objet spécifique d'une photographie. (Voitures, poissons, gens ..) Découvrez si vous pouvez le faire avec OpenCV.

Confirmation de la méthode de détection d'objet avec OpenCV

Référence: https://www.tech-tech.xyz/haar-cascade.html

Il semble y avoir environ 3 modèles,

  1. Correspondance de modèle (correspondance de modèle) Il compare les images telles qu'elles sont et extrait les parties avec une grande similitude. Il semble vulnérable à la rotation de l'image et aux changements d'échelle. Il renvoie également le degré de similitude, donc je n'ai pas d'autre choix que d'en juger.

  2. Extraction de points caractéristiques Contrairement aux modèles de modèle, différentes tailles et celles pivotées peuvent être extraites. Comme pour 1, il est difficile d'extraire "ces choses". Cela semble possible pour extraire des objets uniques qui n'ont pas de pièces de monnaie, de peintures spécifiques ou de différences subtiles.

  3. Utilisez un classificateur en cascade À l'aide d'un fichier en cascade qui a été appris en lisant à l'avance des centaines de fichiers d'images d'apprentissage, ces images sont extraites des images. Visage, personne, haut du corps, yeux. Il existe également des fichiers distribués, vous pouvez donc l'utiliser sans savoir s'il s'agit d'un visage. Fichier en cascade: https://github.com/opencv/opencv/tree/master/data/haarcascades Référence: http://opencv.jp/opencv-2.2/c/objdetect_cascade_classification.html

Il semble qu'un classificateur en cascade soit nécessaire pour détecter quelque chose qui est quelque peu ambigu que je veux faire.

Modèle de modèle si l'image est spécifiée. Si l'objet à extraire est spécifié, il s'agit d'une extraction de points caractéristiques, sinon c'est un classificateur en cascade.

Créer un classificateur en cascade

Référence: https://www.pro-s.co.jp/blog/system/opencv/6202

Il semble que le contenu écrit dans la destination de référence puisse être utilisé. Il semble que le nombre de fichiers d'apprentissage à augmenter puisse être augmenté avec l'outil utilitaire. * Je ne suis pas sûr de la précision, mais ...

opencv_createsamples -img ./pos/1/dist/spoon1.png  -vec ./vec/1.vec  -num 10  -bgthresh 0 
opencv_createsamples -img ./pos/1/src/spoon1.png  -vec ./vec/1.vec  -num 500  -bgthresh 0   -maxidev 40 -maxxangle 0.5 -maxyangle 1.5 -maxzangle 1.5

La sortie suivante est sortie à chaque étape pendant l'apprentissage pendant l'exécution d'opencv_traincascade, mais je ne suis pas sûr de ce que cela signifie.

opencv_traincascade -data ./cascade -vec ./vec/spoon1.vec -bg ./neg/jpg/nglist2.t
xt -numPos 50  -numNeg 50  -stagenumStages 12 

===== TRAINING 0-stage =====
<BEGIN
POS count : consumed   200 : 200
NEG count : acceptanceRatio    1000 : 1
Precalculation time: 1
+----+---------+---------+
|  N |    HR   |    FA   |
+----+---------+---------+
|   1|        1|        1|
+----+---------+---------+
|   2|        1|    0.016|
+----+---------+---------+
END>
Training until now has taken 0 days 0 hours 0 minutes 3 seconds.

Erreur 1 rencontrée

Lorsque je prépare le fichier d'entrée et exécute ʻopencv_traincascade ... `, l'erreur suivante se produit.

Train dataset for temp stage can not be filled. Branch training terminated.

Dans mon cas, cela n'a pas fonctionné car je n'avais pas le chemin, juste le nom de fichier du fichier négatif. Corrigé en insérant le chemin relatif à partir de l'emplacement d'exécution dans le fichier. ls -v | grep jpg > nglist.txt

#Au début de la ligne./neg/jpg/Ajouter
sed "s#^#./neg/jpg/#" nglist.txt >nglist2.txt

Erreur 2 rencontrée

Required leaf false alarm rate achieved. Branch training terminated.

Eh bien, il n'y a pas de réponse à cela, mais le problème est que l'étape progresse dans une certaine mesure et que la valeur par défaut 20 fois ne peut pas être atteinte, j'ai donc décidé de réduire la désignation de l'étape à un endroit où elle peut être effacée. Le nombre d'étapes pouvant être effacées change à mesure que le nombre d'échantillons augmente ou diminue, ce qui semble également être affecté.

-numStages Par défaut 20. 10 ou plus.

Cela apparaît plusieurs fois. Ceci est seulement nécessaire pour comprendre le sens. https://taktak.jp/2016/08/26/1618

Erreur 3 rencontrée

Ce n'est pas une erreur, mais l'entraînement ʻopencv_traincascade` ne progresse pas du tout ... Si j'omettais l'argument -numNeg, ce serait trop tard. Je ne sais pas exactement ce que vous faites, mais la valeur par défaut est 1000

Erreur 4 rencontrée

HOG cascade is not supported in 3.0 in function 'read'

J'ai créé un classificateur en cascade en spécifiant HOG dans le featureType de traing .. Quand j'ai essayé de le lire avec openCV et de l'utiliser, l'erreur ci-dessus s'est produite. Il semble que HOG n'est plus pris en charge.

Script d'exécution

import cv2
 
def main():
    #Lecture de l'image d'entrée (fichier image de test)
    img = cv2.imread("Nom du fichier cible de détection")
    
    #Classificateur de type en cascade (classificateur auto-fabriqué)
    cascade = cv2.CascadeClassifier("./cascade/cascade.xml") # 

    #Changer de face à balle (bien que vous puissiez le laisser tel quel)
    objects = cascade.detectMultiScale(img, scaleFactor=1.1, minNeighbors=3, minSize=(0, 0))

    #Entourez la zone du visage avec un rectangle rouge
    for (x, y, w, h) in objects:
        cv2.rectangle(img, (x, y), (x + w, y+h), (0,0,200), 3)

    #Enregistrer l'image du résultat
    cv2.imwrite("result.png ",img)
    

main()

Mais pas détecté ..

Je me demande si les données d'entrée ne sont pas bonnes ...

Essayez d'augmenter les fichiers d'exemple. .. http://mirai-links.com/2018/06/11/opencv-%E7%89%A9%E4%BD%93%E6%A4%9C%E5%87%BA%E3%80%81%E5%88%86%E9%A1%9E%E5%99%A8%E4%BD%9C%E6%88%90%E3%81%A8%E6%A4%9C%E5%87%BA%E3%83%86%E3%82%B9%E3%83%88%E3%80%80%E3%81%9D%E3%81%AE%EF%BC%92/

Augmenter les images

● Générez un exemple d'image en combinant le fichier image d'origine et l'image d'arrière-plan

opencv_createsamples -info ./pos/info/1.txt -img ./pos/spoon1.png   -bg ./neg/jpg/nglist.txt -num 10 -w 24 -h 24  -show -bgthresh 200

⇒ [Attention] Je dois décrire la position de l'objet cible dans la liste des fichiers de sortie, mais elle ne s'ajuste pas automatiquement et la taille de l'image entière est toujours spécifiée. Si vous procédez de cette façon, vous devez faire en sorte que l'arrière-plan et la taille d'entrée soient exactement les mêmes.

● Créer un fichier vectoriel à partir de la liste de fichiers

opencv_createsamples -info ./pos/2/dist/poslist.txt  -vec ./vec/3.vec  -num 1700

● Formation

opencv_traincascade -data ./cascade_harrlike/3/  -vec ./vec/3.vec  -bg ./neg/jpg/nglist2.txt -numPos 1500  -numNeg 1500  -numStages 10 -precalcValBufSize 2024 -precalcIdxBufSize 2024

Pas encore détecté.

De là, j'ai l'impression qu'il n'y a pas d'autre choix que d'organiser un peu les données d'entrée ... Suite. ..

Recommended Posts

Je veux détecter des objets avec OpenCV
J'ai essayé de détecter rapidement un mouvement avec OpenCV
Je souhaite détecter une connexion non autorisée à Facebook avec Jubatus (1)
Je veux faire ○○ avec les Pandas
Je veux déboguer avec Python
Je veux écrire un blog avec Jupyter Notebook
Je veux installer Python avec PythonAnywhere
Je veux analyser les journaux avec Python
Je veux jouer avec aws avec python
Je veux vérifier la position de mon visage avec OpenCV!
Détecter le retour du chat avec OpenCV
Je veux utiliser MATLAB feval avec python
Je veux moquer datetime.datetime.now () même avec pytest!
Je souhaite afficher plusieurs images avec matplotlib.
Je veux frapper 100 sciences des données avec Colaboratory
Je veux faire un jeu avec Python
Je veux être OREMO avec setParam!
Je souhaite utiliser le répertoire temporaire avec Python2
J'ai essayé de détecter un objet avec M2Det!
Je ne veux pas utiliser -inf avec np.log
#Unresolved Je veux compiler gobject-introspection avec Python3
Je souhaite utiliser ip vrf avec SONiC
Je veux résoudre APG4b avec Python (chapitre 2)
Je veux recommencer avec Migrate de Django
Je veux écrire dans un fichier avec Python
Essayez de détecter les poissons avec python + OpenCV2.4 (inachevé)
Je veux convertir une image en WebP avec sucette
Je veux détecter des images de chats d'Instagram
J'ai essayé d'extraire des fonctionnalités avec SIFT d'OpenCV
Je veux faire la transition avec un bouton sur le ballon
Je veux gérer l'optimisation avec python et cplex
Je veux escalader une montagne avec l'apprentissage par renforcement
Je veux résoudre SUDOKU
Je veux hériter de l'arrière avec la classe de données python
Je veux travailler avec un robot en python.
Je veux diviser une chaîne de caractères avec hiragana
Je veux AWS Lambda avec Python sur Mac!
Je souhaite créer manuellement une légende avec matplotlib
[TensorFlow] Je souhaite traiter des fenêtres avec Ragged Tensor
Je veux faire fonctionner un ordinateur quantique avec Python
Je veux lier une variable locale avec lambda
Je souhaite supprimer l'avertissement d'importation non résolue de Python avec vsCode
Je souhaite utiliser facilement les fonctions R avec le notebook ipython
Je souhaite spécifier une autre version de Python avec pyvenv
Je veux pouvoir analyser des données avec Python (partie 1)
Je veux créer un éditeur de blog avec l'administrateur de django
Je veux démarrer un environnement Jupyter avec une seule commande
[NetworkX] Je souhaite rechercher des nœuds avec des attributs spécifiques
Je veux faire une macro de clic avec pyautogui (désir)
Je veux changer le drapeau japonais en drapeau des Palaos avec Numpy
Je veux pouvoir analyser des données avec Python (partie 4)
Je veux colorier des photos en noir et blanc de souvenirs avec GAN
Je veux pouvoir analyser des données avec Python (partie 2)
Je veux assister automatiquement à des cours en ligne avec Python + Selenium!
Je veux faire une macro de clic avec pyautogui (Outlook)
[Python] Je souhaite utiliser l'option -h avec argparse
Je souhaite utiliser un environnement virtuel avec jupyter notebook!