Datenintelligenz von Platon.
Vertikale Suche & KI.

Verbessern Sie die Genauigkeit der Amazon Rekognition-Gesichtssuche mit Benutzervektoren | Amazon Web Services

Datum:

In verschiedenen Branchen wie Finanzdienstleistungen, Telekommunikation und Gesundheitswesen verwenden Kunden einen digitalen Identitätsprozess, der in der Regel mehrere Schritte zur Verifizierung von Endbenutzern während des Online-Onboardings oder der Step-up-Authentifizierung umfasst. Ein Beispiel für einen Schritt, der verwendet werden kann, ist die Gesichtssuche, mit deren Hilfe festgestellt werden kann, ob das Gesicht eines neuen Endbenutzers mit dem Gesicht eines bestehenden Kontos übereinstimmt.

Der Aufbau eines präzisen Gesichtssuchsystems umfasst mehrere Schritte. Das System muss in der Lage sein, menschliche Gesichter in Bildern zu erkennen, die Gesichter in Vektordarstellungen zu extrahieren, Gesichtsvektoren in einer Datenbank zu speichern und neue Gesichter mit vorhandenen Einträgen zu vergleichen. Amazon-Anerkennung macht dies mühelos, indem es Ihnen vorab trainierte Modelle zur Verfügung stellt, die über einfache API-Aufrufe aufgerufen werden.

Amazon Rekognition ermöglicht Ihnen eine sehr hohe Gesichtssuchgenauigkeit mit einem einzigen Gesichtsbild. In einigen Fällen können Sie mehrere Bilder des Gesichts derselben Person verwenden, um Benutzervektoren zu erstellen und die Genauigkeit noch weiter zu verbessern. Dies ist besonders hilfreich, wenn Bilder unterschiedliche Beleuchtung, Posen und Erscheinungsbilder aufweisen.

In diesem Beitrag zeigen wir, wie Sie die Amazon Rekognition Face Search-APIs mit Benutzervektoren verwenden, um den Ähnlichkeitswert für echte Übereinstimmungen zu erhöhen und den Ähnlichkeitswert für echte Nichtübereinstimmungen zu verringern.

Wir vergleichen die Ergebnisse der Gesichtserkennung mit und ohne Benutzervektoren.

Amazon Rekognition-Gesichtsabgleich

Der Gesichtsabgleich mit Amazon Rekognition ermöglicht die Messung der Ähnlichkeit eines aus einem Bild extrahierten Gesichtsvektors mit einem aus einem anderen Bild extrahierten Gesichtsvektor. Ein Paar Gesichtsbilder soll ein sein richtiger Kampf wenn beide Bilder das Gesicht derselben Person enthalten und a echte Nichtübereinstimmung ansonsten. Amazon Rekognition gibt einen Wert für die Ähnlichkeit der Quell- und Zielgesichter zurück. Der minimale Ähnlichkeitswert beträgt 0, was sehr geringe Ähnlichkeit bedeutet, und der maximale Wert liegt bei 100.

Zum Vergleichen eines Quellgesichts mit einer Sammlung von Zielgesichtern (1:N-Abgleich) können Sie mit Amazon Rekognition ein Collection-Objekt erstellen und es mithilfe von API-Aufrufen mit Gesichtern aus Bildern füllen.

Beim Hinzufügen eines Gesichts zu einer Sammlung speichert Amazon Rekognition nicht das eigentliche Bild des Gesichts, sondern den Gesichtsvektor, eine mathematische Darstellung des Gesichts. Mit dem SearchFaces Mit der API können Sie ein Quellgesicht mit einer oder mehreren Sammlungen von Zielgesichtern vergleichen.

