Menggunakan Amazon Rekognition untuk Verifikasi Identitas - Amazon Rekognition

Terjemahan disediakan oleh mesin penerjemah. Jika konten terjemahan yang diberikan bertentangan dengan versi bahasa Inggris aslinya, utamakan versi bahasa Inggris.

Menggunakan Amazon Rekognition untuk Verifikasi Identitas

Amazon Rekognition memberi pengguna beberapa operasi yang memungkinkan pembuatan sistem verifikasi identitas secara sederhana. Amazon Rekognition memungkinkan pengguna untuk mendeteksi wajah dalam gambar dan kemudian membandingkan wajah yang terdeteksi dengan wajah lain dengan membandingkan data wajah. Data wajah ini disimpan dalam wadah sisi server yang disebut Koleksi. Dengan memanfaatkan deteksi wajah Amazon Rekognition, perbandingan wajah, dan operasi manajemen koleksi, Anda dapat membuat aplikasi dengan solusi verifikasi identitas.

Tutorial ini akan menunjukkan dua alur kerja umum untuk pembuatan aplikasi yang membutuhkan verifikasi identitas.

Alur kerja pertama melibatkan pendaftaran pengguna baru dalam koleksi. Alur kerja kedua melibatkan pencarian koleksi yang ada untuk tujuan masuk ke pengguna yang kembali.

Anda akan menggunakan AWS SDK untuk Python untuk tutorial ini. Anda juga dapat melihat contoh GitHub repo AWS Documentation SDK untuk tutorial Python lainnya.

Prasyarat

Sebelum Anda memulai tutorial ini, Anda perlu menginstal Python dan menyelesaikan langkah-langkah yang diperlukan untuk mengatur SDK Python. AWS Di luar ini, pastikan Anda memiliki:

Membuat Koleksi

Sebelum Anda dapat mendaftarkan pengguna baru di Koleksi atau mencari Koleksi untuk pengguna, Anda harus memiliki Koleksi untuk dikerjakan. Koleksi Rekognition Amazon adalah wadah sisi server yang digunakan untuk menyimpan informasi tentang wajah yang terdeteksi.

Buat Koleksi

Anda akan mulai dengan menulis fungsi yang membuat Collection untuk digunakan oleh aplikasi Anda. Amazon Rekognition menyimpan informasi tentang wajah yang telah terdeteksi dalam wadah sisi server yang disebut Koleksi. Anda dapat mencari informasi wajah yang disimpan dalam Koleksi untuk wajah yang dikenal. Untuk menyimpan informasi wajah, Anda harus terlebih dahulu membuat Koleksi menggunakan CreateCollection operasi.

  1. Pilih nama untuk Koleksi yang ingin Anda buat. Dalam kode berikut, ganti nilai collection_id dengan nama Koleksi yang ingin Anda buat, dan ganti nilainya region dengan nama wilayah yang ditentukan dalam kredensi pengguna Anda. Anda dapat menggunakan Tags argumen untuk menerapkan tag apa pun yang Anda inginkan ke koleksi, meskipun ini tidak diperlukan. CreateCollectionOperasi akan mengembalikan informasi tentang koleksi yang telah Anda buat, termasuk Arn koleksi. Catat Arn yang Anda terima sebagai hasil dari menjalankan kode.

    import boto3 def create_collection(collection_id, region): client = boto3.client('rekognition', region_name=region) # Create a collection print('Creating collection:' + collection_id) response = client.create_collection(CollectionId=collection_id, Tags={"SampleKey1":"SampleValue1"}) print('Collection ARN: ' + response['CollectionArn']) print('Status code: ' + str(response['StatusCode'])) print('Done...') collection_id = 'collection-id-name' region = "region-name" create_collection(collection_id, region)
  2. Simpan dan jalankan kode. Salin koleksi Arn.

    Sekarang setelah Koleksi Rekognition telah dibuat, Anda dapat menyimpan informasi wajah dan pengidentifikasi di Koleksi itu. Anda juga akan dapat membandingkan wajah dengan informasi yang disimpan untuk verifikasi.

