Ubuntu 16.04 Python 3.7 opencv-python 4.1.0.25
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 **
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 ++.
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). Cette fois, utilisez l'API dans le cadre rouge.
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.
** 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.
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)
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 --Murata --narishige --okawa --yusei
Et voici le résultat de la reconnaissance!
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.
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