هوش داده های تولیدی

بهبود دقت جستجوی چهره شناسایی آمازون با بردارهای کاربر | خدمات وب آمازون

تاریخ:

در صنایع مختلف، مانند خدمات مالی، مخابرات و مراقبت‌های بهداشتی، مشتریان از فرآیند هویت دیجیتالی استفاده می‌کنند که معمولاً شامل چندین مرحله برای تأیید کاربران نهایی در حین ورود آنلاین یا تأیید اعتبار می‌شود. نمونه‌ای از یکی از مراحلی که می‌توان استفاده کرد، جستجوی چهره است، که می‌تواند به تعیین اینکه آیا چهره کاربر نهایی جدید با چهره‌های مرتبط با حساب موجود مطابقت دارد یا خیر، کمک می‌کند.

ساختن یک سیستم جستجوی چهره دقیق شامل چندین مرحله است. این سیستم باید بتواند چهره‌های انسان را در تصاویر تشخیص دهد، چهره‌ها را در نمایش‌های برداری استخراج کند، بردارهای چهره را در پایگاه داده ذخیره کند و چهره‌های جدید را با ورودی‌های موجود مقایسه کند. شناسایی آمازون این کار را با ارائه مدل های از پیش آموزش دیده ای که از طریق فراخوانی های ساده API فراخوانی می شوند، آسان می کند.

آمازون Rekognition شما را قادر می سازد تا با یک تصویر چهره به دقت بسیار بالایی در جستجوی چهره برسید. در برخی موارد، می‌توانید از چندین تصویر از چهره یک فرد برای ایجاد بردارهای کاربر و بهبود دقت بیشتر استفاده کنید. این امر به ویژه زمانی مفید است که تصاویر دارای تنوع در نور، ژست و ظاهر باشند.

در این پست، نحوه استفاده از APIهای جستجوی چهره شناسایی آمازون با بردارهای کاربر برای افزایش امتیاز شباهت برای موارد واقعی و کاهش امتیاز شباهت برای موارد غیر منطبق واقعی را نشان می‌دهیم.

ما نتایج انجام تطبیق چهره را با و بدون بردار کاربر مقایسه می کنیم.

تطبیق چهره آمازون Rekognition

تطبیق چهره تشخیص چهره آمازون اندازه گیری شباهت وکتور چهره استخراج شده از یک تصویر به وکتور چهره استخراج شده از تصویر دیگر را امکان پذیر می کند. به یک جفت تصویر چهره می گویند a مطابقت واقعی اگر هر دو تصویر شامل چهره یک شخص باشد، و الف عدم تطابق واقعی در غیر این صورت. آمازون Rekognition امتیازی را برای شباهت چهره منبع و هدف برمی گرداند. حداقل امتیاز شباهت 0 است که به معنای شباهت بسیار کمی است و حداکثر آن 100 است.

برای مقایسه یک چهره منبع با مجموعه ای از چهره های هدف (تطابق 1:N)، شناسایی آمازون به شما امکان می دهد یک شی مجموعه ایجاد کنید و آن را با چهره هایی از تصاویر با استفاده از فراخوانی های API پر کنید.

هنگام افزودن یک چهره به مجموعه، آمازون Rekognition تصویر واقعی چهره را ذخیره نمی کند، بلکه بردار چهره را ذخیره می کند، که یک نمایش ریاضی از چهره است. با جستجوی چهره ها API، می توانید یک چهره منبع را با یک یا چند مجموعه از چهره های هدف مقایسه کنید.

در ماه ژوئن 2023 AWS بردارهای کاربر را راه اندازی کرد، قابلیت جدیدی که به طور قابل توجهی دقت جستجوی چهره را بهبود می بخشد با استفاده از چند تصویر چهره یک کاربر. اکنون، می‌توانید بردارهای کاربر ایجاد کنید، که چندین بردار چهره یک کاربر را جمع‌آوری می‌کند. بردارهای کاربر دقت جستجوی چهره بالاتری را با تصاویر قوی تر ارائه می دهند، زیرا دارای درجات مختلفی از نور، وضوح، ژست، ظاهر و موارد دیگر هستند. این دقت را در مقایسه با جستجو در برابر بردارهای صورت فردی بهبود می بخشد.

