辨識映像中的名人 - Amazon Rekognition

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

辨識映像中的名人

若要辨識影像中的名人並取得已辨識之名人的其他資訊,請使用 RecognizeCelebrities 非儲存 API 操作。例如,在社交媒體或新聞與娛樂業中,時間對資訊收集而言至關重要,您可以使用 RecognizeCelebrities 操作來識別映像中多達 100 位名人,並傳回名人的網頁連結 (如果有)。Amazon Rekognition 不會記得在哪張映像中偵測到名人。您的應用程式必須存放此資訊。

如果您尚未存放 RecognizeCelebrities 傳回的名人其他資訊,又不想重新分析影像來取得該資訊,請使用 GetCelebrityInfo。若要呼叫 GetCelebrityInfo,您需要 Amazon Rekognition 指派給每位名人的唯一識別符。對於映像中已辨識的每位名人,都會在 RecognizeCelebrities 回應中傳回此識別符。

如果您要處理大型映像集合以辨識名人,請考慮使用 AWS Batch 在背景批次處理 RecognizeCelebrities 的呼叫。當您將新的映像新增至集合時,可以使用 AWS Lambda 函數辨識名人,方法是在映像上傳至 S3 儲存貯體時,呼叫 RecognizeCelebrities

呼叫 RecognizeCelebrities

您可以使用 AWS Command Line Interface (AWS CLI) 或 AWS 開發套件,以映像位元組陣列 (Base64編碼映像位元組) 或 Amazon S3 物件的方式提供輸入映像。在 AWS CLI 程序中,您會將 .jpg 或 .png 格式的映像上傳至 S3 儲存貯體。在 AWS SDK 程序中,您會使用從本機檔案系統載入的映像。如需輸入映像建議的資訊,請參閱 使用映像

若要執行此程序,您需要含有一或多個名人臉部的映像檔。

