
Amazonが「世界初の深層学習に対応した開発者向けビデオカメラ」ということで発売したDeepLens。
まだ日本では未発売ですが、アメリカ駐在の弊社エンジニアが手に入れて早速遊んでみました!
そこで今回は、このDeepLensを使った深層学習の体験レポートをご紹介していきます。
DeepLensができること
届いたDeepLens
これを使うと深層学習プロジェクトが10分で作成できるとのことです。
実のところ10分でできるのは、テンプレートを動かすところまでです。。
そこで、テンプレート以外を動かすまでを書いていこうと思います。
ちなみに、現在用意されているテンプレートは物体検出、Art風画像への変換、顔検出、ホットドッグ検出、犬猫検出、動作認識、顔の向き検出の7つです。
テンプレートはDeepLensをAWSコンソールで登録し、ボタンをポチポチするだけで出来てしまいます。
以下動画でAmazonの方が詳しく説明しています。
例えば、物体検出のテンプレートを動かすとこのような感じで動きます。
人、モニター、テーブルが検出されてますね。フレームレートも5fps程度は出てました。
画像認識の仕組み
それでは早速、独自の画像を認識させていきたいと思います。
テンプレートを動かすだけだと何がどう動いているのかがよく分からないので、まずはDeepLensがどうやって動作しているか知らないといけないですよね。
色々と調査したところ、おそらくDeepLensは以下のような構成で動いていると思われます。
OSがlinuxでGreengrassがバックグランドで動作しており、AWS上で作成したLambda、modelをGreengrassでDeepLensにデプロイすることで動いています。
ログもGreengrassを通じてCloudWatchで確認出来ました。
そのため、例えばラズベリーパイを購入してGreengrass coreをインストールして、カメラなどを取り付ければDeepLensと同様のことが出来そうな気がします。
DeepLensで独自の画像を認識させて独自の動作をさせたい場合、この図のmodelとLambdaを独自に作成する必要があります。
Amazon SageMakerでmodelを作成
それでは早速modelを作っていこうと思います。modelはAmazon SageMakerを使用して作ります。
画像を用意
まず認識させる画像を用意します。
ノートブックインスタンスを作成
次にAWS上でSageMakerのコンソールを開きノートブックインスタンスを作成します。
今回はexampleのImage-classification-transfer-learning.ipynb
https://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を用意します。それぞれの中身はこのような感じです。
「画像のID tab ラベルID tab ファイル名」となっています。これらを全てS3にアップロードします。
最終的にS3のフォルダ構成は以下のようになります。
image-Clasificationのコードを修正
次に、image-Clasificationのコードを修正します。
修正した箇所は、保存先のs3バケットのパスと、AmazonSageMakerAPIのtraining_paramsです。
class数やデータ数、ContentTypeをx-recordio=>x-imageなどを変更しました。
実行すると、以下のようにtraining_paramsで設定した場所にmodelが作成されます。
SageMakerはJupyterNotebook上で実行できるのでエラーも分かりやすくSageMakerAPIさえ押さえておけば使いやすいと思いました。また、高価なGPUマシンも自前で用意する必要がないため気軽に試せると思いました。
AWS 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にデプロイします。
DeepLensのコンソールにいきCreate New Projectへ、
プロジェクト名と、説明文を入れ、「Add model」、「Add Function」で今まで作成したmodelと、Lambdaを選択しプロジェクトを作成します。
プロジェクトを作成したら、作成したプロジェクトを選択し、「Deploy to device」へ進み、プロジェクトをDeeplensにデプロイします。
この画面が表示されたらデプロイ成功です。
最後に、DeepLensにログインしてターミナルを開き
$ mplayer –demuxer lavf –lavfdopts format=mjpeg:probesize=32 /tmp/results.mjpeg
とコマンド入力すると・・・
動きました!
見えにくいですがきちんと学習したものが認識されてます。やった!やりました!!><
・・・・・・・
というのを記載するのに、100回くらいDeepLensへデプロイしました(笑)
現時点だとほとんど情報がない上にDeepLensがどんどんバージョンアップされるので、昨日動いてたのに今日動かないなどもありました。信じれるものはログのみです。
またAWSにかかった費用も以下の通りで、
><
SageMakerが高いです。ハマり具合が隠せてませんね(笑)SageMakerのノートブックインスタンスは起動している時間で費用がかかるのでコードを実行してないときはきちんと停止することをお勧めします。。GPUのインスタンスも費用が高いので学習の連発は注意です。
この辺りだけ注意すればDeepLensで色々遊べると思います。
最後に感想を。
AmazonはDeepLensを「深層学習に対応した開発者向けビデオカメラ」として販売していますが、個人的にはGreengrassが強烈だと思いました。
GreengrassはGreengrass CoreをIoT端末にあらかじめインストールしておけば、AWS上で作成したLambdaをOTAで一括アップデートしてローカルで実行出来ますし、ファームウェアのアップデートも出来ます。IoT端末が出力するログも確認できます。つまりIoT端末の状態を全てクラウドで管理することが出来るようになります。
料金もGreengrassの1台当たり年間$2程度(エリアによって違う)でそれほど高くなく、Lambdaもクラウド上のLambdaと違い何度実行しても追加料金がかからないため、費用面でも良いと思いました。
今後の開発でもGreengrassの利用を検討に入れていきたいと思いました。
SageMakerを使用した深層学習もSSDなど他のBuild-in Algorithmsもたくさんあるので、試してみようと思います。
みなさんもぜひDeepLensが日本で販売されたら購入して色々と遊んでみてください!