생성 데이터 인텔리전스

사용자 벡터를 통해 Amazon Rekognition Face Search의 정확성 향상 | 아마존 웹 서비스

시간

금융 서비스, 통신, 의료 등 다양한 산업에서 고객은 일반적으로 온라인 온보딩 또는 단계별 인증 중에 최종 사용자를 확인하기 위한 여러 단계가 포함되는 디지털 ID 프로세스를 사용합니다. 사용할 수 있는 단계 중 하나는 얼굴 검색입니다. 이는 새로운 최종 사용자의 얼굴이 기존 계정과 연결된 얼굴과 일치하는지 확인하는 데 도움이 될 수 있습니다.

정확한 얼굴 검색 시스템을 구축하려면 여러 단계가 필요합니다. 시스템은 이미지에서 사람의 얼굴을 감지하고, 얼굴을 벡터 표현으로 추출하고, 데이터베이스에 얼굴 벡터를 저장하고, 새 얼굴을 기존 항목과 비교할 수 있어야 합니다. 아마존 인식 간단한 API 호출을 통해 호출되는 사전 학습된 모델을 제공하여 이를 쉽게 수행할 수 있습니다.

Amazon Rekognition을 사용하면 단일 얼굴 이미지로 매우 높은 얼굴 검색 정확도를 얻을 수 있습니다. 어떤 경우에는 동일한 사람 얼굴의 여러 이미지를 사용하여 사용자 벡터를 만들고 정확도를 더욱 향상시킬 수 있습니다. 이는 이미지의 조명, 포즈 및 모양이 다양할 때 특히 유용합니다.

이 게시물에서는 사용자 벡터와 함께 Amazon Rekognition Face Search API를 사용하여 실제 일치에 대한 유사성 점수를 높이고 실제 비일치에 대한 유사성 점수를 낮추는 방법을 보여줍니다.

사용자 벡터가 있는 경우와 없는 경우의 얼굴 매칭 결과를 비교합니다.

Amazon Rekognition 얼굴 매칭

Amazon Rekognition 얼굴 매칭을 사용하면 한 이미지에서 추출된 얼굴 벡터와 다른 이미지에서 추출된 얼굴 벡터의 유사성을 측정할 수 있습니다. 한 쌍의 얼굴 이미지는 진정한 일치 두 이미지에 동일한 사람의 얼굴이 포함된 경우 진짜 불일치 그렇지 않으면. Amazon Rekognition은 소스 얼굴과 대상 얼굴의 유사성에 대한 점수를 반환합니다. 최소 유사성 점수는 0으로 유사성이 거의 없음을 의미하며 최대값은 100입니다.

원본 얼굴을 대상 얼굴 모음(1:N 일치)과 비교하기 위해 Amazon Rekognition을 사용하면 API 호출을 사용하여 컬렉션 객체를 생성하고 이미지의 얼굴로 채울 수 있습니다.

컬렉션에 얼굴을 추가할 때 Amazon Rekognition은 얼굴의 실제 이미지를 저장하지 않고 얼굴의 수학적 표현인 얼굴 벡터를 저장합니다. 와 더불어 검색얼굴 API를 사용하면 원본 얼굴을 하나 이상의 대상 얼굴 모음과 비교할 수 있습니다.

6 월 2023에서는, AWS는 얼굴 검색 정확도를 크게 향상시키는 새로운 기능인 사용자 벡터를 출시했습니다. 사용자의 여러 얼굴 이미지를 사용하여 이제 동일한 사용자의 여러 얼굴 벡터를 집계하는 사용자 벡터를 생성할 수 있습니다. 사용자 벡터에는 다양한 수준의 조명, 선명도, 포즈, 모양 등이 포함되어 있으므로 보다 강력한 묘사로 더 높은 얼굴 검색 정확도를 제공합니다. 이렇게 하면 개별 얼굴 벡터를 검색하는 것보다 정확도가 향상됩니다.

다음 섹션에서는 Amazon Rekognition 사용자 벡터를 사용하는 프로세스를 간략하게 설명합니다. 컬렉션을 만들고, 해당 컬렉션에 얼굴 벡터를 저장하고, 해당 얼굴 벡터를 사용자 벡터로 집계한 다음, 개별 얼굴 벡터 및 사용자 벡터에 대한 검색 결과를 비교하는 과정을 안내합니다.

