Amazon Rekognition による自動画像トリミング

Amazon Rekognition による自動画像トリミング

デジタル パブリッシャーは、可能な限り迅速に新しいコンテンツを生成して公開するために、メディア ワークフローを合理化および自動化する方法を常に模索しています。

多くの出版社は、記事に使用するストック画像の大規模なライブラリを持っています。 これらの画像は、特に出版社が有名人の画像を持っている場合、さまざまなストーリーで何度も再利用できます。 多くの場合、ジャーナリストは、次の記事で使用する画像から目的の有名人を切り取る必要があります。 これは、自動化する必要がある手動の反復タスクです。 作成者が有名人の画像を使用したい場合がありますが、その画像には XNUMX 人の人物が含まれており、主要な有名人を画像から切り取る必要があります。 また、モバイル、ソーシャル メディア、デジタル ニュースなどのさまざまなプラットフォームに公開するために、有名人の画像を再フォーマットする必要がある場合もあります。 さらに、作成者は、画像の縦横比を変更したり、有名人に鮮明な焦点を合わせたりする必要がある場合があります。

この投稿では、使用方法を示します Amazonの再認識 画像解析を行います。 Amazon Rekognition を使用すると、機械学習 (ML) の専門知識がなくても、この機能をアプリケーションに簡単に追加できます。また、オブジェクト検出、コンテンツ モデレート、顔検出と分析、テキストと有名人の認識などのユース ケースを満たすさまざまな API が付属しています。この例で使用します。

  有名人認識機能 in Amazonの再認識 ML を使用して、画像や動画に含まれる何万人もの著名人を自動的に認識します。 有名人認識は、特定の有名人の存在だけでなく、画像内の位置も検出できます。

ソリューションの概要

この投稿では、写真、有名人の名前、および出力画像の縦横比を渡す方法を示して、特定の有名人の顔を中央に捉えたトリミングされた画像を生成できるようにします。

また、 Amazon Rekognition 有名人検出 API、多くの要素が応答で返されます。 以下は、主要な応答要素の一部です。

  • マッチコンフィデンス – API の動作を制御するために使用できる一致信頼度スコア。 アプリケーションでこのスコアに適切なしきい値を適用して、優先する操作点を選択することをお勧めします。 たとえば、しきい値を 99% に設定すると、誤検知を排除できますが、潜在的な一致を見逃す可能性があります。
  • 名前、ID、および URL – 有名人の名前、一意の Amazon Rekognition ID、および有名人の IMDb や Wikipedia リンクなどの URL のリストで、詳細情報を入手できます。
  • バウンディングボックス – 認識された各有名人の顔の長方形の境界ボックスの位置の座標。
  • 既知の性別 – 認識された各有名人の既知の性同一性。
  • 感情 – 有名人の顔に表れる感情。たとえば、嬉しい、悲しい、怒っているなど。
  • ポーズ – ロール、ピッチ、ヨーの XNUMX つの軸を使用した有名人の顔のポーズ。
  • 笑顔 – 有名人が笑っているかどうか。

Amazon Rekognition からの API レスポンスの一部には、次のコードが含まれています。