辨識映像中的名人
  1. 如果您尚未執行:

    1. 建立或更新具有 AmazonRekognitionFullAccessAmazonS3ReadOnlyAccess 許可的使用者。如需詳細資訊,請參閱 步驟 1:設定 AWS 帳戶並建立使用者

    2. 安裝並配置 AWS CLI 和 AWS SDKs。如需詳細資訊,請參閱 步驟 2:設定 AWS CLI 和開 AWS 發套件

  2. 使用以下範例來呼叫 RecognizeCelebrities 操作。

    Java

    此範例顯示與映像中偵測到的名人有關的資訊。

    photo 的值變更為某個映像檔案的路徑和檔案名稱,而該映像檔案含有一個或多個名人臉部。

    //Copyright 2018 Amazon.com, Inc. or its affiliates. All Rights Reserved. //PDX-License-Identifier: MIT-0 (For details, see https://github.com/awsdocs/amazon-rekognition-developer-guide/blob/master/LICENSE-SAMPLECODE.) package aws.example.rekognition.image; import com.amazonaws.services.rekognition.AmazonRekognition; import com.amazonaws.services.rekognition.AmazonRekognitionClientBuilder; import com.amazonaws.services.rekognition.model.Image; import com.amazonaws.services.rekognition.model.BoundingBox; import com.amazonaws.services.rekognition.model.Celebrity; import com.amazonaws.services.rekognition.model.RecognizeCelebritiesRequest; import com.amazonaws.services.rekognition.model.RecognizeCelebritiesResult; import java.io.File; import java.io.FileInputStream; import java.io.InputStream; import java.nio.ByteBuffer; import com.amazonaws.util.IOUtils; import java.util.List; public class RecognizeCelebrities { public static void main(String[] args) { String photo = "moviestars.jpg"; AmazonRekognition rekognitionClient = AmazonRekognitionClientBuilder.defaultClient(); ByteBuffer imageBytes=null; try (InputStream inputStream = new FileInputStream(new File(photo))) { imageBytes = ByteBuffer.wrap(IOUtils.toByteArray(inputStream)); } catch(Exception e) { System.out.println("Failed to load file " + photo); System.exit(1); } RecognizeCelebritiesRequest request = new RecognizeCelebritiesRequest() .withImage(new Image() .withBytes(imageBytes)); System.out.println("Looking for celebrities in image " + photo + "\n"); RecognizeCelebritiesResult result=rekognitionClient.recognizeCelebrities(request); //Display recognized celebrity information List<Celebrity> celebs=result.getCelebrityFaces(); System.out.println(celebs.size() + " celebrity(s) were recognized.\n"); for (Celebrity celebrity: celebs) { System.out.println("Celebrity recognized: " + celebrity.getName()); System.out.println("Celebrity ID: " + celebrity.getId()); BoundingBox boundingBox=celebrity.getFace().getBoundingBox(); System.out.println("position: " + boundingBox.getLeft().toString() + " " + boundingBox.getTop().toString()); System.out.println("Further information (if available):"); for (String url: celebrity.getUrls()){ System.out.println(url); } System.out.println(); } System.out.println(result.getUnrecognizedFaces().size() + " face(s) were unrecognized."); } }
    Java V2

    此代碼取自AWS文檔 SDK 示例 GitHub 存儲庫。請參閱此處的完整範例。

    //snippet-start:[rekognition.java2.recognize_celebs.import] import software.amazon.awssdk.auth.credentials.ProfileCredentialsProvider; import software.amazon.awssdk.regions.Region; import software.amazon.awssdk.services.rekognition.RekognitionClient; import software.amazon.awssdk.core.SdkBytes; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.InputStream; import java.util.List; import software.amazon.awssdk.services.rekognition.model.RecognizeCelebritiesRequest; import software.amazon.awssdk.services.rekognition.model.RecognizeCelebritiesResponse; import software.amazon.awssdk.services.rekognition.model.RekognitionException; import software.amazon.awssdk.services.rekognition.model.Image; import software.amazon.awssdk.services.rekognition.model.Celebrity; //snippet-end:[rekognition.java2.recognize_celebs.import] /** * Before running this Java V2 code example, set up your development environment, including your credentials. * * For more information, see the following documentation topic: * * https://docs.aws.amazon.com/sdk-for-java/latest/developer-guide/get-started.html */ public class RecognizeCelebrities { public static void main(String[] args) { final String usage = "\n" + "Usage: " + " <sourceImage>\n\n" + "Where:\n" + " sourceImage - The path to the image (for example, C:\\AWS\\pic1.png). \n\n"; if (args.length != 1) { System.out.println(usage); System.exit(1); } String sourceImage = args[0]; Region region = Region.US_EAST_1; RekognitionClient rekClient = RekognitionClient.builder() .region(region) .credentialsProvider(ProfileCredentialsProvider.create("profile-name")) .build(); System.out.println("Locating celebrities in " + sourceImage); recognizeAllCelebrities(rekClient, sourceImage); rekClient.close(); } // snippet-start:[rekognition.java2.recognize_celebs.main] public static void recognizeAllCelebrities(RekognitionClient rekClient, String sourceImage) { try { InputStream sourceStream = new FileInputStream(sourceImage); SdkBytes sourceBytes = SdkBytes.fromInputStream(sourceStream); Image souImage = Image.builder() .bytes(sourceBytes) .build(); RecognizeCelebritiesRequest request = RecognizeCelebritiesRequest.builder() .image(souImage) .build(); RecognizeCelebritiesResponse result = rekClient.recognizeCelebrities(request) ; List<Celebrity> celebs=result.celebrityFaces(); System.out.println(celebs.size() + " celebrity(s) were recognized.\n"); for (Celebrity celebrity: celebs) { System.out.println("Celebrity recognized: " + celebrity.name()); System.out.println("Celebrity ID: " + celebrity.id()); System.out.println("Further information (if available):"); for (String url: celebrity.urls()){ System.out.println(url); } System.out.println(); } System.out.println(result.unrecognizedFaces().size() + " face(s) were unrecognized."); } catch (RekognitionException | FileNotFoundException e) { System.out.println(e.getMessage()); System.exit(1); } } // snippet-end:[rekognition.java2.recognize_celebs.main] }
    AWS CLI

    此 AWS CLI 命令顯示 recognize-celebrities CLI 操作的 JSON 輸出。

    bucketname 變更為 Amazon S3 儲存貯體的名稱,而該儲存貯體含有映像。將 input.jpg 變更為某個映像的檔案名稱,而該映像中含有一個或多個名人臉孔。

    以您開發人員設定檔的名稱取代 profile_name 的值。

    aws rekognition recognize-celebrities \ --image "S3Object={Bucket=bucketname,Name=input.jpg}"

    如果您在 Windows 裝置上存取 CLI,請使用雙引號而非單引號,並以反斜線 (即\) 替代內部雙引號,以解決您可能遇到的任何剖析器錯誤。例如,請參閱下列內容:

    aws rekognition recognize-celebrities --image \ "{\"S3Object\":{\"Bucket\":\"bucket-name\",\"Name\":\"image-name\"}}" --profile profile-name
    Python

    此範例顯示與映像中偵測到的名人有關的資訊。

    photo 的值變更為某個映像檔案的路徑和檔案名稱,而該映像檔案含有一個或多個名人臉部。

    將建立 Rekognition 工作階段的行 profile_name 中的值取代為您的開發人員設定檔的名稱。

    #Copyright 2018 Amazon.com, Inc. or its affiliates. All Rights Reserved. #PDX-License-Identifier: MIT-0 (For details, see https://github.com/awsdocs/amazon-rekognition-developer-guide/blob/master/LICENSE-SAMPLECODE.) import boto3 def recognize_celebrities(photo): session = boto3.Session(profile_name='profile-name') client = session.client('rekognition') with open(photo, 'rb') as image: response = client.recognize_celebrities(Image={'Bytes': image.read()}) print('Detected faces for ' + photo) for celebrity in response['CelebrityFaces']: print('Name: ' + celebrity['Name']) print('Id: ' + celebrity['Id']) print('KnownGender: ' + celebrity['KnownGender']['Type']) print('Smile: ' + str(celebrity['Face']['Smile']['Value'])) print('Position:') print(' Left: ' + '{:.2f}'.format(celebrity['Face']['BoundingBox']['Height'])) print(' Top: ' + '{:.2f}'.format(celebrity['Face']['BoundingBox']['Top'])) print('Info') for url in celebrity['Urls']: print(' ' + url) print() return len(response['CelebrityFaces']) def main(): photo = 'photo-name' celeb_count = recognize_celebrities(photo) print("Celebrities detected: " + str(celeb_count)) if __name__ == "__main__": main()
    Node.Js

    此範例顯示與映像中偵測到的名人有關的資訊。

    photo 的值變更為某個映像檔案的路徑和檔案名稱,而該映像檔案含有一個或多個名人臉孔。將 bucket 的值變更為包含映像檔案的 S3 儲存貯體。將 REGION 的值變更為與您的使用者相關聯的區域名稱。將建立 Rekognition 工作階段的行 profile_name 中的值取代為您的開發人員設定檔的名稱。

    // Import required AWS SDK clients and commands for Node.js import { RecognizeCelebritiesCommand } from "@aws-sdk/client-rekognition"; import { RekognitionClient } from "@aws-sdk/client-rekognition"; // Set the AWS Region. const REGION = "region-name"; //e.g. "us-east-1" const profileName = "profile-name"; // Create SNS service object. const rekogClient = new RekognitionClient({region: REGION, credentials: fromIni({profile: profileName,}), }); const bucket = 'bucket-name' const photo = 'photo-name' // Set params const params = { Image: { S3Object: { Bucket: bucket, Name: photo }, }, } const recognize_celebrity = async() => { try { const response = await rekogClient.send(new RecognizeCelebritiesCommand(params)); console.log(response.Labels) response.CelebrityFaces.forEach(celebrity =>{ console.log(`Name: ${celebrity.Name}`) console.log(`ID: ${celebrity.Id}`) console.log(`KnownGender: ${celebrity.KnownGender.Type}`) console.log(`Smile: ${celebrity.Smile}`) console.log('Position: ') console.log(` Left: ${celebrity.Face.BoundingBox.Height}`) console.log(` Top : ${celebrity.Face.BoundingBox.Top}`) }) return response.length; // For unit tests. } catch (err) { console.log("Error", err); } } recognize_celebrity()
    .NET

    此範例顯示與映像中偵測到的名人有關的資訊。

    photo 的值變更為某個映像檔案的路徑和檔案名稱,而該映像檔案含有一個或多個名人臉部 (.jpg 或 .png 格式)。

    //Copyright 2018 Amazon.com, Inc. or its affiliates. All Rights Reserved. //PDX-License-Identifier: MIT-0 (For details, see https://github.com/awsdocs/amazon-rekognition-developer-guide/blob/master/LICENSE-SAMPLECODE.) using System; using System.IO; using Amazon.Rekognition; using Amazon.Rekognition.Model; public class CelebritiesInImage { public static void Example() { String photo = "moviestars.jpg"; AmazonRekognitionClient rekognitionClient = new AmazonRekognitionClient(); RecognizeCelebritiesRequest recognizeCelebritiesRequest = new RecognizeCelebritiesRequest(); Amazon.Rekognition.Model.Image img = new Amazon.Rekognition.Model.Image(); byte[] data = null; try { using (FileStream fs = new FileStream(photo, FileMode.Open, FileAccess.Read)) { data = new byte[fs.Length]; fs.Read(data, 0, (int)fs.Length); } } catch(Exception) { Console.WriteLine("Failed to load file " + photo); return; } img.Bytes = new MemoryStream(data); recognizeCelebritiesRequest.Image = img; Console.WriteLine("Looking for celebrities in image " + photo + "\n"); RecognizeCelebritiesResponse recognizeCelebritiesResponse = rekognitionClient.RecognizeCelebrities(recognizeCelebritiesRequest); Console.WriteLine(recognizeCelebritiesResponse.CelebrityFaces.Count + " celebrity(s) were recognized.\n"); foreach (Celebrity celebrity in recognizeCelebritiesResponse.CelebrityFaces) { Console.WriteLine("Celebrity recognized: " + celebrity.Name); Console.WriteLine("Celebrity ID: " + celebrity.Id); BoundingBox boundingBox = celebrity.Face.BoundingBox; Console.WriteLine("position: " + boundingBox.Left + " " + boundingBox.Top); Console.WriteLine("Further information (if available):"); foreach (String url in celebrity.Urls) Console.WriteLine(url); } Console.WriteLine(recognizeCelebritiesResponse.UnrecognizedFaces.Count + " face(s) were unrecognized."); } }
  3. 記錄所顯示之其中一個名人 ID 的值。您在 取得名人的相關資訊 中會需要用到。

