Intelligence de données générative

Améliorer la précision d'Amazon Rekognition Face Search avec des vecteurs utilisateur | Services Web Amazon

Date :

Dans divers secteurs, tels que les services financiers, les télécommunications et la santé, les clients utilisent un processus d'identité numérique, qui implique généralement plusieurs étapes pour vérifier les utilisateurs finaux lors de l'intégration en ligne ou d'une authentification renforcée. Un exemple d'étape pouvant être utilisée est la recherche de visage, qui peut aider à déterminer si le visage d'un nouvel utilisateur final correspond à ceux associés à un compte existant.

Construire un système de recherche de visage précis implique plusieurs étapes. Le système doit être capable de détecter des visages humains dans les images, d'extraire les visages dans des représentations vectorielles, de stocker les vecteurs de visages dans une base de données et de comparer les nouveaux visages aux entrées existantes. Amazon Reconnaissance facilite cela en vous proposant des modèles pré-entraînés qui sont invoqués via de simples appels API.

Amazon Rekognition vous permet d'obtenir une très grande précision de recherche de visage avec une seule image de visage. Dans certains cas, vous pouvez utiliser plusieurs images du visage de la même personne pour créer des vecteurs utilisateur et améliorer encore davantage la précision. Ceci est particulièrement utile lorsque les images présentent des variations d’éclairage, de poses et d’apparences.

Dans cet article, nous montrons comment utiliser les API Amazon Rekognition Face Search avec des vecteurs utilisateur pour augmenter le score de similarité pour les vraies correspondances et diminuer le score de similarité pour les vraies non-correspondances.

Nous comparons les résultats de la mise en correspondance de visages avec et sans vecteurs utilisateur.

Correspondance faciale Amazon Rekognition

La correspondance de visage Amazon Rekognition permet de mesurer la similarité d'un vecteur de visage extrait d'une image avec un vecteur de visage extrait d'une autre image. On dit qu'une paire d'images de visage est un vraie correspondance si les deux images contiennent le visage de la même personne et qu'un vraie non-correspondance sinon. Amazon Rekognition renvoie un score pour la similarité des visages source et cible. Le score de similarité minimum est de 0, ce qui implique très peu de similarité, et le maximum est de 100.

Pour comparer un visage source avec une collection de visages cibles (correspondance 1:N), Amazon Rekognition vous permet de créer un objet Collection et de le remplir avec des visages provenant d'images à l'aide d'appels d'API.

Lors de l'ajout d'un visage à une collection, Amazon Rekognition ne stocke pas l'image réelle du visage mais plutôt le vecteur du visage, une représentation mathématique du visage. Avec le Rechercher des visages API, vous pouvez comparer un visage source avec une ou plusieurs collections de visages cibles.

En juin 2023, AWS a lancé les vecteurs d'utilisateurs, une nouvelle fonctionnalité qui améliore considérablement la précision de la recherche de visages en utilisant plusieurs images de visage d’un utilisateur. Désormais, vous pouvez créer des vecteurs utilisateur, qui regroupent plusieurs vecteurs de visage du même utilisateur. Les vecteurs utilisateur offrent une plus grande précision de recherche de visage avec des représentations plus robustes, car ils contiennent différents degrés d'éclairage, de netteté, de pose, d'apparence, etc. Cela améliore la précision par rapport à la recherche sur des vecteurs de visage individuels.

Dans les sections suivantes, nous décrivons le processus d'utilisation des vecteurs d'utilisateurs Amazon Rekognition. Nous vous guidons dans la création d'une collection, le stockage des vecteurs de visage dans cette collection, l'agrégation de ces vecteurs de visage en vecteurs utilisateur, puis la comparaison des résultats de la recherche avec ces vecteurs de visage individuels et ces vecteurs utilisateur.

Vue d'ensemble de la solution

Pour cette solution, nous utilisons une collection d'utilisateurs Amazon Rekognition, chacun avec ses vecteurs de visage indexés associés à partir d'un certain nombre d'images de visages différentes pour chaque utilisateur.

Examinons le flux de travail pour créer une collection avec des utilisateurs et des visages :

  1. Créez une collection Amazon Rekognition.
  2. Pour chaque utilisateur, créez un utilisateur dans la collection.
  3. Pour chaque image de l'utilisateur, ajoutez le visage à la collection (IndexFaces, qui renvoie l'ID de visage correspondant à chaque vecteur de visage).
  4. Associez tous les identifiants de visage indexés à l’utilisateur (cela est nécessaire pour les vecteurs utilisateur).

Ensuite, nous comparerons les workflows suivants :

Recherche avec une nouvelle image d'entrée donnée par rapport à des vecteurs de visage individuels dans notre collection :

  1. Récupère tous les visages d'une image (Détecter les visages).
  2. Pour chaque visage, comparez avec les visages individuels de notre collection (RechercherVisagesParImage).

