Inteligência de dados generativa

Melhore a precisão do Amazon Rekognition Face Search com vetores do usuário | Amazon Web Services

Data:

Em vários setores, como serviços financeiros, telecomunicações e cuidados de saúde, os clientes utilizam um processo de identidade digital, que normalmente envolve vários passos para verificar os utilizadores finais durante a integração online ou a autenticação progressiva. Um exemplo de etapa que pode ser usada é a pesquisa facial, que pode ajudar a determinar se o rosto de um novo usuário final corresponde àquele associado a uma conta existente.

Construir um sistema preciso de pesquisa facial envolve várias etapas. O sistema deve ser capaz de detectar rostos humanos em imagens, extrair os rostos em representações vetoriais, armazenar vetores faciais em um banco de dados e comparar novos rostos com entradas existentes. Reconhecimento da Amazônia torna isso fácil, fornecendo modelos pré-treinados que são invocados por meio de chamadas de API simples.

O Amazon Rekognition permite que você obtenha uma precisão de pesquisa facial muito alta com uma única imagem facial. Em alguns casos, você pode usar diversas imagens do rosto da mesma pessoa para criar vetores do usuário e melhorar ainda mais a precisão. Isso é especialmente útil quando as imagens apresentam variações de iluminação, poses e aparência.

Nesta postagem, demonstramos como usar as APIs do Amazon Rekognition Face Search com vetores de usuário para aumentar a pontuação de similaridade para correspondências verdadeiras e diminuir a pontuação de similaridade para não correspondências verdadeiras.

Comparamos os resultados da realização da correspondência facial com e sem vetores do usuário.

Correspondência facial do Amazon Rekognition

A correspondência facial do Amazon Rekognition permite medir a semelhança de um vetor facial extraído de uma imagem com um vetor facial extraído de outra imagem. Diz-se que um par de imagens faciais é um correspondência verdadeira se ambas as imagens contiverem o rosto da mesma pessoa e um verdadeira não correspondência de outra forma. O Amazon Rekognition retorna uma pontuação para a similaridade das faces de origem e de destino. A pontuação mínima de similaridade é 0, implicando muito pouca similaridade, e a máxima é 100.

Para comparar uma face de origem com uma coleção de faces de destino (correspondência 1:N), o Amazon Rekognition permite criar um objeto Collection e preenchê-lo com faces de imagens usando chamadas de API.

Ao adicionar um rosto a uma coleção, o Amazon Rekognition não armazena a imagem real do rosto, mas sim o vetor facial, uma representação matemática do rosto. Com o SearchFaces API, você pode comparar uma face de origem com uma ou várias coleções de faces de destino.

Em junho, 2023, AWS lançou vetores de usuário, um novo recurso que melhora significativamente a precisão da pesquisa facial usando várias imagens faciais de um usuário. Agora você pode criar vetores de usuário, que agregam vários vetores de face do mesmo usuário. Os vetores do usuário oferecem maior precisão de pesquisa facial com representações mais robustas, pois contêm vários graus de iluminação, nitidez, pose, aparência e muito mais. Isso melhora a precisão em comparação com a pesquisa em vetores de face individuais.

Nas seções a seguir, descrevemos o processo de uso de vetores de usuário do Amazon Rekognition. Orientamos você na criação de uma coleção, no armazenamento de vetores de face nessa coleção, na agregação desses vetores de face em vetores de usuário e, em seguida, na comparação dos resultados da pesquisa com esses vetores de face individuais e vetores de usuário.

Visão geral da solução

Para esta solução, usamos uma coleção de usuários do Amazon Rekognition, cada um com seus vetores faciais indexados associados a partir de diversas imagens de rostos diferentes para cada usuário.

Vejamos o fluxo de trabalho para construir uma coleção com usuários e rostos:

  1. Crie uma coleção do Amazon Rekognition.
  2. Para cada usuário, crie um usuário na coleção.
  3. Para cada imagem do usuário, adicione o rosto à coleção (IndexFaces, que retorna o ID da face correspondente a cada vetor de face).
  4. Associe todos os IDs faciais indexados ao usuário (isso é necessário para vetores do usuário).

Em seguida, compararemos os seguintes fluxos de trabalho:

Pesquisando com uma nova imagem de entrada em vetores faciais individuais em nossa coleção:

  1. Obtenha todos os rostos de uma imagem (Detectar Faces).
  2. Para cada rosto, compare com rostos individuais em nossa coleção (PesquisaFacesByImage).