Pendaftaran Pengguna Baru

Anda akan ingin dapat mendaftarkan pengguna baru dan menambahkan info mereka ke Koleksi. Proses mendaftarkan pengguna baru biasanya melibatkan langkah-langkah berikut:

Panggil DetectFaces Operasi

Tulis kode untuk memeriksa kualitas gambar wajah melalui DetectFaces operasi. Anda akan menggunakan DetectFaces operasi untuk menentukan apakah gambar yang diambil oleh kamera cocok untuk diproses oleh SearchFacesByImage operasi. Gambar harus berisi hanya satu wajah. Anda akan memberikan file gambar input lokal ke DetectFaces operasi dan menerima detail untuk wajah yang terdeteksi dalam gambar. Kode sampel berikut memberikan gambar input ke DetectFaces dan kemudian memeriksa untuk melihat apakah hanya satu wajah yang terdeteksi dalam gambar.

  1. Dalam contoh kode berikut, ganti photo dengan nama gambar target tempat Anda ingin mendeteksi wajah. Anda juga harus mengganti nilai region dengan nama wilayah yang terkait dengan akun Anda.

    import boto3 import json def detect_faces(target_file, region): client=boto3.client('rekognition', region_name=region) imageTarget = open(target_file, 'rb') response = client.detect_faces(Image={'Bytes': imageTarget.read()}, Attributes=['ALL']) print('Detected faces for ' + photo) for faceDetail in response['FaceDetails']: print('The detected face is between ' + str(faceDetail['AgeRange']['Low']) + ' and ' + str(faceDetail['AgeRange']['High']) + ' years old') print('Here are the other attributes:') print(json.dumps(faceDetail, indent=4, sort_keys=True)) # Access predictions for individual face details and print them print("Gender: " + str(faceDetail['Gender'])) print("Smile: " + str(faceDetail['Smile'])) print("Eyeglasses: " + str(faceDetail['Eyeglasses'])) print("Emotions: " + str(faceDetail['Emotions'][0])) return len(response['FaceDetails']) photo = 'photo-name' region = 'region-name' face_count=detect_faces(photo, region) print("Faces detected: " + str(face_count)) if face_count == 1: print("Image suitable for use in collection.") else: print("Please submit an image with only one face.")
  2. Simpan dan jalankan kode proses.

Panggil CompareFaces Operasi

Aplikasi Anda harus dapat mendaftarkan pengguna baru dalam Koleksi dan mengonfirmasi identitas pengguna yang kembali. Anda akan membuat fungsi yang digunakan untuk mendaftarkan pengguna baru terlebih dahulu. Anda akan mulai dengan menggunakan CompareFaces operasi untuk membandingkan input/target image of the user and a ID/stored gambar lokal. Jika ada kecocokan antara wajah yang terdeteksi di kedua gambar, Anda dapat mencari melalui Koleksi untuk melihat apakah pengguna telah terdaftar di dalamnya.

