Üretken Veri Zekası

Kullanıcı vektörleriyle Amazon Rekognition Yüz Arama'nın doğruluğunu iyileştirin | Amazon Web Hizmetleri

Tarih:

Finansal hizmetler, telekomünikasyon ve sağlık hizmetleri gibi çeşitli sektörlerde müşteriler, genellikle çevrimiçi katılım veya adım adım kimlik doğrulama sırasında son kullanıcıları doğrulamak için birkaç adım içeren bir dijital kimlik süreci kullanır. Kullanılabilecek adımlardan birine örnek olarak yüz arama verilebilir; bu, yeni bir son kullanıcının yüzünün mevcut bir hesapla ilişkili yüzlerle eşleşip eşleşmediğini belirlemeye yardımcı olabilir.

Doğru bir yüz arama sistemi oluşturmak birkaç adımdan oluşur. Sistemin görüntülerdeki insan yüzlerini tespit edebilmesi, yüzleri vektör temsillerine çıkarabilmesi, yüz vektörlerini bir veritabanında saklayabilmesi ve yeni yüzleri mevcut girişlerle karşılaştırabilmesi gerekir. Amazon Rekognisyon size basit API çağrıları yoluyla çağrılan önceden eğitilmiş modeller sunarak bunu zahmetsiz hale getirir.

Amazon Rekognition, tek bir yüz görüntüsüyle çok yüksek yüz arama doğruluğu elde etmenizi sağlar. Bazı durumlarda, kullanıcı vektörleri oluşturmak ve doğruluğu daha da artırmak için aynı kişinin yüzünün birden fazla görüntüsünü kullanabilirsiniz. Bu, özellikle görüntülerin ışıklandırma, poz ve görünüm açısından farklılıklara sahip olduğu durumlarda faydalıdır.

Bu gönderide, gerçek eşleşmeler için benzerlik puanını artırmak ve eşleşmeyen gerçek eşleşmeler için benzerlik puanını azaltmak amacıyla Amazon Rekognition Face Search API'lerinin kullanıcı vektörleriyle nasıl kullanılacağını gösteriyoruz.

Kullanıcı vektörleri ile ve kullanıcı vektörleri olmadan yüz eşleştirme gerçekleştirmenin sonuçlarını karşılaştırıyoruz.

Amazon Tanıma yüz eşleştirme

Amazon Rekognition yüz eşleştirme, bir görüntüden çıkarılan yüz vektörünün başka bir görüntüden çıkarılan yüz vektörüne benzerliğinin ölçülmesine olanak tanır. Bir çift yüz görüntüsünün bir olduğu söyleniyor gerçek eşleşme her iki görüntü de aynı kişinin yüzünü içeriyorsa ve gerçek eşleşmeyen aksi takdirde. Amazon Rekognition, kaynak ve hedef yüzlerin benzerliğine ilişkin bir puan döndürür. Minimum benzerlik puanı 0'dır, bu da çok az benzerliğe işaret eder ve maksimum 100'dür.

Bir kaynak yüzü hedef yüz koleksiyonuyla karşılaştırmak için (1:N eşleştirme), Amazon Rekognition bir Koleksiyon nesnesi oluşturmanıza ve bunu API çağrılarını kullanarak görüntülerdeki yüzlerle doldurmanıza olanak tanır.

Bir koleksiyona yüz eklerken Amazon Rekognition, yüzün gerçek görüntüsünü değil, yüzün matematiksel bir temsili olan yüz vektörünü saklar. İle AramaYüzleri API'de, bir kaynak yüzü bir veya daha fazla hedef yüz koleksiyonuyla karşılaştırabilirsiniz.

Haziran ayında 2023, AWS, yüz arama doğruluğunu önemli ölçüde artıran yeni bir özellik olan kullanıcı vektörlerini kullanıma sundu Bir kullanıcının birden fazla yüz görüntüsünü kullanarak. Artık aynı kullanıcının birden fazla yüz vektörünü bir araya getiren kullanıcı vektörleri oluşturabilirsiniz. Kullanıcı vektörleri, farklı derecelerde aydınlatma, keskinlik, poz, görünüm ve daha fazlasını içerdikleri için daha sağlam tasvirlerle daha yüksek yüz arama doğruluğu sunar. Bu, bireysel yüz vektörlerine göre aramaya kıyasla doğruluğu artırır.

