[PYTHON] Ich habe versucht, das Gesicht mit Face ++ zu erkennen

Ausführungsumgebung

Ubuntu 16.04 Python 3.7 opencv-python 4.1.0.25

Überblick

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

** ① Kontoregistrierung **

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.

a.png

** ② Holen Sie sich die API zu verwenden **

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. b.png Verwenden Sie diesmal die API im roten Rahmen.

** ③ Demo bestätigen **

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. Screenshot from 2019-11-13 10-34-50.png

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

④ Programm

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)

⑤ Gesichtserkennung

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 ezakisan

  • Murata muratasan --narishige muratasan --okawa muratasan --yusei muratasan

Und hier ist das Erkennungsergebnis! result.jpg result_helpIMGL6330_TP_V.jpg result_PAK86_sotugyousei15213941_TP_V.jpg result_N612_shibuyagawadedenwasuruikemen_TP_V.jpg

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. 333.jpg 222.jpg

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