Im Juni 2023, AWS hat Benutzervektoren eingeführt, eine neue Funktion, die die Genauigkeit der Gesichtssuche erheblich verbessert durch die Verwendung mehrerer Gesichtsbilder eines Benutzers. Jetzt können Sie Benutzervektoren erstellen, die mehrere Gesichtsvektoren desselben Benutzers zusammenfassen. Benutzervektoren bieten eine höhere Genauigkeit bei der Gesichtssuche mit aussagekräftigeren Darstellungen, da sie unterschiedliche Grade an Beleuchtung, Schärfe, Pose, Aussehen und mehr enthalten. Dies verbessert die Genauigkeit im Vergleich zur Suche anhand einzelner Gesichtsvektoren.

In den folgenden Abschnitten beschreiben wir den Prozess der Verwendung von Amazon Rekognition-Benutzervektoren. Wir führen Sie durch die Erstellung einer Sammlung, das Speichern von Gesichtsvektoren in dieser Sammlung, das Aggregieren dieser Gesichtsvektoren zu Benutzervektoren und den anschließenden Vergleich der Suchergebnisse mit diesen einzelnen Gesichtsvektoren und Benutzervektoren.

Lösungsüberblick

Für diese Lösung verwenden wir eine Amazon Rekognition-Benutzersammlung mit jeweils zugehörigen indizierten Gesichtsvektoren aus einer Reihe verschiedener Gesichtsbilder für jeden Benutzer.

Schauen wir uns den Workflow zum Erstellen einer Sammlung mit Benutzern und Gesichtern an:

  1. Erstellen Sie eine Amazon Rekognition-Sammlung.
  2. Erstellen Sie für jeden Benutzer einen Benutzer in der Sammlung.
  3. Fügen Sie für jedes Bild des Benutzers das Gesicht zur Sammlung hinzu (IndexGesichter, was die Gesichts-ID zurückgibt, die jedem Gesichtsvektor entspricht.
  4. Verknüpfen Sie alle indizierten Gesichts-IDs mit dem Benutzer (dies ist für Benutzervektoren erforderlich).

Anschließend vergleichen wir die folgenden Arbeitsabläufe:

Suche mit einem neuen gegebenen Eingabebild nach einzelnen Gesichtsvektoren in unserer Sammlung:

  1. Holen Sie sich alle Gesichter aus einem Bild (Gesichter erkennen).
  2. Vergleichen Sie jedes Gesicht mit einzelnen Gesichtern in unserer Sammlung (SearchFacesByImage).

Suche mit einem neuen gegebenen Eingabebild anhand von Benutzervektoren in unserer Sammlung:

  1. Holen Sie sich alle Gesichter aus einem Bild (Gesichter erkennen).
  2. Vergleichen Sie für jedes Gesicht den Benutzervektor (SearchUsersByImage).

Beschreiben wir nun die Lösung im Detail.

Voraussetzungen:

Fügen Sie die folgende Richtlinie zu Ihrer hinzu AWS Identity and Access Management and (IAM) Benutzer oder Rolle. Die Richtlinie gewährt Ihnen die Berechtigung für die relevanten Amazon Rekognition-APIs und ermöglicht den Zugriff auf eine Amazon Simple Storage-Service (Amazon S3) Bucket zum Speichern der Bilder:

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "RekognitionPermissions",
            "Effect": "Allow",
            "Action": [
                "rekognition:CreateCollection",
                "rekognition:DeleteCollection",
                "rekognition:CreateUser",
                "rekognition:IndexFaces",
                "rekognition:DetectFaces",
                "rekognition:AssociateFaces",
                "rekognition:SearchUsersByImage",
                "rekognition:SearchFacesByImage"
            ],
            "Resource": "*"
        },
        {
            "Sid": "S3BucketPermissions",
            "Effect": "Allow",
            "Action": [
                "s3:GetObject",
                "s3:PutObject",
                "s3:ListBucket"
            ],
            "Resource": [
                "arn:aws:s3:::<replace_with_your_bucket>/*",
                "arn:aws:s3:::<replace_with_your_bucket>"
            ]
        }
    ]
}

Erstellen Sie eine Amazon Rekognition-Sammlung und fügen Sie Benutzer und Gesichter hinzu