{ "CelebrityFaces": [ { "Urls": [ "www.wikidata.org/wiki/Q2536951" ], "Name": "Werner Vogels", "Id": "23iZ1oP", "Face": { "BoundingBox": { "Width": 0.10331031680107117, "Height": 0.20054641366004944, "Left": 0.5003396272659302, "Top": 0.07391933351755142 }, "Confidence": 99.99765014648438,
...

この演習では、次のサンプル画像に示すように、境界ボックス要素を使用して顔の位置を特定する方法を示します。 すべての寸法は画像全体のサイズの比率として表されるため、応答の数値は 0 ~ 1 になります。 たとえば、API 応答のサンプルでは、​​バウンディング ボックスの幅は 0.1 です。これは、顔の幅が画像の全幅の 10% であることを意味します。

Werner Vogels バウンディング ボックス

このバウンディング ボックスを使用すると、ロジックを使用して、作成する新しい画像のエッジ内に顔が残るようにすることができます。 この境界ボックスの周りにパディングを適用して、顔を中央に保つことができます。

次のセクションでは、Werner Vogels が鮮明にフォーカスされた次のトリミングされた画像出力を作成する方法を示します。

私たちは アマゾンセージメーカー このノートブックは、コードを実行して画像を A​​mazon Rekognition に渡し、有名人に焦点を合わせて画像を自動的に変更できる Python 環境を提供します。

Werner Vogels トリミング

このコードは、次の大まかな手順を実行します。

  1. に依頼する recognize_celebrities 指定された画像と有名人の名前を持つ API。
  2. 境界ボックス情報の応答をフィルター処理します。
  3. 背景の一部をキャプチャできるように、バウンディング ボックスにパディングを追加します。

前提条件

このチュートリアルでは、次の前提条件を満たしている必要があります。

サンプル画像をアップロード

サンプルの有名人の画像を S3 バケットにアップロードします。

コードを実行する

コードを実行するには、SageMaker ノートブックを使用しますが、Python、pillow、および Boto3 をインストールした後は、任意の IDE も機能します。 SageMaker ノートブックと AWS IDおよびアクセス管理 必要な権限を持つ (IAM) ロール。 次の手順を完了します。

  1. ノートブックを作成する 名前をつけて automatic-cropping-celebrity.

SageMaker ノートブックの作成時に作成されたデフォルトの実行ポリシーには、Amazon S3 と対話するためのアクセス許可をロールに付与する単純なポリシーがあります。

  1. 更新する Resource S3 バケット名による制約:
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "s3:GetObject", "s3:PutObject", "s3:DeleteObject", "s3:ListBucket" ], "Resource": [ "arn:aws:s3::: # your-s3-bucket-name " ] } ]
}

  1. SageMaker ノートブック IAM ロールに追加する別のポリシーを作成して、 認識有名人 API:
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": "rekognition:RecognizeCelebrities", "Resource": "*" } ]
}

IAM権限

  1. SageMakerコンソールで、 ノートブックインスタンス ナビゲーションペインに表示されます。
  2. 動画内で automatic-cropping-celebrity ノートと選択 Jupyterを開く.
  3. 選択する 新作 および conda_python3 ノートブックのカーネルとして。

Jupyter Notebook

次の手順では、コード ブロックを Jupyter ノートブックにコピーし、選択して実行します。 ラン.

  1. まず、ヘルパー関数とライブラリをインポートします。
import boto3
from PIL import Image

  1. 変数の設定
bucket = '<YOUR_BUCKET_NAME>' file = '<YOUR_FILE_NAME>'
celeb = '<CELEBRITY_NAME>'
aspect_ratio = <ASPECT_RATIO_OF_OUTPUT_IMAGE, e.g. 1 for square>

  1. サービス クライアントを作成する
rek = boto3.client('rekognition')
s3 = boto3.client('s3')

  1. 有名人を認識する機能
def recognize_celebrity(photo): with open(photo, 'rb') as image: response = rek.recognize_celebrities(Image={'Bytes': image.read()}) image=Image.open(photo) file_type=image.format.lower() path, ext=image.filename.rsplit(".", 1) celeb_faces = response['CelebrityFaces'] print(f'Detected {len(celeb_faces)} faces for {photo}') return celeb_faces, image, path, file_type 

  1. 指定された有名人の境界ボックスを取得する関数:
def get_bounding_box(celeb_faces, img_width, img_height, celeb): bbox = None for celebrity in celeb_faces: if celebrity['Name'] == celeb: box = celebrity['Face']['BoundingBox'] left = img_width * box['Left'] top = img_height * box['Top'] width = img_width * box['Width'] height = img_height * box['Height'] print('Left: ' + '{0:.0f}'.format(left)) print('Top: ' + '{0:.0f}'.format(top)) print('Face Width: ' + "{0:.0f}".format(width)) print('Face Height: ' + "{0:.0f}".format(height)) #dimenions of famous face inside the bounding boxes x1=left y1=top x2=left+width y2=top+height bbox = [x1,y1,x2,y2] print(f'Bbox coordinates: {bbox}') if bbox == None: raise ValueError(f"{celeb} not found in results") return bbox

  1. バウンディング ボックスにパディングを追加する関数で、顔の周りの背景をキャプチャします。
