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 ~

Choses à faire

cette

Zinedine_Zidane_0001

comme ça

Zinedine_Zidane_0001 jpg 03-36-34-700

environnement

MacOS Catalina 10.15.4
Python 3.7.6

Qu'est-ce que face_recognition?

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/

Dépôt

C'est un code qui utilise face_recognition. https://github.com/komiyakomiyakomiya/face_trim

terminal


$ git https://github.com/komiyakomiyakomiya/face_trim.git

Bibliothèque

opencv-python==4.2.0.34
face-recognition==1.3.0

Installation

terminal


$ pip install opencv-python==4.2.0.34 face-recognition==1.3.0

code

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

Couper toutes les images du répertoire

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

Erreur

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

Images recadrées en cluster

J'ai écrit un article ici. Si ça ne te dérange pas

La fin

Merci d'avoir lu jusqu'au bout! Zidane n'a aucun sens. J'étais à mes côtés.

Recommended Posts

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étection de visage à partir de plusieurs fichiers image avec openCV, découpez et enregistrez
Il est difficile d'installer un écran vert, je n'ai donc découpé que le visage et l'ai superposé sur l'image de fond
[python] Envoyez l'image capturée de la caméra Web au serveur et enregistrez-la
J'ai exécuté GhostScript avec python, divisé le PDF en pages et l'ai converti en image JPEG.
J'ai créé un serveur avec socket Python et ssl et j'ai essayé d'y accéder depuis le navigateur
Démarrez la webcam, prenez une image fixe et enregistrez-la localement
Je veux utiliser uniquement la commande SMTP MAIL FROM et la commande RCPT TO sans envoyer de courrier avec le smtplib de Python
L'histoire de la création d'un outil pour charger une image avec Python ⇒ l'enregistrer sous un autre nom
Je veux écrire dans un fichier avec Python
Le fichier édité avec vim était en lecture seule, mais je veux le sauvegarder
Je veux écrire un élément dans un fichier avec numpy et le vérifier.
Je veux gérer l'optimisation avec python et cplex
Je veux hériter de l'arrière avec la classe de données python
Je veux travailler avec un robot en python.
Je veux faire fonctionner un ordinateur quantique avec Python
[Python] J'ai créé un système pour introduire "la recette que je veux vraiment" depuis le site de recettes!
[Introduction au trading système] J'ai dessiné un oscillateur stochastique avec python et joué avec ♬
Je veux remplacer les variables dans le fichier de modèle python et le produire en masse dans un autre fichier
Traitement d'image avec Python (j'ai essayé de le binariser en art mosaïque 0 et 1)
J'ai essayé de trouver l'entropie de l'image avec python
POSTEZ l'image sélectionnée sur le site Web avec multipart / form-data et enregistrez-la sur Amazon S3! !!
Obtenez de manière récursive la liste Excel dans un dossier spécifique avec python et écrivez-la dans Excel.
Renvoyez les données d'image avec Flask of Python et dessinez-les dans l'élément canvas de HTML
[Python] J'ai installé le jeu depuis pip et j'ai essayé de jouer
Je veux installer le package de requirements.txt avec poésie
Je souhaite envoyer un message de Python à LINE Bot
J'ai créé une fonction pour découper l'image de python openCV, alors veuillez l'utiliser.
J'ai aussi essayé d'imiter la fonction monade et la monade d'état avec le générateur en Python
Je veux connaître la nature de Python et pip
J'ai essayé de trier les objets de l'image du plat de steak-① Détection d'objets
[Python] Je veux être une personne gourmande [Approche basée sur les données] Choisir un magasin pour les fêtes de fin d'année et du Nouvel An
Je veux faire un changeur de voix en utilisant Python et SPTK en référence à un site célèbre
(Mémo) Jusqu'à ce que vous extrayiez uniquement la partie que vous voulez d'une certaine page Web, convertissez-la en page Sphinx et imprimez-la au format PDF
Je veux obtenir des informations de fstab à la destination de la connexion ssh et exécuter la commande
J'ai créé un robot Line qui devine le sexe et l'âge d'une personne à partir de l'image
Je souhaite extraire une URL arbitraire de la chaîne de caractères de la source html avec python
Chapitre 1 Introduction à Python Découpez uniquement les bons points de Deeplearning à partir de zéro
J'ai essayé de trouver la différence entre A + = B et A = A + B en Python, alors notez
Je veux clarifier la question de la méthode "__init__" et de l'argument "self" de la classe Python.
Je souhaite enregistrer l'heure d'exécution et conserver un journal.
Je souhaite utiliser un caractère générique que je souhaite décortiquer avec Python remove
Je veux connaître la météo avec LINE bot avec Heroku + Python
Je veux sortir le début du mois prochain avec Python
Essayez d'extraire une chaîne de caractères d'une image avec Python3
Je souhaite rechercher le texte intégral avec elasticsearch + python
J'ai essayé de faire un processus d'exécution périodique avec Selenium et Python
Je voulais résoudre le problème ABC164 A ~ D avec Python
[Introduction] Je veux créer un robot Mastodon avec Python! 【Débutants】
Je veux créer un fichier pip et le refléter dans le menu fixe
Je veux vérifier la position de mon visage avec OpenCV!
Utilisez Firefox avec Selenium depuis python et enregistrez la capture d'écran
Découpez une image avec python
Découpez le visage avec Python + OpenCV
Coupons le visage de l'image
Je veux déboguer avec Python
Python - Obtenez le taux de bitcoin BTC / JPY à partir de bitflyer à intervalles réguliers et enregistrez-le dans un fichier
Exportez le rapport au format PDF à partir de DB avec Python et attachez-le automatiquement à un e-mail et envoyez-le
J'ai essayé de trier les objets de l'image du plat de steak --③ Image similaire Détection de carte de chaleur