Zuerst erstellen wir einen S3-Bucket, um die Bilder der Benutzer zu speichern. Wir organisieren den Bucket, indem wir für jeden Benutzer einen Ordner erstellen, der seine persönlichen Bilder enthält. Unser Bilderordner sieht wie folgt aus:

── images
│   ├── photo.jpeg
│   ├── Swami
│   │   ├── Swami1.jpeg
│   │   └── Swami2.jpeg
│   └── Werner
│       ├── Werner1.jpeg
│       ├── Werner2.jpeg
│       └── Werner3.jpeg

Unser S3-Bucket verfügt über ein Verzeichnis für jeden Benutzer, in dem seine Bilder gespeichert werden. Derzeit gibt es zwei Ordner, von denen jeder mehrere Bilder enthält. Sie können für Ihre Benutzer weitere Ordner hinzufügen, die jeweils ein oder mehrere zu indizierende Bilder enthalten.

Als nächstes erstellen wir unsere Amazon Rekognition-Sammlung. Wir haben geliefert helpers.py, das verschiedene Methoden enthält, die wir verwenden:

  • create_collection – Erstellen Sie eine neue Sammlung
  • delete_collection – Eine Sammlung löschen
  • create_user – Erstellen Sie einen neuen Benutzer in einer Sammlung
  • add_faces_to_collection – Gesichter zur Sammlung hinzufügen
  • Associate_faces – Ordnen Sie face_ids einem Benutzer in einer Sammlung zu
  • get_subdirs – Holen Sie sich alle Unterverzeichnisse unter dem S3-Präfix
  • get_files – Holen Sie sich alle Dateien unter dem S3-Präfix

Im Folgenden finden Sie eine Beispielmethode zum Erstellen einer Amazon Rekognition-Sammlung:

import boto3
session = boto3.Session()
client = session.client('rekognition')

def create_collection(collection_id):
    try:
        # Create a collection
        print('Creating collection:' + collection_id)
        response = client.create_collection(CollectionId=collection_id)
        print('Collection ARN: ' + response['CollectionArn'])
        print('Status code: ' + str(response['StatusCode']))
        print('Done...')
    except client.exceptions.ResourceAlreadyExistsException:
        print('Resource already exits...')

Erstellen Sie die Sammlung mit dem folgenden Code:

import helpers
collection_id = "faces-collection"
helpers.create_collection(collection_id)

Als nächstes fügen wir die Gesichtsvektoren zu unserer Sammlung hinzu und aggregieren sie zu Benutzervektoren.

Für jeden Benutzer im S3-Verzeichnis erstellen wir einen Benutzervektor in der Sammlung. Anschließend indizieren wir die Gesichtsbilder für jeden Benutzer als einzelne Gesichtsvektoren in der Sammlung, wodurch Gesichts-IDs generiert werden. Zuletzt verknüpfen wir die Gesichts-IDs mit dem entsprechenden Benutzervektor.

Dadurch entstehen zwei Arten von Vektoren in unserer Sammlung:

  • Einzelne Gesichtsvektoren
  • Benutzervektoren, die auf Grundlage der mit der Methode bereitgestellten Gesichtsvektor-IDs erstellt werden associate_faces

Siehe folgenden Code:

bucket = '<replace_with_your_bucket>'
prefix = 'images/'

# Get all the users directories from s3 containing the images
folder_list = helpers.get_subdirs(bucket, prefix)
print(f"Found users folders: {folder_list}")
print()

for user_id in folder_list:
    face_ids = []
    helpers.create_user(collection_id, user_id)
    # Get all files per user under the s3 user directory
    images = helpers.get_files(bucket, prefix + user_id + "/")
    print (f"Found images={images} for {user_id}")
    for image in images:
        face_id = helpers.add_faces_to_collection(bucket, image, collection_id)
        face_ids.append(face_id)
    helpers.associate_faces(collection_id, user_id, face_ids)
    print()

