[PYTHON] Détection de visage à partir de plusieurs fichiers image avec openCV, découpez et enregistrez

J'ai créé un programme pour détecter les visages à partir de plusieurs fichiers image dans un dossier en utilisant openCV, découper la partie du visage et enregistrer l'image, c'est donc une introduction. Voici d'autres articles de référence sur openCV.

Le résumé environnemental est le suivant. 00.ArchitectureopenCV.JPG

Code Python

En utilisant le code expliqué dans l'article "Utiliser les paramètres de détection de visage openCV pour améliorer rapidement la précision de détection", le nom du fichier image, le nombre d'images, Les paramètres du modèle entraîné, detelcMultiScale, peuvent être spécifiés au moment de l'exécution. Je me demandais quel fichier source et quel fichier de sortie pouvaient être identifiés à partir du nom du fichier de sortie, mais j'ai arrêté car cela semblait gêner lors de l'apprentissage avec tensorFlow après cela.

import cv2, os, argparse, shutil

#Répertoire pour enregistrer l'image recadrée
SAVE_PATH = "./outputs/"

#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="alt",
        choices=CASCADE,
        help="cascade 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=80,
        help="minSize value of detectMultiScale."
  )
    parser.add_argument(
        "--input_dir",
        type=str,
        default="./input/",
        help="The path of input directory."
  )
    parser.add_argument(
        "--move_dir",
        type=str,
        default="/done/",
        help="The path of moving detected files."
  )

#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/

#Fichier de modèle formé
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"

#Acquérir la quantité de caractéristiques du classificateur en cascade
faceCascade = cv2.CascadeClassifier(cascade_path)

#Nombre de détections de visage réussies(Spécifiez 0 par défaut)
face_detect_count = 0

#Nombre d'échecs de détection de visage(Spécifiez 0 par défaut)
face_undetected_count = 0

#Stocker les fichiers dans des dossiers dans des variables(Stocke également les répertoires)
files =  os.listdir(FLAGS.input_dir)

#Si vous n'avez pas déplacé le fichier de réussite, supprimez et recréez le répertoire de sortie s'il existe
if FLAGS.move_dir == "":
    if os.path.exists(SAVE_PATH):
        shutil.rmtree(SAVE_PATH)
    os.mkdir(SAVE_PATH)

print(FLAGS)

#Lorsqu'un visage est détecté à partir des données d'image collectées, coupez-le et enregistrez-le.
for file_name in files:

    #Pour les fichiers(Si ce n'est pas un annuaire)
    if os.path.isfile(FLAGS.input_dir + file_name):

        #Lecture de fichier image
        img = cv2.imread(FLAGS.input_dir + file_name)
        
        #Comme il y a des fichiers qui échouent rarement lorsqu'il y a un grand nombre d'images, enregistrez la sortie et ignorez(Cause inconnue)
        if img is None:
            print(file_name + ':Cannot read image file')
            continue

        #Passer de la couleur à l'échelle de gris(Parce que le visage n'est pas détecté par la couleur)
        gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

        #Détection facial
        face = faceCascade.detectMultiScale(gray, scaleFactor=FLAGS.scale, minNeighbors=FLAGS.neighbors, minSize=(FLAGS.min, FLAGS.min))

        if len(face) > 0:
            for rect in face:
                #Sortie d'image recadrée
                cv2.imwrite(SAVE_PATH + str(face_detect_count) + file_name, img[rect[1]:rect[1] + rect[3], rect[0]:rect[0] + rect[2]])
                face_detect_count = face_detect_count + 1
                
            #Déplacer le fichier détecté
            if FLAGS.move_dir != "":
                shutil.move(FLAGS.input_dir + file_name, FLAGS.input_dir + FLAGS.move_dir)
        else:
            print(file_name + ':No Face')
            face_undetected_count = face_undetected_count + 1
            
print('Undetected Image Files:%d' % face_undetected_count)

Avant l'exécution, créez les dossiers d'entrées et de sorties directement sous celui-ci et placez les images dans le dossier d'entrées. Exécutez-le sur la ligne de commande. Puisque la valeur initiale est donnée, vous n'avez pas besoin de spécifier de paramètres.

