[PYTHON] J'ai essayé la reconnaissance faciale avec Face ++

Environnement d'exécution

Ubuntu 16.04 Python 3.7 opencv-python 4.1.0.25

Aperçu

Essayez la reconnaissance faciale à l'aide de l'API "Face ++" développée par la Chine. La procédure est la suivante.

** ① Enregistrement du compte ② Obtenez l'API à utiliser ③ Confirmation de la démo ④ Programme ⑤ Reconnaissance faciale **

** ① Enregistrement du compte **

Tout d'abord, vous devez créer un compte pour utiliser Face ++. Inscrivez-vous sur la page officielle et obtenez votre ** API Key ** et ** API Secret **. Ceux-ci sont obligatoires lors de l'utilisation de chaque API.

Vous pouvez vérifier la clé API et le secret API créés avec Apps / clé API de Face ++. a.png

** ② Obtenez l'API à utiliser **

Il existe trois types d'API utilisés dans le programme de reconnaissance faciale créé cette fois. Les deux existent dans un groupe appelé reconnaissance faciale, Utilisez ** Detect API ** et ** Search API ** pour identifier les visages et ** FaceSet Create API ** pour enregistrer les visages. Vous pouvez vérifier les paramètres de chaque API dans la [Référence API] officielle (https://console.faceplusplus.com/documents/5678948). b.png Cette fois, utilisez l'API dans le cadre rouge.

** ③ Confirmer la démo **

Il existe une Démo sur la page officielle Face ++ pour l'API de recherche, etc., voyons donc quel type de sortie vous pouvez obtenir. Screenshot from 2019-11-13 10-34-50.png

** Probe Face </ font> ** dans la figure ci-dessus est l'image source de comparaison. ** Candidate Face </ font> ** est sélectionné parmi les images de la base de données par ordre décroissant de similitude. (Dans le programme de reconnaissance faciale à créer, Probe Face </ font> est utilisé comme image d'entrée inconnue. Préparez Visage candidat </ font> comme une image de la personne que vous voulez reconnaître. )

Le résultat de la comparaison de chaque image est généré sous forme de fichier JSON.

résultat.json


{
  "time_used": 420,
  "thresholds": {
    "1e-3": 62.327,
    "1e-5": 73.975,
    "1e-4": 69.101
  },
  "faces": [
    {
      "face_token": "8d25b53edf9e20bad18bebe3b0c8e06c",
      "face_rectangle": {
        "width": 252,
        "top": 170,
        "height": 252,
        "left": 102
      }
    }
  ],
  "results": [
    {
      "confidence": 97.076,
      "user_id": "",
      "face_token": "8323ce719cb1129e4abf4ada1129cbc9"
    },
    {
      "confidence": 93.254,
      "user_id": "",
      "face_token": "fd6c81b63615b62b8506f33a6748fd95"
    },
    {
      "confidence": 66.15,
      "user_id": "",
      "face_token": "192672385b603e6b54cf884cd019a620"
    },
    {
      "confidence": 63.826,
      "user_id": "",
      "face_token": "34bbf05899b53968dcee620aa06a35e7"
    },
    {
      "confidence": 57.875,
      "user_id": "",
      "face_token": "ee6cbca281f449d3ed6040ca63b4c52c"
    }
  ],
  "image_id": "+b1mqy/4tPkV6QMTyRVGyA==",
  "request_id": "1573608536,e6ac4f2a-62fb-40a9-890b-696eba9a32a1"
}

Chaque élément de la clé de résultats représente le résultat de la comparaison entre Probe Face </ font> et Candidate Face </ font>. La similitude entre les deux images est sortie comme ** "confiance" **. En regardant les résultats ci-dessus, la confiance de Candidate Face1 </ font> est de 97,076, La confiance de Candidate Face2 </ font> est de 93,254, ce qui représente un degré élevé de similitude. Les autres résultats sont inférieurs à la similitude 70. Créez un programme de reconnaissance faciale en utilisant cette similitude.