در بخش‌های بعدی، روند استفاده از بردارهای کاربر شناسایی آمازون را شرح می‌دهیم. ما شما را از طریق ایجاد یک مجموعه، ذخیره بردارهای چهره در آن مجموعه، تجمیع آن بردارهای چهره در بردارهای کاربر، و سپس مقایسه نتایج جستجو با آن بردارهای صورت فردی و بردارهای کاربر راهنمایی می کنیم.

بررسی اجمالی راه حل

برای این راه‌حل، ما از مجموعه‌ای از کاربران آمازون Rekognition استفاده می‌کنیم که هر کدام دارای بردارهای چهره نمایه‌شده مرتبط با تعدادی تصویر مختلف از چهره‌ها برای هر کاربر است.

بیایید به گردش کار برای ساخت مجموعه ای با کاربران و چهره ها نگاه کنیم:

  1. مجموعه ای از آمازون Rekognition ایجاد کنید.
  2. برای هر کاربر، یک کاربر در مجموعه ایجاد کنید.
  3. برای هر تصویر کاربر، چهره را به مجموعه اضافه کنید (شاخص ها، که شناسه چهره مربوط به هر بردار چهره را برمی گرداند).
  4. همه شناسه های چهره نمایه شده را با کاربر مرتبط کنید (این برای بردارهای کاربر ضروری است).

سپس، گردش کار زیر را با هم مقایسه می کنیم:

جستجو با یک تصویر ورودی داده شده جدید در برابر بردارهای صورت فردی در مجموعه ما:

  1. دریافت همه چهره ها از یک تصویر (ردیابی).
  2. برای هر چهره، با چهره های فردی در مجموعه ما مقایسه کنید (SearchFacesByImage).

جستجو با یک تصویر ورودی داده شده جدید در برابر بردارهای کاربر در مجموعه ما:

  1. دریافت همه چهره ها از یک تصویر (ردیابی).
  2. برای هر چهره، با بردار کاربر مقایسه کنید (SearchUsersByImage).

حالا بیایید راه حل را با جزئیات شرح دهیم.

پیش نیازها

سیاست زیر را به خود اضافه کنید هویت AWS و مدیریت دسترسی کاربر یا نقش (IAM). این خط‌مشی به شما مجوز 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>"
            ]
        }
    ]
}

مجموعه آمازون Rekognition ایجاد کنید و کاربران و چهره ها را اضافه کنید

ابتدا یک سطل S3 برای ذخیره تصاویر کاربران ایجاد می کنیم. ما با ایجاد یک پوشه برای هر کاربر که حاوی تصاویر شخصی آنهاست، سطل را سازماندهی می کنیم. ما پوشه تصاویر شبیه ساختار زیر است:

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

سطل S3 ما یک دایرکتوری برای هر کاربر دارد که تصاویر آنها را ذخیره می کند. در حال حاضر دو پوشه وجود دارد و هر کدام حاوی چندین تصویر است. شما می توانید پوشه های بیشتری را برای کاربران خود اضافه کنید که هر کدام شامل یک یا چند تصویر برای نمایه سازی هستند.

در مرحله بعد، مجموعه شناسایی آمازون خود را ایجاد می کنیم. عرضه کرده ایم helpers.py، که شامل روش های مختلفی است که ما استفاده می کنیم:

  • create_collection - ایجاد یک مجموعه جدید
  • delete_collection - حذف یک مجموعه
  • create_user - یک کاربر جدید در یک مجموعه ایجاد کنید
  • add_faces_to_collection - اضافه کردن چهره به مجموعه
  • associate_faces - face_ids را به یک کاربر در یک مجموعه مرتبط کنید
  • get_subdirs - همه زیر شاخه ها را تحت پیشوند S3 دریافت کنید
  • get_files - همه فایل ها را تحت پیشوند S3 دریافت کنید

