Platón adatintelligencia.
Vertical Search & Ai.

Az Amazon Rekognition Face Search pontosságának javítása felhasználói vektorokkal | Amazon webszolgáltatások

Találka:

A különféle iparágakban, például a pénzügyi szolgáltatásokban, a telekommunikációban és az egészségügyben az ügyfelek digitális identitási eljárást alkalmaznak, amely általában több lépésből áll a végfelhasználók ellenőrzésére az online beléptetés vagy a fokozott hitelesítés során. Az egyik használható lépésre példa az arckeresés, amely segíthet meghatározni, hogy egy új végfelhasználó arca megegyezik-e egy meglévő fiókhoz társított arccal.

A pontos arckereső rendszer felépítése több lépésből áll. A rendszernek képesnek kell lennie arra, hogy felismerje az emberi arcokat a képeken, kivonja az arcokat vektoros ábrázolásokba, tárolja az arcvektorokat egy adatbázisban, és összehasonlítsa az új arcokat a meglévő bejegyzésekkel. Amazon felismerés ezt egyszerűvé teszi azáltal, hogy előre betanított modelleket biztosít, amelyek egyszerű API-hívásokkal hívhatók meg.

Az Amazon Rekognition segítségével nagyon nagy arckeresési pontosságot érhet el egyetlen arcképpel. Egyes esetekben több képet is használhat ugyanarról a személyről, hogy felhasználói vektorokat hozzon létre, és még tovább javítsa a pontosságot. Ez különösen akkor hasznos, ha a képek megvilágítása, pózai és megjelenése eltérő.

Ebben a bejegyzésben bemutatjuk, hogyan használhatjuk az Amazon Rekognition Face Search API-kat felhasználói vektorokkal, hogy növeljük a hasonlósági pontszámot a valódi egyezéseknél, és csökkentsük a hasonlósági pontszámot a valódi nem egyezéseknél.

Összehasonlítjuk a felhasználói vektorokkal és anélkül végzett arcegyeztetés eredményeit.

Amazon Rekognition arcegyeztetés

Az Amazon Rekognition arcillesztése lehetővé teszi az egyik képből kivont arcvektor és egy másik képről kinyert arcvektor hasonlóságának mérését. Egy arcképpárról azt mondják, hogy a igaz meccs ha mindkét kép ugyanazon személy arcát tartalmazza, és a igaz nem egyezés másképp. Az Amazon Rekognition egy pontszámot ad vissza a forrás és a célfelület hasonlóságára. A minimális hasonlósági pontszám 0, ami nagyon csekély hasonlóságot jelent, a maximális pedig 100.

A forrásarcok és a célarcok gyűjteményének (1:N egyezés) összehasonlításához az Amazon Rekognition lehetővé teszi egy Gyűjtemény objektum létrehozását, és API-hívások segítségével képekből való arcokkal való feltöltését.

Amikor egy arcot ad hozzá egy gyűjteményhez, az Amazon Rekognition nem az arc tényleges képét tárolja, hanem az arc vektorát, az arc matematikai ábrázolását. A ... val SearchArcok API, összehasonlíthat egy forráslapot egy vagy több célarc-gyűjteményével.

Júniusban az 2023, Az AWS elindította a felhasználói vektorokat, egy új képességet, amely jelentősen javítja az arckeresés pontosságát egy felhasználó több arcképének használatával. Mostantól létrehozhat felhasználói vektorokat, amelyek ugyanazon felhasználó több arcvektorát aggregálják. A felhasználói vektorok nagyobb arckeresési pontosságot kínálnak robusztusabb ábrázolásokkal, mivel különböző fokú megvilágítást, élességet, pózt, megjelenést és egyebeket tartalmaznak. Ez javítja a pontosságot az egyes arcvektorok szerinti kereséshez képest.

A következő szakaszokban felvázoljuk az Amazon Rekognition felhasználói vektorok használatának folyamatát. Végigvezetjük Önt egy gyűjtemény létrehozásán, az arcvektorok gyűjteményben való tárolásán, az arcvektorok felhasználói vektorokká történő összesítésén, majd a keresés eredményeinek az egyedi arcvektorokkal és felhasználói vektorokkal való összehasonlításán.