def pad_bbox(bbox, pad_width=0.5, pad_height=0.3): x1, y1, x2, y2 = bbox width = x2 - x1 height = y2 - y1 #dimenions of new image with padding x1= max(x1 - (pad_width * width),0) y1= max(y1 - (pad_height * height),0) x2= max(x2 + (pad_width * width),0) y2= max(y2 + (pad_height * height),0) #dimenions of new image with aspect ratio, 1 is square, 1.5 is 6:4, 0.66 is 4:6 x1= max(x1-(max((y2-y1)*max(aspect_ratio,1)-(x2-x1),0)/2),0) y1= max(y1-(max((x2-x1)*1/(min((aspect_ratio),1))-(y2-y1),0)/2),0) x2= max(x2+(max((y2-y1)*max((aspect_ratio),1)-(x2-x1),0)/2),0) y2= max(y2+(max((x2-x1)*1/(min((aspect_ratio),1))-(y2-y1),0)/2),0) print('x1-coordinate after padding: ' + '{0:.0f}'.format(x1)) print('y1-coordinate after padding: ' + '{0:.0f}'.format(y1)) print('x2-coordinate after padding: ' + "{0:.0f}".format(x2)) print('y2-coordinate after padding: ' + "{0:.0f}".format(y2)) return [x1,y1,x2,y2]

  1. イメージをノートブック ストレージと Amazon S3 に保存する機能
def save_image(roi, image, path, file_type): x1, y1, x2, y2 = roi image = image.crop((x1,y1,x2,y2)) image.save(f'{path}-cropped.{file_type}') s3.upload_file(f'{path}-cropped.{file_type}', bucket, f'{path}-cropped.{file_type}') return image

  1. Pythonを使用する main() 関数を使用して、前述の関数を組み合わせて、有名人の新しいトリミングされた画像を保存するワークフローを完了します。
def main(): # Download S3 image to local s3.download_file(bucket, file, './'+file) #Load photo and recognize celebrity celeb_faces, img, file_name, file_type = recognize_celebrity(file) width, height = img.size #Get bounding box bbox = get_bounding_box(celeb_faces, width, height, celeb) #Get padded bounding box padded_bbox = pad_bbox(bbox) #Save result and display result = save_image(padded_bbox, img, file_name, file_type) display(result) if __name__ == "__main__": main()

このコード ブロックを実行すると、Werner Vogels が見つかり、顔が中央にある新しい画像が作成されたことがわかります。

Werner Vogels トリミング

画像はノートブックに保存され、S3 バケットにもアップロードされます。

Jupyter ノートブックの出力

このソリューションを より大きなワークフロー; たとえば、出版社は、有名人の記事を複数のプラットフォームに公開するときに、この機能をエンドポイントとして公開して、画像をその場で再フォーマットおよびサイズ変更することができます。

清掃

今後の請求を回避するには、次のリソースを削除してください。

  1. SageMaker コンソールでノートブックを選択し、 メニュー、選択 Force Stop.
  2. ノートブックが停止した後、 メニュー、選択 削除.
  3. IAM コンソールで、作成した SageMaker 実行ロールを削除します。
  4. Amazon S3 コンソールで、入力イメージと出力ファイルを S3 バケットから削除します。

まとめ

この投稿では、Amazon Rekognition を使用して、メディア ワークフローをサポートするために画像を変更するという手動のタスクを自動化する方法を示しました。 これは、新鮮なコンテンツを迅速に複数のプラットフォームに公開するスピードが重要な出版業界では特に重要です。

メディア アセットの操作の詳細については、次を参照してください。 Media2Cloud 3.0 でメディア インテリジェンスがさらにスマートに


著者について

Amazon Rekognition PlatoBlockchain Data Intelligence による自動画像トリミング。垂直検索。あい。

マークワトキンス メディア アンド エンターテイメント チームのソリューション アーキテクトです。 彼は、AWS を使用してビジネス上の課題を解決する AI/ML ソリューションを作成する顧客を支援しています。 彼は、コンピューター ビジョン、自然言語処理、パーソナライゼーション、エッジでの ML などに関連するいくつかの AI/ML プロジェクトに取り組んできました。 職業生活から離れて、彼は家族と時間を過ごし、XNUMX 人の小さな子供の成長を見守るのが大好きです。

タイムスタンプ:

より多くの AWS機械学習