Kecerdasan Data Generatif

Tingkatkan akurasi Amazon Rekognition Face Search dengan vektor pengguna | Layanan Web Amazon

Tanggal:

Di berbagai industri, seperti jasa keuangan, telekomunikasi, dan layanan kesehatan, pelanggan menggunakan proses identitas digital, yang biasanya melibatkan beberapa langkah untuk memverifikasi pengguna akhir selama orientasi online atau otentikasi bertahap. Contoh salah satu langkah yang dapat digunakan adalah penelusuran wajah, yang dapat membantu menentukan apakah wajah pengguna akhir baru cocok dengan wajah yang dikaitkan dengan akun yang sudah ada.

Membangun sistem pencarian wajah yang akurat melibatkan beberapa langkah. Sistem harus mampu mendeteksi wajah manusia dalam gambar, mengekstrak wajah ke dalam representasi vektor, menyimpan vektor wajah dalam database, dan membandingkan wajah baru dengan entri yang sudah ada. Rekognisi Amazon mempermudah hal ini dengan memberi Anda model terlatih yang dipanggil melalui panggilan API sederhana.

Amazon Rekognition memungkinkan Anda mencapai akurasi pencarian wajah yang sangat tinggi dengan satu gambar wajah. Dalam beberapa kasus, Anda dapat menggunakan beberapa gambar wajah orang yang sama untuk membuat vektor pengguna dan lebih meningkatkan akurasi. Hal ini sangat membantu ketika gambar memiliki variasi dalam pencahayaan, pose, dan tampilan.

Dalam postingan ini, kami mendemonstrasikan cara menggunakan API Amazon Rekognition Face Search dengan vektor pengguna untuk meningkatkan skor kemiripan untuk kecocokan sebenarnya dan menurunkan skor kemiripan untuk ketidakcocokan sebenarnya.

Kami membandingkan hasil melakukan pencocokan wajah dengan dan tanpa vektor pengguna.

Pencocokan wajah Amazon Rekognition

Pencocokan wajah Amazon Rekognition memungkinkan pengukuran kemiripan vektor wajah yang diekstrak dari satu gambar ke vektor wajah yang diekstraksi dari gambar lain. Sepasang gambar wajah dikatakan a pertandingan yang sebenarnya jika kedua gambar tersebut memuat wajah orang yang sama, dan a benar tidak cocok jika tidak. Amazon Rekognition mengembalikan skor untuk kesamaan wajah sumber dan target. Skor kemiripan minimal adalah 0, artinya sangat sedikit kemiripan, dan maksimal adalah 100.

Untuk membandingkan wajah sumber dengan kumpulan wajah target (pencocokan 1:N), Amazon Rekognition memungkinkan Anda membuat objek Koleksi dan mengisinya dengan wajah dari gambar menggunakan panggilan API.

Saat menambahkan wajah ke koleksi, Amazon Rekognition tidak menyimpan gambar wajah sebenarnya, melainkan vektor wajah, yang merupakan representasi matematis dari wajah. Dengan PencarianWajah API, Anda dapat membandingkan wajah sumber dengan satu atau beberapa kumpulan wajah target.

Pada bulan Juni 2023, AWS meluncurkan vektor pengguna, sebuah kemampuan baru yang secara signifikan meningkatkan akurasi pencarian wajah dengan menggunakan beberapa gambar wajah pengguna. Sekarang, Anda dapat membuat vektor pengguna, yang menggabungkan beberapa vektor wajah dari pengguna yang sama. Vektor pengguna menawarkan akurasi pencarian wajah yang lebih tinggi dengan penggambaran yang lebih kuat, karena mengandung berbagai tingkat pencahayaan, ketajaman, pose, penampilan, dan banyak lagi. Hal ini meningkatkan akurasi dibandingkan pencarian berdasarkan vektor wajah individual.

Di bagian berikut, kami menguraikan proses penggunaan vektor pengguna Amazon Rekognition. Kami memandu Anda dalam membuat koleksi, menyimpan vektor wajah dalam koleksi tersebut, menggabungkan vektor wajah tersebut ke dalam vektor pengguna, lalu membandingkan hasil penelusuran terhadap masing-masing vektor wajah dan vektor pengguna tersebut.