Mulailah dengan menulis fungsi yang membandingkan gambar input dengan gambar ID yang telah Anda simpan di bucket Amazon S3 Anda. Dalam contoh kode berikut, Anda harus memberikan gambar input sendiri, yang harus ditangkap setelah menggunakan beberapa bentuk detektor keaktifan. Anda juga harus meneruskan nama gambar yang disimpan di ember Amazon S3 Anda.

  1. Ganti nilai bucket dengan nama bucket Amazon S3 yang berisi file sumber Anda. Anda juga perlu mengganti nilai source_file dengan nama gambar sumber yang Anda gunakan. Ganti nilai target_file dengan nama file target yang telah Anda berikan. Ganti nilai region dengan nama yang region ditentukan dalam kredensi pengguna Anda.

    Anda juga ingin menentukan tingkat kepercayaan minimum dalam pertandingan yang dikembalikan dalam respons, menggunakan similarityThreshold argumen. Wajah yang terdeteksi hanya akan dikembalikan dalam FaceMatches array jika kepercayaan berada di atas ambang batas ini. Pilihan Anda similarityThreshold harus mencerminkan sifat kasus penggunaan spesifik Anda. Setiap kasus penggunaan yang melibatkan aplikasi keamanan kritis harus menggunakan 99 sebagai ambang batas yang dipilih.

    import boto3 def compare_faces(bucket, sourceFile, targetFile, region): client = boto3.client('rekognition', region_name=region) imageTarget = open(targetFile, 'rb') response = client.compare_faces(SimilarityThreshold=99, SourceImage={'S3Object':{'Bucket':bucket,'Name':sourceFile}}, TargetImage={'Bytes': imageTarget.read()}) for faceMatch in response['FaceMatches']: position = faceMatch['Face']['BoundingBox'] similarity = str(faceMatch['Similarity']) print('The face at ' + str(position['Left']) + ' ' + str(position['Top']) + ' matches with ' + similarity + '% confidence') imageTarget.close() return len(response['FaceMatches']) bucket = 'bucket-name' source_file = 'source-file-name' target_file = 'target-file-name' region = "region-name" face_matches = compare_faces(bucket, source_file, target_file, region) print("Face matches: " + str(face_matches)) if str(face_matches) == "1": print("Face match found.") else: print("No face match found.")
  2. Simpan dan jalankan kode proses.

    Anda akan dikembalikan objek respons yang berisi informasi tentang wajah yang cocok dan tingkat kepercayaan diri.

Panggil SearchFacesByImage Operasi

Jika tingkat kepercayaan CompareFaces operasi di atas pilihan AndaSimilarityThreshold, Anda akan ingin mencari Koleksi Anda untuk wajah yang mungkin cocok dengan gambar input. Jika kecocokan ditemukan di koleksi Anda, itu berarti pengguna kemungkinan sudah terdaftar di Koleksi dan tidak perlu mendaftarkan pengguna baru di Koleksi Anda. Jika tidak ada kecocokan, Anda dapat mendaftarkan pengguna baru di Koleksi Anda.

  1. Mulailah dengan menulis kode yang akan memanggil SearchFacesByImage operasi. Operasi akan mengambil file gambar lokal sebagai argumen dan kemudian mencari wajah Anda Collection yang cocok dengan wajah terdeteksi terbesar dalam gambar yang disediakan.

    Dalam contoh kode berikut, ubah nilai collectionId ke Koleksi yang ingin Anda cari. Ganti nilai region dengan nama wilayah yang terkait dengan akun Anda. Anda juga harus mengganti nilai photo dengan nama file input Anda. Anda juga ingin menentukan ambang kesamaan dengan mengganti nilai threshold dengan persentil yang dipilih.

    import boto3 collectionId = 'collection-id-name' region = "region-name" photo = 'photo-name' threshold = 99 maxFaces = 1 client = boto3.client('rekognition', region_name=region) # input image should be local file here, not s3 file with open(photo, 'rb') as image: response = client.search_faces_by_image(CollectionId=collectionId, Image={'Bytes': image.read()}, FaceMatchThreshold=threshold, MaxFaces=maxFaces) faceMatches = response['FaceMatches'] print(faceMatches) for match in faceMatches: print('FaceId:' + match['Face']['FaceId']) print('ImageId:' + match['Face']['ImageId']) print('Similarity: ' + "{:.2f}".format(match['Similarity']) + "%") print('Confidence: ' + str(match['Face']['Confidence']))
  2. Simpan dan jalankan kode proses. Jika ada kecocokan, itu berarti orang yang dikenali dalam gambar sudah menjadi bagian dari Koleksi dan tidak perlu melanjutkan ke langkah berikutnya. Dalam hal ini, Anda hanya dapat mengizinkan akses pengguna ke aplikasi.

Panggil IndexFaces Operasi