Recherche avec une nouvelle image d'entrée donnée par rapport aux vecteurs utilisateur de notre collection :

  1. Récupère tous les visages d'une image (Détecter les visages).
  2. Pour chaque visage, comparez au vecteur utilisateur (Rechercher des utilisateurs par image).

Décrivons maintenant la solution en détail.

Pré-requis

Ajoutez la stratégie suivante à votre Gestion des identités et des accès AWS (IAM) utilisateur ou rôle. La stratégie vous accorde l'autorisation d'accéder aux API Amazon Rekognition pertinentes et vous permet d'accéder à un Service de stockage simple Amazon (Amazon S3) pour stocker les images :

{
    "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>"
            ]
        }
    ]
}

Créez une collection Amazon Rekognition et ajoutez des utilisateurs et des visages

Tout d'abord, nous créons un compartiment S3 pour stocker les images des utilisateurs. Nous organisons le bucket en créant un dossier pour chaque utilisateur contenant ses images personnelles. Notre dossier d'images ressemble à la structure suivante :

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

Notre compartiment S3 dispose d'un répertoire pour chaque utilisateur qui stocke ses images. Il existe actuellement deux dossiers et chacun contient plusieurs images. Vous pouvez ajouter plusieurs dossiers pour vos utilisateurs, chacun contenant une ou plusieurs images à indexer.

Ensuite, nous créons notre collection Amazon Rekognition. Nous avons fourni aides.py, qui contient différentes méthodes que nous utilisons :

  • créer_collection – Créer une nouvelle collection
  • supprimer_collection – Supprimer une collection
  • Créer un utilisateur – Créer un nouvel utilisateur dans une collection
  • add_faces_to_collection – Ajouter des visages à la collection
  • associ_faces – Associer face_ids à un utilisateur dans une collection
  • get_subdirs – Récupérez tous les sous-répertoires sous le préfixe S3
  • get_files – Récupérez tous les fichiers sous le préfixe S3

Voici un exemple de méthode pour créer une collection Amazon Rekognition :

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...')

Créez la collection avec le code suivant :

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

Ensuite, ajoutons les vecteurs de visage à notre collection et regroupons-les en vecteurs utilisateur.

Pour chaque utilisateur du répertoire S3, nous créons un vecteur utilisateur dans la collection. Ensuite, nous indexons les images de visage de chaque utilisateur dans la collection en tant que vecteurs de visage individuels, ce qui génère des identifiants de visage. Enfin, nous associons les identifiants de visage au vecteur utilisateur approprié.

Cela crée deux types de vecteurs dans notre collection :

  • Vecteurs de visage individuels
  • Vecteurs utilisateur, qui sont construits sur la base des identifiants de vecteur de visage fournis à l'aide de la méthode associate_faces

Voir le code suivant:

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()

Nous utilisons les méthodes suivantes :

  • get_subdirs – Renvoie une liste de tous les répertoires des utilisateurs. Dans notre exemple, la valeur est [Swami, Werner].
  • get_files – Renvoie tous les fichiers images sous le préfixe S3 pour l'utilisateur.
  • face_ids – Il s’agit d’une liste contenant tous les identifiants de visage appartenant à un utilisateur. Nous utilisons cette liste lorsque nous appelons le AssocierFaces API.

Comme expliqué précédemment, vous pouvez ajouter plus d'utilisateurs en leur ajoutant des dossiers (le dossier dicte l'ID utilisateur) et ajouter vos images dans ce dossier (aucun ordre n'est requis pour les fichiers).

Maintenant que notre environnement est configuré et que nous disposons à la fois de vecteurs de visage individuels et de vecteurs d'utilisateurs, comparons la qualité de notre recherche à chacun d'eux. Pour ce faire, nous utilisons une nouvelle photo avec plusieurs personnes et essayons de faire correspondre leurs visages avec notre collection, d'abord avec les vecteurs de visage individuels, puis avec les vecteurs utilisateur.

Recherche de visage d'image par rapport à une collection de vecteurs de visage individuels

Pour effectuer une recherche sur nos vecteurs de visage individuels, nous utilisons Amazon Rekognition RechercherVisagesParImage API. Cette fonction utilise une image de visage source pour rechercher des vecteurs de visage individuels dans notre collection et renvoie les visages qui correspondent à notre seuil de score de similarité défini.

Une considération importante est que le SearchFacesByImage L'API ne fonctionnera que sur le plus grand visage détecté dans l'image. Si plusieurs visages sont présents, vous devez recadrer chaque visage individuel et le transmettre séparément à la méthode d'identification.

Pour extraire les détails des visages d'une image (comme leur emplacement sur l'image), nous utilisons Amazon Rekognition Détecter les visages API.

détecter_faces_in_image La méthode détecte les visages dans une image. Pour chaque face, il effectue les actions suivantes :

  • Imprimer l'emplacement de sa boîte englobante
  • Recadrez le visage de l'image et vérifiez si ce visage existe dans la collection et imprimez l'utilisateur ou "Inconnu".
  • Imprimer le score de similarité

