MacOS Catalina 10.15.4
Python 3.7.6
Une bibliothèque qui peut effectuer un traitement d'image tel que la détection de visage à l'aide d'un modèle entraîné. On dit que dlib est utilisé. https://github.com/ageitgey/
C'est un code qui utilise face_recognition. https://github.com/komiyakomiyakomiya/face_trim
terminal
$ git https://github.com/komiyakomiyakomiya/face_trim.git
opencv-python==4.2.0.34
face-recognition==1.3.0
terminal
$ pip install opencv-python==4.2.0.34 face-recognition==1.3.0
face_trim.py
import os
from pathlib import Path
import subprocess
import sys
import cv2
import face_recognition
from IPython.display import display
from IPython.display import Image
cwd = Path().resolve()
def exec_cmd(cmd):
"""Exécution de la commande"""
#Supprimer s'il y a un espace avant ou après la chaîne cmd->Divisez par espace et faites une liste
cmd_split = cmd.strip().split()
#Obtenez une sortie standard avec les paramètres stdout
cp = subprocess.run(cmd_split, stdout=subprocess.PIPE)
# cp = subprocess.check_output(cmd_split)
if cp.returncode != 0:
print(f'{cmd_split[0]} faild.', file=sys.stderr)
sys.exit(1)
#Renvoie s'il y a une sortie standard
if cp.stdout is not None:
# bytes ->Décoder en str
return cp.stdout.decode('utf-8')
def get_face_location(img_path):
"""Obtenir les coordonnées du visage"""
img = face_recognition.load_image_file(img_path)
# location = face_recognition.face_locations(img, model='cnn')
location = face_recognition.face_locations(img, model='hog')
print(location)
# [(82, 175, 180, 76)]
top = location[0][0]
right = location[0][1]
bottom = location[0][2]
left = location[0][3]
return top, right, bottom, left
def get_face_location_cli(img_path):
"""Face de l'outil CLI_Exécuter la détection pour obtenir les coordonnées du visage
load_image_file()Utilisez ceci si la méthode ne peut pas être utilisée en raison d'un bogue"""
#Détecte le visage et le haut, Right, Bottom,Commande pour afficher les coordonnées de gauche en standard
cmd_face_detection = f'face_detection {img_path}'
# cmd_face_detection = f'face_detection --model cnn {img_path}'
#Recevoir la sortie standard
stdout = exec_cmd(cmd_face_detection)
print(stdout)
# /Users/USER_NAME/path/to/dir/input/Zinedine_Zidane_0001.jpg,89,181,192,77
#Liste séparée par des virgules
stdout_list = stdout.strip().split(',')
top = int(stdout_list[1])
right = int(stdout_list[2])
bottom = int(stdout_list[3])
left = int(stdout_list[4])
return top, right, bottom, left
def display_image(img_path):
"""Afficher l'image"""
#Chargement des images
img = cv2.imread(img_path)
#Obtenir l'extension
format = os.path.splitext(img_path)[1]
#Extension réussie(format)Encodé au format de
decoded_bytes = cv2.imencode(format, img)[1].tobytes()
print(cv2.imencode(format, img)[1])
# [[255]
# [216]
# [255]
# ...
# [103]
# [255]
# [217]]
# print(decoded_bytes)
# b'\xff\xd8\xff\xe0\x00\x10JFIF\x00\x01\x01\x0......
display(Image(data=decoded_bytes))
if __name__ == '__main__':
#Veuillez le remplacer par votre image préférée
file_name = f'Zinedine_Zidane_0001.jpg'
#Où mettre l'image d'origine
input_path = f'{cwd}/../input'
#Destination de sortie de l'image recadrée
output_path = f'{cwd}/../output'
#Créer s'il n'y a pas de répertoire de destination de sortie
os.makedirs(output_path, exist_ok=True)
#Obtenir les coordonnées du visage
top, right, bottom, left = get_face_location(f'{input_path}/{file_name}')
#Lire le fichier original
img = cv2.imread(f'{input_path}/{file_name}')
#afficher
display_image(f'{input_path}/{file_name}')
#garniture
img_face = img[top:bottom, left:right]
#Enregistrer dans le répertoire de sortie
cv2.imwrite(f'{output_path}/{file_name}', img_face)
#afficher
display_image(f'{output_path}/{file_name}')
if __name__ == '__main__':
#Où mettre l'image d'origine
input_path = f'{cwd}/../input'
#Destination de sortie de l'image recadrée
output_path = f'{cwd}/../output'
#Créer s'il n'y a pas de répertoire de destination de sortie
os.makedirs(output_path, exist_ok=True)
#Générer un objet chemin
path_obj = Path(input_path)
#Correspondance de motif avec glob
files_path = path_obj.glob('*')
#conversion posix
files_path_posix = [file_path.as_posix() for file_path in files_path]
print(files_path_posix)
for file_path in files_path_posix:
#Obtenir le nom du fichier
file_name = file_path.split('/')[-1]
#Obtenir les coordonnées du visage
top, right, bottom, left = get_face_location(file_path)
#Lire le fichier original
img = cv2.imread(file_path)
#afficher
display_image(file_path)
#garniture
img_face = img[top:bottom, left:right]
#Enregistrer dans le répertoire de sortie
cv2.imwrite(f'{output_path}/{file_name}', img_face)
#afficher
display_image(f'{output_path}/{file_name}')
J'ai parfois une erreur comme celle-ci.
AttributeError: module 'face_recognition' has no attribute 'load_image_file'
Le problème était également debout, mais je ne pouvais pas le résoudre même si j'essayais ce qui était écrit ici. https://github.com/ageitgey/face_recognition/issues/318
Quand j'ai abandonné et essayé la méthode de force brute pour obtenir les coordonnées du visage à partir de la sortie standard de l'outil CLI, cela a été corrigé avant que je le sache ...
J'ai écrit un article ici. Si ça ne te dérange pas
Merci d'avoir lu jusqu'au bout! Zidane n'a aucun sens. J'étais à mes côtés.
Recommended Posts