Trí thông minh dữ liệu tạo

Cải thiện độ chính xác của Tìm kiếm khuôn mặt Rekognition của Amazon với vectơ người dùng | Dịch vụ web của Amazon

Ngày:

Trong các ngành khác nhau, chẳng hạn như dịch vụ tài chính, viễn thông và chăm sóc sức khỏe, khách hàng sử dụng quy trình nhận dạng kỹ thuật số, thường bao gồm một số bước để xác minh người dùng cuối trong quá trình xác thực trực tuyến hoặc xác thực từng bước. Ví dụ về một bước có thể sử dụng là tìm kiếm khuôn mặt. Bước này có thể giúp xác định xem khuôn mặt của người dùng cuối mới có khớp với những khuôn mặt được liên kết với tài khoản hiện tại hay không.

Xây dựng một hệ thống tìm kiếm khuôn mặt chính xác bao gồm một số bước. Hệ thống phải có khả năng phát hiện khuôn mặt người trong hình ảnh, trích xuất khuôn mặt thành biểu diễn vectơ, lưu trữ vectơ khuôn mặt trong cơ sở dữ liệu và so sánh khuôn mặt mới với các mục nhập hiện có. Nhận thức lại Amazon giúp việc này trở nên dễ dàng bằng cách cung cấp cho bạn các mô hình được đào tạo trước được gọi thông qua các lệnh gọi API đơn giản.

Amazon Rekognition cho phép bạn đạt được độ chính xác rất cao khi tìm kiếm khuôn mặt chỉ bằng một hình ảnh khuôn mặt. Trong một số trường hợp, bạn có thể sử dụng nhiều hình ảnh của cùng một khuôn mặt để tạo vectơ người dùng và cải thiện độ chính xác hơn nữa. Điều này đặc biệt hữu ích khi hình ảnh có nhiều biến thể về ánh sáng, tư thế và hình thức.

Trong bài đăng này, chúng tôi trình bày cách sử dụng API Tìm kiếm khuôn mặt của Amazon Rekognition với vectơ người dùng để tăng điểm tương tự cho các kết quả trùng khớp thực và giảm điểm tương tự cho các kết quả không khớp thực sự.

Chúng tôi so sánh kết quả thực hiện khớp khuôn mặt có và không có vectơ người dùng.

Amazon Rekognition khớp khuôn mặt

So khớp khuôn mặt của Amazon Rekognition cho phép đo mức độ giống nhau của vectơ khuôn mặt được trích xuất từ ​​một hình ảnh với vectơ khuôn mặt được trích xuất từ ​​một hình ảnh khác. Một cặp ảnh khuôn mặt được gọi là một trận đấu thực sự nếu cả hai hình ảnh đều chứa khuôn mặt của cùng một người và một không khớp thực sự nếu không thì. Amazon Rekognition trả về điểm cho độ giống nhau của khuôn mặt nguồn và mục tiêu. Điểm tương đồng tối thiểu là 0, ngụ ý rất ít sự tương đồng và tối đa là 100.

Để so sánh một khuôn mặt nguồn với một tập hợp các khuôn mặt đích (khớp 1:N), Amazon Rekognition cho phép bạn tạo một đối tượng Bộ sưu tập và điền vào đó các khuôn mặt từ hình ảnh bằng lệnh gọi API.

Khi thêm một khuôn mặt vào bộ sưu tập, Amazon Rekognition không lưu trữ hình ảnh thực tế của khuôn mặt mà lưu trữ vectơ khuôn mặt, một biểu diễn toán học của khuôn mặt. Với Tìm kiếmKhuôn mặt API, bạn có thể so sánh một mặt nguồn với một hoặc một số bộ sưu tập các mặt đích.