Wir nutzen folgende Methoden:

  • get_subdirs – Gibt eine Liste aller Benutzerverzeichnisse zurück. In unserem Beispiel ist der Wert [Swami,Werner].
  • get_files – Gibt alle Bilddateien unter dem S3-Präfix für den Benutzer zurück.
  • face_ids – Dies ist eine Liste mit allen Gesichts-IDs eines Benutzers. Wir verwenden diese Liste, wenn wir die aufrufen AssociateFaces API.

Wie bereits erläutert, können Sie weitere Benutzer hinzufügen, indem Sie Ordner für sie hinzufügen (der Ordner bestimmt die Benutzer-ID) und Ihre Bilder in diesem Ordner hinzufügen (für die Dateien ist keine Reihenfolge erforderlich).

Nachdem unsere Umgebung nun eingerichtet ist und wir sowohl individuelle Gesichtsvektoren als auch Benutzervektoren haben, vergleichen wir unsere Suchqualität mit jedem dieser Vektoren. Dazu verwenden wir ein neues Foto mit mehreren Personen und versuchen, ihre Gesichter mit unserer Sammlung abzugleichen, zuerst mit den einzelnen Gesichtsvektoren und dann mit den Benutzervektoren.

Gesichtssuche im Bild anhand einer Sammlung einzelner Gesichtsvektoren

Um anhand unserer individuellen Gesichtsvektoren zu suchen, verwenden wir Amazon Rekognition SearchFacesByImage API. Diese Funktion verwendet ein Quellgesichtsbild, um einzelne Gesichtsvektoren in unserer Sammlung zu durchsuchen und gibt Gesichter zurück, die unserem definierten Schwellenwert für die Ähnlichkeitsbewertung entsprechen.

Eine wichtige Überlegung ist, dass die SearchFacesByImage Die API funktioniert nur auf dem größten im Bild erkannten Gesicht. Wenn mehrere Gesichter vorhanden sind, müssen Sie jedes einzelne Gesicht zuschneiden und separat an die Methode zur Identifizierung übergeben.

Zum Extrahieren von Gesichtsdetails aus einem Bild (z. B. deren Position auf dem Bild) verwenden wir Amazon Rekognition Gesichter erkennen API.

Folgende discover_faces_in_image Die Methode erkennt Gesichter in einem Bild. Für jedes Gesicht werden die folgenden Aktionen ausgeführt:

  • Drucken Sie die Position des Begrenzungsrahmens
  • Schneiden Sie das Gesicht aus dem Bild aus und prüfen Sie, ob ein solches Gesicht in der Sammlung vorhanden ist, und drucken Sie den Benutzer oder „Unbekannt“ aus.
  • Drucken Sie den Ähnlichkeitswert aus

Der Beispiel-Python-Code verwendet die Kissen Bibliothek zum Durchführen von Bildbearbeitungen (z. B. Drucken, Zeichnen und Zuschneiden).

Wir verwenden einen Schwellenwert für die Ähnlichkeitsbewertung von 99 %, was eine übliche Einstellung für Anwendungsfälle zur Identitätsüberprüfung ist.

Führen Sie den folgenden Code aus:

import detect_users
from PIL import Image

# The image we would like to match faces against our collection.
file_key= "images/photo.jpeg"

img = detect_users.detect_faces_in_image(
    bucket, 
    file_key, 
    collection_id, 
    threshold=99
)
img.show() # or in Jupyter use display(img)

file_key ist der S3-Objektschlüssel, den wir mit unserer Sammlung abgleichen möchten. Wir haben ein Beispielbild bereitgestellt (photo.jpeg) im Bilderordner.

Das folgende Bild zeigt unsere Ergebnisse.

Bei einem Schwellenwert von 99 % wurde nur eine Person identifiziert. Dr. Werner Vogels wurde als unbekannt gekennzeichnet. Wenn wir denselben Code mit einem unteren Schwellenwert von 90 ausführen (Schwellenwert = 90 festlegen), erhalten wir die folgenden Ergebnisse.