Dengan asumsi bahwa tidak ada kecocokan yang ditemukan di Koleksi yang Anda cari, Anda akan ingin menambahkan wajah pengguna ke koleksi Anda. Anda melakukan ini dengan memanggil IndexFaces operasi. Saat Anda menelepon IndexFaces, Amazon Rekognition mengekstrak fitur wajah wajah yang diidentifikasi dalam gambar input Anda, menyimpan data dalam koleksi yang ditentukan.

  1. Mulailah dengan menulis kode untuk meneleponIndexFaces. Ganti nilai image dengan nama file lokal yang ingin Anda gunakan sebagai gambar input untuk IndexFaces operasi. Anda juga perlu mengganti nilai photo_name dengan nama yang diinginkan untuk gambar input Anda. Pastikan untuk mengganti nilai collection_id dengan ID koleksi yang Anda buat sebelumnya. Selanjutnya, ganti nilai region dengan nama wilayah yang terkait dengan akun Anda. Anda juga ingin menentukan nilai untuk parameter MaxFaces input, yang menentukan jumlah maksimum wajah dalam gambar yang harus diindeks. Nilai default untuk parameter ini adalah 1.

    import boto3 def add_faces_to_collection(target_file, photo, collection_id, region): client = boto3.client('rekognition', region_name=region) imageTarget = open(target_file, 'rb') response = client.index_faces(CollectionId=collection_id, Image={'Bytes': imageTarget.read()}, ExternalImageId=photo, MaxFaces=1, QualityFilter="AUTO", DetectionAttributes=['ALL']) print(response) print('Results for ' + photo) print('Faces indexed:') for faceRecord in response['FaceRecords']: print(' Face ID: ' + faceRecord['Face']['FaceId']) print(' Location: {}'.format(faceRecord['Face']['BoundingBox'])) print(' Image ID: {}'.format(faceRecord['Face']['ImageId'])) print(' External Image ID: {}'.format(faceRecord['Face']['ExternalImageId'])) print(' Confidence: {}'.format(faceRecord['Face']['Confidence'])) print('Faces not indexed:') for unindexedFace in response['UnindexedFaces']: print(' Location: {}'.format(unindexedFace['FaceDetail']['BoundingBox'])) print(' Reasons:') for reason in unindexedFace['Reasons']: print(' ' + reason) return len(response['FaceRecords']) image = 'image-file-name' collection_id = 'collection-id-name' photo_name = 'desired-image-name' region = "region-name" indexed_faces_count = add_faces_to_collection(image, photo_name, collection_id, region) print("Faces indexed count: " + str(indexed_faces_count))
  2. Simpan dan jalankan kode proses. Tentukan apakah Anda ingin menyimpan salah satu data yang dikembalikan oleh IndexFaces operasi, seperti FaceID yang ditetapkan untuk orang dalam gambar. Bagian selanjutnya akan memeriksa cara menyimpan data ini. Salin Confidence nilai yang dikembalikan FaceIdImageId,, dan sebelum melanjutkan.

Simpan Data Gambar dan FaceID di Amazon S3 dan Amazon DynamoDB