Vào tháng 6, 2023, AWS ra mắt vectơ người dùng, một khả năng mới giúp cải thiện đáng kể độ chính xác của tìm kiếm khuôn mặt bằng cách sử dụng nhiều hình ảnh khuôn mặt của người dùng. Bây giờ, bạn có thể tạo vectơ người dùng, tổng hợp nhiều vectơ khuôn mặt của cùng một người dùng. Vectơ người dùng cung cấp độ chính xác tìm kiếm khuôn mặt cao hơn với các mô tả mạnh mẽ hơn vì chúng chứa các mức độ ánh sáng, độ sắc nét, tư thế, diện mạo khác nhau, v.v. Điều này cải thiện độ chính xác so với tìm kiếm dựa trên các vectơ khuôn mặt riêng lẻ.

Trong các phần sau, chúng tôi phác thảo quy trình sử dụng vectơ người dùng Amazon Rekognition. Chúng tôi hướng dẫn bạn cách tạo một bộ sưu tập, lưu trữ các vectơ khuôn mặt trong bộ sưu tập đó, tổng hợp các vectơ khuôn mặt đó thành các vectơ người dùng, sau đó so sánh kết quả tìm kiếm với các vectơ khuôn mặt và vectơ người dùng riêng lẻ đó.

Tổng quan về giải pháp

Đối với giải pháp này, chúng tôi sử dụng tập hợp người dùng Amazon Rekognition, mỗi người có vectơ khuôn mặt được lập chỉ mục liên quan từ một số hình ảnh khuôn mặt khác nhau cho mỗi người dùng.

Hãy xem quy trình làm việc để xây dựng bộ sưu tập với người dùng và khuôn mặt:

  1. Tạo bộ sưu tập Amazon Rekognition.
  2. Đối với mỗi người dùng, hãy tạo một người dùng trong bộ sưu tập.
  3. Đối với mỗi hình ảnh của người dùng, hãy thêm khuôn mặt vào bộ sưu tập (Chỉ mụcKhuôn mặt, trả về ID khuôn mặt tương ứng với từng vectơ khuôn mặt).
  4. Liên kết tất cả các ID khuôn mặt được lập chỉ mục với người dùng (điều này là cần thiết đối với vectơ người dùng).

Sau đó, chúng ta sẽ so sánh các quy trình công việc sau:

Tìm kiếm với một hình ảnh đầu vào mới nhất định dựa trên các vectơ khuôn mặt riêng lẻ trong bộ sưu tập của chúng tôi:

  1. Nhận tất cả các khuôn mặt từ một hình ảnh (Phát hiện không gian).
  2. Đối với mỗi khuôn mặt, hãy so sánh với từng khuôn mặt trong bộ sưu tập của chúng tôi (Tìm kiếmKhuôn mặtByHình ảnh).

Tìm kiếm bằng hình ảnh đầu vào mới nhất định dựa trên vectơ người dùng trong bộ sưu tập của chúng tôi:

  1. Nhận tất cả các khuôn mặt từ một hình ảnh (Phát hiện không gian).
  2. Đối với mỗi khuôn mặt, so sánh với vectơ người dùng (Tìm kiếmNgười dùngByHình ảnh).

Bây giờ hãy mô tả chi tiết giải pháp.

Điều kiện tiên quyết

Thêm chính sách sau vào của bạn Quản lý truy cập và nhận dạng AWS (IAM) người dùng hoặc vai trò. Chính sách này cấp cho bạn quyền truy cập vào các API Amazon Rekognition có liên quan và cho phép truy cập vào một Dịch vụ lưu trữ đơn giản của Amazon (Amazon S3) để lưu trữ hình ảnh:

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

Tạo bộ sưu tập Amazon Rekognition và thêm người dùng và khuôn mặt

Đầu tiên, chúng tôi tạo vùng lưu trữ S3 để lưu trữ hình ảnh của người dùng. Chúng tôi sắp xếp nhóm bằng cách tạo một thư mục cho mỗi người dùng chứa hình ảnh cá nhân của họ. Của chúng tôi thư mục hình ảnh trông giống như cấu trúc sau:

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

