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

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 とかありますので色々試して見てください。

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

■LINE BOT on AWS

技術

お疲れ様です、ししなみです 掲題の件についての解説になります。 本当は本当にiPad でやりたいところですが、pythonistaで python のソースをzipで固めてS3にUPする方法が現状わかっていないので、涙を飲んでmacでやります。

必要資材

  • AWSのアカウント

あるよね?

  • LINE のアカウント

まずPCからログインできるようにするためにはスマホが必要です、iPadだけではできません
スマホから事前にPCからログインできるようにして
LINE Developer > Messenger API からアカウントを作っておいてください。
https://developers.line.me の Messenger API のところにドキュメントがあるので(動画でもあります) みておくと吉。 なお ビジネスセンターのアカウントと Developerのアカウントが両方が必要です。

python と pipのインストール

$ brew install python
$ python --version
Python 2.7.10
$ which python
/usr/local/bin/python

デフォルトでは mac に pip が入っていないので、brew install python で pipを入れます。
which して /usr/local/bin になってれば成功

また、Lambdaは 2.7で動作するので、python2.7 であることを確認します。

pip がエラーを吐くので修正

http://sysop.hatenablog.com/entry/2017/02/05/231821

上記URLにある通り、pipコマンドが変なエラーを出してとまっちゃうので、.pydistutils.cfg を HOMEディレクトリに置きます。

$ touch ~/.pydistutils.cfg 
$ vi ~/.pydistutils.cfg 

[install]
prefix=

requests とソース の インストール

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

ししなみの GitHubから デフォルトソースを落としてください。 平文で書いているので、180秒ほどで中読んでください。

Lambda function の作成

f:id:sysop:20170207113443p:plain

microservice-http-endpoint-python
を選択(余談ですが、別にどれ選んでも最後はソース上書きするのでなんでもいいです)

f:id:sysop:20170207113539p:plain

APINameは任意で適当にどうぞ Secrity は LINE DeveloperからAPI KEYを入れる方法わかんないので Openで。 もし誰か、API Key入れる方法わかったら教えてください。

ソースのUP

namaは Cloudwatchlog で表示される名前になります。

Description は任意なので好き勝手つけましょう。

Code entry type を Upload a zip にして 先ほど作った zip を選択。

環境変数に ChannelAccessTokenの設定

環境変数に LINE の Channel Access Tokenが必要なので f:id:sysop:20170207162415p:plain

LINE Developer 画面から Channel Access Token をコピーして

Lambda Function のEnvironment variables に ACCESS_TOKENを設定してください。

f:id:sysop:20170207163514p:plain

他に、role 設定を求められますが、デフォルトで
lambda_basic_execution が存在しているはずなのでそれを使います。

それ以外はデフォルトでいいので Save > Create function

次の画面で表示される URLを今度は LINE Developer の WebHookに設定します

f:id:sysop:20170207163640p:plain f:id:sysop:20170207170253p:plain

以上、お疲れ様でした。

動かない時とかデバッグとか

CloudWatchLog に ログが出ますが、表示まで2分くらいかかります、のんびり待ちましょう。
あとストリームなので、AWSの機嫌次第で 複数まとめて出力されたり しなかったりします。

  • LINE Developer 画面で Verify しても 502 Bad Gateway が出る

ソースの 最後で response を print していますが、これを print(respose.text) に直してください
もし、Cloudwatch に表示されるエラーが invalid replay token なら 無視して実機確認しましょう、多分動いてます。

■pip install must supply either home or prefix/exec-prefix -- not both"

技術 python mac pip

pip install must supply either home or prefix/exec-prefix – not both"

DistutilsOptionError: must supply either home or prefix/exec-prefix – not both

お疲れ様です、ししなみです。 Mac で pip install しようとしたら、件名のようなエラーが出た件、解決しましたので報告します。

結論から書くと

vi ~/.pydistutils.cfg

[install]
prefix=

http://stackoverflow.com/questions/24257803/distutilsoptionerror-must-supply-either-home-or-prefix-exec-prefix-not-both/24357384

上のURLにある通り、ファイル[~/.pydistutils.cfg]を作成し 中に prefix を 書くことで 2017年2月現在の MacOSX El Captitan では正常にpipができるようになりました。

もし、これでは動作しなかった場合、上のURLを見れば、他にも対処方法いろいろ書いてあるので、試してみてください。

一応、エラー全文も添付します。

Exception:
Traceback (most recent call last):
  File "/usr/local/lib/python2.7/site-packages/pip/basecommand.py", line 215, in main
    status = self.run(options, args)
  File "/usr/local/lib/python2.7/site-packages/pip/commands/install.py", line 342, in run
    prefix=options.prefix_path,
  File "/usr/local/lib/python2.7/site-packages/pip/req/req_set.py", line 784, in install
    **kwargs
  File "/usr/local/lib/python2.7/site-packages/pip/req/req_install.py", line 851, in install
    self.move_wheel_files(self.source_dir, root=root, prefix=prefix)
  File "/usr/local/lib/python2.7/site-packages/pip/req/req_install.py", line 1064, in move_wheel_files
    isolated=self.isolated,
  File "/usr/local/lib/python2.7/site-packages/pip/wheel.py", line 247, in move_wheel_files
    prefix=prefix,
  File "/usr/local/lib/python2.7/site-packages/pip/locations.py", line 153, in distutils_scheme
    i.finalize_options()
  File "/usr/local/Cellar/python/2.7.13/Frameworks/Python.framework/Versions/2.7/lib/python2.7/distutils/command/install.py", line 264, in finalize_options
    "must supply either home or prefix/exec-prefix -- not both"
DistutilsOptionError: must supply either home or prefix/exec-prefix -- not both

iPadPro+Cloud9・Codeanywhereでの開発環境構築

技術 ipad

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

掲題の件について、以下の理由により Cloud9・Codeanywhere側の対応が終わるまで、ペンディングとなります。

カーソル移動が効かない

2017年1月17日現在

iPad Pro でCloud9 <c9.io> のブラウザIDEを開くと SmartKeyboradの十字キー、つまり ↑↓←→が効かないので、開発難易度が非常に高い というか、この組み合わせは辞めた方が良い。

フォーラムを読むと、どうやら既知の問題のようだ。 community.c9.io

cmdキーとの組み合わせでカーソル移動できるだろうと思ってみたがことごとくだめ。 わざわざSmartKeyboradを外して二本指タップによるカーソル移動を試みたが、それすらできない。

f:id:sysop:20170117212048p:plain

それならばと、類似サービスであるCodeAnywhereも試してみたが

codeanywhere.com

こちらは左右キーは動くが、上下キーが動かない。(ブラウザIDE上) そしてなんと、iPadアプリの方では、今度は上下左右全てのキーが動作しない

appsto.re

このクラウド時代、iPad Proがあれば開発環境なんてクラウドで十分だぜ! と思っていたらあてが外れてしまったわけである。

ちなみに、この記事はiPad proのSafariで書いているが ここではカーソルキーは過不足なく動作している。

追記 Magic keyborad / elecom bluetooth keyborad

www.apple.com

www2.elecom.co.jp

なお、Smart keyborad のせいかと考え、apple magic keyborad(旧版)と elecom の bluetoothキーボードでも試してみたが結果は同じだったことを報告しておく。