④ Programme

Le programme de reconnaissance faciale est le suivant. Pour savoir comment utiliser l'API, j'ai fait référence à l'URL suivante. https://github.com/Doarakko/api-challenge/tree/master/facepp-api

main.py



import time
import re
import base64
import requests
import glob
import cv2

API_KEY = 'Ma clé API'
API_SECRET = 'Mon secret API'

#API pour détecter le visage
def detect_image(img):
    endpoint = 'https://api-us.faceplusplus.com'
    response = requests.post(
        endpoint + '/facepp/v3/detect',
        {
            'api_key': API_KEY,
            'api_secret': API_SECRET,
            'image_base64': img,
        }
    )
    #1 seconde de sommeil
    time.sleep(1)
    #Si le code d'état de la réponse est différent de 200
    if response.status_code != 200:
        print('[Error] ')
        return -1
    resources = response.json()
    return resources

#API d'identification de visage
def search_image(img,face_set):
    endpoint = 'https://api-us.faceplusplus.com'
    res, dst_data = cv2.imencode('.jpg', img)
    img_base64 = base64.b64encode(dst_data)
    #Envoyez une requête à l'API de détection de visage
    faces=detect_image(img_base64)
    for face in faces["faces"]:
        try:
            response = requests.post(
                endpoint + '/facepp/v3/search',
                {
                    'api_key': API_KEY,
                    'api_secret': API_SECRET,
                    'face_token': str(face["face_token"]),
                    'faceset_token': face_set["faceset_token"],
                    'return_result_count': 1,
                }
            )
            #1 seconde de sommeil
            time.sleep(1)
            #Si le code d'état de la réponse est différent de 200
            if response.status_code != 200:
                return -1
            resources = response.json()
            print("Succès")
            print(resources)
            img=draw_img(face,resources,img)
        except Exception as e:
            return -1
    #Enregistrer l'image
    cv2.imwrite("./output/result_"+filename, img)
    return resources

#Dessinez des informations sur le visage avec la probabilité la plus élevée
def draw_img(face,resources,img):
    try:
        left = face["face_rectangle"]["left"]
        top = face["face_rectangle"]["top"]
        right = left + face["face_rectangle"]["width"]
        bottom = top + face["face_rectangle"]["height"]
        #Dessinez un rectangle
        cv2.rectangle(img, (left, top), (right, bottom), (0, 0, 255), 3)
        font = cv2.FONT_HERSHEY_SIMPLEX
        #Dessin de probabilité
        cv2.putText(img, str(resources["results"][0]["confidence"]) + "%", (left, top), font, 0.5, (255, 255, 255), 3, cv2.LINE_AA)
        cv2.putText(img, str(resources["results"][0]["confidence"]) + "%", (left, top), font, 0.5, (0, 0, 0), 1, cv2.LINE_AA)
        #Dessiner le nom
        cv2.putText(img, str(resources["results"][0]["user_id"]) , (left, top-20), font, 0.5, (255, 255, 255), 3, cv2.LINE_AA)
        cv2.putText(img, str(resources["results"][0]["user_id"]) , (left, top-20), font, 0.5, (0, 0, 0), 1, cv2.LINE_AA)
    except Exception as e:
        print("none")

    return img

#Enregistrer les images de visage pour comparer
def create_faceset(face_list,tags):
    id_list = []
    for (img_path,face_id) in zip(face_list,tags):
        img_file = base64.encodebytes(open(img_path, 'rb').read())
        resources = detect_image(img_file)
        set_userid(resources["faces"][0]["face_token"],face_id)
        id_list.append(resources["faces"][0]["face_token"])

    id_list=str(id_list).replace("'", "")
    id_list=str(id_list).replace("[", "")
    id_list=str(id_list).replace("]", "")
    id_list=str(id_list).replace(" ", "")

    print(resources)
    print(id_list)

    endpoint = 'https://api-us.faceplusplus.com'
    try:
        response = requests.post(
            endpoint + '/facepp/v3/faceset/create',
            {
                'api_key': API_KEY,
                'api_secret': API_SECRET,
                'display_name': 'facebank',
                'face_tokens': id_list,
            }
        )
        #1 seconde de sommeil
        time.sleep(1)
        #Si le code d'état de la réponse est différent de 200
        if response.status_code != 200:
            return -1
        resources = response.json()
        print(resources)
        return resources
    except Exception as e:
        return -1

