DeepLens」を使ってみた!TweetAmazonが「世界初の深層学習に対応した開発者向けビデオカメラ」ということで発売したDeepLens。日本では未発売ですが、アメリカ駐在の弊社エンジニアが手に入れて早速遊んでみました!そこで今回は、このDeepLensを使った深層学習の体験レポートをご紹介していきます。Lambdaの作成DeepLensへのデプロイ最後に感想を。DeepLensができること届いたDeepLensこれを使うと深層学習プロジェクトが10分で作成できるとのことです。実のところ10分でできるのは、テンプレートを動かすところまでです。そこで、テンプレート以外を動かすまでを書いていこうと思います。テンプレートはDeepLensをAWSコンソールで登録し、ボタンをポチポチするだけで出来てしまいます。以下動画でAmazonの方が詳しく説明しています。物体検出のテンプレートを動かすとこのような感じで動きます。人、モニター、テーブルが検出されてますね。フレームレートも5fps程度は出てました。画像認識の仕組みそれでは早速、独自の画像を認識させていきたいと思います。テンプレートを動かすだけだと何がどう動いているのかがよく分からないので、まずはDeepLensがどうやって動作しているか知らないといけないですよね。調査したところ、おそらくDeepLensは以下のような構成で動いていると思われます。OSがlinuxでGreengrassがバックグランドで動作しており、AWS上で作成したLambda、modelをGreengrassでDeepLensにデプロイすることで動いています。ログもGreengrassを通じてCloudWatchで確認出来ました。coreをインストールして、カメラなどを取り付ければDeepLensと同様のことが出来そうな気がします。DeepLensで独自の画像を認識させて独自の動作をさせたい場合、この図のmodelとLambdaを独自に作成する必要があります。SageMakerでmodelを作成それでは早速modelを作っていこうと思います。SageMakerを使用して作ります。画像を用意まず認識させる画像を用意します。次にAWS上でSageMakerのコンソールを開きノートブックインスタンスを作成します。今回はexampleのImage-classification-transfer-learning.ipynbhttps://sagemaker-sample.notebook.us-east-1.sagemaker.aws/examples/preview?example_id=%2Fhome%2Fec2-user%2Fsample-notebooks%2Fintroduction_to_Amazon_algorithms%2Fimageclassification_caltech%2FImage-classification-transfer-learning.ipynbをベースに作成します。SageMakerにBuilt-inされているResNetを使用したAlgorithmsになります。転移学習を行うため、画像数が少なくともそれなりに結果が出ます。image-classificationは以下のような構成でSageMakerAPIを使用して動作しています。SageMakerAPIを使用するのがいつもと違います。計算速度は遅くなりますが、トレーニングインスタンスは使用せずにノートブックインスタンスで実行することも可能です。次に、トレーニングデータを用意します。認識したい画像の写真をひたすら撮り、画像を小さくリサイズし、ラベリングしていきます。画像認識はここが一番大変なところだと思います。画像はそれぞれ、トレーニングデータを20枚、バリデーションデータを5枚用意しました。ラベリングした画像のリストを用意、S3にアップロード次にラベリングした画像のリストを用意します。トレーニング用と評価用でtrain.lstとvalidation.lstを用意します。それぞれの中身はこのような感じです。ファイル名」となっています。これらを全てS3にアップロードします。最終的にS3のフォルダ構成は以下のようになります。次に、image-Clasificationのコードを修正します。修正した箇所は、保存先のs3バケットのパスと、AmazonSageMakerAPIのtraining_paramsです。class数やデータ数、ContentTypeをx-recordio=>x-imageなどを変更しました。実行すると、以下のようにtraining_paramsで設定した場所にmodelが作成されます。SageMakerはJupyterNotebook上で実行できるのでエラーも分かりやすくSageMakerAPIさえ押さえておけば使いやすいと思いました。高価なGPUマシンも自前で用意する必要がないため気軽に試せると思いました。Lambdaの作成modelが完成したので次にLambdaを作成します。これがまた大変です、Amazonが提供しているサンプルのソースコードでは動きません。そのままで動かそうとすると次のようなエラーが出ます文字コードでエラーが出る。ライブラリのバージョンがあっていない。必要なライブラリがインポートされていない。カメラ画像を取り込む処理が記載されていない。S3からダウンロードしたmodelの名前が変で読み込めない。エラーが出すぎなのですぐにアップデートされると思うので、今回はこれらのエラーの直し方ではなく、どうやってこれらのエラーを発見したかを記載したいと思います。その方法はCloudWatchログを使用することです。知ってる人からは当然と言われそうですが。AWSのDeepLensのコンソール上からアクセス出来、ここでLambdaの実行時エラーを発見出来ます。これは本当に助かります。エラー時はただカメラが動かないだけなのでこの方法を知らないと正直デバッグ出来ないです。CloudWatchへアクセスすると以下のような画面が表示されます。pythonのruntime系のエラーは/aws/Greengrass/GreengrassSystem/python_runtime、各Lambdaが出力するエラーは/aws/Greengrass/Lambda/エリア/数字/プロジェクト名で確認することができます。他にもネットワーク系のエラーなど色々見れます。こんなエラーを確認できたりします。日付や文字列でソートできます。Lambdaが動作しないときは是非これで確認してみてください。DeepLensへのデプロイ一通りバグを取り終えたら作成したmodelとLambdaをDeeplensにデプロイします。Function」で今まで作成したmodelと、Lambdaを選択しプロジェクトを作成します。device」へ進み、プロジェクトをDeeplensにデプロイします。この画面が表示されたらデプロイ成功です。動きました!見えにくいですがきちんと学習したものが認識されてます。やった!やりました!!><・・・・・・・というのを記載するのに、100回くらいDeepLensへデプロイしました(笑)現時点だとほとんど情報がない上にDeepLensがどんどんバージョンアップされるので、昨日動いてたのに今日動かないなどもありました。信じれるものはログのみです。AWSにかかった費用も以下の通りで、><SageMakerが高いです。ハマり具合が隠せてませんね(笑)SageMakerのノートブックインスタンスは起動している時間で費用がかかるのでコードを実行してないときはきちんと停止することをお勧めします。GPUのインスタンスも費用が高いので学習の連発は注意です。この辺りだけ注意すればDeepLensで色々遊べると思います。AmazonはDeepLensを「深層学習に対応した開発者向けビデオカメラ」として販売していますが、個人的にはGreengrassが強烈だと思いました。CoreをIoT端末にあらかじめインストールしておけば、AWS上で作成したLambdaをOTAで一括アップデートしてローカルで実行出来ますし、ファームウェアのアップデートも出来ます。IoT端末が出力するログも確認できます。IoT端末の状態を全てクラウドで管理することが出来るようになります。料金もGreengrassの1台当たり年間$2程度(エリアによって違う)でそれほど高くなく、Lambdaもクラウド上のLambdaと違い何度実行しても追加料金がかからないため、費用面でも良いと思いました。今後の開発でもGreengrassの利用を検討に入れていきたいと思いました。Algorithmsもたくさんあるので、試してみようと思います。