[PYTHON] Améliorez rapidement la précision de détection en spécifiant les paramètres avec la détection de visage openCV

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. 00.ArchitectureopenCV.JPG

Bibliothèque de paramètres argparse

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 #).

Utilisation basique d'argparse

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.

Mettre les paramètres dans un tableau

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

Programme de détection de visage

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

Améliorez rapidement la précision de détection en spécifiant les paramètres avec la détection de visage openCV
Détection de visage avec Python + OpenCV
Détection de visage d'anime avec OpenCV
Détection de visage avec Python + OpenCV (rotation invariante)
[Python] Détection de visage par OpenCV (Haar Cascade)
Hello World et détection de visage avec OpenCV 4.3 + Python
Redimensionner, mosaïque, détection de visage avec OpenCV, parfois tampon d'éléphant
Génération d'images JPEG en spécifiant la qualité avec Python + OpenCV
Reconnaissance faciale avec OpenCV de Python
Reconnaissance faciale en temps réel avec vidéo acquise par getUserMedia [HTML5, openCV]
Essayez la détection des bords avec OpenCV
Un mémo lorsque le visage est détecté avec Python + OpenCV rapidement
Détection de visage avec Python + dlib
Détection des bords en temps réel avec OpenCV
Reconnaissance faciale / coupe avec OpenCV
Détection de visage avec Haar Cascades
Détection de visage avec YOLO Face (Windows10, Python3.6)
Détection de visage avec Lambda (Python) + Rekognition
[Python] Utilisation d'OpenCV avec Python (détection des bords)
[OpenCV] Identification personnelle avec photo du visage
Essayez la reconnaissance faciale avec python + OpenCV
Accélérer la lecture en spécifiant une trame OpenCV
J'ai essayé la détection de visage avec MTCNN
Découpez le visage avec Python + OpenCV
Reconnaissance faciale avec caméra avec opencv3 + python2.7
Détection des fonctionnalités OpenCV avec Google Colaboratory
Détection de chat avec OpenCV (distribution de modèles)
Reconnaissance d'objets avec openCV par traincascade
J'ai essayé la reconnaissance faciale avec OpenCV
Détection de visage à partir de plusieurs fichiers image avec openCV, découpez et enregistrez
Hello World et détection de visage avec opencv-python 4.2
Enregistrer la vidéo image par image avec Python OpenCV
Détection de visage en collectant des images d'Angers.
Installer en spécifiant la version avec pip
[python, openCV] base64 Reconnaissance faciale dans les images