AWS DeepLensを使用したイメージ分類のプロジェクト作成 (Part1)

NetOne USA
藤田 雄介

 AWS DeepLensは、2017年12月のAWS Re:Inventで発表されたDeep Learningに対応した開発者向けビデオカメラデバイスです。サンプルプロジェクトが用意されており、幾つかのプロジェクトは簡単なステップで使用が可能です。
https://aws.amazon.com/jp/DeepLens/

サンプルプロジェクトの場合には、特定の処理やデータに特化しているため、今回はサンプルプロジェクトでは無く、自身でカスタマイズを実施し、AWS DeepLensを使用する手順を紹介します。これを実施するためには調査とセットアップに時間を要します。本手順を参照することで、Deep Learningに経験の無い人が初回実施する際にも、環境構成の時間を短縮し、より多くの時間を次のフェーズの様々な応用に充てることが出来るようになることを期待しています。これにより、より多くの人がDeep Learningを活用することが出来ればと考えています。

※1 本内容の全ては米国で実施しており、AWS DeepLensのデバイスを日本に持ち込んではいません。
※2 Amazon Web Services, “Powered by AWS”ロゴ、[およびかかる資料で使用されるその他のAWS商標]は、米国その他の諸国における、Amazon.com, Inc.またはその関連会社の商標です。

実施すること

 オブジェクト認識のモデルを使用して、AWS DeepLensによって特定人物を認識し、その内容をAWS IoTにメッセージとして送信します。本内容を実現するために、AWS DeepLensを使用しなければいけない制約は無いのですが、AWS DeepLensを使用することで、AWSを活用した様々なサービスとの連携が実現でき、トレーニング時のコンピューティングリソースを容易に確保することができるメリットを受けることが出来ます。

実施ステップ

 全体的なステップとしては以下となります。

Step 1. AWS DeepLensの登録と確認
Step 2. イメージデータの作成
Step 3. Amazon SageMakerによるモデルの作成とトレーニング
Step 4. AWS Lambdaファンクションの作成
Step 5. AWS DeepLensに対するデプロイ

[使用バージョン]
AWS DeepLens 1.3.12
MXNET 1.2.0

今回はPart1とPart2に分けて掲載します。 Part1はStep1~Step3を掲載し、Part2ではStep4~Step5を掲載します。

Step 1. Deepensの登録と確認

 はじめに使用するAWS DeepLensを自身のAWSコンソールに登録する作業を実施します。こちらのステップは以下のガイドに沿って実施します。
https://docs.aws.amazon.com/DeepLens/latest/dg/DeepLens-getting-started.html

全体の流れとTipsのみ記載しておきます。

初めにAWS Management Consoleにサインインを行い、AWS DeepLensのコンソールを開き [Devices]から[Register device]をクリックします。デバイス名の設定、IAMロールの設定、証明書ダウンロードを行います。証明書に関しては、後ほどAWS DeepLensに対してインポートを行います。次に以下の画面が表示されますが、AWS DeepLensの電源を入れることで、ローカルWiFiが起動し、AWS DeepLensの底に表示されているSSIDとパスワードでログインを実施することが可能です。

Tips:初回は問題ありませんが、何らかの理由で既にWiFi設定を行っている場合には、接続を行うべきAMDC-XXXXのSSIDが表示されない場合があります。その場合には、AWS DeepLens背面の小さいResetボタンを押すことで、ローカルWiFiが起動し、WiFi LEDが点滅し、ローカルのSSIDが表示されます。

[complete the setup]をクリックすると、http://DeepLens.configへリダイレクトされます。

1-1

WiFiの設定、先ほどダウンロードした証明書のインポート、ストリーミング証明書のダウンロード、SSHの設定を実施して、[Finish]をクリックします。ストリーミング証明書は後ほどAWS DeepLensの表示を行うためにPCのブラウザ側にインポートするための証明書となります。

