使用 Amazon Rekognition (REK) 偵測行銷應用程式的標籤 - Amazon Rekognition

本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。

使用 Amazon Rekognition (REK) 偵測行銷應用程式的標籤

本教學課程會引導您根據上傳至網站的影像,建立可用來傳送電子郵件給人們的 Python 應用程式範例。示例應用程序旨在通過向用戶發送有關旅行交易的個性化電子郵件,如果他們的照片中識別了地標,從而吸引用戶參與社交媒體營銷活動。

該解決方案整合了各種 AWS 服務,包括亞馬 Amazon Rekognition、Amazon S3、DynamoDB 和 Amazon。 CloudWatch SES應用程式使用 Amazon Rekognition 偵測 DynamoDB 資料庫中識別的帳戶上傳之影像中的標籤,然後根據影像中偵測到的標籤傳送行銷電子郵件給帳戶持有人。完整的解決方案架構如下:

  • 將使用者資料儲存在 DynamoDB 資料庫中。

  • 使用者將影像資料和中繼資料 (使用者帳戶號碼) 上傳到 Amazon S3。

  • Lambda 函數會叫用DetectLabels以識別並記錄上傳映像中的標籤、在 DynamoDB 中查詢使用者電子郵件,以及傳送行銷電子郵件給上傳影像的使用者。

  • Lambda 函數的結果會登入以 CloudWatch 供日後檢閱。

以下是本教程中所有步驟的概述:

  1. 建立並填入 DynamoDB 表格。

  2. 使用記錄和通知撰寫 Lambda 函數。

  3. 設定 Lambda 函數和權限。

  4. 使用 Amazon S3 上傳影像和中繼資料。

  5. 輪詢 CloudWatch 記錄檔。

必要條件

在開始本教學課程之前,您將需要:

  • AWS 帳戶和適當的IAM權限。

  • Python 和 Boto3 安裝在您的開發環境中。

  • 對 Lambda、Amazon S3、DynamoDB 支援SES、Amazon 和. CloudWatch

  • 基本熟悉 Lambda 和 Amazon SES。

建立和填入 DynamoDB 料表

若要開始本教學課程,我們將建立 DynamoDB 表來儲存客戶資料,例如:電子郵件地址、年齡、電話號碼和會員資格狀態,並使用 "AccountNumber" 變數做為主索引鍵。我們還將插入一些示例數據到表中。

建立動 DynamoDB 料表

首先,我們將建立 DynamoDB 資料表。以下是如何使用 Python 和 Boto3 進行設置。我們建立一個名為的函數,create_user_table並連接到其中的 DynamoDB 資源。在下面的代碼示例中,將「region_name」的值替換為您的帳戶運行所在的區域名稱,然後運行代碼單元格以創建表格。

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

執行此指令碼已設定名AccountNumber為主索引鍵CustomerDataTable的 DynamoDB 表格。

插入範例資料

現在,我們要插入一些示例數據到表中。此範例資料將協助我們測試應用程式的完整功能。

我們將創建第二個函數,將示例數據添加到CustomerDataTable我們之前創建的相同。下面的代碼創建了三個樣本條目,每個條目包括一個帳戶號碼,電子郵件地址,年齡,電話號碼和會員狀態。在下面的程式碼範例中,將region_name的值取代為您帳戶運作的區域名稱,然後執行程式碼儲存格以建立資料表。如果您想測試應用程序的電子郵件傳遞部分,請將下面第一個客戶項目EmailAddress中的值替換為可以接收電子郵件的電子郵件地址。儲存並執行程式碼。

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

設定並填入 DynamoDB 表後,我們現在可以繼續將此資料擷取整合到 Lambda 函數中。這使我們的應用程序根據即將在即將到來的圖像處理工作流程中識別的帳戶號來檢索用戶詳細信息。

使用記錄和通知建立 Lambda 函數

現在,我們可以創建一個 Lambda 函數。我們希望確保在影像上傳時觸發的 Lambda 函數可以讀取影像資料和帳戶中繼資料,並使用該函數在 DynamoDB 表中執行關聯使用者資料的查閱。這表示我們不僅需要叫用 Amazon Rekognition 的 DetectLabels 函數,還需要一個接受 AccountNumber 並使用該函數從 DynamoDB 擷取關聯的電子郵件地址。此外,我們需要一個函數,使用 Amazon 將電子郵件發送到電子郵件地址SES。最後,我們使用記錄器來記錄有關進程的信息。此資料將由顯示 CloudWatch。

建立 Lambda 函數

以下是 Lambda 函數如何處理這些需求的概述。在下列程式碼範例中,如果您使用的是資料表名稱以外 CustomerDataTable 的項目,請確定已指定正確的 DynamoDB 表。此外,在「send_marketing_email」功能中,您應該將「Source」參數的值替換為您可以訪問的電子郵件地址,該參數將作為發送電子郵件地址。

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

現在我們已經撰寫 Lambda 函數,我們需要設定 Lambda 的許可,並在 AWS 管理主控台中建立 Lambda 函數的執行個體。

設定權限和 Lambda 函數

建立或更新IAM角色