Megoldás áttekintése

Ehhez a megoldáshoz egy Amazon Rekognition felhasználói gyűjteményt használunk, amelyek mindegyike a hozzá tartozó indexelt arcvektorokkal rendelkezik számos különböző arcképből az egyes felhasználók számára.

Nézzük meg a munkafolyamatot egy gyűjtemény létrehozásához felhasználókkal és arcokkal:

  1. Hozzon létre egy Amazon Rekognition gyűjteményt.
  2. Minden felhasználóhoz hozzon létre egy felhasználót a gyűjteményben.
  3. A felhasználó minden képéhez adja hozzá az arcot a gyűjteményhez (IndexArcok, amely az egyes arcvektoroknak megfelelő arcazonosítót adja vissza).
  4. Az összes indexelt arcazonosítót társítsa a felhasználóhoz (ez szükséges a felhasználói vektorokhoz).

Ezután összehasonlítjuk a következő munkafolyamatokat:

Keresés egy új megadott bemeneti képpel a gyűjteményünkben lévő egyes arcvektorok alapján:

  1. Minden arc lekérése egy képről (Arcok észlelése).
  2. Hasonlítsa össze az egyes arcokat a gyűjteményünkben található arcokkal (Search FacesByImage).

Keresés egy új megadott bemeneti képpel a gyűjteményünkben található felhasználói vektorok alapján:

  1. Minden arc lekérése egy képről (Arcok észlelése).
  2. Minden arc esetében hasonlítsa össze a felhasználói vektorral (SearchUsersByImage).

Most pedig írjuk le részletesen a megoldást.

Előfeltételek

Adja hozzá a következő szabályzatot AWS Identity and Access Management (IAM) felhasználó vagy szerepkör. A házirend engedélyt ad Önnek a vonatkozó Amazon Rekognition API-khoz, és hozzáférést biztosít egy Amazon egyszerű tárolási szolgáltatás (Amazon S3) vödör a képek tárolására:

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

Hozzon létre egy Amazon Rekognition gyűjteményt, és adjon hozzá felhasználókat és arcokat

Először létrehozunk egy S3 tárolót a felhasználók képeinek tárolására. A tárolót úgy rendezzük, hogy minden felhasználó számára létrehozunk egy mappát, amely tartalmazza a személyes képeiket. A miénk képek mappa így néz ki a szerkezet:

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

Az S3 tárolónkban minden felhasználó számára van egy könyvtár, amely a képeiket tárolja. Jelenleg két mappa van, és mindegyik több képet tartalmaz. Felvehet további mappákat a felhasználók számára, amelyek mindegyike egy vagy több indexelendő képet tartalmaz.

Ezután létrehozzuk az Amazon Rekognition gyűjteményünket. szállítottunk helpers.py, amely különböző általunk használt módszereket tartalmaz:

  • Create_collection – Hozzon létre egy új kollekciót
  • delete_collection – Gyűjtemény törlése
  • felhasználó létrehozása – Hozzon létre egy új felhasználót egy gyűjteményben
  • arcok_adása a gyűjteményhez – Arcok hozzáadása a gyűjteményhez
  • társított_arcok – A face_ids társítása egy felhasználóhoz a gyűjteményben
  • get_subdirs – Az összes alkönyvtár lekérése az S3 előtag alatt
  • get_files – Az összes fájl lekérése az S3 előtag alatt

A következő példa egy Amazon Rekognition gyűjtemény létrehozására szolgáló módszer:

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

Hozd létre a gyűjteményt a következő kóddal:

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

Ezután adjuk hozzá az arcvektorokat a gyűjteményünkhöz, és aggregáljuk őket felhasználói vektorokká.

Az S3 könyvtárban minden felhasználóhoz létrehozunk egy felhasználói vektort a gyűjteményben. Ezután az egyes felhasználók arcképeit egyedi arcvektorokként indexeljük a gyűjteménybe, amely arcazonosítókat generál. Végül az arcazonosítókat a megfelelő felhasználói vektorhoz társítjuk.