Nhóm S3 của chúng tôi có một thư mục cho mỗi người dùng lưu trữ hình ảnh của họ. Hiện tại có hai thư mục và mỗi thư mục chứa một số hình ảnh. Bạn có thể thêm nhiều thư mục hơn cho người dùng của mình, mỗi thư mục chứa một hoặc nhiều hình ảnh cần được lập chỉ mục.

Tiếp theo, chúng tôi tạo bộ sưu tập Amazon Rekognition của mình. Chúng tôi đã cung cấp helpers.py, chứa các phương thức khác nhau mà chúng tôi sử dụng:

  • tạo_bộ sưu tập – Tạo bộ sưu tập mới
  • xóa_bộ sưu tập – Xóa một bộ sưu tập
  • tạo người dùng – Tạo người dùng mới trong bộ sưu tập
  • add_faces_to_collection – Thêm khuôn mặt vào bộ sưu tập
  • liên kết_khuôn mặt – Liên kết face_id với người dùng trong bộ sưu tập
  • get_subdirs – Nhận tất cả các thư mục con dưới tiền tố S3
  • get_files – Nhận tất cả các file có tiền tố S3

Sau đây là một phương pháp mẫu để tạo bộ sưu tập 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...')

Tạo bộ sưu tập với mã sau:

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

Tiếp theo, hãy thêm các vectơ khuôn mặt vào bộ sưu tập của chúng ta và tổng hợp chúng thành các vectơ người dùng.

Đối với mỗi người dùng trong thư mục S3, chúng tôi tạo một vectơ người dùng trong bộ sưu tập. Sau đó, chúng tôi lập chỉ mục các hình ảnh khuôn mặt cho từng người dùng vào bộ sưu tập dưới dạng vectơ khuôn mặt riêng lẻ, tạo ra ID khuôn mặt. Cuối cùng, chúng tôi liên kết ID khuôn mặt với vectơ người dùng thích hợp.

Điều này tạo ra hai loại vectơ trong bộ sưu tập của chúng tôi:

  • Vectơ khuôn mặt riêng lẻ
  • Các vectơ người dùng, được xây dựng dựa trên ID vectơ mặt được cung cấp bằng phương pháp associate_faces

Xem mã sau đây:

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

Chúng tôi sử dụng các phương pháp sau:

  • get_subdirs – Trả về danh sách tất cả các thư mục của người dùng. Trong ví dụ của chúng tôi, giá trị là [Swami,Werner].
  • get_files – Trả về tất cả các file hình ảnh có tiền tố S3 cho người dùng.
  • face_ids – Đây là danh sách chứa tất cả ID khuôn mặt của người dùng. Chúng tôi sử dụng danh sách này khi gọi liên kếtkhuôn mặt API.

Như đã giải thích trước đó, bạn có thể thêm nhiều người dùng hơn bằng cách thêm thư mục cho họ (thư mục chỉ định ID người dùng) và thêm hình ảnh của bạn vào thư mục đó (không cần sắp xếp thứ tự cho các tệp).

Bây giờ môi trường của chúng ta đã được thiết lập và chúng ta có cả vectơ khuôn mặt và vectơ người dùng riêng lẻ, hãy so sánh chất lượng tìm kiếm của chúng ta với từng vectơ khuôn mặt đó. Để làm điều đó, chúng tôi sử dụng một bức ảnh mới có nhiều người và cố gắng so khớp khuôn mặt của họ với bộ sưu tập của chúng tôi, trước tiên là so với các vectơ khuôn mặt riêng lẻ và sau đó so với các vectơ người dùng.

Tìm kiếm khuôn mặt của hình ảnh dựa trên tập hợp các vectơ khuôn mặt riêng lẻ

Để tìm kiếm dựa trên các vectơ khuôn mặt riêng lẻ, chúng tôi sử dụng Amazon Rekognition Tìm kiếmKhuôn mặtByHình ảnh API. Hàm này sử dụng hình ảnh khuôn mặt nguồn để tìm kiếm dựa trên các vectơ khuôn mặt riêng lẻ trong bộ sưu tập của chúng tôi và trả về các khuôn mặt khớp với ngưỡng điểm tương đồng đã xác định của chúng tôi.

