Amazon Rekognitionを使ってみる

Amazon Rekognitionを使ってみる

f:id:ueponx:20170903014828p:plain

Amazon Pollyに引き続いて、Amazon RekognitionCLIで使用してみようと思います。詳細は以下のリンクにあります。

製品の詳細 - Amazon Rekognition | AWS

Rekognition では、画像内の物体、シーン、および顔を検出できます。顔を検索および比較し、有名人を認識し、不適切なコンテンツを識別することもできます。

画像認識系のものですね。MicrosoftさんのComputer Vision APIGoogleさんのCloud Vision APIに該当するもののようです。(あってる?)

Computer Vision APIazure.microsoft.com

【Cloud Vision APIcloud.google.com

最近たくさんのAPIが出てきているのであっているのか不安になってきます。 ネットを見ると機能対決に関しても面白いですが、時間とともに学習されていくこともあるので現在の状況はどうなんでしょうか。

qiita.com

AWS CLIの設定に関して

AWS CLIに関しては以前のエントリでインストールしてあると思いますので説明は省略します。

uepon.hatenadiary.com

Amazon Rekognitionを使用するためのIAMの設定する

Polly使用時と同様にAWSマネージメントコンソールから認証情報を設定する必要があります。具体的にはマネージメントコンソールからIAMを設定する必要があります。

IAMの画面からユーザの追加を選択します。今回のユーザー名はRekognition_userとして【プログラムによるアクセス】にチェックを入れ、画面下の【次のステップ:アクセス権限】ボタンをクリックします。

f:id:ueponx:20170903003330j:plain

作成されたRekognition_userの権限を追加する画面です。

f:id:ueponx:20170903003657j:plain

アクセス権限に【既存のポリシーを直接アタッチ】を選択し、フィルターの検索ボックスにRekognitionと入力して検索をします。

f:id:ueponx:20170903003748j:plain

f:id:ueponx:20170903003807j:plain

すると

  • AmazonRekognitionFullAccess
  • AmazonRekognitionReadOnlyAccess

以上の2つが候補に上がります。今回使用するポリシーはAmazonRekognitionFullAccessというポリシーになりますので、にチェックをいれて、【次のステップ:確認】ボタンをクリックします。(注意)実際には、適切な権限を与えるようにしてください。

ボタンをクリックすると、作成内容の確認画面になります。問題なければ【ユーザの作成】ボタンをクリックします。

f:id:ueponx:20170903004242j:plain

成功すると以下のような画面に遷移します。

f:id:ueponx:20170903004344j:plain

ユーザ名、アクセスキーID、シークレットアクセスキーが表示されますが、画面の中ほどにある【.csvのダウンロード】ボタンをクリックすれば、表示された情報が含まれたCSVファイルがダウンロードできるのでそれをダウンロードしておきます。この情報をあとの手順で使用します。

Amazon RekognistionAWS 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さんを使用しました。

f:id:ueponx:20170903010215j:plain

S3のBucketを作成し(Bucket名:20170831-image-sample)、画像ファイル(画像ファイル名:lena.jpg)を保存しておきたいと思います。 以下のようにBucketを作成して

f:id:ueponx:20170903010912j:plain

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が表示されると思うのでチェックを入れて追加をします。

f:id:ueponx:20170903011116j:plain

【アクセス権限の追加】ボタンをクリックします。

f:id:ueponx:20170903011411j:plain

以下のように権限が追加されてば問題はありません。

f:id:ueponx:20170903011535j:plain

では改めて、コピーをします。

PS C:\Users\xxx> aws s3 cp lena.jpg s3://20170831-image-sample/
upload: Desktop\lena.jpg to s3://20170831-image-sample/lena.jpg

無事にコピーできたようです。マネージメントコンソール上からでも以下のようにアクセスできました。

f:id:ueponx:20170903011723j:plain

(※)基本的に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を判定してみます。

【全身の画像(一応モザイクはかけました。)】 f:id:ueponx:20170903013037j:plain

【顔だけの画像】

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)

個人的にはその他のサービスに比べてちょっと物足りないかな…こういうものなんでしょうか。

/* -----codeの行番号----- */