Menggunakan Amazon Rekognition (REK) untuk mendeteksi label untuk aplikasi pemasaran - 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 (REK) untuk mendeteksi label untuk aplikasi pemasaran

Tutorial ini memandu Anda melalui pembuatan contoh aplikasi Python yang dapat digunakan untuk mengirim email ke orang-orang, berdasarkan gambar yang diunggah ke situs web. Aplikasi sampel dirancang untuk melibatkan pengguna dalam kampanye pemasaran media sosial dengan mengirimi mereka email yang dipersonalisasi tentang penawaran perjalanan jika tengara dikenali di foto mereka.

Solusi ini mengintegrasikan berbagai AWS layanan, termasuk Amazon Rekognition, Amazon S3, DynamoDB CloudWatch,, dan Amazon SES. Aplikasi ini menggunakan Amazon Rekognition untuk mendeteksi label dalam gambar yang diunggah oleh akun yang dikenali dalam database DynamoDB, dan kemudian pemegang akun dikirimi email pemasaran berdasarkan label yang terdeteksi dalam gambar. Arsitektur solusi lengkap adalah sebagai berikut:

  • Simpan data pengguna dalam database DynamoDB.

  • Pengguna mengunggah data gambar dan metadata (nomor akun pengguna) ke Amazon S3.

  • Fungsi Lambda memanggil DetectLabelsuntuk mengidentifikasi dan merekam label dalam gambar yang diunggah, mencari email pengguna di DynamoDB, dan mengirim email pemasaran ke pengguna yang mengunggah gambar.

  • Hasil fungsi Lambda masuk CloudWatch untuk ditinjau nanti.

Berikut adalah ikhtisar dari semua langkah dalam tutorial:

  1. Membuat dan mengisi tabel DynamoDB.

  2. Tulis fungsi Lambda dengan Logging dan Notification.

  3. Siapkan fungsi dan izin Lambda.

  4. Unggah gambar dan metadata dengan Amazon S3.

  5. CloudWatch Log jajak pendapat.

Prasyarat

Sebelum Anda memulai tutorial ini, Anda akan membutuhkan:

  • AWS Akun dan izin IAM yang sesuai.

  • Python dan Boto3 diinstal pada lingkungan pengembangan Anda.

  • Pemahaman dasar tentang Lambda, Amazon S3, DynamoDB, Amazon SES, dan. CloudWatch

  • Keakraban dasar dengan Lambda dan Amazon SES.

Membuat dan mengisi tabel DynamoDB

Untuk memulai tutorial ini, kita akan membuat tabel DynamoDB untuk menyimpan data pelanggan seperti: alamat email, usia, nomor telepon, dan status keanggotaan, menggunakan variabel AccountNumber "" sebagai kunci utama. Kami juga akan memasukkan beberapa data sampel ke dalam tabel.

Membuat tabel DynamoDB

Pertama, kita akan membuat tabel DynamoDB. Berikut cara mengaturnya menggunakan Python dan Boto3. Kami membuat fungsi yang disebut create_user_table dan terhubung ke sumber daya DynamoDB di dalamnya. Dalam contoh kode di bawah ini, ganti nilai “region_name” dengan nama wilayah tempat akun Anda beroperasi, lalu jalankan sel kode untuk membuat tabel Anda.

