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.
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. Pour plus de détails, je l'ai noté dans l'article "Astuces pour détecter efficacement un grand nombre d'images avec openCV".