Một sự cân nhắc quan trọng là SearchFacesByImage API sẽ chỉ hoạt động trên khuôn mặt lớn nhất được phát hiện trong ảnh. Nếu có nhiều khuôn mặt, bạn cần cắt từng khuôn mặt riêng lẻ và chuyển nó riêng biệt cho phương pháp nhận dạng.

Để trích xuất chi tiết khuôn mặt từ một hình ảnh (chẳng hạn như vị trí của chúng trên hình ảnh), chúng tôi sử dụng Amazon Rekognition Phát hiện không gian API.

Sau đây detect_faces_in_image Phương pháp phát hiện khuôn mặt trong ảnh. Đối với mỗi khuôn mặt, nó thực hiện các hành động sau:

  • In vị trí hộp giới hạn của nó
  • Cắt khuôn mặt khỏi hình ảnh và kiểm tra xem khuôn mặt đó có tồn tại trong bộ sưu tập hay không và in người dùng hoặc 'Không xác định'
  • In điểm tương đồng

Ví dụ mã Python sử dụng Cái gối thư viện để thực hiện các thao tác hình ảnh (chẳng hạn như in, vẽ và cắt xén).

Chúng tôi sử dụng ngưỡng điểm tương đồng là 99%, đây là cài đặt phổ biến cho các trường hợp sử dụng xác minh danh tính.

Chạy mã sau:

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 là khóa đối tượng S3 mà chúng tôi muốn so khớp với bộ sưu tập của mình. Chúng tôi đã cung cấp một hình ảnh ví dụ (photo.jpeg) trong thư mục hình ảnh.

Hình ảnh sau đây cho thấy kết quả của chúng tôi.

Sử dụng ngưỡng 99%, chỉ có một người được xác định. Tiến sĩ Werner Vogels được gắn cờ là Không xác định. Nếu chúng tôi chạy cùng một mã với ngưỡng thấp hơn là 90 (đặt ngưỡng=90), chúng tôi sẽ nhận được kết quả sau.

Bây giờ chúng ta thấy khuôn mặt của tiến sĩ Werner Vogel có tỷ lệ giống nhau là 96.86%. Tiếp theo, hãy kiểm tra xem liệu chúng ta có thể đạt được điểm tương tự trên ngưỡng đã xác định hay không bằng cách sử dụng vectơ người dùng.

Tìm kiếm khuôn mặt của hình ảnh dựa trên tập hợp các vectơ người dùng

Để tìm kiếm dựa trên vectơ người dùng, chúng tôi sử dụng Amazon Rekognition Tìm kiếmNgười dùngByHình ảnh API. Hàm này sử dụng hình ảnh khuôn mặt nguồn để tìm kiếm dựa trên vectơ người dùng trong bộ sưu tập của chúng tôi và trả về những người dùng khớp với ngưỡng điểm tương đồng đã xác định của chúng tôi.

Sự xem xét tương tự cũng có liên quan ở đây – SearchUsersByImage API sẽ chỉ hoạt động trên khuôn mặt lớn nhất được phát hiện trong ảnh. Nếu có nhiều khuôn mặt, bạn cần cắt từng khuôn mặt riêng lẻ và chuyển nó riêng biệt cho phương pháp nhận dạng.

Để trích xuất chi tiết khuôn mặt từ một hình ảnh (chẳng hạn như vị trí của chúng trên hình ảnh), chúng tôi sử dụng Amazon Rekognition Phát hiện không gian API.