Ez kétféle vektort hoz létre a gyűjteményünkben:

  • Egyéni arc vektorok
  • Felhasználói vektorok, amelyek a módszerrel biztosított arcvektor-azonosítók alapján épülnek fel associate_faces

Lásd a következő kódot:

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 következő módszereket használjuk:

  • get_subdirs – Visszaadja az összes felhasználó könyvtárának listáját. Példánkban az érték [Swami,Werner].
  • get_files – Visszaadja az összes képfájlt az S3 előtag alatt a felhasználó számára.
  • face_ids – Ez egy olyan lista, amely egy felhasználóhoz tartozó összes arcazonosítót tartalmazza. Ezt a listát használjuk a AssociateFaces API.

A korábban kifejtetteknek megfelelően további felhasználókat is hozzáadhat mappák hozzáadásával (a mappa diktálja a felhasználói azonosítót), és hozzáadhatja a képeket ebbe a mappába (a fájlok nem igényelnek sorrendet).

Most, hogy a környezetünk be van állítva, és egyedi arcvektorokkal és felhasználói vektorokkal is rendelkezünk, hasonlítsuk össze keresési minőségünket mindegyikkel. Ehhez egy új fényképet használunk több emberrel, és megpróbáljuk összeilleszteni az arcukat a gyűjteményünkkel, először az egyes arcvektorokkal, majd a felhasználói vektorokkal.

Arckeresés a képen egyéni arcvektorok gyűjteményével szemben

Az egyéni arcvektorainkkal való kereséshez az Amazon Rekognitiont használjuk Search FacesByImage API. Ez a függvény egy forrásarckép segítségével keres a gyűjteményünkben lévő egyes arcvektorok alapján, és olyan arcokat ad vissza, amelyek megfelelnek a meghatározott hasonlósági pontszám küszöbértékének.

Fontos szempont, hogy a SearchFacesByImage Az API csak a képen észlelt legnagyobb arcon működik. Ha több arc is jelen van, minden egyes arcot le kell vágnia, és külön kell átadnia az azonosítási módszernek.

Az arcok képének részleteinek (például a képen elfoglalt helyének) kinyeréséhez az Amazon Rekognitiont használjuk Arcok észlelése API.

A következő észlel_arcok_a_képben módszer arcokat észlel a képen. Minden arc esetében a következő műveleteket hajtja végre:

  • Nyomtassa ki a határolókeret helyét
  • Vágja le az arcot a képről, és ellenőrizze, hogy létezik-e ilyen arc a gyűjteményben, és nyomtassa ki a felhasználót vagy az „Ismeretlen”
  • Nyomtassa ki a hasonlósági pontszámot

A példa Python kód a Párna könyvtár a képkezeléshez (például nyomtatáshoz, rajzoláshoz és vágáshoz).

A hasonlósági pontszám 99%-os küszöbértékét használjuk, amely általános beállítás a személyazonosság-ellenőrzési használati eseteknél.

Futtassa a következő kódot:

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 az S3 objektumkulcs, amelyet össze akarunk egyeztetni a gyűjteményünkkel. Példaképet adtunk (photo.jpeg) a képek mappa alatt.

Az alábbi képen az eredményeink láthatók.

99%-os küszöböt használva csak egy személyt azonosítottak. Dr. Werner Vogelst ismeretlenként jelölték meg. Ha ugyanazt a kódot egy alacsonyabb 90-es küszöbértékkel futtatjuk (beállítás threshold=90), a következő eredményeket kapjuk.

Most azt látjuk, hogy Dr. Werner Vogel arcának hasonlósági pontszáma 96.86%. Ezután ellenőrizzük, hogy felhasználói vektorok használatával elérhetjük-e a hasonlósági pontszámot a meghatározott küszöbérték felett.

Arckeresés a képen a felhasználói vektorok gyűjteményével szemben