در زیر یک روش نمونه برای ایجاد مجموعه شناسایی آمازون آمده است:

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، یک بردار کاربر در مجموعه ایجاد می کنیم. سپس تصاویر چهره برای هر کاربر را به عنوان بردارهای صورت جداگانه در مجموعه فهرست می کنیم، که شناسه چهره تولید می کند. در نهایت، شناسه‌های چهره را به بردار کاربر مناسب مرتبط می‌کنیم.

این دو نوع بردار در مجموعه ما ایجاد می کند:

  • بردارهای صورت فردی
  • بردارهای کاربر، که بر اساس شناسه های بردار چهره ارائه شده با استفاده از روش ساخته شده اند 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 – فهرستی از فهرست های همه کاربران را برمی گرداند. در مثال ما، مقدار [سوامی، ورنر] است.
  • get_files – تمامی فایل های تصویری تحت پیشوند S3 را برای کاربر برمی گرداند.
  • face_ids - این لیستی است که شامل تمام شناسه های چهره متعلق به یک کاربر است. ما از این لیست هنگام فراخوانی استفاده می کنیم AssociateFaces API

همانطور که قبلاً توضیح داده شد، می‌توانید با افزودن پوشه‌ها به کاربران بیشتری اضافه کنید (پوشه شناسه کاربر را دیکته می‌کند) و تصاویر خود را در آن پوشه اضافه کنید (برای فایل‌ها نیازی به سفارش نیست).

اکنون که محیط ما راه‌اندازی شده است و هم بردارهای چهره و هم بردارهای کاربر داریم، بیایید کیفیت جستجوی خود را با هر یک از آنها مقایسه کنیم. برای انجام این کار، از یک عکس جدید با چندین نفر استفاده می کنیم و سعی می کنیم چهره آنها را با مجموعه خود مطابقت دهیم، ابتدا با بردارهای صورت فردی و سپس با بردارهای کاربر.

جستجوی چهره تصویر در برابر مجموعه ای از بردارهای صورت فردی

برای جستجوی بردارهای صورت فردی خود، از تشخیص آمازون استفاده می کنیم SearchFacesByImage API. این تابع از یک تصویر چهره منبع برای جستجوی بردارهای چهره در مجموعه ما استفاده می کند و چهره هایی را برمی گرداند که با آستانه امتیاز تشابه تعریف شده ما مطابقت دارند.

یک ملاحظه مهم این است که SearchFacesByImage API فقط روی بزرگترین چهره شناسایی شده در تصویر کار می کند. اگر چند چهره وجود دارد، باید هر چهره را برش دهید و به طور جداگانه به روش شناسایی منتقل کنید.

برای استخراج جزئیات چهره از یک تصویر (مانند مکان آنها روی تصویر)، از شناسایی آمازون استفاده می کنیم. ردیابی API

در زیر detect_faces_in_image این روش چهره ها را در یک تصویر تشخیص می دهد. برای هر چهره، اقدامات زیر را انجام می دهد:

  • محل جعبه مرزی آن را چاپ کنید
  • چهره را از تصویر برش دهید و بررسی کنید که آیا چنین چهره ای در مجموعه وجود دارد و کاربر یا "ناشناس" را چاپ کنید.
  • امتیاز شباهت را چاپ کنید

مثال کد پایتون از بالش کتابخانه ای برای انجام دستکاری های تصویر (مانند چاپ، طراحی و برش).

ما از آستانه امتیاز شباهت 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) زیر پوشه images.

تصویر زیر نتایج ما را نشان می دهد.

با استفاده از آستانه 99 درصد فقط یک نفر شناسایی شد. دکتر ورنر فوگلز به عنوان ناشناس علامت گذاری شد. اگر همان کد را با استفاده از آستانه پایین تر 90 (تنظیم آستانه=90) اجرا کنیم، نتایج زیر را دریافت می کنیم.