Setelah ID Wajah untuk gambar input diperoleh, data gambar dapat disimpan di Amazon S3, sedangkan data wajah dan URL gambar dapat dimasukkan ke dalam database seperti DynamoDB.

  1. Tulis kode untuk mengunggah gambar input ke database Amazon S3 Anda. Dalam contoh kode berikut, ganti nilainya bucket dengan nama bucket tempat Anda ingin mengunggah file, lalu ganti nilainya file_name dengan nama file lokal yang ingin Anda simpan di bucket Amazon S3 Anda. Berikan nama kunci yang akan mengidentifikasi file di bucket Amazon S3 dengan mengganti nilainya key_name dengan nama yang ingin Anda berikan pada file gambar. File yang ingin Anda unggah adalah file yang sama yang didefinisikan dalam contoh kode sebelumnya, yang merupakan file input yang Anda gunakan IndexFaces. Akhirnya, ganti nilai region dengan nama wilayah yang terkait dengan akun Anda.

    import boto3 import logging from botocore.exceptions import ClientError # store local file in S3 bucket bucket = "amzn-s3-demo-bucket" file_name = "file-name" key_name = "key-name" region = "region-name" s3 = boto3.client('s3', region_name=region) # Upload the file try: response = s3.upload_file(file_name, bucket, key_name) print("File upload successful!") except ClientError as e: logging.error(e)
  2. Simpan dan jalankan contoh kode lanjutan untuk mengunggah gambar masukan Anda ke Amazon Amazon S3.

  3. Anda juga ingin menyimpan ID Wajah yang dikembalikan ke database. Ini dapat dilakukan dengan membuat tabel database DynamoDB dan kemudian mengunggah ID Wajah ke tabel itu. Contoh kode berikut membuat tabel DynamoDB. Perhatikan bahwa Anda hanya perlu menjalankan kode yang membuat tabel ini sekali. Dalam kode berikut, ganti nilai region dengan nilai wilayah yang terkait dengan akun Anda. Anda juga perlu mengganti nilai database_name dengan nama yang ingin Anda berikan pada tabel DynamoDB.

    import boto3 # Create DynamoDB database with image URL and face data, face ID def create_dynamodb_table(table_name, region): dynamodb = boto3.client("dynamodb", region_name=region) table = dynamodb.create_table( TableName=table_name, KeySchema=[{ 'AttributeName': 'FaceID', 'KeyType': 'HASH' # Partition key },], AttributeDefinitions=[ { 'AttributeName': 'FaceID', 'AttributeType': 'S' }, ], ProvisionedThroughput={ 'ReadCapacityUnits': 10, 'WriteCapacityUnits': 10 } ) print(table) return table region = "region-name" database_name = 'database-name' dynamodb_table = create_dynamodb_table(database_name, region) print("Table status:", dynamodb_table)
  4. Simpan dan jalankan kode proses untuk membuat tabel Anda.

  5. Setelah membuat tabel, Anda dapat mengunggah yang dikembalikan FaceId ke sana. Untuk melakukan ini, Anda akan membuat koneksi ke tabel dengan fungsi Tabel dan kemudian menggunakan put_item fungsi untuk mengunggah data.

    Dalam contoh kode berikut, ganti nilai bucket dengan nama bucket yang berisi gambar input yang Anda unggah ke Amazon S3. Anda juga harus mengganti nilai file_name dengan nama file input yang Anda unggah ke bucket Amazon S3 dan nilainya key_name dengan kunci yang sebelumnya Anda gunakan untuk mengidentifikasi file input. Akhirnya, ganti nilai region dengan nama wilayah yang terkait dengan akun Anda. Nilai-nilai ini harus sesuai dengan yang disediakan pada langkah 1.

    AddDBEntryMenyimpan nilai FaceId ImageId,, dan Keyakinan yang ditetapkan ke wajah dalam koleksi. Berikan fungsi di bawah ini dengan nilai-nilai yang Anda simpan selama Langkah 2 dari IndexFaces bagian prosiding.

    import boto3 from pprint import pprint from decimal import Decimal import json # The local file that was stored in S3 bucket bucket = "amzn-s3-demo-bucket" file_name = "file-name" key_name = "key-name" region = "region-name" # Get URL of file file_url = "https://s3.amazonaws.com/{}/{}".format(bucket, key_name) print(file_url) # upload face-id, face info, and image url def AddDBEntry(file_name, file_url, face_id, image_id, confidence): dynamodb = boto3.resource('dynamodb', region_name=region) table = dynamodb.Table('FacesDB-4') response = table.put_item( Item={ 'ExternalImageID': file_name, 'ImageURL': file_url, 'FaceID': face_id, 'ImageID': image_id, 'Confidence': json.loads(json.dumps(confidence), parse_float=Decimal) } ) return response # Mock values for face ID, image ID, and confidence - replace them with actual values from your collection results dynamodb_resp = AddDBEntry(file_name, file_url, "FACE-ID-HERE", "IMAGE-ID-HERE", confidence-here) print("Database entry successful.") pprint(dynamodb_resp, sort_dicts=False)
  6. Simpan dan jalankan contoh kode lanjutan untuk menyimpan data ID Wajah yang dikembalikan dalam tabel.

Login Pengguna yang Ada