def set_userid(face_token,user):
    endpoint = 'https://api-us.faceplusplus.com'
    try:
        response = requests.post(
            endpoint + '/facepp/v3/face/setuserid',
            {
                'api_key': API_KEY,
                'api_secret': API_SECRET,
                'display_name': 'facebank',
                'face_token':face_token,
                'user_id':user,
        }
        )
        #1 seconde de sommeil
        time.sleep(1)
        #Si le code d'état de la réponse est différent de 200
        if response.status_code != 200:
            return -1
        resources = response.json()
        print(resources)
        return resources
    except Exception as e:
        return -1

if __name__ == '__main__':
    #Obtenez l'image que vous souhaitez identifier
    filename="input.jpg "
    img=cv2.imread('./input/'+filename)
    #Obtenir des images dans un dossier
    face_list = glob.glob('./facebank/*/*.jpg')
    face_list.sort()
    tags=[]#Chaque nom(user_id)Pour le stockage
    #Lire à partir des données d'enregistrement
    for face_path in face_list:
        tags.append(str(re.search(r'./facebank/(.+)/.+', face_path).group(1)))
    #Définir des visages à comparer avec l'API
    face_set = create_faceset(face_list,tags)
    #Envoyer une demande à l'API d'identification
    resources = search_image(img,face_set)

Pour les arguments de chaque API, reportez-vous à Référence officielle.

La hiérarchie des dossiers est la suivante.

─ facebank/
    ├ A/ 
    │ └ A.jpg
    ├ B/ 
    │ └ B.jpg
    ├ C/ 
    │ └ C.jpg
    ├ D/ 
    │ └ D.jpg
    └ E/
      └ E.jpg
─ input/
    └ input.jpg
─ output/
    └ result_input.jpg
─ main.py

Placez l'image à identifier dans le dossier d'entrée. Préparez un dossier avec le nom de chaque personne dans le dossier Facebank, Mettez votre photo de visage dans ce dossier. (Le nom de la photo du visage est arbitraire)

⑤ Reconnaissance faciale

Maintenant, la reconnaissance faciale. Les photos à enregistrer et à reconnaître ont été empruntées à "Pakutaso", qui publie gratuitement des documents de personnes. Les 5 photos suivantes sont enregistrées comme cibles de reconnaissance cette fois.

--ezaki ezakisan --Murata muratasan --narishige muratasan --okawa muratasan --yusei muratasan

Et voici le résultat de la reconnaissance! result.jpg result_helpIMGL6330_TP_V.jpg result_PAK86_sotugyousei15213941_TP_V.jpg result_N612_shibuyagawadedenwasuruikemen_TP_V.jpg

Toutes les personnes qui ont enregistré leurs visages sont correctes avec un degré de similitude de 80% ou plus! Le nombre de photos de visage enregistrées est d'une pour chaque personne, mais il est très précis.

Les personnes avec des visages non enregistrés sont également identifiées comme présentant le plus haut degré de similitude parmi les personnes enregistrées, On peut voir que le degré de similitude est faible comme le montre la figure ci-dessous. 333.jpg 222.jpg

Si vous créez un compte avec Face ++, vous pouvez effectuer une reconnaissance faciale avec votre propre image sur la Démo sur la page WEB. Si vous êtes intéressé, pourquoi ne pas essayer.

Recommended Posts