import boto3 def create_user_table(dynamodb=None): if not dynamodb: dynamodb = boto3.resource('dynamodb', region_name='us-east-1') table = dynamodb.create_table( TableName='CustomerDataTable', KeySchema=[ { 'AttributeName': 'AccountNumber', 'KeyType': 'HASH' # Partition key }, ], AttributeDefinitions=[ { 'AttributeName': 'AccountNumber', 'AttributeType': 'S' }, ], ProvisionedThroughput={ 'ReadCapacityUnits': 10, 'WriteCapacityUnits': 10 } ) # Wait until the table exists. table.wait_until_exists() print("Table status:", table.table_status) # Create the DynamoDB table. create_user_table()

Menjalankan skrip ini telah menyiapkan tabel DynamoDB CustomerDataTable bernama AccountNumber dengan sebagai kunci utama.

Memasukkan data sampel

Sekarang kita akan ingin memasukkan beberapa data sampel ke dalam tabel. Data sampel ini akan membantu kami menguji fungsionalitas lengkap aplikasi.

Kita akan membuat fungsi kedua yang menambahkan data sampel yang sama dengan yang CustomerDataTable kita buat sebelumnya. Tiga entri sampel dibuat oleh kode di bawah ini, dan setiap entri mencakup nomor akun, alamat email, usia, nomor telepon, dan status keanggotaan. Dalam contoh kode di bawah ini, ganti nilainya region_name dengan nama wilayah tempat akun Anda beroperasi, lalu jalankan sel kode untuk membuat tabel Anda. Jika Anda ingin menguji bagian pengiriman email aplikasi, ganti nilai entri pelanggan pertama EmailAddress di bawah ini dengan alamat email yang dapat Anda terima email di. Simpan dan jalankan kode.

import boto3 def insert_sample_data(dynamodb=None): if not dynamodb: dynamodb = boto3.resource('dynamodb', region_name='us-east-1') table = dynamodb.Table('CustomerDataTable') # Sample data customers = [ { 'AccountNumber': 'ACC1000', 'EmailAddress': 'email-for-delivery-here', 'Age': 30, 'PhoneNumber': '123-456-7890', 'MembershipStatus': 'Active' }, { 'AccountNumber': 'ACC1001', 'EmailAddress': 'jane.doe@example.com', 'Age': 25, 'PhoneNumber': '098-765-4321', 'MembershipStatus': 'Inactive' }, { 'AccountNumber': 'ACC1002', 'EmailAddress': 'pat.candella@example.com', 'Age': 35, 'PhoneNumber': '555-555-5555', 'MembershipStatus': 'Active' } ] # Inserting data for customer in customers: print(f"Adding customer: {customer['AccountNumber']}") table.put_item(Item=customer) # Insert sample data into DynamoDB insert_sample_data()

Dengan tabel DynamoDB diatur dan diisi, kita sekarang dapat melanjutkan untuk mengintegrasikan pengambilan data ini ke dalam fungsi Lambda. Ini memungkinkan aplikasi kami mengambil detail pengguna berdasarkan nomor akun yang akan diidentifikasi dalam alur kerja pemrosesan gambar yang akan datang.

Membuat Fungsi Lambda dengan Logging dan Notification

Sekarang, kita dapat membuat fungsi Lambda. Kami ingin memastikan bahwa fungsi Lambda, yang dipicu pada unggahan gambar, dapat membaca data gambar dan metadata akun dan menggunakannya untuk melakukan pencarian di tabel DynamoDB untuk data pengguna terkait. Ini berarti bahwa kita tidak hanya perlu menjalankan fungsi Amazon Rekognition, kita juga memerlukan DetectLabels fungsi yang mengambil AccountNumber dan menggunakannya untuk mengambil alamat email terkait dari DynamoDB. Selain itu, kami memerlukan fungsi yang mengirim email ke alamat email menggunakan Amazon SES. Akhirnya, kami menggunakan logger untuk mencatat info tentang prosesnya. Data ini akan ditampilkan oleh CloudWatch.

Buat fungsi Lambda

Berikut adalah garis besar bagaimana fungsi Lambda dapat menangani persyaratan ini. Dalam contoh kode berikut, pastikan bahwa tabel DynamoDB yang benar ditentukan, jika Anda telah menggunakan sesuatu CustomerDataTable selain sebagai nama tabel Anda. Selain itu, dalam fungsi “send_marketing_email”, Anda harus mengganti nilai argumen “Sumber” dengan alamat email yang dapat Anda akses yang akan berfungsi sebagai email pengirim.

import json import boto3 import logging logger = logging.getLogger() logger.setLevel(logging.INFO) def lambda_handler(event, context): s3_bucket = event['Records'][0]['s3']['bucket']['name'] s3_object_key = event['Records'][0]['s3']['object']['key'] print(s3_bucket) print(s3_object_key) s3 = boto3.client('s3') try: s3_response = s3.head_object(Bucket=s3_bucket, Key=s3_object_key) account_number = s3_response['Metadata']['account_number'] except Exception as e: logger.error(f"Failed to retrieve object or metadata: {str(e)}") raise e # Optionally re-raise to handle the error upstream or signal a failure rekognition = boto3.client('rekognition') try: labels_response = rekognition.detect_labels(Image={'S3Object': {'Bucket': s3_bucket, 'Name': s3_object_key}}) #logger.info(f"Detected labels: {json.dumps(labels_response['Labels'], indent=4)}") except Exception as e: #logger.info(f"Detected label: {label['Name']}") raise e #logger.info(f"Detected labels: {json.dumps(labels_response['Labels'], indent=4)}") landmark_detected = any(label['Name'] == 'Landmark' and label['Confidence'] > 20 for label in labels_response['Labels']) if landmark_detected: result = notify_user_based_on_landmark(account_number) print(result) #logger.info(f"Detected label: {label['Name']}") #logger.info(f"Notification sent: {result}") return { 'statusCode': 200, 'body': json.dumps('Process completed successfully!') } def notify_user_based_on_landmark(account_number): # Retrieve user data from DynamoDB dynamodb = boto3.resource('dynamodb') table = dynamodb.Table('CustomerDataTable') user_info = table.get_item(Key={'AccountNumber': account_number}) # Send email if user is found if 'Item' in user_info: send_marketing_email(user_info['Item']['EmailAddress']) return "User notified with relevant travel information." def send_marketing_email(email): ses = boto3.client('ses') response = ses.send_email( Source='your-email@example.com', Destination={'ToAddresses': [email]}, Message={ 'Subject': {'Data': 'Explore New Destinations!'}, 'Body': { 'Text': {'Data': 'Check out our exclusive travel packages inspired by the landmark in your uploaded image!'} } } ) return f"Email sent to {email} with status {response['ResponseMetadata']['HTTPStatusCode']}" print("succeess")

Sekarang kita telah menulis fungsi Lambda, kita perlu mengkonfigurasi izin untuk Lambda dan membuat instance fungsi Lambda kita di Konsol Manajemen. AWS

Menyiapkan izin dan fungsi Lambda

Buat atau Perbarui Peran IAM

Sebelum kita dapat menggunakan fungsi Lambda untuk menangani gambar apa pun yang diunggah oleh pengguna, kita harus menangani izin untuk itu. Fungsi Lambda memerlukan peran IAM yang tercakup padanya yang memiliki kebijakan yang memungkinkannya berinteraksi dengan Amazon S3, DynamoDB, Amazon SES, Amazon Rekognition, dan. CloudWatch

Untuk mengonfigurasi peran IAM Anda untuk fungsi Lambda:

  1. Buka Konsol AWS Manajemen.

  2. Pergi ke IAM > Peran > Buat peran.

    Pilih “Buat peran”.

  3. Pilih Lambda sebagai layanan yang akan menggunakan peran ini. Klik “Next”.

  4. Lampirkan kebijakan berikut (Perhatikan bahwa kebijakan ini dipilih semata-mata untuk tujuan demonstrasi, dalam pengaturan produksi nyata Anda ingin membatasi izin hanya untuk yang diperlukan. ):

    • AmazonS3 ReadOnlyAccess

    • AmazonRekognitionReadOnlyAccess

    • AmazonDynamoDBFullAkses

    • SESFullAkses Amazon

    • AWSLambdaJalankan

    • AWSLambdaBasicExecutionRole (untuk CloudWatch penebangan)

    Klik “Next”.

  5. Beri nama peran dan deskripsi, lalu buat peran dengan memilih “Buat peran”.

  6. Setelah kami mengonfigurasi izin yang tepat untuk Lambda, kami dapat membuat instance fungsi Lambda menggunakan Konsol Manajemen. AWS

    Buka layanan Lambda di AWS Management Console.

  7. Klik “Buat fungsi.” Pilih “Penulis dari awal.”

  8. Masukkan nama fungsi dan pilih runtime Python. Di bawah “Ubah peran eksekusi default”, pilih “Gunakan peran yang ada” dan kemudian pilih peran IAM yang Anda buat sebelumnya.

  9. Sekarang Anda harus membuat dan memperbarui kode di tab fungsi lambda. Buka tab yang disebut “lambda_function”, dan ganti kode di sana dengan contoh kode Lambda yang sedang berjalan.

    Simpan perubahan dan terapkan perubahan.

  10. Sekarang Anda harus mengonfigurasi Acara Amazon S3 sebagai Pemicu Lambda.

    Pada tab/halaman konfigurasi fungsi Lambda Anda, buka Pemicu, klik “Tambahkan pemicu.”

  11. Pilih Amazon S3 dari daftar pemicu yang tersedia.

  12. Untuk mengonfigurasi pemicu: Pilih ember dari mana fungsi harus dipicu.

    Pilih jenis acara, PUT. Secara opsional, Anda dapat menentukan awalan atau akhiran jika Anda hanya ingin memproses file dengan nama atau jenis tertentu.

  13. Aktifkan pemicu dengan mengklik “Tambah” dan simpan konfigurasi.

Memverifikasi Alamat Email Amazon SES

Sebelum Anda dapat menggunakan Amazon SES untuk mengirim email, Anda perlu memverifikasi alamat email pengirim dan penerima. Untuk melakukannya:

  1. Buka konsol Amazon SES. Arahkan ke “Manajemen Identitas”, lalu ke “Alamat Email”.

  2. Klik “Verifikasi Alamat Email Baru”. Masukkan alamat email yang ingin Anda verifikasi, dan klik “Verifikasi Alamat Email Ini”. Anda akan menerima email dengan tautan verifikasi. Klik tautan untuk menyelesaikan proses verifikasi.

  3. Setelah memverifikasi alamat email untuk kedua akun, menyiapkan fungsi Lambda dengan izin yang benar, dan membuat beberapa contoh data pelanggan, Anda dapat menguji fungsi Lambda dengan mengunggah gambar uji ke bucket Amazon S3 pilihan Anda.

Mengunggah Gambar ke Amazon S3 dengan Metadata

Sekarang kita dapat mengunggah gambar uji ke bucket Amazon S3 pilihan kita menggunakan AWS Konsol atau skrip yang kita siapkan sebelumnya. Tulis skrip yang mengunggah gambar ke bucket Amazon S3 yang sebelumnya Anda tentukan dalam fungsi Lambda. Dalam contoh kode di bawah ini, tentukan jalur gambar Anda sebagai argumen pertama ke “upload_image_to_s3", nama bucket sebagai argumen kedua, dan nomor akun pengguna yang mengunggah gambar sebagai argumen terakhir.

import boto3 def upload_image_to_s3(file_name, bucket, account_number): s3 = boto3.client('s3') try: with open(file_name, 'rb') as data: s3.upload_fileobj( Fileobj=data, Bucket=bucket, Key=file_name, ExtraArgs={ 'Metadata': {'account_number': account_number} } ) print("Image uploaded successfully with metadata.") except Exception as e: print("Failed to upload image") print(e) # Usage upload_image_to_s3('path-to-image-here', 's3-bucket-name-here', 'user-account-number-here')

Dalam fungsi ini, ExtraArgs parameter dalam upload_fileobj metode ini digunakan untuk menyertakan metadata yang ditentukan pengguna (account_number) bersama dengan gambar. Metadata ini nantinya dapat digunakan oleh AWS untuk memproses gambar yang sesuai.

Simpan dan jalankan skrip. Ini akan mengunggah gambar.

Screenshot dari IDE dengan hasil menjalankan kode yang disebutkan sebelumnya ditampilkan.

Beberapa menit setelah mengunggah gambar, Anda akan menerima email di alamat yang sebelumnya Anda kaitkan dengan akun yang ditentukan di sini.

CloudWatch Log Polling dari Klien

Periksa CloudWatch log untuk fungsi Lambda Anda untuk melihat apakah itu dipicu dan dijalankan seperti yang diharapkan. Log dapat ditemukan di CloudWatch bawah> Log > Grup log>/AWS/lambda/your_function_name. Anda juga dapat menulis skrip untuk mengakses dan mencetak log. Contoh kode berikut mengajak grup Lambda untuk log, mencetak log yang dihasilkan dalam satu jam terakhir. Simpan dan jalankan kode.

import boto3 import time def fetch_lambda_logs(log_group_name, start_time): client = boto3.client('logs') query = "fields @timestamp, @message | sort @timestamp desc | limit 20" start_query_response = client.start_query( logGroupName=log_group_name, startTime=int(start_time), endTime=int(time.time()), queryString=query, ) query_id = start_query_response['queryId'] response = None while response is None or response['status'] == 'Running': time.sleep(1) # Wait for 1 second before checking the query status again response = client.get_query_results(queryId=query_id) return response['results'] # Usage log_group = '/aws/lambda/RekMediaFunction' logs = fetch_lambda_logs(log_group, int(time.time()) - 3600) # Fetch logs from the last hour print("Retrieving logs") for log in logs: #print(log) print(log[1]['value'])

Menjalankan kode harus mencetak log dan Anda harus dapat melihat bahwa pengguna diberi tahu melalui email yang berisi informasi perjalanan yang relevan.

Tangkapan layar IDE yang menampilkan hasil menjalankan kode yang disebutkan sebelumnya, dengan informasi dari log Cloudwatch ditampilkan.

Anda telah berhasil membuat aplikasi yang mampu mendeteksi label dalam gambar yang diunggah ke ember Amazon S3 dan kemudian mengirim email kepada pengguna yang mengunggah gambar dengan pesan promosi. Pastikan untuk menghapus sumber daya apa pun yang tidak lagi Anda perlukan sehingga Anda tidak dikenakan biaya untuk itu.