Sau đây detect_users_in_image Phương pháp phát hiện khuôn mặt trong ảnh. Đối với mỗi khuôn mặt, nó thực hiện các hành động sau:

  • In vị trí hộp giới hạn của nó
  • Cắt khuôn mặt khỏi hình ảnh và kiểm tra xem khuôn mặt người dùng đó có tồn tại trong bộ sưu tập của chúng tôi hay không và in người dùng hoặc 'Không xác định'
  • In điểm tương đồng

Xem mã sau đây:

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

Hàm trả về một hình ảnh đã sửa đổi với kết quả có thể được lưu vào Amazon S3 hoặc được in. Hàm này cũng đưa ra số liệu thống kê về độ tuổi ước tính của các khuôn mặt cho thiết bị đầu cuối.

Chạy mã sau:

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)

Hình ảnh sau đây cho thấy kết quả của chúng tôi.

Những người dùng tồn tại trong bộ sưu tập của chúng tôi đã được xác định chính xác với độ tương tự cao (trên 99%).

Chúng tôi có thể tăng điểm tương đồng bằng cách sử dụng ba vectơ khuôn mặt cho mỗi vectơ người dùng. Khi chúng tôi tăng số lượng vectơ khuôn mặt được sử dụng, chúng tôi hy vọng điểm tương tự cho các kết quả trùng khớp thực sự cũng sẽ tăng lên. Bạn có thể sử dụng tối đa 100 vectơ khuôn mặt cho mỗi vectơ người dùng.

Mã ví dụ end-to-end có thể được tìm thấy trong Kho GitHub. Nó bao gồm một chi tiết Máy tính xách tay Jupyter mà bạn có thể chạy tiếp Xưởng sản xuất Amazon SageMaker (hoặc các lựa chọn thay thế khác).

Làm sạch

Để xóa bộ sưu tập, hãy sử dụng đoạn mã sau:

helpers.delete_collection(collection_id)

Kết luận

Trong bài đăng này, chúng tôi đã trình bày cách sử dụng vectơ người dùng Amazon Rekognition để triển khai tìm kiếm khuôn mặt dựa trên bộ sưu tập khuôn mặt của người dùng. Chúng tôi đã trình bày cách cải thiện độ chính xác của tìm kiếm khuôn mặt bằng cách sử dụng nhiều hình ảnh khuôn mặt cho mỗi người dùng và so sánh nó với các vectơ khuôn mặt riêng lẻ. Ngoài ra, chúng tôi đã mô tả cách bạn có thể sử dụng các API Amazon Rekognition khác nhau để phát hiện khuôn mặt. Mã ví dụ được cung cấp đóng vai trò là nền tảng vững chắc để xây dựng hệ thống tìm kiếm khuôn mặt chức năng.

Để biết thêm thông tin về vectơ người dùng Amazon Rekognition, hãy tham khảo Tìm kiếm khuôn mặt trong bộ sưu tập. Nếu mới sử dụng Amazon Rekognition, bạn có thể sử dụng Bậc miễn phí của chúng tôi, kéo dài 12 tháng và bao gồm xử lý 5,000 hình ảnh mỗi tháng và lưu trữ 1,000 đối tượng vectơ người dùng mỗi tháng.


Về các tác giả

Arik Porat là Kiến trúc sư giải pháp khởi nghiệp cấp cao tại Amazon Web Services. Anh ấy làm việc với các công ty khởi nghiệp để giúp họ xây dựng và thiết kế các giải pháp trên đám mây, đồng thời rất đam mê các giải pháp máy học và dựa trên vùng chứa. Khi rảnh rỗi, Arik thích chơi cờ và trò chơi điện tử.

Eliran Efron là Kiến trúc sư giải pháp khởi nghiệp tại Amazon Web Services. Eliran là một người đam mê dữ liệu và điện toán, hỗ trợ các công ty khởi nghiệp thiết kế kiến ​​trúc hệ thống của họ. Trong thời gian rảnh rỗi, Eliran thích chế tạo và đua xe trong các cuộc đua Touring cũng như chế tạo các thiết bị IoT.

tại chỗ_img

Tin tức mới nhất

tại chỗ_img