RecognizeCelebrities 操作請求

RecognizeCelebrities 的輸入是映像。在此範例中,映像以映像位元組傳遞。如需詳細資訊,請參閱 使用映像

{ "Image": { "Bytes": "/AoSiyvFpm....." } }

RecognizeCelebrities 作業回應

以下是 RecognizeCelebrities 的 JSON 輸入和輸出範例。

RecognizeCelebrities 會傳回已辨識之名人的陣列與無法辨識之臉部的陣列。在範例中,請注意下列事項:

  • 已辨識的名人Celebrities 是已辨識之名人的陣列。陣列中的每個名人物件都會包含名人姓名與指向相關內容的 URL 清單,例如名人的 IMDB 或 Wikidata 連結。Amazon Rekognition 會傳回應用程式可用來判斷名人臉在影像上的位置和名人的唯一識別碼的ComparedFace物件。您之後可透過 GetCelebrityInfo API 操作,使用唯一識別符來擷取名人資訊。

  • 無法辨識的臉部UnrecognizedFaces 是未與任何已知名人相符之臉部的陣列。陣列中的每個 ComparedFace 物件都包含週框方塊 (及其他資訊),可讓您用來尋找影像中的臉部。

{ "CelebrityFaces": [{ "Face": { "BoundingBox": { "Height": 0.617123007774353, "Left": 0.15641026198863983, "Top": 0.10864841192960739, "Width": 0.3641025722026825 }, "Confidence": 99.99589538574219, "Emotions": [{ "Confidence": 96.3981749057023, "Type": "Happy" } ], "Landmarks": [{ "Type": "eyeLeft", "X": 0.2837241291999817, "Y": 0.3637104034423828 }, { "Type": "eyeRight", "X": 0.4091649055480957, "Y": 0.37378931045532227 }, { "Type": "nose", "X": 0.35267341136932373, "Y": 0.49657556414604187 }, { "Type": "mouthLeft", "X": 0.2786353826522827, "Y": 0.5455248355865479 }, { "Type": "mouthRight", "X": 0.39566439390182495, "Y": 0.5597742199897766 }], "Pose": { "Pitch": -7.749263763427734, "Roll": 2.004552125930786, "Yaw": 9.012002944946289 }, "Quality": { "Brightness": 32.69192123413086, "Sharpness": 99.9305191040039 }, "Smile": { "Confidence": 95.45394855702342, "Value": True } }, "Id": "3Ir0du6", "KnownGender": { "Type": "Male" }, "MatchConfidence": 98.0, "Name": "Jeff Bezos", "Urls": ["www.imdb.com/name/nm1757263"] }], "OrientationCorrection": "NULL", "UnrecognizedFaces": [{ "BoundingBox": { "Height": 0.5345501899719238, "Left": 0.48461538553237915, "Top": 0.16949152946472168, "Width": 0.3153846263885498 }, "Confidence": 99.92860412597656, "Landmarks": [{ "Type": "eyeLeft", "X": 0.5863404870033264, "Y": 0.36940744519233704 }, { "Type": "eyeRight", "X": 0.6999204754829407, "Y": 0.3769848346710205 }, { "Type": "nose", "X": 0.6349524259567261, "Y": 0.4804527163505554 }, { "Type": "mouthLeft", "X": 0.5872702598571777, "Y": 0.5535582304000854 }, { "Type": "mouthRight", "X": 0.6952020525932312, "Y": 0.5600858926773071 }], "Pose": { "Pitch": -7.386096477508545, "Roll": 2.304218292236328, "Yaw": -6.175624370574951 }, "Quality": { "Brightness": 37.16635513305664, "Sharpness": 99.9305191040039 }, "Smile": { "Confidence": 95.45394855702342, "Value": True } }] }