솔루션 개요

이 솔루션을 위해 우리는 Amazon Rekognition 사용자 컬렉션을 사용합니다. 각 사용자는 각 사용자의 다양한 얼굴 이미지에서 가져온 관련 인덱싱된 얼굴 벡터를 가지고 있습니다.

사용자와 얼굴로 컬렉션을 구축하는 워크플로를 살펴보겠습니다.

  1. Amazon Rekognition 컬렉션을 생성합니다.
  2. 각 사용자에 대해 컬렉션에 사용자를 만듭니다.
  3. 사용자의 각 이미지에 대해 컬렉션에 얼굴을 추가합니다(인덱스페이스, 각 얼굴 벡터에 해당하는 얼굴 ID를 반환합니다).
  4. 인덱싱된 모든 얼굴 ID를 사용자와 연결합니다(사용자 벡터에 필요함).

그런 다음 다음 워크플로를 비교해 보겠습니다.

컬렉션의 개별 얼굴 벡터에 대해 새로운 입력 이미지로 검색:

  1. 이미지에서 모든 얼굴 가져오기(얼굴 감지).
  2. 각 얼굴에 대해 컬렉션에 있는 개별 얼굴과 비교합니다(이미지로 얼굴 검색).

컬렉션의 사용자 벡터에 대해 새로운 입력 이미지로 검색:

  1. 이미지에서 모든 얼굴 가져오기(얼굴 감지).
  2. 각 얼굴에 대해 사용자 벡터(이미지별 사용자 검색).

이제 솔루션을 자세히 설명하겠습니다.

사전 조건

다음 정책을 추가하세요. AWS 자격 증명 및 액세스 관리 (IAM) 사용자 또는 역할. 이 정책은 관련 Amazon Rekognition API에 대한 권한을 부여하고 다음 항목에 대한 액세스를 허용합니다. 아마존 단순 스토리지 서비스 (Amazon S3) 이미지를 저장할 버킷:

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

Amazon Rekognition 컬렉션 생성 및 사용자 및 얼굴 추가

먼저 사용자의 이미지를 저장할 S3 버킷을 생성합니다. 우리는 각 사용자의 개인 이미지가 포함된 폴더를 생성하여 버킷을 구성합니다. 우리의 이미지 폴더 다음 구조와 같습니다.

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

S3 버킷에는 각 사용자의 이미지를 저장하는 디렉터리가 있습니다. 현재 두 개의 폴더가 있으며 각 폴더에는 여러 이미지가 포함되어 있습니다. 사용자를 위해 색인화할 이미지가 하나 이상 포함된 폴더를 더 추가할 수 있습니다.

다음으로 Amazon Rekognition 컬렉션을 생성합니다. 우리는 공급했습니다 helpers.py여기에는 우리가 사용하는 다양한 방법이 포함되어 있습니다.

  • 생성 컬렉션 – 새 컬렉션 만들기
  • 삭제_컬렉션 – 컬렉션 삭제
  • create_user – 컬렉션에 새 사용자 생성
  • add_faces_to_collection – 컬렉션에 얼굴 추가
  • 동료_얼굴 – 컬렉션의 사용자에 Face_ids 연결
  • get_subdirs – S3 접두사 아래의 모든 하위 디렉터리를 가져옵니다.
  • get_files – S3 접두사 아래의 모든 파일 가져오기

다음은 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...')

다음 코드를 사용하여 컬렉션을 만듭니다.

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

다음으로 얼굴 벡터를 컬렉션에 추가하고 이를 사용자 벡터로 집계해 보겠습니다.

S3 디렉터리의 각 사용자에 대해 컬렉션에 사용자 벡터를 생성합니다. 그런 다음 각 사용자의 얼굴 이미지를 개별 얼굴 벡터로 컬렉션에 인덱싱하여 얼굴 ID를 생성합니다. 마지막으로 얼굴 ID를 적절한 사용자 벡터에 연결합니다.