Pesquisando com uma nova imagem de entrada em vetores do usuário em nossa coleção:

  1. Obtenha todos os rostos de uma imagem (Detectar Faces).
  2. Para cada face, compare com o vetor do usuário (PesquisarUsuáriosByImage).

Agora vamos descrever a solução em detalhes.

Pré-requisitos

Adicione a seguinte política ao seu Gerenciamento de acesso e identidade da AWS (IAM) usuário ou função. A política concede permissão para as APIs relevantes do Amazon Rekognition e permite acesso a um Serviço de armazenamento simples da Amazon (Amazon S3) balde para armazenar as imagens:

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

Crie uma coleção do Amazon Rekognition e adicione usuários e rostos

Primeiro, criamos um bucket S3 para armazenar as imagens dos usuários. Organizamos o balde criando uma pasta para cada usuário que contém suas imagens pessoais. Nosso pasta de imagens se parece com a seguinte estrutura:

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

Nosso bucket S3 possui um diretório para cada usuário que armazena suas imagens. Atualmente existem duas pastas e cada uma contém várias imagens. Você pode adicionar mais pastas para seus usuários, cada uma contendo uma ou mais imagens a serem indexadas.

A seguir, criamos nossa coleção Amazon Rekognition. Nós fornecemos ajudantes.py, que contém diferentes métodos que usamos:

  • criar_coleção – Crie uma nova coleção
  • excluir_coleção – Excluir uma coleção
  • criar_usuário – Crie um novo usuário em uma coleção
  • add_faces_to_collection – Adicionar rostos à coleção
  • associados_faces – Associar face_ids a um usuário em uma coleção
  • get_subdirs – Obtenha todos os subdiretórios sob o prefixo S3
  • get_files – Obtenha todos os arquivos sob o prefixo S3

Veja a seguir um exemplo de método para criar uma coleção do 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...')

Crie a coleção com o seguinte código:

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

A seguir, vamos adicionar os vetores faciais à nossa coleção e agregá-los aos vetores do usuário.

Para cada usuário no diretório S3, criamos um vetor de usuário na coleção. Em seguida, indexamos as imagens faciais de cada usuário na coleção como vetores faciais individuais, o que gera IDs faciais. Por último, associamos os IDs faciais ao vetor de usuário apropriado.

Isso cria dois tipos de vetores em nossa coleção:

  • Vetores de rostos individuais
  • Vetores do usuário, que são construídos com base nos IDs de vetores de face fornecidos usando o método associate_faces

Veja o seguinte código:

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

Usamos os seguintes métodos:

  • get_subdirs – Retorna uma lista de todos os diretórios dos usuários. No nosso exemplo, o valor é [Swami,Werner].
  • get_files – Retorna todos os arquivos de imagens com o prefixo S3 para o usuário.
  • face_ids – Esta é uma lista contendo todos os IDs faciais pertencentes a um usuário. Usamos esta lista ao chamar o AssociarFaces API.

Conforme explicado anteriormente, você pode adicionar mais usuários adicionando pastas para eles (a pasta determina o ID do usuário) e adicionar suas imagens nessa pasta (nenhuma ordem é necessária para os arquivos).

Agora que nosso ambiente está configurado e temos vetores de face individuais e vetores de usuário, vamos comparar nossa qualidade de pesquisa com cada um deles. Para fazer isso, usamos uma nova foto com várias pessoas e tentamos comparar seus rostos com nossa coleção, primeiro com os vetores de rostos individuais e depois com os vetores do usuário.

Pesquisa facial de imagem em uma coleção de vetores faciais individuais

Para pesquisar nossos vetores faciais individuais, usamos o Amazon Rekognition PesquisaFacesByImage API. Esta função usa uma imagem facial de origem para pesquisar vetores faciais individuais em nossa coleção e retorna faces que correspondem ao nosso limite de pontuação de similaridade definido.

Uma consideração importante é que SearchFacesByImage A API operará apenas no maior rosto detectado na imagem. Se várias faces estiverem presentes, será necessário recortar cada face individual e passá-la separadamente para o método de identificação.

Para extrair detalhes de rostos de uma imagem (como sua localização na imagem), usamos o Amazon Rekognition Detectar Faces API.

Os seguintes detect_faces_in_image método detecta rostos em uma imagem. Para cada face, realiza as seguintes ações:

  • Imprima a localização da caixa delimitadora
  • Recorte o rosto da imagem e verifique se tal rosto existe na coleção e imprima o usuário ou 'Desconhecido'
  • Imprima a pontuação de similaridade