Ikhtisar solusi

Untuk solusi ini, kami menggunakan kumpulan pengguna Amazon Rekognition, masing-masing dengan vektor wajah terindeks terkait dari sejumlah gambar wajah berbeda untuk setiap pengguna.

Mari kita lihat alur kerja untuk membuat koleksi dengan pengguna dan wajah:

  1. Buat koleksi Amazon Recognition.
  2. Untuk setiap pengguna, buat pengguna di koleksi.
  3. Untuk setiap gambar pengguna, tambahkan wajah ke koleksi (Wajah Indeks, yang mengembalikan ID wajah yang sesuai dengan setiap vektor wajah).
  4. Kaitkan semua ID wajah yang diindeks dengan pengguna (ini diperlukan untuk vektor pengguna).

Kemudian, kami akan membandingkan alur kerja berikut:

Menelusuri dengan gambar masukan baru yang diberikan terhadap masing-masing vektor wajah dalam koleksi kami:

  1. Dapatkan semua wajah dari sebuah gambar (Deteksi Wajah).
  2. Untuk setiap wajah, bandingkan dengan masing-masing wajah dalam koleksi kami (CariWajahByImage).

Mencari dengan gambar masukan baru yang diberikan terhadap vektor pengguna di koleksi kami:

  1. Dapatkan semua wajah dari sebuah gambar (Deteksi Wajah).
  2. Untuk setiap wajah, bandingkan dengan vektor pengguna (CariPenggunaBerdasarkanGambar).

Sekarang mari kita jelaskan solusinya secara detail.

Prasyarat

Tambahkan kebijakan berikut ke Anda Identitas AWS dan Manajemen Akses (IAM) pengguna atau peran. Kebijakan ini memberi Anda izin ke API Amazon Rekognition yang relevan dan mengizinkan akses ke Layanan Penyimpanan Sederhana Amazon Bucket (Amazon S3) untuk menyimpan gambar:

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

Buat koleksi Amazon Rekognition dan tambahkan pengguna dan wajah

Pertama, kami membuat bucket S3 untuk menyimpan gambar pengguna. Kami mengatur keranjang dengan membuat folder untuk setiap pengguna yang berisi gambar pribadi mereka. Kita folder gambar terlihat seperti struktur berikut:

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

Bucket S3 kami memiliki direktori untuk setiap pengguna yang menyimpan gambar mereka. Saat ini ada dua folder, dan masing-masing berisi beberapa gambar. Anda dapat menambahkan lebih banyak folder untuk pengguna Anda, masing-masing berisi satu atau lebih gambar untuk diindeks.

Selanjutnya, kami membuat koleksi Amazon Recognition kami. Kami telah menyediakan pembantu.py, yang berisi berbagai metode yang kami gunakan:

  • buat_koleksi – Buat koleksi baru
  • hapus_koleksi – Hapus koleksi
  • buat pengguna – Buat pengguna baru dalam koleksi
  • tambahkan_wajah_ke_koleksi – Tambahkan wajah ke koleksi
  • rekanan_wajah – Kaitkan face_ids ke pengguna dalam koleksi
  • get_subdirs – Dapatkan semua subdirektori di bawah awalan S3
  • dapatkan_files – Dapatkan semua file dengan awalan S3

Berikut ini adalah contoh metode untuk membuat koleksi 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...')

Buat koleksi dengan kode berikut:

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

Selanjutnya, mari tambahkan vektor wajah ke dalam koleksi kita dan gabungkan menjadi vektor pengguna.

Untuk setiap pengguna di direktori S3, kami membuat vektor pengguna dalam koleksi. Lalu kami mengindeks gambar wajah setiap pengguna ke dalam koleksi sebagai vektor wajah individual, yang kemudian menghasilkan ID wajah. Terakhir, kami mengaitkan ID wajah ke vektor pengguna yang sesuai.