python openCVCutAndSave01_20170804.py

Bien sûr, vous pouvez également donner des paramètres et exécuter.

python openCVCutAndSave01_20170804.py --cascade "alt" --image_file "cut_source" --image_count 4 --scale 1.1 --neigbors 3 --min 50

L'image dans le dossier des entrées est découpée et sortie dans le dossier des sorties, et l'image dont le visage peut être détecté est déplacée vers le dossier terminé. Puisqu'il est pratique de diviser les dossiers en fonction de la présence ou de l'absence de détection lors du traitement d'une grande quantité d'images, nous avons fait cette spécification. 10.openCVResult.JPG Pour plus de détails, je l'ai noté dans l'article "Astuces pour détecter efficacement un grand nombre d'images avec openCV".

Recommended Posts

Détection de visage à partir de plusieurs fichiers image avec openCV, découpez et enregistrez
Je veux découper uniquement le visage d'une image de personne avec Python et l'enregistrer ~ Détection de visage et rognage avec face_recognition ~
Découpez le visage avec Python + OpenCV
Détection de visage avec Python + OpenCV
Détection de visage d'anime avec OpenCV
Découpez une image d'une vidéo toutes les secondes avec Python + OpenCV
Découpez une image avec python
Enregistrer et récupérer des fichiers avec Pepper
Coupons le visage de l'image
Détection de visage avec Python + OpenCV (rotation invariante)
Hello World et détection de visage avec opencv-python 4.2
Modifier et enregistrer des fichiers en lecture seule avec vim
Acquisition d'images depuis une caméra avec Python + OpenCV
Découpez et connectez des images avec ImageMagick
Redimensionner, mosaïque, détection de visage avec OpenCV, parfois tampon d'éléphant
Un mémo qui détecte le visage de l'image acquise à partir de la caméra Web avec OpenCV de Django et le renvoie.
Capture d'image / comparaison de la vitesse OpenCV avec et sans GPU
[Ubuntu] [Python] Comparaison de la détection de visage entre dlib et OpenCV
Supprimer les en-têtes de fichiers CSV à plusieurs formats avec python
[Python] Envoyer gmail avec python: envoyez un par un avec plusieurs fichiers image en pièce jointe
Améliorez rapidement la précision de détection en spécifiant les paramètres avec la détection de visage openCV
Détection d'image de visage similaire utilisant la reconnaissance faciale et le clustering PCA et K-means
[Python] Lecture facile des fichiers image du numéro de série avec OpenCV
Reconnaissance faciale avec OpenCV de Python
Édition d'image avec python OpenCV
Détection de visage avec Python + dlib
Tri des fichiers image avec Python (2)
Tri des fichiers image avec Python (3)
Détection des bords en temps réel avec OpenCV
Tri des fichiers image avec Python
Obtenez des fonctionnalités d'image avec OpenCV
Reconnaissance faciale / coupe avec OpenCV
Détection de visage avec Haar Cascades
Reconnaissance d'image avec Keras + OpenCV
Interpolation automatique des images avec OpenCV et Python (méthode de marche rapide, Navier-Stokes)
[AWS] Recherchez et acquérez les données nécessaires à partir des fichiers S3 avec S3 Select
[Traitement d'image] Poo-san est nu par détection de bord en utilisant Python et OpenCV!
Dessinez une illusion d'aquarelle avec détection des contours en Python3 et openCV3
J'ai essayé de couper une image fixe de la vidéo
ZOOM en remplaçant votre visage par une icône Twitter avec la reconnaissance faciale openCV
Obtenez les conditions de simulation OCTA à partir d'un fichier et enregistrez avec les pandas
Utilisez Firefox avec Selenium depuis python et enregistrez la capture d'écran
[Explication pour les débutants] Mécanisme de détection de visage OpenCV et pratique (détecter MultiScale)
[Python] Essayez de reconnaître les caractères des images avec OpenCV et pyocr
Comment mettre OpenCV dans Raspberry Pi et collecter facilement des images des résultats de détection de visage avec Python