読者です 読者をやめる 読者になる 読者になる

LINEBOTonAWSLambda+Rekognitionで画像認識

技術

お疲れ様です、ししなみです。

掲題のLINEから画像を送ると、AWSの画像認識サービス Rekognitionで なんの画像か判定して返却する、を実装します。

f:id:sysop:20170208201737p:plain

性能まだわかりませんが、和風なのか洋風なのか、だけでも欲しいところですね。

構成

f:id:sysop:20170207195858p:plain

必要資材

  • AWS アカウント
  • LINEアカウント
  • Python2.7( の pip )

S3に画像をUPする場所を用意

f:id:sysop:20170208194817p:plain

Rekognition が 東京リージョンだと使えないので S3のリージョンをオレゴンで作成します。

ソースをダウンロード

 $ mkdir linebot
 $ cd !*
 $ wget https://raw.githubusercontent.com/sishinami/LINEBOTonAWSandRekognition/master/lambda_function.py
 $ pip install requests -t .
 $ zip -r reko *

ししなみのGitHubに平文で書いたサンプルソースをUPしているので
ダウンロードして、requestと一緒にzipで固めておいてください。 後で LambdaにUPします。

ロールの作成

S3と Rekognitionを使うので、権限を付与したロールを作成しておきます

f:id:sysop:20170208195053p:plain

また、CloudWatchへのアクセスも許可しておかないと、Logが吐き出されないので、同じく追加します。

f:id:sysop:20170208195129p:plain

なお、FullAccessとか本来的には不要です、本番運用を想定するのであれば、権限はもっと絞ってください。

LambdaFunctionの作成

LINEからのコールバックを受け取るためにAPIGatewayとLambdaを連携させます。 よくわからん人は 初期画面の Blueprintから microservice-http を選択しましょう。勝手にAPIGatewayが設定されます。

f:id:sysop:20170208195513p:plain

セキュリティは OPENを選択します。
LINEのWebHook から API Keyを送る方法わかる人いたら教えてください。

ソースのUP

f:id:sysop:20170208195604p:plain name はロググループの名前になるのでわかりやすいものをつけてください。

Code entry type は 先ほど固めた zipファイルを 選択します。

環境変数に設定

f:id:sysop:20170208195925p:plain

S3_BUCKET に先ほど作った バケット名を設定してください。 ACCESS_TOKEN は LINE Developer から取得できる
Channel Access Token です f:id:sysop:20170208200023p:plain

ロール設定

ロールには、先ほど作ったロールを設定します

f:id:sysop:20170208200117p:plain

それ以外はデフォルトでいいので、Save > Create functionをします

LINE に設定

f:id:sysop:20170208201600p:plain 表示された URL を LINE の Webhook にそのままコピーすれば設定は完了です。

f:id:sysop:20170208201636p:plain

API Refarence

ソースについて

元になっているソースは Lmabda blue print から
Rekognition で検索するとでてくるソースです。
もともとあった、lambda_handler を
59: getRekognitaion
に修正 、LINEから取得したデータを S3にUPする
89 def getContent(id,output):
を追加しています。

さて、ここで注意点ですが /tmp/ 以下を利用しています。
Lambda では /tmp 以下が利用できるのですが
ファイル名が他の誰かの functionが作ったファイル名と被る事がありえます。(多分)
また、自分のLambda 内で同一名で /tmp/ 以下にファイルを作っているとたまに失敗します。(なんでですかね?)
本番運用時は、ここが 一つの発火点になるので注意しましょう。

また、/tmp以下はファイルを消していますが
S3はUPするだけして、消していないので、定期的に消すか、使い終わったら消す処理が本番運用時は必要です。

次に getRekognitionの responseは

{u'Labels': [{u'Confidence': 97.0301742553711, u'Name': u'Crest'}, {u'Confidence': 97.0301742553711, u'Name': u'Mountain'}, {u'Confidence': 97.0301742553711, u'Name': u'Mountain Range'}, {u'Confidence': 97.0301742553711, u'Name': u'Outdoors'}, {u'Confidence': 97.0301742553711, u'Name': u'Peak'}, {u'Confidence': 50.661468505859375, u'Name': u'Landscape'}, {u'Confidence': 50.661468505859375, u'Name': u'Nature'}, {u'Confidence': 50.661468505859375, u'Name': u'Scenery'}], 'ResponseMetadata': {'RetryAttempts': 0, 'HTTPStatusCode': 200, 'RequestId': '0bb6a7d4-edcc-11a6-1b78-3d6b98765b13', 'HTTPHeaders': {'date': 'Wed, 08 Feb 2017 00:00:00 GMT', 'x-amzn-requestid': '0bb6a7d4-edcc-11e6-8b78-4d6b0982oa7654’, 'content-length': ‘256’, 'content-type': 'application/x-amz-json-1.1', 'connection': 'keep-alive'}}}

こんな感じのデータです。

name がラベル、その後ろの数字は、確率ですね。
上の API Refalenceを見てもらうとわかりますが
ここで使っている detect_label 以外にも、 detect_face http://docs.aws.amazon.com/rekognition/latest/dg/API_DetectFaces.html とかありますので色々試して見てください。

以上、ししなみでした。 どうぞ、よろしくお願いいたします。