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.
Référence: https://www.tech-tech.xyz/haar-cascade.html
Il semble y avoir environ 3 modèles,
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.
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.
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.
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.
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
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
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
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.
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()
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/
● 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
La liste de fichiers générée à l'emplacement spécifié par -info est sortie. Créez-en plusieurs et fusionnez-les en un seul fichier à utiliser comme entrée pour la création de vecteurs.
Pour le moment, le contenu de nglist ne peut être que le nom du fichier. Aucun chemin de fichier requis.
⇒ [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
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