Terjemahan disediakan oleh mesin penerjemah. Jika konten terjemahan yang diberikan bertentangan dengan versi bahasa Inggris aslinya, utamakan versi bahasa Inggris.
Mendeteksi Label dalam Gambar Menggunakan Lambda dan Python
AWS Lambda adalah layanan komputasi yang dapat Anda gunakan untuk menjalankan kode tanpa menyediakan atau mengelola server. Anda dapat memanggil operasi API Rekognition dari dalam fungsi Lambda. Petunjuk berikut menunjukkan cara membuat fungsi Lambda dengan Python yang memanggil. DetectLabels
Fungsi Lambda memanggil DetectLabels
dan mengembalikan array label yang terdeteksi dalam gambar, serta tingkat kepercayaan yang dengannya mereka terdeteksi.
Instruksi termasuk contoh kode Python yang menunjukkan cara memanggil fungsi Lambda dan menyediakannya dengan gambar yang bersumber dari bucket Amazon S3 atau komputer lokal Anda.
Pastikan gambar yang Anda pilih memenuhi batas Rekognition. Lihat Pedoman dan kuota di Rekognition dan DetectLabels API Referensi untuk informasi tentang jenis file gambar dan batas ukuran.
Buat fungsi Lambda (konsol)
Pada langkah ini, Anda membuat fungsi Lambda kosong dan peran IAM eksekusi yang memungkinkan fungsi Lambda Anda memanggil operasi. DetectLabels
Pada langkah selanjutnya, Anda menambahkan kode sumber dan secara opsional menambahkan lapisan ke fungsi Lambda.
Jika Anda menggunakan dokumen yang disimpan dalam bucket Amazon S3, langkah ini juga menunjukkan cara memberikan akses ke bucket yang menyimpan dokumen Anda.
Untuk membuat AWS Lambda fungsi (konsol)
Masuk ke AWS Management Console dan buka AWS Lambda konsol di https://console.aws.amazon.com/lambda/
. -
Pilih Buat fungsi. Untuk informasi selengkapnya, lihat Membuat Fungsi Lambda dengan Konsol.
-
Pilih opsi berikut:
-
Pilih Tulis dari awal.
-
Masukkan nilai untuk nama Fungsi.
-
Untuk Runtime, pilih versi terbaru Python.
-
Untuk Arsitektur, pilih x86_64.
-
-
Pilih Buat fungsi untuk membuat AWS Lambda fungsi.
Pada halaman fungsi, pilih tab Konfigurasi.
-
Pada panel Izin, di bawah Peran eksekusi, pilih nama peran untuk membuka peran di IAM konsol.
-
Di tab Izin, pilih Tambahkan izin, lalu Buat kebijakan sebaris.
Pilih JSONtab dan ganti kebijakan dengan kebijakan berikut:
{ "Version": "2012-10-17", "Statement": [ { "Action": "rekognition:DetectLabels", "Resource": "*", "Effect": "Allow", "Sid": "DetectLabels" } ] }
Pilih Tinjau kebijakan.
Masukkan nama untuk kebijakan, misalnya DetectLabels-access.
Pilih Buat kebijakan.
-
Jika Anda menyimpan dokumen untuk analisis dalam bucket Amazon S3, Anda harus menambahkan kebijakan akses Amazon S3. Untuk melakukan ini, ulangi langkah 7 hingga 11 di AWS Lambda konsol dan buat perubahan berikut.
-
Untuk langkah 8, gunakan kebijakan berikut. Ganti
bucket/folder path
dengan bucket Amazon S3 dan path folder ke dokumen yang ingin Anda analisis.{ "Version": "2012-10-17", "Statement": [ { "Sid": "S3Access", "Effect": "Allow", "Action": "s3:GetObject", "Resource": "arn:aws:s3:::
bucket/folder path
/*" } ] } Untuk langkah 10, pilih nama kebijakan yang berbeda, seperti S3Bucket-access.
-
(Opsional) Buat layer (konsol)
Anda tidak perlu melakukan langkah ini untuk menggunakan fungsi dan panggilan Lambda. DetectLabels
DetectLabels
Operasi ini termasuk dalam lingkungan Lambda Python default sebagai bagian dari untuk AWS SDK Python (Boto3).
Jika bagian lain dari fungsi Lambda Anda memerlukan pembaruan AWS layanan terbaru yang tidak ada di lingkungan Lambda Python default, maka Anda dapat melakukan langkah ini untuk menambahkan rilis Boto3 SDK terbaru sebagai lapisan ke fungsi Anda.
Untuk menambahkan lapisan SDK as, pertama-tama Anda membuat arsip file zip yang berisi Boto3SDK. Kemudian, Anda membuat layer dan menambahkan arsip file zip ke layer. Untuk informasi selengkapnya, lihat Menggunakan layer dengan fungsi Lambda Anda.
Untuk membuat dan menambahkan lapisan (konsol)
-
Buka prompt perintah dan masukkan perintah berikut untuk membuat paket penyebaran dengan versi terbaru dari file. AWS SDK
pip install boto3 --target python/. zip boto3-layer.zip -r python/
Perhatikan nama file zip (boto3-layer.zip), yang Anda gunakan pada langkah 8 prosedur ini.
Buka AWS Lambda konsol di https://console.aws.amazon.com/lambda/
. -
Di panel navigasi, pilih Layers (Lapisan).
-
Pilih Buat lapisan.
-
Masukkan nilai untuk Nama dan Deskripsi.
-
Untuk jenis entri Kode, pilih Unggah file.zip dan pilih Unggah.
-
Di kotak dialog, pilih arsip file zip (boto3-layer.zip) yang Anda buat di langkah 1 prosedur ini.
-
Untuk runtime yang kompatibel, pilih versi terbaru Python.
-
Pilih Create untuk membuat layer.
-
Pilih ikon menu panel navigasi.
-
Di panel navigasi, pilih Fungsi.
-
Dalam daftar sumber daya, pilih fungsi yang Anda buat sebelumnya.
-
Pilih tab Kode.
-
Di bagian Layers, pilih Add a layer.
-
Pilih Custom Layers.
-
Di Custom layers, pilih nama layer yang Anda masukkan pada langkah 6.
Di Versi pilih versi layer, yang seharusnya 1.
-
Pilih Tambahkan.
Tambahkan kode Python (konsol)
Pada langkah ini, Anda menambahkan kode Python Anda ke fungsi Lambda Anda melalui editor kode konsol Lambda. Kode mendeteksi label dalam gambar menggunakan DetectLabels
operasi. Ia mengembalikan array label terdeteksi dalam gambar, serta tingkat kepercayaan pada label terdeteksi.
Dokumen yang Anda berikan untuk DetectLabels
operasi dapat ditemukan di bucket Amazon S3 atau komputer lokal.
Untuk menambahkan kode Python (konsol)
Arahkan ke tab Kode.
-
Di editor kode, ganti kode di lambda_function.py dengan kode berikut:
import boto3 import logging from botocore.exceptions import ClientError import json import base64 # Instantiate logger logger = logging.getLogger(__name__) # connect to the Rekognition client rekognition = boto3.client('rekognition') def lambda_handler(event, context): try: image = None if 'S3Bucket' in event and 'S3Object' in event: s3 = boto3.resource('s3') s3_object = s3.Object(event['S3Bucket'], event['S3Object']) image = s3_object.get()['Body'].read() elif 'image' in event: image_bytes = event['image'].encode('utf-8') img_b64decoded = base64.b64decode(image_bytes) image = img_b64decoded elif image is None: raise ValueError('Missing image, check image or bucket path.') else: raise ValueError("Only base 64 encoded image bytes or S3Object are supported.") response = rekognition.detect_labels(Image={'Bytes': image}) lambda_response = { "statusCode": 200, "body": json.dumps(response) } labels = [label['Name'] for label in response['Labels']] print("Labels found:") print(labels) except ClientError as client_err: error_message = "Couldn't analyze image: " + client_err.response['Error']['Message'] lambda_response = { 'statusCode': 400, 'body': { "Error": client_err.response['Error']['Code'], "ErrorMessage": error_message } } logger.error("Error function %s: %s", context.invoked_function_arn, error_message) except ValueError as val_error: lambda_response = { 'statusCode': 400, 'body': { "Error": "ValueError", "ErrorMessage": format(val_error) } } logger.error("Error function %s: %s", context.invoked_function_arn, format(val_error)) return lambda_response
Pilih Deploy untuk menerapkan fungsi Lambda Anda.
Untuk menambahkan kode Python (konsol)
Sekarang setelah Anda membuat fungsi Lambda, Anda dapat memanggilnya untuk mendeteksi label dalam gambar.
Pada langkah ini, Anda menjalankan kode Python di komputer Anda, yang meneruskan gambar lokal atau gambar di bucket Amazon S3, ke fungsi Lambda Anda.
Pastikan Anda menjalankan kode di AWS Wilayah yang sama di mana Anda membuat fungsi Lambda. Anda dapat melihat AWS Wilayah untuk fungsi Lambda Anda di bilah navigasi halaman detail fungsi di konsol Lambda.
Jika fungsi Lambda mengembalikan kesalahan batas waktu, perpanjang periode batas waktu untuk fungsi Lambda. Untuk informasi selengkapnya, lihat Mengonfigurasi batas waktu fungsi (konsol).
Untuk informasi selengkapnya tentang menjalankan fungsi Lambda dari kode Anda, lihat Memanggil AWS Fungsi Lambda.
Untuk mencoba fungsi Lambda Anda
Jika Anda belum melakukannya, lakukan hal berikut:
-
Pastikan bahwa pengguna memiliki
lambda:InvokeFunction
izin. Anda dapat menggunakan kebijakan berikut:{ "Version": "2012-10-17", "Statement": [ { "Sid": "InvokeLambda", "Effect": "Allow", "Action": "lambda:InvokeFunction", "Resource": "
ARN for lambda function
" } ] }Anda bisa mendapatkan fungsi ARN untuk Lambda Anda dari ikhtisar fungsi di konsol Lambda.
Untuk memberikan akses dan menambahkan izin bagi pengguna, grup, atau peran Anda:
-
Pengguna dan grup di AWS IAM Identity Center:
Buat rangkaian izin. Ikuti instruksi di Buat rangkaian izin di Panduan Pengguna AWS IAM Identity Center .
-
Pengguna yang dikelola IAM melalui penyedia identitas:
Buat peran untuk federasi identitas. Ikuti petunjuk di Membuat peran untuk penyedia identitas pihak ketiga (federasi) di Panduan IAM Pengguna.
-
IAMpengguna:
-
Buat peran yang dapat diambil pengguna Anda. Ikuti petunjuk di Buat peran untuk IAM pengguna di Panduan IAM Pengguna.
-
(Tidak disarankan) Lampirkan kebijakan langsung ke pengguna atau tambahkan pengguna ke grup pengguna. Ikuti petunjuk di Menambahkan izin ke pengguna (konsol) di Panduan IAM Pengguna.
-
-
-
Instal dan konfigurasikan AWS SDK untuk Python. Untuk informasi selengkapnya, lihat Langkah 2: Siapkan AWS CLI and AWS SDKs.
-
-
Simpan kode berikut ke file bernama
client.py
:import boto3 import json import base64 import pprint # Replace with the name of your S3 bucket and image object key bucket_name = "name of bucket" object_key = "name of file in s3 bucket" # If using a local file, supply the file name as the value of image_path below image_path = "" # Create session and establish connection to client[' session = boto3.Session(profile_name='developer-role') s3 = session.client('s3', region_name="us-east-1") lambda_client = session.client('lambda', region_name="us-east-1") # Replace with the name of your Lambda function function_name = 'RekDetectLabels' def analyze_image_local(img_path): print("Analyzing local image:") with open(img_path, 'rb') as image_file: image_bytes = image_file.read() data = base64.b64encode(image_bytes).decode("utf8") lambda_payload = {"image": data} # Invoke the Lambda function with the event payload response = lambda_client.invoke( FunctionName=function_name, Payload=(json.dumps(lambda_payload)) ) decoded = json.loads(response['Payload'].read().decode()) pprint.pprint(decoded) def analyze_image_s3(bucket_name, object_key): print("Analyzing image in S3 bucket:") # Load the image data from S3 into memory response = s3.get_object(Bucket=bucket_name, Key=object_key) image_data = response['Body'].read() image_data = base64.b64encode(image_data).decode("utf8") # Create the Lambda event payload event = { 'S3Bucket': bucket_name, 'S3Object': object_key, 'ImageBytes': image_data } # Invoke the Lambda function with the event payload response = lambda_client.invoke( FunctionName=function_name, InvocationType='RequestResponse', Payload=json.dumps(event), ) decoded = json.loads(response['Payload'].read().decode()) pprint.pprint(decoded) def main(path_to_image, name_s3_bucket, obj_key): if str(path_to_image) != "": analyze_image_local(path_to_image) else: analyze_image_s3(name_s3_bucket, obj_key) if __name__ == "__main__": main(image_path, bucket_name, object_key)
-
Jalankan kode tersebut. Jika dokumen ada di ember Amazon S3. pastikan itu adalah ember yang sama dengan yang Anda tentukan sebelumnya di langkah 12 dari.
Jika berhasil, kode Anda akan mengembalikan JSON respons sebagian untuk setiap jenis Blok yang terdeteksi dalam dokumen.