그러면 컬렉션에 두 가지 유형의 벡터가 생성됩니다.

  • 개별 얼굴 벡터
  • 메소드를 사용하여 제공된 얼굴 벡터 ID를 기반으로 구축된 사용자 벡터 associate_faces

다음 코드를 참조하십시오.

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

우리는 다음 방법을 사용합니다:

  • get_subdirs – 모든 사용자 디렉터리 목록을 반환합니다. 이 예에서 값은 [Swami,Werner]입니다.
  • get_files – 사용자의 S3 접두사 아래에 있는 모든 이미지 파일을 반환합니다.
  • 얼굴_ID – 사용자의 모든 얼굴 ID가 포함된 목록입니다. 우리는 전화를 걸 때 이 목록을 사용합니다. AssociateFaces API.

앞서 설명했듯이 폴더를 추가하여 사용자를 더 추가하고(폴더는 사용자 ID를 나타냄) 해당 폴더에 이미지를 추가할 수 있습니다(파일에 대한 순서는 필요하지 않습니다).

이제 환경이 설정되었고 개별 얼굴 벡터와 사용자 벡터가 모두 있으므로 각각에 대해 검색 품질을 비교해 보겠습니다. 이를 위해 우리는 여러 사람이 포함된 새 사진을 사용하고 그들의 얼굴을 우리 컬렉션과 일치시키려고 시도합니다. 먼저 개별 얼굴 벡터와 사용자 벡터와 비교합니다.

개별 얼굴 벡터 모음에 대한 이미지의 얼굴 검색

개별 얼굴 벡터를 검색하기 위해 Amazon Rekognition을 사용합니다. 이미지로 얼굴 검색 API. 이 함수는 원본 얼굴 이미지를 사용하여 컬렉션에 있는 개별 얼굴 벡터를 검색하고 정의된 유사성 점수 임계값과 일치하는 얼굴을 반환합니다.

중요한 고려 사항은 SearchFacesByImage API는 이미지에서 감지된 가장 큰 얼굴에서만 작동합니다. 여러 얼굴이 있는 경우 각 개별 얼굴을 잘라서 식별 방법에 별도로 전달해야 합니다.

이미지에서 얼굴 세부 정보(예: 이미지에서의 위치)를 추출하기 위해 Amazon Rekognition을 사용합니다. 얼굴 감지 API.

다음 detector_faces_in_image 방법은 이미지에서 얼굴을 감지합니다. 각 얼굴에 대해 다음 작업을 수행합니다.

  • 경계 상자 위치를 인쇄합니다.
  • 이미지에서 얼굴을 잘라내어 컬렉션에 해당 얼굴이 있는지 확인하고 사용자 또는 '알 수 없음'으로 인쇄합니다.
  • 유사성 점수 인쇄

예제 Python 코드에서는 다음을 사용합니다. 베개 이미지 조작(예: 인쇄, 그리기, 자르기)을 수행하기 위한 라이브러리입니다.

우리는 신원 확인 사용 사례에 대한 일반적인 설정인 99%의 유사성 점수 임계값을 사용합니다.

다음 코드를 실행합니다.

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 컬렉션과 일치시키려는 S3 객체 키입니다. 예시 이미지를 제공했습니다(photo.jpeg) 이미지 폴더 아래에 있습니다.

다음 이미지는 결과를 보여줍니다.

99%의 임계값을 사용하면 단 한 사람만 식별되었습니다. Werner Vogels 박사는 알 수 없음으로 표시되었습니다. 더 낮은 임계값인 90(임계값=90으로 설정)을 사용하여 동일한 코드를 실행하면 다음과 같은 결과를 얻습니다.

이제 Werner Vogel 박사의 얼굴의 유사성 점수는 96.86%입니다. 다음으로, 사용자 벡터를 사용하여 정의된 임계값 이상의 유사성 점수를 얻을 수 있는지 확인해 보겠습니다.

사용자 벡터 모음에 대한 이미지의 얼굴 검색

사용자 벡터를 검색하기 위해 Amazon Rekognition을 사용합니다. 이미지별 사용자 검색 API. 이 함수는 원본 얼굴 이미지를 사용하여 컬렉션의 사용자 벡터를 검색하고 정의된 유사성 점수 임계값과 일치하는 사용자를 반환합니다.