在使用 Lambda 函數處理使用者上傳的任何影像之前,我們必須先處理該函數的權限。Lambda 函數需要一個IAM角色的範圍,該角色的政策允許其與 Amazon S3、DynamoDB、Amazon、Amazon SES Rekognition 和互動。 CloudWatch

若要設定 Lambda 函數的IAM角色:

  1. 開啟 AWS 管理主控台。

  2. 前往 IAM > 角色 > 建立角色。

    選擇「創建角色」。

  3. 選取 Lambda 做為將使用此角色的服務。點擊「下一步」。

  4. 附加下列原則 (請注意,選取這些原則僅用於示範目的,在實際生產設定中,您會想要將權限限制為只有需要的權限。 ):

    • 亞馬遜 3 ReadOnlyAccess

    • AmazonRekognitionReadOnlyAccess

    • AmazonDynamoDBFullAccess

    • A mazonSESFull 訪問

    • AWSLambdaExecute

    • AWSLambdaBasicExecutionRole(用於 CloudWatch 記錄)

    點擊「下一步」。

  5. 命名角色和說明,然後選擇「建立角色」來建立角色。

  6. 為 Lambda 設定適當的許可後,就可以使用 AWS 管理主控台建立 Lambda 函數的執行個體。

    前往AWS管理主控台中的 Lambda 服務。

  7. 點擊「創建功能」。選擇「從頭開始作者」。

  8. 輸入函數名稱並選取 Python 執行階段。在「更改默認執行角色」下,選擇「使用現有角色」,然後選擇您之前創建的IAM角色。

  9. 現在,您必須在 lambda 函數選項卡中創建和更新代碼。轉到名為「lambda_function」的選項卡,並將其代碼替換為正在進行的 Lambda 代碼示例。

    儲存變更並部署變更。

  10. 現在,您必須將 Amazon S3 事件設定為 Lambda 觸發器。

    在 Lambda 函數的配置選項卡/頁面上,轉到觸發器,單擊「添加觸發器」。

  11. 從可用的觸發器清單中選取 Amazon S3。

  12. 若要設定觸發器:選取應從中觸發函數的值區。

    選擇事件類型PUT。或者,如果您只想處理具有特定名稱或類型的檔案,您可以指定字首或字尾。

  13. 通過單擊「添加」激活觸發器並保存配置。

驗證 Amazon SES 電子郵件地址

您必須先驗證寄件者和收件者的電子郵件地址,才能使用 Amazon SES 傳送電子郵件。若要執行此作業:

  1. 轉到 Amazon 控SES制台。導航到「身份管理」,然後導航到「電子郵件地址」。

  2. 點擊「驗證新的電子郵件地址」。輸入您要驗證的電子郵件地址,然後單擊「驗證此電子郵件地址」。您將收到一封帶有驗證鏈接的電子郵件。按一下連結以完成驗證程序。

  3. 驗證兩個帳戶的電子郵件地址、使用正確的許可設定 Lambda 函數,並建立一些範例客戶資料後,您可以將測試映像上傳到您選擇的 Amazon S3 儲存貯體來測試 Lambda 函數。

使用中繼資料將映像上傳到 Amazon S3

現在,我們可以使用 AWS 主控台或先前準備的指令碼,將測試映像上傳到我們選擇的 Amazon S3 儲存貯體。撰寫指令碼,將影像上傳到您先前在 Lambda 函數中指定的 Amazon S3 儲存貯體。在下面的程式碼範例中,指定影像路徑作為「upload_image_to_s3" 的第一個引數,指定值區名稱作為第二個引數,以及上傳影像的使用者帳戶號碼作為最後一個引數。

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

在此函數中,方upload_fileobj法中的ExtraArgs參數用於包括使用者定義的 metadata (account_number) 與圖像一起。稍後可以使用此中繼資料來 AWS 相應地處理影像。

儲存並執行指令碼。這將上傳圖像。

顯示運行前面提到的代碼的結果的屏幕截圖。IDE

上傳圖片幾分鐘後,您應該會在先前與此處指定的帳戶相關聯的電子郵件地址收到一封電子郵件。

來自用戶端的輪詢 CloudWatch 記錄檔

檢查 Lambda 函數的 CloudWatch 日誌,以查看它是否按預期觸發和執行。日誌可以在 CloudWatch > 日誌 > 日誌組 >//Lambda AWS/你的功能名稱下找到。您還可以編寫腳本來訪問和打印日誌。下列程式碼範例會輪詢 Lambda 群組的記錄檔,並列印出最近一小時產生的記錄。儲存並執行程式碼。

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

運行代碼應該打印出日誌,您應該能夠看到用戶通過包含相關旅行信息的電子郵件收到通知。

IDE顯示執行上述程式碼之結果的螢幕擷取畫面,並顯示 Cloudwatch 記錄中的資訊。

您已成功建立一個應用程式,該應用程式能夠偵測上傳到 Amazon S3 儲存貯體的影像中的標籤,然後透過電子郵件向上傳影像的使用者傳送促銷訊息。請務必刪除您不再需要的任何資源,以免向您收取費用。