Tips:SSHは無効にすることが推奨されています。AWS DeepLensの内部ではUbuntuが起動して処理が行われますが、その内部の様子を確認するためには、ディスプレイ、キーボード、マウスをAWS DeepLensに直接接続して操作を行う必要があります。もし、それらのデバイスが手元に無い場合には、SSHを一時的に有効化しておくと、テスト等で便利になります。

以上でAWS DeepLensの登録は完了となり、以下の表示から[AWS management console]にアクセスを行い、[Devices]から”Device Status” が Onlineになっていることを確認できます。

2

その後、動作確認を実施するためにプロジェクトテンプレートをデプロイすることで確認を実施することができます。

[Projects]-[Create New Project]をクリックします。以下の画面が表示されるため、[Use a project template]を選択し、例として[Object detection]を選択して[Next]をクリックします。

3

[Project Name]の入力欄が表示されますが、既に入力されており変更の必要は特に無いため、[Create]をクリックします。以下のようにテンプレートの説明も表示されます。AWS DeepLensにインプットされた内容が、AWS Lambda関数を介してオブジェクト認識モデルにより処理されるストリームをプロジェクトストリームと呼び、何も処理されない通常のストリームをデバイスストリームと呼びます。

4

作成されたプロジェクトをデバイスにデプロイするために、[Projects]から作成したプロジェクトにチェックを入れ、[Deploy to device]をクリックします。1〜2分後にデプロイが完了し、テンプレートプロジェクトを稼働させることが可能となります。FireFoxを起動し、先ほどダウンロードしたストリーミング証明書をブラウザに追加します。FireFoxの[環境設定]から[プライバシーとセキュリティ]を選択し、[証明書]の項目から[証明書を表示]をクリックし、先ほどの証明書(ファイル名:download.p12)を”あなたの証明書”の中にインポートします。その際に、パスワードが求められますがブランクとします。

Tips:当初MAC上のCromeでストリームを参照しようと試みたが、なぜか指示されているブランクパスワードでのインポートが正常に行われず、FireFoxで実施しました。

その後、AWS Management ConsoleのAWS DeepLensコンソールから、[DeepLens] > [Devices] > [自身のデバイス名] から画面右上の[View output]をクリックすることで、ストリームを参照することができます。

5

プロジェクトストリームは以下のように表示され、人物が”Person”として認識されていることが把握できます。

6

AWS DeepLens内での動作等を把握したい場合、コンソールから確認することが可能です。SSH接続もしくはディスプレイ、キーボード、マウスをAWS DeepLensに接続して確認します。SSHの場合には、IPアドレスは [Devices]から確認した自身に付与されたアドレスを使用します。

ssh aws_cam@X.X.X.X

デプロイした際にモデル及びファンクションがAWS DeepLens内の以下のディレクトリ内に生成されます。Intel Model Optimizerモジュールで変換された後のファイルが.bin、.xmlとして以下のパスに生成されています。後に、自身でモデルやファンクションを作成する場合には、本ディレクトリに.params、.jsonというファイルがダウンロードされ、Model Optimizerにて.bin、 .xmlのファイルが生成されます。

aws_cam@Deepcam:~$ ls -al /opt/awscam/artifacts
-rw-r--r--  1 ggc_user ggc_group 62264808 Jul  6 13:08 mxnet_deploy_ssd_resnet50_300_FP16_FUSED.bin
-rw-r--r--  1 ggc_user ggc_group   127997 Jul  6 13:08 mxnet_deploy_ssd_resnet50_300_FP16_FUSED.xml
-rw-r--r--  1 ggc_user ggc_group      208 Jul  6 13:08 object_detect_info.txt

デプロイが完了したタイミングで以下のファイルが生成されて、ストリーミングとしてAWS DeepLensによって読み込まれます。正常に稼動していない場合には、本ファイルが生成されない場合があります。

aws_cam@Deepcam:~$ ls -al /tmp
prw-r--r--  1 ggc_user ggc_group    0 Jul  6 13:08 results.mjpeg