Ini menciptakan dua jenis vektor dalam koleksi kami:

  • Vektor wajah individu
  • Vektor pengguna, yang dibuat berdasarkan ID vektor wajah yang diberikan menggunakan metode ini associate_faces

Lihat kode berikut:

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

Kami menggunakan metode berikut:

  • get_subdirs – Mengembalikan daftar semua direktori pengguna. Dalam contoh kita, nilainya adalah [Swami,Werner].
  • dapatkan_files – Mengembalikan semua file gambar dengan awalan S3 untuk pengguna.
  • face_ids – Ini adalah daftar yang berisi semua ID wajah milik pengguna. Kami menggunakan daftar ini saat memanggil Wajah Asosiasi API.

Seperti yang dijelaskan sebelumnya, Anda dapat menambahkan lebih banyak pengguna dengan menambahkan folder untuk mereka (folder menentukan ID pengguna) dan menambahkan gambar Anda ke folder itu (tidak diperlukan pengurutan untuk file).

Sekarang lingkungan kita telah diatur dan kita memiliki vektor wajah dan vektor pengguna individual, mari kita bandingkan kualitas pencarian kita terhadap masing-masing vektor tersebut. Untuk melakukannya, kami menggunakan foto baru dengan beberapa orang dan mencoba mencocokkan wajah mereka dengan koleksi kami, pertama dengan vektor wajah individu dan kemudian dengan vektor pengguna.

Pencarian wajah gambar terhadap kumpulan vektor wajah individu

Untuk mencari berdasarkan vektor wajah individual, kami menggunakan Amazon Rekognition CariWajahByImage API. Fungsi ini menggunakan gambar wajah sumber untuk mencari berdasarkan vektor wajah individual dalam koleksi kami dan mengembalikan wajah yang cocok dengan ambang skor kesamaan yang kami tentukan.

Pertimbangan penting adalah bahwa SearchFacesByImage API hanya akan beroperasi pada wajah terbesar yang terdeteksi pada gambar. Jika terdapat beberapa wajah, Anda perlu memotong setiap wajah dan meneruskannya secara terpisah ke metode identifikasi.

Untuk mengekstrak detail wajah dari suatu gambar (seperti lokasinya pada gambar), kami menggunakan Amazon Rekognition Deteksi Wajah API.

Berikut ini deteksi_wajah_dalam_gambar metode mendeteksi wajah dalam gambar. Untuk setiap wajah, ia melakukan tindakan berikut:

  • Cetak lokasi kotak pembatasnya
  • Pangkas wajah dari gambar dan periksa apakah wajah tersebut ada dalam koleksi dan cetak pengguna atau 'Tidak Dikenal'
  • Cetak skor kesamaan

Contoh kode Python menggunakan Bantal perpustakaan untuk melakukan manipulasi gambar (seperti mencetak, menggambar, dan memotong).

Kami menggunakan ambang skor kesamaan sebesar 99%, yang merupakan pengaturan umum untuk kasus penggunaan verifikasi identitas.

Jalankan kode berikut:

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 adalah kunci objek S3 yang ingin kita cocokkan dengan koleksi kita. Kami telah memberikan contoh gambar (photo.jpeg) di bawah folder gambar.

Gambar berikut menunjukkan hasil kami.

Dengan menggunakan ambang batas 99%, hanya satu orang yang teridentifikasi. Dr Werner Vogels ditandai sebagai Tidak Diketahui. Jika kita menjalankan kode yang sama menggunakan ambang batas yang lebih rendah yaitu 90 (setel ambang batas=90), kita mendapatkan hasil sebagai berikut.

Sekarang kita lihat wajah Dr. Werner Vogel memiliki skor kemiripan 96.86%. Selanjutnya, mari kita periksa apakah kita bisa mendapatkan skor kesamaan di atas ambang batas yang ditentukan dengan menggunakan vektor pengguna.

Pencarian wajah gambar terhadap kumpulan vektor pengguna

Untuk mencari berdasarkan vektor pengguna kami, kami menggunakan Amazon Rekognition CariPenggunaBerdasarkanGambar API. Fungsi ini menggunakan gambar wajah sumber untuk menelusuri vektor pengguna di koleksi kami dan mengembalikan pengguna yang cocok dengan ambang skor kesamaan yang kami tentukan.

