Lors de la détection d'un visage en utilisant openCV, ** "1. Quel modèle entraîné (fichier en cascade) dois-je utiliser?" Et "2. Que dois-je faire avec les paramètres de la méthode detectMultiScale?" ** Je pense que c'est loin d'être déroutant. Je vais. Les deux ci-dessus sont indispensables pour améliorer la précision de détection et il est inefficace de réécrire et d'exécuter le programme un par un. Ceci est une introduction sur la façon de spécifier des paramètres (sans changer de programme) et de les exécuter afin d'améliorer rapidement la précision de détection. Voici d'autres articles de référence sur openCV.
Le résumé environnemental est le suivant.
argparse fait partie de la bibliothèque standard Python qui vous aide à utiliser les arguments du programme. Pour plus d'informations, veuillez contacter Aide officielle et [Tutoriel officiel](https://docs.python.jp/3/howto/argparse. Veuillez vous référer au html #).
C'est un moyen simple d'utiliser argparse. Écrivez ce code et enregistrez-le sous "argparse_test01.py" ([Tutoriel "Introduction of Positioning Arguments"](https://docs.python.jp/3/howto/argparse.html#introducing- Cité à partir des arguments de position)).
import argparse
import argparse
parser = argparse.ArgumentParser()
parser.add_argument("square",
help="display a square of a given number",
type=int)
args = parser.parse_args()
print(args.square**2)
Tout d'abord, obtenez de l'aide sur la ligne de commande.
python argparse_test01.py --h
Ensuite, il renverra une description des paramètres définis.
usage: argparse_test01.py [-h] square
positional arguments:
square display a square of a given number
optional arguments:
-h, --help show this help message and exit
Maintenant, exécutez le programme sur la ligne de commande.
python argparse_test01.py 4
Ensuite, la valeur "16" qui est le carré de "4" spécifié comme paramètre est renvoyée.
Placez les paramètres dans un tableau comme utilisé dans le tutoriel tensorflow C'était.
argparse_test02.py
import argparse
#Modèle de base
FLAGS = None
def main():
print(FLAGS.parameter1)
print(FLAGS.parameter2)
if __name__ == '__main__':
parser = argparse.ArgumentParser()
parser.add_argument(
'--parameter1',
type=float,
default=0.01,
help='Parameter1.'
)
parser.add_argument(
'--parameter2',
type=int,
default=2000,
help='Parameter2.'
)
FLAGS, unparsed = parser.parse_known_args()
main()
Si vous l'exécutez avec la commande suivante, la valeur du paramètre sera sortie telle quelle.
python argparse_test02.py --parameter1 3.23 --parameter2 112
En passant, vous pouvez également définir des abréviations en spécifiant deux. Dans ce cas, vous pouvez également spécifier le paramètre avec "-p".
parser.add_argument(
'-p',
'--parameter',
type=int,
default=2000,
help='Parameter2.'
)
Comme je l'ai écrit au début, "1. Modèle formé (fichier en cascade)" et "2. Paramètres de la méthode detectMultiScale", puis paramétrez le nom du fichier image. Le code ressemble à ceci.
openCVWithParameter01.py
import cv2
import argparse
#Paramètres de base du modèle
FLAGS = None
#Types de modèles formés
cascade = ["default","alt","alt2","tree","profile","nose"]
#Passer si courir directement(Importé et ne passe pas au moment de l'exécution)
if __name__ == "__main__":
parser = argparse.ArgumentParser()
parser.add_argument(
"--cascade",
type=str,
default="default",
choices=cascade,
help="cascade file."
)
parser.add_argument(
"--image_file",
type=str,
default="cut_source0.jpg ",
help="image file."
)
parser.add_argument(
"--scale",
type=float,
default=1.3,
help="scaleFactor value of detectMultiScale."
)
parser.add_argument(
"--neighbors",
type=int,
default=2,
help="minNeighbors value of detectMultiScale."
)
parser.add_argument(
"--min",
type=int,
default=30,
help="minSize value of detectMultiScale."
)
#Acquisition et exécution des paramètres
FLAGS, unparsed = parser.parse_known_args()
#Répertoire du trieur(Obtenu à partir de)
# https://github.com/opencv/opencv/blob/master/data/haarcascades/
# https://github.com/opencv/opencv_contrib/blob/master/modules/face/data/cascades/
if FLAGS.cascade == cascade[0]:#"default":
cascade_path = "./models/haarcascade_frontalface_default.xml"
elif FLAGS.cascade == cascade[1]:#"alt":
cascade_path = "./models/haarcascade_frontalface_alt.xml"
elif FLAGS.cascade == cascade[2]:#"alt2":
cascade_path = "./models/haarcascade_frontalface_alt2.xml"
elif FLAGS.cascade == cascade[3]:#"tree":
cascade_path = "./models/haarcascade_frontalface_alt_tree.xml"
elif FLAGS.cascade == cascade[4]:#"profile":
cascade_path = "./models/haarcascade_profileface.xml"
elif FLAGS.cascade == cascade[5]:#"nose":
cascade_path = "./models/haarcascade_mcs_nose.xml"
#Fichiers utilisés et répertoires d'entrée / sortie
image_path = "./inputs/" + FLAGS.image_file
output_path = "./outputs/" + FLAGS.image_file
#Pour la confirmation de l'annuaire(Pour quand les choses tournent mal)
#import os
#print(os.path.exists(image_path))
#Lecture de fichiers
image = cv2.imread(image_path)
#Conversion de l'échelle de gris
image_gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
#Acquérir la quantité de caractéristiques du classificateur en cascade
cascade = cv2.CascadeClassifier(cascade_path)
#Exécution de la reconnaissance d'objets (reconnaissance faciale)
#image - CV_Matrice de type 8U. Les objets sont détectés dans les images stockées ici
#objects -Un vecteur dont les éléments sont des rectangles. Chaque rectangle contient l'objet détecté
#scaleFactor -Représente la quantité de réduction à chaque échelle d'image
#minNeighbors -Les rectangles candidats doivent contenir au moins ce nombre de rectangles voisins
#flags -Ce paramètre n'est pas utilisé dans la nouvelle cascade. Pour les cascades plus anciennes, il a la même signification que pour la fonction cvHaarDetectObjects.
#minSize -La taille minimale qu'un objet peut prendre. Les objets plus petits seront ignorés
facerect = cascade.detectMultiScale(image_gray, scaleFactor=FLAGS.scale, minNeighbors=FLAGS.neighbors, minSize=(FLAGS.min, FLAGS.min))
#print(facerect)
color = (255, 255, 255) #blanc
#Une fois détecté
if len(facerect) > 0:
#Créez un rectangle qui entoure le visage détecté
for rect in facerect:
cv2.rectangle(image, tuple(rect[0:2]),tuple(rect[0:2]+rect[2:4]), color, thickness=2)
#Enregistrer les résultats de la reconnaissance
cv2.imwrite(output_path, image)
Tout ce que vous avez à faire est de l'exécuter. Cela réduira le temps et les efforts nécessaires pour réécrire et exécuter le programme, et devrait améliorer l'efficacité! ** **
python openCVWithParameter01.py --scale 1.3 --neighbors 1 --image_file "cut_source1.jpg " --cascade "nose" --min 50
Bien entendu, il est possible d'exécuter la valeur par défaut sans spécifier le paramètre.
python openCVWithParameter01.py
Recommended Posts