اکنون می بینیم که چهره دکتر ورنر ووگل دارای امتیاز شباهت 96.86 درصد است. در مرحله بعد، بیایید بررسی کنیم که آیا می‌توانیم با استفاده از بردارهای کاربر، امتیاز شباهت را بالاتر از آستانه تعریف‌شده‌مان به دست آوریم.

جستجوی چهره تصویر در برابر مجموعه ای از بردارهای کاربر

برای جستجو بر اساس بردارهای کاربر خود، از شناسایی آمازون استفاده می کنیم SearchUsersByImage API. این تابع از یک تصویر چهره منبع برای جستجوی بردارهای کاربر در مجموعه ما استفاده می کند و کاربرانی را برمی گرداند که با آستانه امتیاز تشابه تعریف شده ما مطابقت دارند.

همین ملاحظات در اینجا مرتبط است - SearchUsersByImage API فقط روی بزرگترین چهره شناسایی شده در تصویر کار می کند. اگر چند چهره وجود دارد، باید هر چهره را برش دهید و به طور جداگانه به روش شناسایی منتقل کنید.

برای استخراج جزئیات چهره از یک تصویر (مانند مکان آنها روی تصویر)، از شناسایی آمازون استفاده می کنیم. ردیابی API

در زیر detect_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 بردار چهره برای هر بردار کاربر استفاده کنید.

یک کد مثال سرتاسر را می توان در قسمت پیدا کرد مخزن GitHub. شامل جزئیات است دفترچه ژوپیتر که می توانید روی آن بدوید Amazon SageMaker Studio (یا جایگزین های دیگر).

پاک کردن

برای حذف مجموعه از کد زیر استفاده کنید:

helpers.delete_collection(collection_id)

نتیجه

در این پست نحوه استفاده از وکتورهای کاربری شناسایی آمازون برای پیاده سازی جستجوی چهره در برابر مجموعه ای از چهره های کاربران را ارائه کردیم. ما نشان دادیم که چگونه می‌توان دقت جستجوی چهره را با استفاده از چندین تصویر چهره برای هر کاربر بهبود بخشید و آن را با بردارهای صورت جداگانه مقایسه کردیم. علاوه بر این، توضیح دادیم که چگونه می‌توانید از APIهای شناسایی مختلف آمازون برای شناسایی چهره‌ها استفاده کنید. کد مثال ارائه شده به عنوان یک پایه محکم برای ساخت یک سیستم جستجوی چهره کاربردی عمل می کند.

برای اطلاعات بیشتر در مورد وکتورهای کاربر شناسایی آمازون، به جستجوی چهره ها در یک مجموعه. اگر در آمازون Rekognition تازه کار هستید، می توانید از Free Tier ما استفاده کنید که 12 ماه طول می کشد و شامل پردازش 5,000 تصویر در ماه و ذخیره 1,000 شیء برداری کاربر در ماه است.


درباره نویسنده

آریک پورات یک معمار ارشد راه حل های استارتاپی در خدمات وب آمازون است. او با استارت‌آپ‌ها کار می‌کند تا به آنها کمک کند راه‌حل‌هایشان را در فضای ابری بسازند و طراحی کنند، و علاقه زیادی به یادگیری ماشینی و راه‌حل‌های مبتنی بر کانتینر دارد. آریک در اوقات فراغت خود دوست دارد شطرنج و بازی های ویدیویی انجام دهد.

الیران افرون یک معمار راه حل های استارتاپی در خدمات وب آمازون است. Eliran یک علاقه‌مند به داده و محاسبات است و به استارت‌آپ‌ها در طراحی معماری سیستم خود کمک می‌کند. الایران در اوقات فراغت خود دوست دارد در مسابقات تورینگ اتومبیل بسازد و به مسابقه بپردازد و دستگاه های اینترنت اشیا بسازد.

نقطه_img

جدیدترین اطلاعات

نقطه_img