Pertimbangan yang sama juga relevan di sini – the SearchUsersByImage API hanya akan beroperasi pada wajah terbesar yang terdeteksi pada gambar. Jika terdapat beberapa wajah, Anda perlu memotong setiap wajah dan meneruskannya secara terpisah ke metode identifikasi.

Untuk mengekstrak detail wajah dari suatu gambar (seperti lokasinya pada gambar), kami menggunakan Amazon Rekognition Deteksi Wajah API.

Berikut ini deteksi_pengguna_dalam_gambar metode mendeteksi wajah dalam gambar. Untuk setiap wajah, ia melakukan tindakan berikut:

  • Cetak lokasi kotak pembatasnya
  • Pangkas wajah dari gambar dan periksa apakah wajah pengguna tersebut ada di koleksi kami dan cetak pengguna atau 'Tidak Dikenal'
  • Cetak skor kesamaan

Lihat kode berikut:

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

Fungsi ini mengembalikan gambar yang dimodifikasi dengan hasil yang dapat disimpan ke Amazon S3 atau dicetak. Fungsi ini juga menampilkan statistik tentang perkiraan usia wajah-wajah di terminal.

Jalankan kode berikut:

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)

Gambar berikut menunjukkan hasil kami.

Pengguna yang ada dalam koleksi kami diidentifikasi dengan benar dengan kemiripan yang tinggi (lebih dari 99%).

Kami dapat meningkatkan skor kemiripan dengan menggunakan tiga vektor wajah per vektor pengguna. Seiring dengan bertambahnya jumlah vektor wajah yang digunakan, kami memperkirakan skor kemiripan untuk kecocokan sebenarnya juga akan meningkat. Anda dapat menggunakan hingga 100 vektor wajah per vektor pengguna.

Contoh kode ujung ke ujung dapat ditemukan di Repositori GitHub. Ini mencakup secara rinci Notebook Jupyter yang bisa kamu jalankan Studio Amazon SageMaker (atau alternatif lain).

Membersihkan

Untuk menghapus koleksi, gunakan kode berikut:

helpers.delete_collection(collection_id)

Kesimpulan

Dalam postingan ini, kami menyajikan cara menggunakan vektor pengguna Amazon Rekognition untuk mengimplementasikan pencarian wajah terhadap kumpulan wajah pengguna. Kami mendemonstrasikan cara meningkatkan akurasi penelusuran wajah dengan menggunakan beberapa gambar wajah per pengguna dan membandingkannya dengan vektor wajah individual. Selain itu, kami menjelaskan bagaimana Anda dapat menggunakan berbagai API Amazon Rekognition untuk mendeteksi wajah. Kode contoh yang diberikan berfungsi sebagai dasar yang kuat untuk membangun sistem pencarian wajah yang fungsional.

Untuk informasi lebih lanjut tentang vektor pengguna Amazon Rekognition, lihat Mencari wajah dalam koleksi. Jika Anda baru menggunakan Amazon Rekognition, Anda dapat menggunakan Tingkat Gratis kami, yang berlangsung selama 12 bulan dan mencakup pemrosesan 5,000 gambar per bulan dan menyimpan 1,000 objek vektor pengguna per bulan.


Tentang Penulis

Arik Porat adalah Arsitek Solusi Startup Senior di Amazon Web Services. Dia bekerja dengan startup untuk membantu mereka membangun dan merancang solusi mereka di cloud, dan sangat tertarik dengan pembelajaran mesin dan solusi berbasis container. Di waktu senggangnya, Arik suka bermain catur dan video game.

Eliran Efron adalah Arsitek Solusi Startup di Amazon Web Services. Eliran adalah penggemar data dan komputasi, membantu startup merancang arsitektur sistem mereka. Di waktu luangnya, Eliran suka membuat dan membalap mobil di balapan Touring dan membuat perangkat IoT.

tempat_img

Intelijen Terbaru

tempat_img

Hubungi kami

Hai, yang di sana! Apa yang bisa saya bantu?