여기에도 동일한 고려 사항이 적용됩니다. SearchUsersByImage API는 이미지에서 감지된 가장 큰 얼굴에서만 작동합니다. 여러 얼굴이 있는 경우 각 개별 얼굴을 잘라서 식별 방법에 별도로 전달해야 합니다.

이미지에서 얼굴 세부 정보(예: 이미지에서의 위치)를 추출하기 위해 Amazon Rekognition을 사용합니다. 얼굴 감지 API.

다음 detector_users_in_image 방법은 이미지에서 얼굴을 감지합니다. 각 얼굴에 대해 다음 작업을 수행합니다.

  • 경계 상자 위치를 인쇄합니다.
  • 이미지에서 얼굴을 자르고 해당 사용자 얼굴이 컬렉션에 있는지 확인한 후 사용자 또는 '알 수 없음'을 인쇄합니다.
  • 유사성 점수 인쇄

다음 코드를 참조하십시오.

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

이 함수는 Amazon S3에 저장하거나 인쇄할 수 있는 결과와 함께 수정된 이미지를 반환합니다. 이 기능은 또한 얼굴의 추정 연령에 대한 통계를 단말기에 출력합니다.

다음 코드를 실행합니다.

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)

다음 이미지는 결과를 보여줍니다.

우리 컬렉션에 존재하는 사용자는 높은 유사성(99% 이상)으로 정확하게 식별되었습니다.

사용자 벡터당 100개의 얼굴 벡터를 사용하여 유사성 점수를 높일 수 있었습니다. 사용되는 얼굴 벡터의 수를 늘리면 실제 일치에 대한 유사성 점수도 높아질 것으로 예상됩니다. 사용자 벡터당 최대 XNUMX개의 얼굴 벡터를 사용할 수 있습니다.

엔드투엔드 예제 코드는 다음에서 찾을 수 있습니다. GitHub 저장소. 여기에는 상세한 내용이 포함되어 있습니다. 주피터 노트 당신이 달릴 수 있는 것 아마존 세이지 메이커 스튜디오 (또는 다른 대안).

정리

컬렉션을 삭제하려면 다음 코드를 사용하세요.

helpers.delete_collection(collection_id)

결론

이 게시물에서는 Amazon Rekognition 사용자 벡터를 사용하여 사용자 얼굴 모음에 대해 얼굴 검색을 구현하는 방법을 소개했습니다. 우리는 사용자당 여러 얼굴 이미지를 사용하여 얼굴 검색 정확도를 향상시키는 방법을 시연하고 이를 개별 얼굴 벡터와 비교했습니다. 또한 다양한 Amazon Rekognition API를 사용하여 얼굴을 감지하는 방법도 설명했습니다. 제공된 예제 코드는 기능적인 얼굴 검색 시스템을 구축하기 위한 견고한 기반 역할을 합니다.

Amazon Rekognition 사용자 벡터에 대한 자세한 내용은 다음을 참조하십시오. 컬렉션에서 얼굴 검색. Amazon Rekognition을 처음 사용하는 경우 12개월 동안 지속되며 매월 5,000개의 이미지를 처리하고 매월 1,000개의 사용자 벡터 객체를 저장하는 프리 티어를 사용할 수 있습니다.


저자에 관하여

아릭 포랏 Amazon Web Services의 수석 스타트업 솔루션 설계자입니다. 그는 스타트업과 협력하여 클라우드에서 솔루션을 구축하고 설계하도록 돕고 있으며 기계 학습 및 컨테이너 기반 솔루션에 열정을 갖고 있습니다. 여가 시간에는 Arik은 체스와 비디오 게임을 좋아합니다.

엘리란 에프론 Amazon Web Services의 스타트업 솔루션 아키텍트입니다. Eliran은 스타트업의 시스템 아키텍처 설계를 지원하는 데이터 및 컴퓨팅 애호가입니다. 여가 시간에는 Eliran은 투어링 경주에서 자동차를 만들고 경주하며 IoT 장치를 만드는 것을 좋아합니다.

spot_img

최신 인텔리전스

spot_img

우리와 함께 채팅

안녕하세요! 어떻게 도와 드릴까요?