AWS DeepLensに直接ディスプレイ、キーボード、マウスを接続して、コンソールからストリーム(動画)を確認する場合、以下のコマンドで参照することができます。

aws_cam@Deepcam:~$ mplayer -demuxer lavf /opt/awscam/out/ch1_out.h264     (デバイスストリームを表示する場合)
aws_cam@Deepcam:~$ mplayer -demuxer lavf -lavfdopts format=mjpeg:probesize=32 /tmp/results.mjpeg     (プロジェクトストリームを表示する場合)

デプロイ時及びデプロイ後に想定通りの動作が行われない場合には、Amazon CloudWatchのログを参照することが有益と考えられます。[Devices]から自身のデバイスをクリックし、[Device settings]の項目から参照することが可能です。

7

Step 2. イメージデータの作成

 以上で基本的な設定と動作確認が完了できたので、以降で自身のモデルとAWS Lambdaファンクションを作成して動作させる手順を記載します。今回は2人の異なる人物の認識を含む、256種類のオブジェクト認識を行う環境を作成します。オブジェクトイメージが保存されているファイル (http://data.mxnet.io/mxnet/data/caltech-256/) をベースとして使用します。

ターミナルから以下のコマンドを実行し、イメージファイルをローカルに保存、展開します。

mac:~ user$ wget http://www.vision.caltech.edu/Image_Datasets/Caltech256/256_ObjectCategories.tar
mac:~ user$ tar -xf 256_ObjectCategories.tar

本ファイルはオブジェクト毎にディレクトリが分かれており257のディレクトリが存在します。各ディレクトリ内には、.jpgのイメージファイルが保存されています。

mac:~ user$ ls -al
drwxr-xr-x  259 yusuke  staff   8806 Jun 25 15:52 .
drwxr-xr-x   31 yusuke  staff   1054 Jun 25 15:51 ..
drwxr-xr-x  100 yusuke  staff   3400 Sep 18  2006 001.ak47
drwxr-xr-x   99 yusuke  staff   3366 Sep 18  2006 002.american-flag
drwxr-xr-x  153 yusuke  staff   5202 Sep 18  2006 003.backpack
<一部省略>
drwxr-xr-x  110 yusuke  staff   3740 Sep 18  2006 256.toad
drwxr-xr-x  829 yusuke  staff  28186 Sep 18  2006 257.clutter

mac:~ user$ ls -al ./001.ak47/
total 4624
drwxr-xr-x  100 yusuke  staff    3400 Sep 18  2006 .
drwxr-xr-x  260 yusuke  staff    8840 Jul  6 14:01 ..
-rwxr-xr-x    1 yusuke  staff   24022 Jan 11  2006 001_0001.jpg
-rwxr-xr-x    1 yusuke  staff    9997 Feb 18  2006 001_0002.jpg
-rwxr-xr-x    1 yusuke  staff   12801 Feb 18  2006 001_0003.jpg
-rwxr-xr-x    1 yusuke  staff   18333 Feb 18  2006 001_0004.jpg
-rwxr-xr-x    1 yusuke  staff    7230 Feb 18  2006 001_0005.jpg
<一部省略>
-rwxr-xr-x    1 yusuke  staff    7793 Feb 18  2006 001_0094.jpg
-rwxr-xr-x    1 yusuke  staff    9483 Jan  4  2006 001_0095.jpg
-rwxr-xr-x    1 yusuke  staff   13295 Feb 18  2006 001_0096.jpg
-rwxr-xr-x    1 yusuke  staff   15481 Feb 18  2006 001_0097.jpg
-rwxr-xr-x    1 yusuke  staff   47607 Feb 18  2006 001_0098.jpg

このファイルに対して、2人の異なる人物のイメージを各約80枚用意して、ディレクトリの入れ替えを行います。ディレクトリ番号を 010, 011として作成したイメージに入れ替えます。内部のファイルは他のディレクトリと同様の命名規則に従い保存します。010の場合には、010_0001.jpgからスタートします。

drwxr-xr-x  259 yusuke  staff   8806 Jun 25 15:52 .
drwxr-xr-x   31 yusuke  staff   1054 Jun 25 15:51 ..
drwxr-xr-x  100 yusuke  staff   3400 Sep 18  2006 001.ak47
drwxr-xr-x   99 yusuke  staff   3366 Sep 18  2006 002.american-flag
drwxr-xr-x  153 yusuke  staff   5202 Sep 18  2006 003.backpack
drwxr-xr-x  129 yusuke  staff   4386 Sep 18  2006 004.baseball-bat
drwxr-xr-x  150 yusuke  staff   5100 Sep 18  2006 005.baseball-glove
drwxr-xr-x   92 yusuke  staff   3128 Sep 18  2006 006.basketball-hoop
drwxr-xr-x  108 yusuke  staff   3672 Sep 18  2006 007.bat
drwxr-xr-x  234 yusuke  staff   7956 Sep 18  2006 008.bathtub
drwxr-xr-x  104 yusuke  staff   3536 Sep 18  2006 009.bear
drwxr-xr-x   82 yusuke  staff   2788 Jun 25 14:59 010.YusukeFujita
drwxr-xr-x   82 yusuke  staff   2788 Jun 25 15:05 011.YukiHisata
drwxr-xr-x  218 yusuke  staff   7412 Sep 18  2006 012.binoculars
drwxr-xr-x  100 yusuke  staff   3400 Sep 18  2006 013.birdbath
<以下省略>
drwxr-xr-x  110 yusuke  staff   3740 Sep 18  2006 256.toad
drwxr-xr-x  829 yusuke  staff  28186 Sep 18  2006 257.clutter

MACの場合、コピー時にファイル権限等に@が含まれる場合があるためこれを削除し、.DS等のファイルが存在する場合にも、これらを削除しておきます。

xattr -d com.apple.quarantine ./*

再度、TARにより単一ファイルとします。

tar cvfz ./256_ObjectCategories.tar ./256_ObjectCategories

以上でイメージファイルの作成は完了です。本ファイルをトレーニングのためのイメージとして使用するため、S3へ”256_ObjectCategories.tar” ファイルをアップロードしておきます。Amazon S3はAWS DeepLensから参照するためにバケットの名称に含められるプレフィックスが重要となります。”deeplens-sagemaker-XXX”という命名規則でバケットを生成します。また、後ほどのトレーニングで使用するためのフォルダを[train]、[train_lst]、[validation]、[validation_lst]という名称で作成しておきます。最終的には以下のような構造となります。イメージは1.1GBytesあるため、アップロードにある程度の時間を要します。また、Amazon S3において ”256_ObjectCategories.tar” ファイルに対して、Read ObjectとしてのEveryoneの権限を付与しておきます。

8

Step 3. Amazon SageMakerによるモデルの作成とトレーニング

次にAmazon SageMakerを使用してモデルの作成を実施します。初めにAmazon SageMakerでノートブックインスタンスを作成します。ノートブックインスタンスとして、ml.t2.mediumが選択されます。

9

ノートブックインスタンス作成後に、オープンを行いJupiter Notebookを起動します。様々な手法が存在しますが、今回は [SageMaker Examples]タブから[Introduction to Amazon algorithms]内にある[Image-classification-lst-format.ipynb] をサンプルとして使用します。”Image classification trying with image format demo” という名称でJupiter Notebookが起動します。以下には変更箇所の部分のみ記載します。

Prequisites and Preprocessing の項目においては、PythonでAWSの操作を実施するためのモジュール “boto3”を呼び出し、実行ロールを取得し、トレーニングとモデルデータに使用するS3バケットを定義し、イメージ分類を行う際に使用するAmazon SageMaker Dockerイメージの定義を行います。
変更箇所: [bucket]の箇所に自身のバケット名を入力します。

10

Fine-tuning the Image classification model の項目においては、イメージファイルのダウンロードとim2rec.pyのダウンロードを実施します。今回はMachine Learning フレームワークとしてMXNetを使用しますが、インプットフォーマットとしてRecordIOフォーマットか、Listフォーマットを使用します。im2rec.pyというツールを使用して、JPEGイメージを変換する必要がありますが、今回はListフォーマットを使用します。

変更箇所:Caltech 256 Imageを直接Webからダウンロードする代わりに、Amazon S3に保存したイメージ ”256_ObjectCategories.tar” をwgetでダウンロードするように変更します。

11

Fine-tuning the Image Classification Model の項目に移ります。今回は、Amazon SageMakerのイメージ分類ネットワークのデフォルトである、ResNetを使用しますが、イメージをトレーニングするためのハイパーパラメータを設定する項目となります。

変更箇所:様々なチューニングを試すことができますが、今回は大きな変更を行わず、epochsを20回へ変更しました。それ以外に関しては、サンプル数が異なるため、自身の作成したイメージの数と合わせ、合計サンプル数(num_training_samples)を記載します。

12

変更箇所:Download test imageの項目において、トレーニング後のモデルをテストするためのイメージをダウンロードするURLを指定します。また、”object_categories” 変数に、変更を行ったイメージの名称をラベル名として変更しておきます。今回は、10番目と11番目を変更したため、当該箇所を変更します。

13

上記の変更を保存した後に、Jupiter Notebookの上部にある[Run]をクリックして1つずつ実行していきます。実行の際に、In [ * ]の表示の場合には、実行中を意味しており、In [ 1 ]等の数字が表示された場合には実行が完了しています。実行中の場合には、次の項目を実行しないように注意が必要となります。特に Training の項目に関しては時間を要し、今回の環境で約50-60分程度要します。

最終的には、Amazon S3内に[sagemaker-imageclassification-notebook]というバケットが作成され、その中に、”model.tar.gz”というファイルがモデルとして生成されます。本ステップで、ある程度のProbabilityを得ることができたら、”model.tar.gz”をローカルにダウンロードして展開します。
複数のファイルで構成されていますが、”image-classification-0020.params”、”image-classification-symbol.json”、”model-shapes.json”の3つのファイルを再度S3にアップロードしておきます。今回は、”deepens-sagemaker-image”バケットの直下に”deeplens”フォルダを作成してアップロードを行いました。

※ Training 及び Endpoint作成の際には”ml.p2.xlarge”インスタンスが使用されます。デフォルトで1つの”ml.p2.xlarge”が使用可能であり、今回の処理実行においてリソース上限緩和依頼は不要となります。
(https://docs.aws.amazon.com/ja_jp/general/latest/gr/aws_service_limits.html#limits_SageMaker)

※ Amazon SageMakerで処理が完了した後に、Jupiterで作成された[エンドポイント]の削除及び[ノートブックインスタンス]の停止を行います。エンドポイントがもし削除されていない場合には、比較的大きいインスタンスを稼働させているためコストを要してしまいます。トレーニング等の処理が完了したら確認することをお勧めします。

まとめ

 Part1では、Step1~Step3を掲載しました。AWS DeepLensの初期設定を実施し、今回使用するデータの準備を行った後に、Amazon SageMakerによりモデルの作成及びトレーニングの実施を行いました。Part2では、Step4~Step5をご紹介します。作成したモデルとAWS DeepLensの連携を実施するためのAWS Lambdaファンクションを作成し、AWS DeepLensで自身のデータを元にオブジェクト認識が出来るように構成します。

関連記事

AWS DeepLensを使用したイメージ分類のプロジェクト作成 (Part1)
AWS DeepLensを使用したイメージ分類のプロジェクト作成 (Part2)

執筆者プロフィール

藤田 雄介
ネットワンシステムズ株式会社所属。CCIE #8777、VMware vExpert 2013-2017獲得。2016年からシリコンバレーに活動拠点を移し、インフラ系の知識をベースに機械学習等の技術を活用した取り組みを米国スタートアップ企業と共に実施する、技術系ビジネスデベロップメントとして活動中。

イベント/レポート

pagetop