Aşağıdaki bölümlerde Amazon Rekognition kullanıcı vektörlerini kullanma sürecini özetliyoruz. Bir koleksiyon oluşturma, yüz vektörlerini bu koleksiyonda saklama, bu yüz vektörlerini kullanıcı vektörleri halinde toplama ve ardından arama sonuçlarını bu bireysel yüz vektörleri ve kullanıcı vektörleriyle karşılaştırma konusunda size rehberlik ediyoruz.

Çözüme genel bakış

Bu çözüm için, her biri, her kullanıcı için bir dizi farklı yüz görüntüsünden ilişkili indekslenmiş yüz vektörlerine sahip bir Amazon Rekognition kullanıcı koleksiyonu kullanıyoruz.

Kullanıcıları ve yüzleri içeren bir koleksiyon oluşturmak için iş akışına bakalım:

  1. Bir Amazon Rekognition koleksiyonu oluşturun.
  2. Her kullanıcı için koleksiyonda bir kullanıcı oluşturun.
  3. Kullanıcının her görseli için yüzü koleksiyona ekleyin (IndexYüzler, her yüz vektörüne karşılık gelen yüz kimliğini döndürür).
  4. Dizine eklenen tüm yüz kimliklerini kullanıcıyla ilişkilendirin (bu, kullanıcı vektörleri için gereklidir).

Daha sonra aşağıdaki iş akışlarını karşılaştıracağız:

Koleksiyonumuzdaki tek tek yüz vektörlerine karşı yeni bir giriş görüntüsüyle arama yapma:

  1. Bir görüntüdeki tüm yüzleri alın (Yüzleri Algıla).
  2. Her yüz için koleksiyonumuzdaki ayrı yüzlerle karşılaştırın (AramaYüzlerByImage).

Koleksiyonumuzdaki kullanıcı vektörlerine karşı verilen yeni bir giriş görüntüsüyle arama:

  1. Bir görüntüdeki tüm yüzleri alın (Yüzleri Algıla).
  2. Her yüz için kullanıcı vektörüyle karşılaştırın (KullanıcılarıResme Göre Ara).

Şimdi çözümü detaylı olarak anlatalım.

Önkoşullar

Aşağıdaki politikayı dosyanıza ekleyin AWS Kimlik ve Erişim Yönetimi (IAM) kullanıcısı veya rolü. Politika size ilgili Amazon Rekognition API'lerine erişim izni verir ve Amazon Basit Depolama Hizmeti (Amazon S3) görüntüleri depolamak için kova:

