Amazon Rekognitionを使ってみる
Amazon Polly
に引き続いて、Amazon Rekognition
もCLIで使用してみようと思います。詳細は以下のリンクにあります。
製品の詳細 - Amazon Rekognition | AWS
Rekognition では、画像内の物体、シーン、および顔を検出できます。顔を検索および比較し、有名人を認識し、不適切なコンテンツを識別することもできます。
画像認識系のものですね。MicrosoftさんのComputer Vision API
やGoogleさんのCloud Vision APIに該当するもののようです。(あってる?)
【Computer Vision API】 azure.microsoft.com
【Cloud Vision API】 cloud.google.com
最近たくさんのAPIが出てきているのであっているのか不安になってきます。 ネットを見ると機能対決に関しても面白いですが、時間とともに学習されていくこともあるので現在の状況はどうなんでしょうか。
AWS CLI
の設定に関して
AWS CLI
に関しては以前のエントリでインストールしてあると思いますので説明は省略します。
Amazon Rekognition
を使用するためのIAMの設定する
Polly使用時と同様にAWSマネージメントコンソールから認証情報を設定する必要があります。具体的にはマネージメントコンソールからIAMを設定する必要があります。
IAMの画面からユーザの追加を選択します。今回のユーザー名はRekognition_user
として【プログラムによるアクセス】にチェックを入れ、画面下の【次のステップ:アクセス権限】ボタンをクリックします。
作成されたRekognition_user
の権限を追加する画面です。
アクセス権限に【既存のポリシーを直接アタッチ】を選択し、フィルターの検索ボックスにRekognition
と入力して検索をします。
すると
- AmazonRekognitionFullAccess
- AmazonRekognitionReadOnlyAccess
以上の2つが候補に上がります。今回使用するポリシーはAmazonRekognitionFullAccess
というポリシーになりますので、にチェックをいれて、【次のステップ:確認】ボタンをクリックします。(注意)実際には、適切な権限を与えるようにしてください。
ボタンをクリックすると、作成内容の確認画面になります。問題なければ【ユーザの作成】ボタンをクリックします。
成功すると以下のような画面に遷移します。
ユーザ名、アクセスキーID、シークレットアクセスキーが表示されますが、画面の中ほどにある【.csvのダウンロード】ボタンをクリックすれば、表示された情報が含まれたCSVファイルがダウンロードできるのでそれをダウンロードしておきます。この情報をあとの手順で使用します。
Amazon Rekognistion
をAWS CLI
から使用する
AMIの設定が完了したのでCLIから使用してみたいと思います。初回なのでaws configure
コマンドで設定を行います。
PS C:\Users\xxx> aws configure AWS Access Key ID [None]: <ダウンロードしたCSVに記載> AWS Secret Access Key [None]: <ダウンロードしたCSVに記載> Default region name [None]: us-west-2 Default output format [None]: json
Pollyの設定が残っている可能性もあるので、自分は一度設定をクリアしています。書き換える場合にはNone
となっている部分に旧設定が入力されています。
注意点としてはRekognitionが使えるリージョンは以下の通りです。これ以外のリージョンでは使えないので注意してください。ただし、CLIのオプションで設定すればDefault設定が違っていても問題はないと思います。リージョンが異なる状態で使用すると対応していませんという旨のエラーが発生します。
リージョン名 | 値? |
---|---|
US East (N. Virginia) | us-east-1 |
US West (Oregon) | us-west-2 |
EU (Ireland) | eu-west-1 |
Configureの設定が終わったので早速使用してみたいと思います。
Amazon Rekognition
のドキュメントを読むと
【参照】 docs.aws.amazon.com
AWS CLI を使用して Amazon Rekognition オペレーションを呼び出す場合、呼び出しの一部として画像のバイトを渡すことはサポートされていません。最初に Amazon S3 バケットに画像をアップロードし、次にアップロードした画像を参照するオペレーションを呼び出します。
と書いてあります。CLI経由での仕様ではバイト列の直接送信はできず、S3で画像ファイルにアクセスするしかないようです。 画像はlenaさんを使用しました。
S3のBucketを作成し(Bucket名:20170831-image-sample
)、画像ファイル(画像ファイル名:lena.jpg
)を保存しておきたいと思います。
以下のようにBucketを作成して
CLI経由で画像ファイルを転送してみます。
PS C:\Users\xxx> aws s3 cp C:\Users\xxx\lena.jpg s3://20170831-image-sample/ upload failed: Desktop\lena.jpg to s3://20170831-image-sample/lena.jpg An error occurred (AccessDenied) when calling the PutObject operation: Access Denied
あれ?そうか、IAMの設定にS3の操作権限がありませんでした。
先程設定したIAMにS3FullAccess
のポリシーを追加します。アクセス権限に【既存のポリシーを直接アタッチ】を選択し、S3のフィルタをかけるとAmazonS3FullAccess
が表示されると思うのでチェックを入れて追加をします。
【アクセス権限の追加】ボタンをクリックします。
以下のように権限が追加されてば問題はありません。
では改めて、コピーをします。
PS C:\Users\xxx> aws s3 cp lena.jpg s3://20170831-image-sample/ upload: Desktop\lena.jpg to s3://20170831-image-sample/lena.jpg
無事にコピーできたようです。マネージメントコンソール上からでも以下のようにアクセスできました。
(※)基本的にSDK経由でアクセスする場合にはS3上にあるファイルである必要は必ずしもありません。ただし、AWS CLI
経由の場合にはS3である必要があるとのことでした。そのため権限にもS3FullAccess
が必要になります。
さて、S3に画像ファイルの準備ができたのでRekognitionを使用してみます。
ここで使用しているのはdetect-labels
になります。入力として渡した画像内の物体、概念、シーンを検出してテキスト情報で返します。
PS C:\Users\xxx> aws rekognition detect-labels --image "S3Object={Bucket=20170831-image-sample,Name=lena.jpg}" { "Labels": [ { "Confidence": 99.27481079101562, "Name": "Human" }, { "Confidence": 99.27967071533203, "Name": "People" }, { "Confidence": 99.2796859741211, "Name": "Person" }, { "Confidence": 53.77459716796875, "Name": "Female" }, { "Confidence": 53.77459716796875, "Name": "Girl" }, { "Confidence": 53.77459716796875, "Name": "Woman" }, { "Confidence": 52.33949279785156, "Name": "Hat" }, { "Confidence": 51.73891830444336, "Name": "Cap" }, { "Confidence": 51.73891830444336, "Name": "Sun Hat" }, { "Confidence": 51.37664031982422, "Name": "Face" }, { "Confidence": 51.37664031982422, "Name": "Selfie" } ], "OrientationCorrection": "ROTATE_0" }
Human、Person、Girl、Woman、Hat、Face、Selfieなど、この画像にあった検出ができているようです。Json形式で返されているのであとはこれを編集するだけですね。
detect-labels
以外にもdetect-moderation-labels
という機能もあります。
Moderation(画像の「節度」)を判定する機能です。 具体的には、不適切な画像(例えばヌードや、露骨ないやらしさなど)を判定することができる機能です。
lenaさんのオリジナル画像はアレな画像なので、先程の顔だけの画像(lena.jp
)と全身像の画像(lena2.jpg
)でdetect-moderation-labels
を判定してみます。
【全身の画像(一応モザイクはかけました。)】
【顔だけの画像】
PS C:\Users\xxx> aws rekognition detect-moderation-labels --image "S3Object={Bucket=20170831-image-sample,Name=lena.jpg}" { "ModerationLabels": [] }
【全身の画像】
PS C:\Users\xxx> aws rekognition detect-moderation-labels --image "S3Object={Bucket=20170831-image-sample,Name=lena2.jpg}" { "ModerationLabels": [ { "Confidence": 59.9111328125, "ParentName": "", "Name": "Suggestive" }, { "Confidence": 59.9111328125, "ParentName": "Suggestive", "Name": "Revealing Clothes" } ] }
全身の画像ではRevealing Clothes
と判別されています。正解です。
おわりに
Amazon RekognitionをAWS CLIから操作してみました。CLIではS3に画像データを置く必要があるので今ひとつですが、SDK経由であればそのようなことはないようです。画像の送信にBASE64エンコードに対応した言語であればすんなり行けるそうです。(ほとんどがOK)
個人的にはその他のサービスに比べてちょっと物足りないかな…こういうものなんでしょうか。