O exemplo de código Python usa o Almofadas biblioteca para fazer as manipulações de imagens (como imprimir, desenhar e cortar).

Usamos um limite de pontuação de similaridade de 99%, que é uma configuração comum para casos de uso de verificação de identidade.

Execute o seguinte código:

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 é a chave do objeto S3 que queremos comparar com nossa coleção. Fornecemos uma imagem de exemplo (photo.jpeg) na pasta de imagens.

A imagem a seguir mostra nossos resultados.

Usando um limite de 99%, apenas uma pessoa foi identificada. Dr. Werner Vogels foi sinalizado como Desconhecido. Se executarmos o mesmo código usando um limite inferior de 90 (definir limite=90), obteremos os seguintes resultados.

Agora vemos que o rosto do Dr. Werner Vogel tem uma pontuação de similaridade de 96.86%. A seguir, vamos verificar se podemos obter a pontuação de similaridade acima do limite definido usando vetores do usuário.

Pesquisa facial de imagem em uma coleção de vetores do usuário

Para pesquisar nossos vetores de usuário, usamos o Amazon Rekognition PesquisarUsuáriosByImage API. Esta função usa uma imagem facial de origem para pesquisar vetores de usuário em nossa coleção e retorna usuários que correspondem ao nosso limite de pontuação de similaridade definido.

A mesma consideração é relevante aqui – a SearchUsersByImage A API operará apenas no maior rosto detectado na imagem. Se houver vários rostos presentes, será necessário recortar cada rosto individual e passá-lo separadamente para o método de identificação.

Para extrair detalhes de rostos de uma imagem (como sua localização na imagem), usamos o Amazon Rekognition Detectar Faces API.

Os seguintes detect_users_in_image método detecta rostos em uma imagem. Para cada face, realiza as seguintes ações:

  • Imprima a localização da caixa delimitadora
  • Corte o rosto da imagem e verifique se tal rosto de usuário existe em nossa coleção e imprima o usuário ou 'Desconhecido'
  • Imprima a pontuação de similaridade

Veja o seguinte código:

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

A função retorna uma imagem modificada com os resultados que podem ser salvos no Amazon S3 ou impressos. A função também envia estatísticas sobre as idades estimadas dos rostos para o terminal.

Execute o seguinte código:

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)

A imagem a seguir mostra nossos resultados.

Os usuários existentes em nossa coleção foram identificados corretamente com alta similaridade (mais de 99%).

Conseguimos aumentar a pontuação de similaridade usando três vetores de face por vetor de usuário. À medida que aumentamos o número de vetores de faces usados, esperamos que a pontuação de similaridade para correspondências verdadeiras também aumente. Você pode usar até 100 vetores de face por vetor de usuário.

Um exemplo de código de ponta a ponta pode ser encontrado no Repositório GitHub. Inclui um detalhado Caderno Jupyter que você pode executar Estúdio Amazon SageMaker (ou outras alternativas).

limpar

Para excluir a coleção, use o seguinte código:

helpers.delete_collection(collection_id)

Conclusão

Nesta postagem, apresentamos como usar vetores de usuário do Amazon Rekognition para implementar a pesquisa facial em uma coleção de rostos de usuários. Demonstramos como melhorar a precisão da pesquisa facial usando várias imagens faciais por usuário e comparando-as com vetores faciais individuais. Além disso, descrevemos como você pode usar as diferentes APIs do Amazon Rekognition para detectar rostos. O código de exemplo fornecido serve como uma base sólida para a construção de um sistema funcional de pesquisa facial.

Para obter mais informações sobre vetores de usuário do Amazon Rekognition, consulte Pesquisando rostos em uma coleção. Se você é novo no Amazon Rekognition, pode usar nosso nível gratuito, que dura 12 meses e inclui o processamento de 5,000 imagens por mês e o armazenamento de 1,000 objetos vetoriais do usuário por mês.


Sobre os autores

Arik Porat é arquiteto sênior de soluções para startups na Amazon Web Services. Ele trabalha com startups para ajudá-las a construir e projetar suas soluções na nuvem e é apaixonado por aprendizado de máquina e soluções baseadas em contêineres. Nas horas vagas, Arik gosta de jogar xadrez e videogame.

Eliran Efron é arquiteto de soluções para startups na Amazon Web Services. Eliran é um entusiasta de dados e computação, auxiliando startups no design de suas arquiteturas de sistemas. Em seu tempo livre, Eliran gosta de construir e correr carros em corridas de turismo e construir dispositivos IoT.

local_img

Inteligência mais recente

local_img