{
    "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 koleksiyonu oluşturun ve kullanıcı ve yüz ekleyin

Öncelikle kullanıcıların görsellerini depolamak için bir S3 klasörü oluşturuyoruz. Her kullanıcı için kişisel görsellerini içeren bir klasör oluşturarak paketi düzenliyoruz. Bizim görüntüler klasörü aşağıdaki yapıya benziyor:

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

S3 klasörümüzde her kullanıcı için resimlerini saklayan bir dizin bulunur. Şu anda iki klasör var ve her biri birkaç resim içeriyor. Kullanıcılarınız için, her biri dizine eklenecek bir veya daha fazla resim içeren daha fazla klasör ekleyebilirsiniz.

Daha sonra Amazon Rekognition koleksiyonumuzu oluşturuyoruz. biz tedarik ettik yardımcılar.pykullandığımız farklı yöntemleri içeren:

  • koleksiyon_oluştur – Yeni bir koleksiyon oluşturun
  • delete_collection – Bir koleksiyonu silin
  • Kullanıcı oluştur – Koleksiyonda yeni bir kullanıcı oluşturun
  • add_faces_to_collection – Koleksiyona yüzler ekleyin
  • ortak_yüzler – Face_id'leri bir koleksiyondaki bir kullanıcıyla ilişkilendirin
  • get_subdirs – Tüm alt dizinleri S3 öneki altına alın
  • get_files – Tüm dosyaları S3 öneki altına alın

Aşağıda Amazon Rekognition koleksiyonu oluşturmaya yönelik örnek bir yöntem verilmiştir:

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...')

Koleksiyonu aşağıdaki kodla oluşturun:

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

Daha sonra yüz vektörlerini koleksiyonumuza ekleyelim ve bunları kullanıcı vektörleri halinde toplayalım.

S3 dizinindeki her kullanıcı için koleksiyonda bir kullanıcı vektörü oluşturuyoruz. Daha sonra her kullanıcının yüz görüntülerini, yüz kimliklerini oluşturan bireysel yüz vektörleri olarak koleksiyona indeksliyoruz. Son olarak yüz kimliklerini uygun kullanıcı vektörüyle ilişkilendiriyoruz.

Bu, koleksiyonumuzda iki tür vektör oluşturur:

  • Bireysel yüz vektörleri
  • Yöntem kullanılarak sağlanan yüz vektör kimliklerine göre oluşturulan kullanıcı vektörleri associate_faces

Aşağıdaki koda bakın:

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

Aşağıdaki yöntemleri kullanıyoruz:

  • get_subdirs – Tüm kullanıcıların dizinlerinin bir listesini döndürür. Örneğimizde değer [Swami,Werner]'dir.
  • get_files – Kullanıcı için S3 öneki altındaki tüm görüntü dosyalarını döndürür.
  • yüz kimlikleri – Bu, bir kullanıcıya ait tüm yüz kimliklerini içeren bir listedir. Bu listeyi çağırırken kullanırız. AssociateFaces API.

Daha önce açıklandığı gibi, onlar için klasörler ekleyerek daha fazla kullanıcı ekleyebilir (klasör, kullanıcı kimliğini belirler) ve görsellerinizi bu klasöre ekleyebilirsiniz (dosyalar için herhangi bir sıralama gerekmez).

Artık ortamımız ayarlandığına ve hem bireysel yüz vektörlerimiz hem de kullanıcı vektörlerimiz olduğuna göre, arama kalitemizi bunların her biriyle karşılaştıralım. Bunu yapmak için, birden fazla kişinin yer aldığı yeni bir fotoğraf kullanıyoruz ve bu kişilerin yüzlerini koleksiyonumuzla, önce bireysel yüz vektörleriyle ve ardından kullanıcı vektörleriyle eşleştirmeye çalışıyoruz.

Bireysel yüz vektörlerinden oluşan bir koleksiyona karşı görselin yüz araması

Bireysel yüz vektörlerimize göre arama yapmak için Amazon Rekognition'ı kullanıyoruz AramaYüzlerByImage API'dir. Bu işlev, koleksiyonumuzdaki tek tek yüz vektörlerini aramak için bir kaynak yüz görüntüsü kullanır ve tanımlı benzerlik puanı eşiğimizle eşleşen yüzleri döndürür.

Önemli bir husus, SearchFacesByImage API yalnızca görüntüde tespit edilen en büyük yüzde çalışacaktır. Birden fazla yüz varsa, her bir yüzü kırpmanız ve tanımlama yöntemine ayrı ayrı aktarmanız gerekir.

Bir görüntüden yüz ayrıntılarını (görüntüdeki konumları gibi) çıkarmak için Amazon Rekognition'ı kullanırız Yüzleri Algıla API.

Aşağıdaki tespit_yüzler_in_image yöntem bir görüntüdeki yüzleri algılar. Her yüz için aşağıdaki eylemleri gerçekleştirir:

  • Sınırlayıcı kutu konumunu yazdır
  • Yüzü resimden kırpın ve koleksiyonda böyle bir yüz olup olmadığını kontrol edin ve kullanıcıyı veya 'Bilinmeyen'i yazdırın
  • Benzerlik puanını yazdır

Örnek Python kodu şunu kullanır: Yastık görüntü işlemlerini (yazdırma, çizim ve kırpma gibi) yapmak için kütüphane.

Kimlik doğrulama kullanım durumları için yaygın bir ayar olan %99'luk bir benzerlik puanı eşiği kullanıyoruz.

Aşağıdaki kodu çalıştırın:

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 koleksiyonumuzla eşleştirmek istediğimiz S3 nesne anahtarıdır. Örnek bir resim sağladık (photo.jpeg) görüntüler klasörünün altında.

Aşağıdaki resim sonuçlarımızı göstermektedir.

%99 eşik değeri kullanılarak yalnızca bir kişi belirlendi. Dr. Werner Vogels Bilinmeyen olarak işaretlendi. Aynı kodu 90 gibi daha düşük bir eşik değeri kullanarak çalıştırırsak (set eşik=90) aşağıdaki sonuçları elde ederiz.

Şimdi Dr. Werner Vogel'in yüzünün benzerlik puanının %96.86 olduğunu görüyoruz. Daha sonra kullanıcı vektörlerini kullanarak benzerlik puanını tanımladığımız eşiğin üzerinde alıp alamayacağımızı kontrol edelim.

Kullanıcı vektörlerinden oluşan bir koleksiyona karşı görselin yüz araması

Kullanıcı vektörlerimize göre arama yapmak için Amazon Rekognition'ı kullanıyoruz KullanıcılarıResme Göre Ara API'dir. Bu işlev, koleksiyonumuzdaki kullanıcı vektörlerine göre arama yapmak için bir kaynak yüz görüntüsü kullanır ve tanımlı benzerlik puanı eşiğimizle eşleşen kullanıcıları döndürür.

Aynı değerlendirme burada da geçerlidir; SearchUsersByImage API yalnızca görüntüde tespit edilen en büyük yüzde çalışacaktır. Birden fazla yüz varsa, her bir yüzü kırpmanız ve tanımlama yöntemine ayrı ayrı aktarmanız gerekir.

Bir görüntüden yüz ayrıntılarını (görüntüdeki konumları gibi) çıkarmak için Amazon Rekognition'ı kullanırız Yüzleri Algıla API.

Aşağıdaki tespit_kullanıcılar_in_image yöntem bir görüntüdeki yüzleri algılar. Her yüz için aşağıdaki eylemleri gerçekleştirir:

  • Sınırlayıcı kutu konumunu yazdır
  • Yüzü resimden kırpın ve böyle bir kullanıcı yüzünün koleksiyonumuzda mevcut olup olmadığını kontrol edin ve kullanıcıyı veya 'Bilinmeyen'i yazdırın
  • Benzerlik puanını yazdır

Aşağıdaki koda bakın:

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

İşlev, Amazon S3'e kaydedilebilecek veya yazdırılabilecek sonuçları içeren değiştirilmiş bir görüntüyü döndürür. İşlev aynı zamanda yüzlerin tahmini yaşlarına ilişkin istatistikleri de terminale gönderir.

Aşağıdaki kodu çalıştırın:

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şağıdaki resim sonuçlarımızı göstermektedir.

Koleksiyonumuzda bulunan kullanıcılar yüksek benzerlik (%99'un üzerinde) ile doğru bir şekilde tespit edildi.

Kullanıcı vektörü başına üç yüz vektörü kullanarak benzerlik puanını artırmayı başardık. Kullanılan yüz vektörlerinin sayısını artırdıkça gerçek eşleşmeler için benzerlik puanının da artmasını bekliyoruz. Kullanıcı vektörü başına en fazla 100 yüz vektörü kullanabilirsiniz.

Uçtan uca örnek kodu şurada bulabilirsiniz: GitHub deposu. Ayrıntılı bir içerir Jupyter dizüstü bilgisayar üzerinde koşabileceğin Amazon SageMaker Stüdyosu (veya diğer alternatifler).

Temizlemek

Koleksiyonu silmek için aşağıdaki kodu kullanın:

helpers.delete_collection(collection_id)

Sonuç

Bu yazıda, bir grup kullanıcının yüzlerine karşı yüz araması uygulamak için Amazon Rekognition kullanıcı vektörlerinin nasıl kullanılacağını anlattık. Kullanıcı başına birden fazla yüz görüntüsü kullanarak yüz arama doğruluğunun nasıl iyileştirilebileceğini gösterdik ve bunu bireysel yüz vektörleriyle karşılaştırdık. Ayrıca yüzleri algılamak için farklı Amazon Rekognition API'lerini nasıl kullanabileceğinizi de açıkladık. Sağlanan örnek kod, işlevsel bir yüz arama sistemi oluşturmak için sağlam bir temel görevi görür.

Amazon Rekognition kullanıcı vektörleri hakkında daha fazla bilgi için bkz. Bir koleksiyondaki yüzleri arama. Amazon Rekognition'da yeniyseniz, 12 ay süren ve ayda 5,000 görüntünün işlenmesini ve 1,000 kullanıcı vektör nesnesinin depolanmasını içeren Ücretsiz Kullanımımızı kullanabilirsiniz.


Yazarlar Hakkında

Arık Porat Amazon Web Services'te Kıdemli Startup Çözümleri Mimarıdır. Bulutta çözümlerini oluşturmalarına ve tasarlamalarına yardımcı olmak için yeni kurulan şirketlerle çalışıyor ve makine öğrenimi ve konteyner tabanlı çözümler konusunda tutkulu. Arık boş zamanlarında satranç ve video oyunları oynamayı seviyor.

Eliran Efron Amazon Web Services'te Startup Çözümleri Mimarıdır. Eliran, yeni kurulan şirketlere sistem mimarilerini tasarlamalarında yardımcı olan bir veri ve bilgi işlem meraklısıdır. Eliran boş zamanlarında arabalar yapmayı ve Touring yarışlarında yarışmayı ve IoT cihazları yapmayı seviyor.

spot_img

En Son İstihbarat

spot_img

Bizimle sohbet

Merhaba! Size nasıl yardım edebilirim?