Ubuntu 16.04 Python 3.7 opencv-python 4.1.0.25
Versuchen Sie die Gesichtserkennung mit der von China entwickelten API "Face ++". Das Verfahren ist wie folgt.
** ① Kontoregistrierung ② Holen Sie sich die API zu verwenden ③ Bestätigung der Demo ④ Programm ⑤ Gesichtserkennung **
Zunächst müssen Sie ein Konto registrieren, um Face ++ verwenden zu können. Registrieren Sie sich auf der offiziellen Seite und erhalten Sie Ihren ** API-Schlüssel ** und ** API-Geheimnis **. Diese sind bei Verwendung jeder API erforderlich.
In dem diesmal erstellten Gesichtserkennungsprogramm werden drei Arten von APIs verwendet. Beide existieren in einer Gruppe namens Gesichtserkennung, Verwenden Sie ** Erkennungs-API ** und ** Such-API **, um Gesichter zu identifizieren, und ** FaceSet Create API **, um Gesichter zu registrieren. Sie können die Parameter jeder API in der offiziellen API-Referenz überprüfen. Verwenden Sie diesmal die API im roten Rahmen.
Auf der offiziellen Face ++ - Seite für die Such-API usw. befindet sich eine Demo. Schauen wir uns also an, welche Art von Ausgabe Sie erhalten können.
** Sondenfläche </ font> ** in der obigen Abbildung ist das Vergleichsquellbild. ** Kandidatengesicht </ font> ** wird aus den Bildern in der Datenbank in absteigender Reihenfolge der Ähnlichkeit ausgewählt. (In dem zu erstellenden Gesichtserkennungsprogramm wird Probe Face </ font> als unbekanntes Eingabebild verwendet. Bereiten Sie Kandidatengesicht </ font> als Bild der Person vor, die Sie erkennen möchten. )
Das Vergleichsergebnis jedes Bildes wird als JSON-Datei ausgegeben.
Ergebnis.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"
}
Jedes Element des Ergebnisschlüssels repräsentiert das Vergleichsergebnis zwischen Sondenfläche </ font> und Kandidatenfläche </ font>. Die Ähnlichkeit zwischen den beiden Bildern wird als ** "Vertrauen" ** ausgegeben. Wenn man sich die obigen Ergebnisse ansieht, ist das Vertrauen von Candidate Face1 </ font> 97.076, Das Vertrauen von Candidate Face2 </ font> beträgt 93,254, was einen hohen Grad an Ähnlichkeit darstellt. Andere Ergebnisse liegen unter der Ähnlichkeit von 70. Erstellen Sie mit dieser Ähnlichkeit ein Gesichtserkennungsprogramm.
Das Gesichtserkennungsprogramm ist wie folgt. Informationen zur Verwendung der API habe ich auf die folgende URL verwiesen. 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 = 'Mein API-Schlüssel'
API_SECRET = 'Mein API-Geheimnis'
#API zur Gesichtserkennung
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 Sekunde Schlaf
time.sleep(1)
#Wenn der Statuscode der Antwort nicht 200 ist
if response.status_code != 200:
print('[Error] ')
return -1
resources = response.json()
return resources
#Gesichtsidentifikations-API
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)
#Senden Sie eine Anfrage an die Gesichtserkennungs-API
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 Sekunde Schlaf
time.sleep(1)
#Wenn der Statuscode der Antwort nicht 200 ist
if response.status_code != 200:
return -1
resources = response.json()
print("Erfolg")
print(resources)
img=draw_img(face,resources,img)
except Exception as e:
return -1
#Bild speichern
cv2.imwrite("./output/result_"+filename, img)
return resources
#Zeichnen Sie Gesichtsinformationen mit der höchsten Wahrscheinlichkeit
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"]
#Zeichne ein Rechteck
cv2.rectangle(img, (left, top), (right, bottom), (0, 0, 255), 3)
font = cv2.FONT_HERSHEY_SIMPLEX
#Zeichnung der Wahrscheinlichkeit
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)
#Den Namen zeichnen
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
#Registrieren Sie Gesichtsbilder zum Vergleichen
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 Sekunde Schlaf
time.sleep(1)
#Wenn der Statuscode der Antwort nicht 200 ist
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 Sekunde Schlaf
time.sleep(1)
#Wenn der Statuscode der Antwort nicht 200 ist
if response.status_code != 200:
return -1
resources = response.json()
print(resources)
return resources
except Exception as e:
return -1
if __name__ == '__main__':
#Holen Sie sich das Bild, das Sie identifizieren möchten
filename="input.jpg "
img=cv2.imread('./input/'+filename)
#Holen Sie sich Bilder in einen Ordner
face_list = glob.glob('./facebank/*/*.jpg')
face_list.sort()
tags=[]#Jeder Name(user_id)Zur Aufbewahrung
#Lesen Sie aus den Registrierungsdaten
for face_path in face_list:
tags.append(str(re.search(r'./facebank/(.+)/.+', face_path).group(1)))
#Definieren Sie Gesichter, die mit der API verglichen werden sollen
face_set = create_faceset(face_list,tags)
#Senden Sie eine Anfrage an die identifizierende API
resources = search_image(img,face_set)
Die Argumente der einzelnen APIs finden Sie unter Offizielle Referenz.
Die Ordnerhierarchie lautet wie folgt.
─ 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
Legen Sie das zu identifizierende Bild in den Eingabeordner. Bereiten Sie einen Ordner mit dem Namen jeder Person im Facebank-Ordner vor. Legen Sie Ihr Gesichtsfoto in diesen Ordner. (Der Name des Gesichtsfotos ist beliebig)
Nun Gesichtserkennung. Die zu registrierenden und zu erkennenden Fotos wurden von "Pakutaso" ausgeliehen, das kostenlose Materialien von Personen veröffentlicht. Die folgenden 5 Fotos werden dieses Mal als Erkennungsziele registriert.
--ezaki
Und hier ist das Erkennungsergebnis!
Alle Personen, die ihre Gesichter registriert haben, sind mit einem Ähnlichkeitsgrad von 80% oder mehr korrekt! Obwohl die Anzahl der registrierten Gesichtsfotos für jede Person eins ist, ist sie sehr genau.
Personen mit nicht registrierten Gesichtern weisen ebenfalls den höchsten Grad an Ähnlichkeit zwischen registrierten Personen auf. Es ist ersichtlich, dass der Ähnlichkeitsgrad gering ist, wie in der folgenden Abbildung gezeigt.
Wenn Sie ein Konto bei Face ++ registrieren, können Sie die Gesichtserkennung mit Ihrem eigenen Bild auf der Demo auf der WEB-Seite durchführen. Wenn Sie interessiert sind, probieren Sie es einfach aus.
Recommended Posts