[新機能] Amazon Rekognitionに追加されたImage ModerationをAWS SDK for Pythonから使ってみました

2017.04.20

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

はじめに

好物はインフラとフロントエンドのかじわらゆたかです。 Amazon Rekognitionに新しくImage Moderation機能が追加されました。

新機能紹介を書こうとしたところ一足先に書かれてしまったので、この記事ではAWS SDK for Pythonから使ってみたいと思います。

機能紹介については、下記を参考にしていただければと思います。

【新機能】Amazon RekognitionにImage Moderationが追加されました!

AWS SDK for PythonでImage Moderationを動かしてみる

新機能だしどうかなとは思ったのですが、PythonのSDKの機能を実装しているboto-coreのdevelopブランチにはすでに実装されてそうです。

api-change:rekognition: Update rekognition client to latest version

botocore/CHANGELOG.rst at develop · boto/botocore

boto3の最新版をいれ試してみたいと思います。 なお、下記の環境構築に関してはpyenv pyenv-virtualenvを用いています。 こちらの導入については下記の記事を参考にいただければと思います。

AWS LambdaがPython3.6に対応したのでpyenvとpyenv-virtualenvで環境構築してみた

$ pyenv install 3.6.0
$ pyenv virtualenv 3.6.0 mahoro
$ pyenv local 3.6.0/envs/mahoro
$ git clone https://github.com/boto/boto3.git
$ cd boto3
$ python ./setup.py install
(中略)
Reading https://pypi.python.org/simple/botocore/
Downloading https://pypi.python.org/packages/60/46/3f1885b210cabecca7b012be844fb96e59e247aea4536343881b12ca0097/botocore-1.5.41.tar.gz#md5=3fbb39319f0c5b5e423673176091ba10
Best match: botocore 1.5.41
Processing botocore-1.5.41.tar.gz
(省略)

botocore の 1.5.41が入っているため動いてくれそうな気配です。 あと検証用の画像として、デモにあった画像をyoga_swimwear_resized.jpgとして同一階層に配置してあります。

rekognition_detect_moderation_labels_sample.py

import boto3
import json
client = boto3.client('rekognition',region_name='us-east-1')
fh = open('./yoga_swimwear_resized.jpg', 'rb')
ba = bytearray(fh.read())
response = client.detect_moderation_labels(Image={
        'Bytes': ba
    })
print(json.dumps(response['ModerationLabels']))

DetectModerationLabelsのAPIのドキュメントを見ると、以下の2つの方法があるようです。

DetectModerationLabels - Amazon Rekognition

  • バイト配列を渡す
  • S3にアップロードしておいて、バケット名とパスを送付する

ちゃちゃっと試したいので、バイト配列で渡す方法で実装してあります。

実行結果

$ python ./rekognition_detect_moderation_labels_sample.py | jq .
[
{
"Confidence": 83.18207550048828,
"Name": "Suggestive",
"ParentName": ""
},
{
"Confidence": 83.18207550048828,
"Name": "Female Swimwear Or Underwear",
"ParentName": "Suggestive"
}
]

Demoで取得していた値と同じ値が取得できているのがわかります。

まとめ

わりとあっさりとSDKから利用することができました。 今回Pythonからの実装ですので、応用することでS3に画像がアップロードされたのを契機に、 LambdaでImage Moderationを用いてアップロードされた画像を評価すると言った使い方等もできそうです。