Setelah pengguna terdaftar dalam Koleksi, mereka dapat diautentikasi setelah mereka kembali dengan menggunakan SearchFacesByImage operasi. Anda perlu mendapatkan gambar input dan kemudian memeriksa kualitas gambar input yang digunakanDetectFaces. Ini menentukan apakah gambar yang sesuai telah digunakan sebelum menjalankan SearchFacesbyImage operasi.

Panggil DetectFaces Operasi

  1. Anda akan menggunakan DetectFaces operasi untuk memeriksa kualitas gambar wajah dan menentukan apakah gambar yang diambil oleh kamera cocok untuk diproses oleh SearchFacesByImage operasi. Gambar input harus berisi hanya satu wajah. Contoh kode berikut mengambil gambar input dan menyediakannya untuk DetectFaces operasi.

    Dalam contoh kode berikut, ganti nilai photo dengan nama gambar target lokal dan ganti nilai region dengan nama wilayah yang terkait dengan akun Anda.

    import boto3 import json def detect_faces(target_file, region): client=boto3.client('rekognition', region_name=region) imageTarget = open(target_file, 'rb') response = client.detect_faces(Image={'Bytes': imageTarget.read()}, Attributes=['ALL']) print('Detected faces for ' + photo) for faceDetail in response['FaceDetails']: print('The detected face is between ' + str(faceDetail['AgeRange']['Low']) + ' and ' + str(faceDetail['AgeRange']['High']) + ' years old') print('Here are the other attributes:') print(json.dumps(faceDetail, indent=4, sort_keys=True)) # Access predictions for individual face details and print them print("Gender: " + str(faceDetail['Gender'])) print("Smile: " + str(faceDetail['Smile'])) print("Eyeglasses: " + str(faceDetail['Eyeglasses'])) print("Emotions: " + str(faceDetail['Emotions'][0])) return len(response['FaceDetails']) photo = 'photo-name' region = 'region-name' face_count=detect_faces(photo, region) print("Faces detected: " + str(face_count)) if face_count == 1: print("Image suitable for use in collection.") else: print("Please submit an image with only one face.")
  2. Simpan dan jalankan kode.

Panggil SearchFacesByImage Operasi

  1. Tulis kode untuk membandingkan wajah yang terdeteksi dengan wajah di Koleksi denganSearchFacesByImage. Anda akan menggunakan kode yang ditunjukkan di bagian Pendaftaran Pengguna Baru yang sedang berjalan dan memberikan gambar input ke SearchFacesByImage operasi.

    Dalam contoh kode berikut, ubah nilai collectionId ke koleksi yang ingin Anda cari. Anda juga akan mengubah nilai bucket menjadi nama bucket Amazon S3 dan nilai fileName ke file gambar di bucket itu. Ganti nilai region dengan nama wilayah yang terkait dengan akun Anda. Anda juga ingin menentukan ambang kesamaan dengan mengganti nilai threshold dengan persentil yang dipilih.

    import boto3 bucket = 'amzn-s3-demo-bucket' collectionId = 'collection-id-name' region = "region-name" fileName = 'file-name' threshold = 70 maxFaces = 1 client = boto3.client('rekognition', region_name=region) # input image should be local file here, not s3 file with open(fileName, 'rb') as image: response = client.search_faces_by_image(CollectionId=collectionId, Image={'Bytes': image.read()}, FaceMatchThreshold=threshold, MaxFaces=maxFaces)
  2. Simpan dan jalankan kode.

Periksa FaceID yang Dikembalikan dan Tingkat Keyakinan

Anda sekarang dapat memeriksa informasi tentang kecocokan FaceId dengan mencetak elemen respons seperti atribut FaceId, Kesamaan, dan Keyakinan.

faceMatches = response['FaceMatches'] print(faceMatches) for match in faceMatches: print('FaceId:' + match['Face']['FaceId']) print('ImageId:' + match['Face']['ImageId']) print('Similarity: ' + "{:.2f}".format(match['Similarity']) + "%") print('Confidence: ' + str(match['Face']['Confidence']))