Jetzt sehen wir, dass Dr. Werner Vogels Gesicht einen Ähnlichkeitswert von 96.86 % hat. Als Nächstes prüfen wir, ob wir mithilfe von Benutzervektoren einen Ähnlichkeitswert über unserem definierten Schwellenwert erzielen können.

Gesichtssuche des Bildes anhand einer Sammlung von Benutzervektoren

Um anhand unserer Benutzervektoren zu suchen, verwenden wir Amazon Rekognition SearchUsersByImage API. Diese Funktion verwendet ein Quellgesichtsbild, um nach Benutzervektoren in unserer Sammlung zu suchen, und gibt Benutzer zurück, die unserem definierten Schwellenwert für die Ähnlichkeitsbewertung entsprechen.

Die gleiche Überlegung ist hier relevant – die SearchUsersByImage Die API funktioniert nur auf dem größten im Bild erkannten Gesicht. Wenn mehrere Gesichter vorhanden sind, müssen Sie jedes einzelne Gesicht zuschneiden und separat an die Methode zur Identifizierung übergeben.

Zum Extrahieren von Gesichtsdetails aus einem Bild (z. B. deren Position auf dem Bild) verwenden wir Amazon Rekognition Gesichter erkennen API.

Folgende discover_users_in_image Die Methode erkennt Gesichter in einem Bild. Für jedes Gesicht werden die folgenden Aktionen ausgeführt:

  • Drucken Sie die Position des Begrenzungsrahmens
  • Schneiden Sie das Gesicht aus dem Bild aus und prüfen Sie, ob ein solches Benutzergesicht in unserer Sammlung vorhanden ist, und drucken Sie den Benutzer oder „Unbekannt“ aus.
  • Drucken Sie den Ähnlichkeitswert aus

Siehe folgenden Code:

import boto3
import io
import math
from PIL import Image, ImageDraw, ImageFont

def detect_users_in_image(bucket, key, collection_id, threshold=80):

    session = boto3.Session()
    client = session.client('rekognition')

    # Load image from S3 bucket
    s3_connection = boto3.resource('s3')
    s3_object = s3_connection.Object(bucket, key)
    s3_response = s3_object.get()

    stream = io.BytesIO(s3_response['Body'].read())
    image = Image.open(stream)

    # Call DetectFaces to find faces in image
    response = client.detect_faces(
        Image={'S3Object': {'Bucket': bucket, 'Name': key}},
        Attributes=['ALL']
    )

    imgWidth, imgHeight = image.size
    draw = ImageDraw.Draw(image)

    # Calculate and display bounding boxes for each detected face
    for faceDetail in response['FaceDetails']:
        print('The detected face is between ' + str(faceDetail['AgeRange']['Low'])
              + ' and ' + str(faceDetail['AgeRange']['High']) + ' years old')

        box = faceDetail['BoundingBox']
        left = imgWidth * box['Left']
        top = imgHeight * box['Top']
        width = imgWidth * box['Width']
        height = imgHeight * box['Height']

        print('Left: ' + '{0:.0f}'.format(left))
        print('Top: ' + '{0:.0f}'.format(top))
        print('Face Width: ' + "{0:.0f}".format(width))
        print('Face Height: ' + "{0:.0f}".format(height))

        points = (
            (left, top),
            (left + width, top),
            (left + width, top + height),
            (left, top + height),
            (left, top)
        )

        # Crop the face box and convert it to byte array
        face = image.crop((left, top, left + width, top + height))
        imgByteArr = image_to_byte_array(face, image.format)

        # Search for a user in our collection using the cropped image
        user_response = client.search_users_by_image(
            CollectionId=collection_id,
            Image={'Bytes': imgByteArr},
            UserMatchThreshold=threshold
        )
        # print (user_response)

        # Extract user id and the similarity from the response
        if (user_response['UserMatches']):
            similarity = user_response['UserMatches'][0]['Similarity']
            similarity = (math.trunc(similarity * 100) / 100) if isinstance(similarity, float) else similarity
            user_id = user_response['UserMatches'][0]['User']['UserId']
            print(f"User {user_id} was found, similarity of {similarity}%")
            print("")
        else:
            user_id = "Unknown"
            similarity = 0

        draw.line(points, fill='#00d400', width=4)
        font = ImageFont.load_default(size=25)
        draw.text((left, top - 30), user_id, fill='#00d400', font=font)
        if similarity > 0:
            draw.text((left, top + 1), str(similarity), fill='#00d400', font=font)

    return image