A felhasználói vektorainkkal való kereséshez az Amazon Rekognitiont használjuk SearchUsersByImage API. Ez a függvény egy forrás arcképet használ a gyűjteményünkben található felhasználói vektorok szerinti kereséshez, és olyan felhasználókat ad vissza, amelyek megfelelnek a meghatározott hasonlósági pontszám küszöbértékének.

Ugyanez a megfontolás itt is releváns – a SearchUsersByImage Az API csak a képen észlelt legnagyobb arcon működik. Ha több arc is jelen van, akkor minden egyes arcot le kell vágnia, és külön kell átadnia az azonosítási módszernek.

Az arcok képének részleteinek (például a képen elfoglalt helyének) kinyeréséhez az Amazon Rekognitiont használjuk Arcok észlelése API.

A következő detect_users_in_image módszer arcokat észlel a képen. Minden arc esetében a következő műveleteket hajtja végre:

  • Nyomtassa ki a határolókeret helyét
  • Vágja le az arcot a képről, és ellenőrizze, hogy létezik-e ilyen felhasználói arc a gyűjteményünkben, majd nyomtassa ki a felhasználót vagy az „Ismeretlen” nevet.
  • Nyomtassa ki a hasonlósági pontszámot

Lásd a következő kódot:

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

A függvény egy módosított képet ad vissza az eredményekkel, amelyek elmenthetők az Amazon S3-ra vagy kinyomtathatók. A függvény ezenkívül statisztikát ad ki az arcok becsült életkoráról a terminálra.

Futtassa a következő kódot:

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)

Az alábbi képen az eredményeink láthatók.

A gyűjteményünkben szereplő felhasználókat helyesen azonosították, nagy hasonlósággal (több mint 99%).

Sikerült növelni a hasonlósági pontszámot felhasználói vektoronként három arcvektor használatával. Ahogy növeljük a használt arcvektorok számát, arra számítunk, hogy a valódi egyezések hasonlósági pontszáma is növekedni fog. Felhasználói vektoronként legfeljebb 100 arcvektort használhat.

Egy végpontok közötti példakód található a GitHub tárház. Ez tartalmaz egy részletes Jupyter jegyzetfüzet hogy tovább tud futni Amazon SageMaker Studio (vagy más alternatívák).

Tisztítsuk meg

A gyűjtemény törléséhez használja a következő kódot:

helpers.delete_collection(collection_id)

Következtetés

Ebben a bejegyzésben bemutattuk, hogyan használhatók az Amazon Rekognition felhasználói vektorok az arckeresés megvalósítására a felhasználók arcainak gyűjteményével szemben. Bemutattuk, hogyan javítható az arckeresés pontossága felhasználónként több arckép használatával, és összehasonlítottuk az egyes arcvektorokkal. Ezenkívül leírtuk, hogyan használhatja a különböző Amazon Rekognition API-kat az arcok észlelésére. A megadott példakód szilárd alapot nyújt egy funkcionális arckereső rendszer felépítéséhez.

Az Amazon Rekognition felhasználói vektorokkal kapcsolatos további információkért lásd: Arcok keresése egy gyűjteményben. Ha még nem ismeri az Amazon Rekognition szolgáltatást, használhatja ingyenes rétegünket, amely 12 hónapig tart, és havonta 5,000 kép feldolgozását és havi 1,000 felhasználói vektorobjektum tárolását tartalmazza.


A szerzőkről

Arik Porat az Amazon Web Services vezető startup megoldások építésze. Startup vállalkozásokkal dolgozik, hogy segítsen nekik megoldásaikat felhőben kiépíteni és megtervezni, és szenvedélyesen rajong a gépi tanulásért és a konténeralapú megoldásokért. Szabadidejében Arik szeret sakkozni és videojátékokat játszani.

Eliran Efron az Amazon Web Services Startups Solutions építésze. Eliran az adatok és a számítástechnika rajongója, segít az induló vállalkozásoknak rendszerarchitektúra tervezésében. Szabadidejében Eliran szeret autókat építeni és versenyezni a Touring versenyeken, valamint IoT-eszközöket építeni.

spot_img

Legújabb intelligencia

spot_img

Beszélj velünk

Szia! Miben segíthetek?