L'exemple de code Python utilise le Oreillers bibliothèque pour effectuer les manipulations d’images (telles que l’impression, le dessin et le recadrage).

Nous utilisons un seuil de score de similarité de 99 %, ce qui est un paramètre courant pour les cas d'utilisation de la vérification d'identité.

Exécutez le code suivant :

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 est la clé d'objet S3 que nous voulons comparer à notre collection. Nous avons fourni un exemple d'image (photo.jpeg) dans le dossier images.

L'image suivante montre nos résultats.

En utilisant un seuil de 99 %, une seule personne a été identifiée. Le Dr Werner Vogels a été signalé comme inconnu. Si nous exécutons le même code en utilisant un seuil inférieur de 90 (définir le seuil = 90), nous obtenons les résultats suivants.

Nous constatons maintenant que le visage du Dr Werner Vogel présente un score de similarité de 96.86 %. Vérifions ensuite si nous pouvons obtenir un score de similarité supérieur à notre seuil défini en utilisant des vecteurs utilisateur.

Recherche de visage d'image par rapport à une collection de vecteurs utilisateur

Pour rechercher nos vecteurs d'utilisateurs, nous utilisons Amazon Rekognition Rechercher des utilisateurs par image API. Cette fonction utilise une image de visage source pour rechercher des vecteurs d'utilisateurs dans notre collection et renvoie les utilisateurs qui correspondent à notre seuil de score de similarité défini.

La même considération est pertinente ici – le SearchUsersByImage L'API ne fonctionnera que sur le plus grand visage détecté dans l'image. Si plusieurs visages sont présents, vous devez recadrer chaque visage individuel et le transmettre séparément à la méthode d'identification.

Pour extraire les détails des visages d'une image (comme leur emplacement sur l'image), nous utilisons Amazon Rekognition Détecter les visages API.

détecter_utilisateurs_in_image La méthode détecte les visages dans une image. Pour chaque face, il effectue les actions suivantes :

  • Imprimer l'emplacement de sa boîte englobante
  • Recadrez le visage de l'image et vérifiez si ce visage d'utilisateur existe dans notre collection et imprimez l'utilisateur ou "Inconnu".
  • Imprimer le score de similarité

Voir le code suivant:

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

La fonction renvoie une image modifiée avec les résultats qui peuvent être enregistrés sur Amazon S3 ou imprimés. La fonction génère également des statistiques sur l'âge estimé des visages vers le terminal.

Exécutez le code suivant :

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)

L'image suivante montre nos résultats.

Les utilisateurs qui existent dans notre collection ont été correctement identifiés avec une grande similarité (plus de 99 %).

Nous avons pu augmenter le score de similarité en utilisant trois vecteurs de visage par vecteur utilisateur. À mesure que nous augmentons le nombre de vecteurs de visages utilisés, nous nous attendons à ce que le score de similarité pour les vraies correspondances augmente également. Vous pouvez utiliser jusqu'à 100 vecteurs de visage par vecteur utilisateur.

Un exemple de code de bout en bout peut être trouvé dans le GitHub référentiel. Il comprend un détail Carnet Jupyter sur lequel tu peux courir Amazon SageMakerStudio (ou d'autres alternatives).

Nettoyer

Pour supprimer la collection, utilisez le code suivant :

helpers.delete_collection(collection_id)

Conclusion

Dans cet article, nous avons présenté comment utiliser les vecteurs d'utilisateurs Amazon Rekognition pour mettre en œuvre la recherche de visages sur un ensemble de visages d'utilisateurs. Nous avons démontré comment améliorer la précision de la recherche de visages en utilisant plusieurs images de visage par utilisateur et les avons comparées à des vecteurs de visage individuels. De plus, nous avons décrit comment utiliser les différentes API Amazon Rekognition pour détecter les visages. L'exemple de code fourni sert de base solide pour construire un système de recherche de visage fonctionnel.

Pour plus d'informations sur les vecteurs d'utilisateurs Amazon Rekognition, reportez-vous à Rechercher des visages dans une collection. Si vous êtes nouveau sur Amazon Rekognition, vous pouvez utiliser notre offre gratuite, qui dure 12 mois et comprend le traitement de 5,000 1,000 images par mois et le stockage de XNUMX XNUMX objets vectoriels utilisateur par mois.


À propos des auteurs

Arik Porat est architecte senior de solutions de startups chez Amazon Web Services. Il travaille avec des startups pour les aider à créer et concevoir leurs solutions dans le cloud, et est passionné par l'apprentissage automatique et les solutions basées sur des conteneurs. Dans ses temps libres, Arik aime jouer aux échecs et aux jeux vidéo.

Eliran Efron est architecte de solutions de startups chez Amazon Web Services. Eliran est un passionné de données et de calcul, aidant les startups à concevoir leurs architectures système. Dans ses temps libres, Eliran aime construire et piloter des voitures lors de courses de tourisme et construire des appareils IoT.

spot_img

Dernières informations

spot_img

Discutez avec nous

Salut! Comment puis-je t'aider?