Die Funktion gibt ein geändertes Bild mit den Ergebnissen zurück, die in Amazon S3 gespeichert oder gedruckt werden können. Die Funktion gibt außerdem Statistiken über das geschätzte Alter der Gesichter an das Terminal aus.

Führen Sie den folgenden Code aus:

import detect_users
from PIL import Image

# The image we would like to match faces against our collection.
file_key= "images/photo.jpeg"

img = detect_users.detect_users_in_image(
    bucket, 
    file_key, 
    collection_id, 
    threshold=99
)
img.show() # or in Jupyter use display(img)

Das folgende Bild zeigt unsere Ergebnisse.

Die in unserer Sammlung vorhandenen Benutzer wurden mit hoher Ähnlichkeit (über 99 %) korrekt identifiziert.

Wir konnten den Ähnlichkeitswert erhöhen, indem wir drei Gesichtsvektoren pro Benutzervektor verwendeten. Wenn wir die Anzahl der verwendeten Gesichtsvektoren erhöhen, erwarten wir, dass sich auch der Ähnlichkeitswert für echte Übereinstimmungen erhöht. Sie können bis zu 100 Gesichtsvektoren pro Benutzervektor verwenden.

Einen End-to-End-Beispielcode finden Sie im GitHub-Repository. Es enthält eine detaillierte Jupyter Notizbuch auf dem du laufen kannst Amazon SageMaker-Studio (oder andere Alternativen).

Aufräumen

Um die Sammlung zu löschen, verwenden Sie den folgenden Code:

helpers.delete_collection(collection_id)

Zusammenfassung

In diesem Beitrag haben wir vorgestellt, wie Sie Amazon Rekognition-Benutzervektoren verwenden, um die Gesichtssuche für eine Sammlung von Benutzergesichtern zu implementieren. Wir haben gezeigt, wie die Genauigkeit der Gesichtssuche durch die Verwendung mehrerer Gesichtsbilder pro Benutzer verbessert und diese mit einzelnen Gesichtsvektoren verglichen werden können. Darüber hinaus haben wir beschrieben, wie Sie die verschiedenen Amazon Rekognition-APIs zur Gesichtserkennung verwenden können. Der bereitgestellte Beispielcode dient als solide Grundlage für den Aufbau eines funktionierenden Gesichtssuchsystems.

Weitere Informationen zu Amazon Rekognition-Benutzervektoren finden Sie unter Suche nach Gesichtern in einer Sammlung. Wenn Sie neu bei Amazon Rekognition sind, können Sie unser kostenloses Kontingent nutzen, das 12 Monate dauert und die Verarbeitung von 5,000 Bildern pro Monat und die Speicherung von 1,000 Benutzervektorobjekten pro Monat umfasst.


Über die Autoren

Arik Porat ist Senior Startups Solutions Architect bei Amazon Web Services. Er arbeitet mit Startups zusammen, um ihnen beim Aufbau und Design ihrer Lösungen in der Cloud zu helfen, und ist begeistert von maschinellem Lernen und Container-basierten Lösungen. In seiner Freizeit spielt Arik gerne Schach und Videospiele.

Eliran Efron ist Startup-Lösungsarchitekt bei Amazon Web Services. Eliran ist ein Daten- und Computer-Enthusiast und unterstützt Start-ups beim Entwurf ihrer Systemarchitekturen. In seiner Freizeit baut Eliran gerne Autos, nimmt an Tourenrennen teil und baut IoT-Geräte.

spot_img

Neueste Intelligenz

spot_img

Chat mit uns

Hallo! Wie kann ich dir helfen?