Category: Artificial Intelligence*


Apache MXNet 用のモデルサーバーのご紹介

今週初めに、AWS はディープラーニングモデルを提供する Apache MXNet の上に構築されるオープンソースのコンポーネントである、Apache MXNet 用のモデルサーバーの提供開始を発表しました。Apache MXNet は、機械学習のための使いやすく簡潔な API を備えた、高速でスケーラブルなトレーニングおよび推論フレームワークです。Apache MXNet 用のモデルサーバーにより、エンジニアは MXNet モデルを簡単、迅速、大規模に提供することができます。

Apache MXNet 用のモデルサーバーとは

Apache MXNet (MMS) 用のモデルサーバーは、推論のディープラーニングモデルを大規模なデプロイするタスクを簡略化するために設計された、オープンソースのコンポーネントです。推論のモデルをデプロイすることは、ささいなタスクではありません。さまざまなモデルアーティファクトの収集、提供スタックのセットアップ、ディープラーニングフレームワークの初期化と設定、エンドポイントの公開、リアルタイムメトリクスの出力、カスタム前処理および後処理コードの実行をはじめ、数多くのエンジニアリングタスクがあります。各タスクが必要以上に複雑にならないこともありますが、モデルのデプロイに関連する全体的な労力は、デプロイプロセスが時間のかかる面倒なものとなる要因として十分です。

MMS により、AWS はディープラーニングモデルのデプロイプロセスを大幅に簡略化する、Apache MXNet 用のオープンソースのエンジニアリングツールセットを提供します。モデルのデプロイに MMS を使用することにより得られる主要な機能を以下に示します。

  • MXNet モデルを提供するために必要なすべてをカプセル化する単一の「モデルアーカイブ」にすべてのモデルアーティファクトをパッケージ化し、エクスポートするためのツール。
  • HTTP 推論エンドポイント、MXNet ベースのエンジンを含むサービススタックの自動セットアップ。このすべては、ホストする特定のモデルに対して自動的に設定されます。
  • スケーラブルなモデルの提供用に NGINX、MXNet、および MMS で設定された、事前設定済みの Docker イメージ。
  • モデルの初期化から、前処理と推論を経てモデルの出力の後処理に至る、推論実行パイプラインの各ステップをカスタマイズする機能。
  • レイテンシー、リソース使用率、エラーを含む、推論サービスとエンドポイントをモニタリングするリアルタイムのオペレーションメトリクス。
  • Java、JavaScript、C# など一般的なスタックのクライアントコードの簡単な統合と自動生成を可能にする、OpenAPI 仕様のサポート。

MMS は PyPi パッケージを通じて、またはモデルサーバーの GitHub レポジトリから直接利用でき、Mac および Linux で実行されます。スケーラブルな本稼働のユースケースでは、MMS GitHub レポジトリで提供される事前設定済み Docker イメージの使用をお勧めします。

次の図は、リファレンスアーキテクチャの例を示しています。

モデル提供のクイックスタート

MMS; の使用開始は簡単です。以下の例で示します。この例では、MMS Model Zoo で一般公開されている事前トレーニング済みの SqueezeNet v1.1 オブジェクト検出モデルを利用します。

使用を開始するには、Python が必要です。これは MMS の唯一の前提条件です。Python がインストールされていない場合は、Python のウェブサイトの手順に従って、Python 2.7 または 3.6 をインストールします。

次に、PyPi を使用して選択したマシンに MMS をインストールします。MMS では Mac および Linux オペレーティングシステムがサポートされています。

$ pip install mxnet-model-server

モデルの提供は、MMS を実行し、モデルアーカイブ URL またはローカルファイルでそれを指すことにより行われます。

$ mxnet-model-server --models squeezenet=https://s3.amazonaws.com/model-server/models/squeezenet_v1.1/squeezenet_v1.1.model

このコマンドを実行すると、MMS プロセスが開始され、モデルアーカイブのダウンロードと解凍、モデルアーティファクトによるサービスの設定が行われた後で、ポート 8080、localhost の /squeezenet/predict エンドポイント経由で受信リクエストのリッスンが開始されます (ホストとポートは設定可能です)。

新しく作成されたサービスをテストするため、HTTP 経由で推論リクエストを送信し、イメージの分類をモデルに要求してみましょう。

$ curl -O https://s3.amazonaws.com/model-server/inputs/kitten.jpg
$ curl http://127.0.0.1:8080/squeezenet/predict -F "input0=@kitten.jpg"

次のようなレスポンスが表示され、モデルは 85% の確立で、イメージ内のオブジェクトを「Egyptian cat」として識別します。

{
  "prediction": [
    [
      {
        "class": "n02124075 Egyptian cat",
        "probability": 0.8515276312828064
      },
… (その他のより低い確率の予測) …
}

モデル提供の理解を深めるため、サーバードキュメントを参照してください。

提供用のモデルのエクスポート

MMS は、MMS モデルアーカイブ形式でパッケージ化されたモデルを提供します。これには、モデルアーティファクトをパッケージ化し、単一のモデルアーカイブファイルをエクスポートするコマンドラインインターフェイス mxnet-model-export が含まれます。エクスポートされたモデルアーカイブは、モデルを提供するために必要なすべてのアーティファクトとメタデータをカプセル化します。これは、提供エンドポイントを初期化するときに MMS によって消費されます。提供のために追加のモデルメタデータまたはリソースは必要ありません。

次の図はエクスポートプロセスを示しています。

図に示すように、モデルアーカイブをパッケージ化するために必要な必須のアーティファクトは、モデルのニューラルネットワークアーキテクチャとパラメータ (レイヤー、演算子、ウェイト) と、サービスの入出力データ型およびテンソル形状の定義です。ただし、現実のユースケースでモデルを使用するには、ニューラルネットワーク以上のものが必要になります。たとえば、多くのビジョンモデルでは、モデルに渡す前に入力イメージの前処理および変換が必要になります。別の例として、通常、分類結果をソートおよび切り捨てるために後処理を必要とする分類モデルがあります。これらの要件に対応し、モデルアーカイブへのモデルの完全なカプセル化を可能にするため、MMS はカスタム処理コードと補助ファイルをアーカイブにパッケージ化して、それらにファイルを実行時に利用可能にできます。この強力なメカニズムにより、完全な処理パイプラインをカプセル化するモデルアーカイブを生成できます。入力の前処理から開始し、推論のカスタマイズを経て、ネットワークの出力でクラスラベル ID を適用した直後に、ネットワーク経由でクライアントに返されます。

モデルアーカイブのエクスポートの詳細については、MMS エクスポートのドキュメントを参照してください。

詳細と貢献

MMS は、使いやすさ、柔軟性、およびスケーラビリティを実現するように設計されています。提供エンドポイントの設定、リアルタイムのメトリクスとログ記録、事前設定されたコンテナイメージなど、このブログ投稿の説明以外にも追加機能を備えています。

MMS の詳細を学習するには、「Single Shot MultiBox Detector (SSD) チュートリアル」から始めることをお勧めします。このチュートリアルでは、SSD モデルのエクスポートと提供について説明しています。その他の例と追加のドキュメントが、レポジトリのドキュメントフォルダで利用できます。

当社が MMS をさらに開発、拡大する際に、質問、リクエスト、貢献を通じたコミュニティへの参加を歓迎いたします。awslabs/mxnet-model-server レポジトリに移動して開始してください。


その他の参考資料

AWS と MXNet の詳細情報をご覧ください。


今回のブログの投稿者について

Hagay Lupesko は AWS Deep Learning のエンジニアリングマネージャーです。開発者やサイエンティストがインテリジェントアプリケーションを構築できるようにするディープラーニングツールの構築を担当しています。読書やハイキング、家族と時間を過ごすことが趣味です。

Ruofei Yu は AWS Deep Learning のソフトウェアエンジニアです。ソフトウェアエンジニアやサイエンティスト向けの革新的なディープラーニングツールの構築を担当しています。友人や家族と時間を過ごすことが趣味です。

Yao Wang は AWS Deep Learning のソフトウェアエンジニアです。ソフトウェアエンジニアやサイエンティスト向けの革新的なディープラーニングツールの構築を担当しています。ハイキング、読書、音楽を楽しむことが趣味です。

Amazon Polly を使用した Haptik のパーソナルアシスタントサービス

今回のブログは Haptik Inc. の共同創立者および CTO の Swapan Rajdev 氏より寄稿いただきました。

日々忙しく過ごしている我々にとって、やるべき事柄は増加する一方で達成しなければならない毎日のタスクをすべて管理することは容易ではありません。ミーティング日程を忘れないようにしたり、飛行機のチケットを購入したり、十分な水分補給そしてジムで体を動かすことなど、すべきことを数えだせばきりがありません。スケジュール管理というのは本当に面倒です。

Haptik はインド初のパーソナルアシスタントアプリです。ユーザーは旅行のプランを立てたり、フライトの確認、タクシーの予約そしてリマインダー設定を行うために、このアプリを使用しています。様々な機能を搭載しているこのアプリですが、中でユーザーが頻繁に使用しているのはリマインダー機能です。このアプリのユーザーは、モーニングコールを設定したり、水分補給を忘れずに行うようにリマインダーをセットアップしたり、異なる時間に電話を掛けたり、特別な日にメッセージを送るなど、リマインダーを必要とする様々な事柄に Haptik を使用しています。リマインダー機能を介して、ユーザーはアプリでリマインダーメッセージに関する通知を受信、そしてリクエストした時間に電話を受け取ることができます。

今回のブログでは、タスクを知らせるため指定時間にユーザーに電話をする場合に、当社がどのように Machine Learning や読み上げ機能 (TTS) を使用してユーザーのリマインダーを設定しているのかご説明します。各ユーザーに合わせて電話を掛けたり、何百万人というユーザーに対しリマインダー機能をスケーリングする場合に、どれほど Amazon Polly が役立っているか解説します。

Haptik のリマインダー機能

パーソナルアシスタントに仕事をさせるため、ユーザーは Haptik アプリにアクセスしてボットにメッセージを送信します。当社のシステムにあるメッセージはすべてメッセージパイプラインを通るようになっています。ここでは次の点を検出します。

  • ユーザーが意図するドメイン (リマインダー、旅行、周辺情報など)
  • ユーザーが完了したいタスク (目的)
  • エンティティ (ユーザーのタスクを完了するために必要な別のデータ)

このパイプラインの終わりに近づいた時点でボットがすべての情報を取得している場合は、タスクを完了します。それ以外の場合は、関連性のある質問を返してすべての情報を収集します。

このベーシックパイプラインの他にも、アルゴリズムがいくつもあります。これはディープラーニングを使用してユーザーの介入なしに、ユーザーのタスクを完了しやすくするため、チャット履歴から学習します。

ユーザーに電話を掛ける理由は?

ユーザーに予定のタスクを知らせるため、アプリで通知を送信し電話でも連絡します。Haptik は一般的に使用されている通知技術を使用してユーザーにリマインダーを送信していますが、次のいくつかの理由により、ユーザーに電話を掛ける方がさらに効果的であると当社は考えています。

まず、今のスマートフォン時代では、どのアプリからも大量の通知が届くようになっているので、重要な通知を見逃してしまうことがあります。そのため、知らない番号または Haptik から電話を受け取ることは、スヌーズボタンを押すだけで終わってしまう通常のアラームに比べて効果的です。

2 つめの理由は、当社はリマインダーを設定したタスクの種類に基づいて、電話を掛ける声とその内容を変更し、より優れたユーザーエクスペリエンスを提供しています。たとえば、モーニングコールには穏やかで落ち着いた音声を使用しています。そして時々、ユーザーが気持ち良く元気な状態で起床できるようにするため、電話の終わりに自己啓発的なメッセージも追加しています。Amazon Polly を使用することで、こうした TTS ユースケースの実装をシンプルで信頼性があるものにすることができます。

(more…)

ONNX 1.0 の提供開始を発表

アマゾン ウェブ サービス (AWS)、Facebook、Microsoft は Open Neural Network Exchange (ONNX) 形式が本稼働環境で使用できるようになったことを発表しました。

ディープラーニングモデルのオープンスタンダード形式である ONNX は、Apache MXNet、Caffe2、Microsoft Cognitive Toolkit、PyTorch といったディープラーニングフレームワーク間での相互運用を可能にします。ONNX 1.0 は、ユーザーがフレームワーク間でディープラーニングモデルを移動できるようにし、本番稼働環境に取り入れやすくします。たとえば、開発者は PyTorch のようなフレームワークを使用して洗練されたコンピュータビジョンモデルを構築し、Microsoft Cognitive Toolkit または Apache MXNet を使用し推論で実行することができます。

ONNX の初回リリースは 9 月だったので、我々はこの成長とコミュニティサポートの勢いやその関与をたのもしく思いながら観察しています。Qualcomm、Huawei、Intel などを含む数々のハードウェアパートナーが各社のハードウェアプラットフォームで ONNX 形式をサポートしていることを発表しており、ユーザーが異なるハードウェアプラットフォームでモデルを実行しやすくしています。新機能のコードやサポートに貢献して下さったコミュニティの皆さんに、この場を借りて感謝申し上げます。

開発者が最新のリサーチにアクセスし最先端モデルを本稼働アプリケーションと統合できるようにするため、今後も ONNX の進化において ONNX パートナーやコミュニティと協力していきます。

関連の発表


今回のブログの投稿者について

Sukwon Kim は AWS Deep Learning のシニアプロダクトマネージャーです。 特にオープンソースの Apache MXNet エンジンに注目し、ディープラーニングエンジンを使いやすくする製品を担当しています。余暇にはハイキングや旅行を楽しんでいます。

AWS、Apache MXNet の ディープラーニングエンジンのマイルストーンである 1.0 のリリースに対し新しいモデル提供機能の追加を含む貢献

AWS は Apache MXNet ディープラーニングエンジンのマイルストーンとなる 1.0 のリリースへの貢献と、MXNet 向けの新しいモデル提供機能の導入を発表しました。これらの新機能により、(1) ディープラーニングモデルのトレーニングとデプロイが簡素化され、(2) 最先端のパフォーマンス強化の実装が可能になり、また (3) ディープラーニングフレームワーク間の相互運用性が簡単になります。

このブログ記事では、本日導入された主な機能それぞれの開始方法を説明します。

シンプルで使用が容易

Apache MXNet 向けモデルサーバー: モデルサーバーは、わずか数行のコードを使用するだけで、ディープラーニングモデルを数秒でパッケージ化、実行、提供します。これにより API エンドポイント経由でインターネットを使用してアクセスすることができます。その後、アプリケーションからこのエンドポイントを呼び出して予測を行うことができます。また、モデルサーバーには 10 個の事前トレーニング済みモデルを備えた model zoo が含まれています。モデルを自分でトレーニングする必要はなく、簡単にデプロイできます。モデルサーバーによって、ウェブ、モバイル、IoT アプリケーション内への AI 機能のデプロイが簡素化されます。

Apache MXNet 向けモデルサーバーの使用を開始するには、以下のコマンドを使用してライブラリをインストールします。

pip install mxnet-model-server

モデルサーバーのライブラリには、SqueezeNet v1.1 オブジェクト分類モデルが含まれています。次のコマンドを使用して SqueezeNet モデルの提供を開始できます。

mxnet-model-server --models squeezenet=https://s3.amazonaws.com/model-server/models/squeezenet_v1.1/squeezenet_v1.1.model 

モデルサーバーの詳細とソースコード、リファレンスサンプル、チュートリアルの表示方法については、こちらを参照してください。

アドバンスドインデックス作成: 1.0 リリースには、アドバンスドインデックス作成機能が含まれています。これにより、Python NumPy ライブラリ内の ndarray 配列オブジェクトクラスの既存の知識を活用して、より直感的な方法でテンソル演算を実行できます。この機能によりより効率的な方法でインデックスにアクセスできるため、開発者の時間と手間を節約できます。以下は、MXNet の新しいアドバンスドインデックス作成機能の例です。

  • 整数のリストをインデックスとしてサポート:
    x = nd.array([[1, 2], [3, 4], [5, 6]], dtype = ‘int32’)
    print(x[[0, 1, 0]])
    [[1, 2] [3, 4]  [1, 0]] # the row index is [0, 1, 0] and print the corresponding row of matrix 
  • 正方行列から対角要素を取得:
    • アドバンスドインデックス作成機能を使用しない場合は 3 行のコードを作成する必要があります:
      a = [[0 1 2 3] [ 4 5 6 7] [ 8 9 10 11] [12 13 14 15]]
      index = mx.nd.array([0, 1, 2, 3], dtype=’int32’)
      index = mx.nd.stack(index, index)
      diag = mx.nd.gather_nd(a, index) 
    • アドバンスドインデックス作成のサポートを使用すると、1 行のコードでジョブを実行できます:
      diag = a[[0, 1, 2, 3], [0, 1, 2, 3]] 

アドバンスドインデックス作成の詳細については、こちらをご覧ください。

高性能

1.0 リリースには、ディープラーニング分野におけるモデルトレーニングおよび推論の最適化に関する最新の研究成果に基づいた機能が実装されています。

グラデーション圧縮: 分散トレーニングでは、各マシンがモデルパラメータを更新し、それにより、単一モデルを集合的に構築するために、頻繁に他のマシンと通信する必要があります。そのためネットワークトラフィックが高くなり、しばしばトレーニング速度とパフォーマンスに悪影響を及ぼします。グラデーション圧縮により、各インスタンスで通信されるモデルの変更を圧縮することで、集束率または精度を失うことなく、最大 5 倍高速にモデルをトレーニングできます。グラデーション圧縮は、しきい値を下回るウェイトの更新の同期を遅延させる方法を使用します。VGGNet や AlexNet などのアーキテクチャは、通信と比較して低コンピューティングを使用しているため、トレーニング速度に目覚ましい改善を見せることができます。

次の例では、しきい値が 2 に設定されている場合に、2 ビットグラデーション圧縮がどのようにグラデーションを圧縮するかを示しています。緑の要素はしきい値に一致しているため、量子化された形式で 2 つのビット「11」と表されます。青色の要素の負の値はしきい値に一致しているため、別の 2 つのビット「10」で表されます。絶対値がしきい値未満の残りの値は、「00」で表されます。グラデーション圧縮では、通信されるグラデーションを、各グラデーション値に 2 ビットのみを使用して圧縮します。実際のグラデーションと展開されたグラデーションの差異は残余として保存され、次回のイテレーションで量子化の前に加算されます。

グラデーション圧縮はランタイム設定パラメータであり、次のように Gluon API を使用して有効にできます。グラデーション圧縮の詳細についてはこちらをご覧ください。

trainer = gluon.Trainer(net.collect_params(), 'sgd', {'learning_rate': .1}, compression_params={'type’:'2bit', 'threshold':0.5})

NVIDIA Collective Communication Library (NCCL): NCCL は、NVIDIA GPU に対してパフォーマンスが最適化されたマルチ GPU およびマルチノードの集合的な通信プリミティブを実装しています。NCCL は、マルチ GPU 間の通信で高い帯域幅を達成するよう最適化された通信ルーチンを提供します。MXNet は、単一ノードマルチ GPU システムでの NCCL をサポートするため、トレーニング速度が約 20% 増加します。これには、ライブラリをインストールし、次のように kvstore のタイプのランタイム設定パラメータを渡す必要があります。

trainer = gluon.Trainer(net.collect_params(), 'sgd', {'learning_rate': .1}, kvstore = ‘nccl’)

NCCL の詳細についてはこちらをご覧ください。

相互運用が容易

MXNet に、Caffe フレームワークで記述されたニューラルネットワークコードを MXNet コードに変換するためのツールが含まれました。MXNet のスケーラビリティとパフォーマンスをより簡単に活用できます。Caffe トランスレータはトレーニング/検証 prototxt およびソルバー prototxt を入力として受け取り、MXNet Python コードを出力として生成します。変換された Python コードは、MXNet シンボルおよびモジュール API を使用したネットワークの構築、LMDB ファイルからのデータの読み取り、トレーニングの実行、および MXNet モジュール API を使用したトレーニング済みモデルの保存を行います。MXNet 向け Caffe トランスレータの使用を開始するには、実効可能な JAR ファイルを Apache maven からダウンロードします。

train_val.prototxt および solver.prototxt を MXNet Python コードに変換するには、次のコマンドを実行します。

java -jar caffe-translator-<version>.jar --training-prototxt <train_val.prototxt_path> \
    --solver <solver.prototxt_path> \ --output-file <output_file_path>

変換されたコードを実行するには、MXNet インターフェイス搭載の Caffe または Caffe プラグイン搭載の MXNet のいずれかを使用する必要があります。変換された Python コードは単純に、他の Python コードと同様に次のように実行できます。

python translated_code.py

Caffe Translator の詳細についてはこちらをご覧ください。

MXNet の開始方法

Apache MXNet の使用を開始するには、以下のコマンドを使用して pip のインストールを実行します。

pip install mxnet==1.0.0

Gluon インターフェイスとディープラーニングの詳細については、この包括的な一連のチュートリアルを参照できます。これらのチュートリアルでは、ディープラーニングの概要から最先端のニュートラルネットワークモデルを実装する方法まで紹介しています。


今回のブログの投稿者について

Sukwon Kim は AWS Deep Learning のシニアプロダクトマネージャーです。 特にオープンソースの Apache MXNet エンジンに注目し、ディープラーニングエンジンを使いやすくする製品を担当しています。余暇にはハイキングや旅行を楽しんでいます。

AWS が Apache MXNet のマイルストーン 1.0 リリースに貢献、モデル提供機能を追加

Dr. Matt Wood による投稿

AWS は MXNet 向けの新しいモデル提供機能の導入を含む、Apache MXNet ディープラーニングエンジンのマイルストーンとなる 1.0 のリリースへの協力について発表しました。MXNet の新機能は、ユーザーにとって次のような利点があります。

1) MXNet は使用が簡単: MXNet 向けモデルサーバーは AWS が導入した新機能であり、わずか数行のコードを使用するだけで、ディープラーニングモデルを数秒でパッケージ化、実行、提供します。これにより API エンドポイント経由でインターネットを使用してアクセスすることができるため、アプリケーションに簡単に統合することができます。また、1.0 リリースには、詳細なインデックス作成機能が含まれています。これにより、ユーザーはより直観的な方法でマトリックス操作を実行できます。

  • Model Serving により予測のための API エンドポイントのセットアップが可能に: わずか数行のコードで予測機能を実行してアプリケーションに統合するための API エンドポイントの設定タスクを要約し、開発者の時間と労力を減らします。Docker コンテナベースのデプロイモデルを通じて、Python ベースのディープラーニングフレームワークと本稼働システム間の壁を克服します。
  • MXNet 用の配列オペレーションの用の高度なインデックス作成: 開発者が MXNet で強力な配列オペレーションを利用できるよう、より直感的になりました。NumPy/SciPy 配列の既存の知識を利用して、高度なインデックス作成機能を使用できます。たとえば、MXNet NDArray および Numpy ndarray をインデックスとしてサポートします (例: a[mx.nd.array([1,2], dtype = ‘int32’])。

2) MXNet は高速: 1.0 リリースには、トレーニングと推論のパフォーマンスを最適化する、最新鋭の機能が実装されています。グラデーション圧縮により、ユーザーは集束率または正確さを失うことなく、コンピューティングノード間の通信の帯域幅を減らすことで、最大 5 倍高速にモデルをトレーニングすることができます。Alexa 音声のような音声認識アコースティックモデルの場合、この機能により、トレーニング中に最大 3 桁までネットワーク帯域幅を減らすことができます。NVIDIA Collective Communication Library (NCCL) のサポートにより、ユーザーはマルチ GPU システムでモデルを 20% 高速にトレーニングできます。

  • グラデーション圧縮によりネットワーク帯域幅を最適化: 分散トレーニングでは、各マシンが重量ベクトルを更新し、それにより、単一モデルを集合的に構築して、高いネットワークトラフィックとなるよう、各マシンは頻繁に他のマシンと通信する必要があります。グラデーション圧縮アルゴリズムにより、ユーザーは各インスタンスから伝えられたモデル変更を圧縮することで、最大 5 倍高速にモデルをトレーニングすることができます。
  • NCCL を利用してトレーニングのパフォーマンスを最適化: NCCL は、NVIDIA GPU に対してパフォーマンスが最適化されたマルチ GPU およびマルチノードの集合的な通信プリミティブを実装しています。NCCL は、マルチ GPU 間の相互通信で高い帯域幅を達成するよう最適化された通信ルーチンを提供します。MXNet は NCCL のサポートにより、マルチ GPU システムよりも約 20% 高速にモデルをトレーニングします。

3) MXNet が簡単な相互運用性を提供: MXNet は、Caffe フレームワークで書かれたニューラルネットワークコードを MXNet コードに変換し、ユーザーが MXNet のスケーラビリティおよびパフォーマンスを簡単に活用できるようにします。

  • Caffe モデルを MXNet に移行: Caffe コードを MXNet コードに変換する新しいソースコード変換を使用して、Caffe コードを簡単に MXNet に移行できるようになりました。

MXNet は開発者や研究者が言語の翻訳から自動運転車や行動バイオメトリックセキュリティまで、すべてにおいて前進を可能にしてきました。MXNet で開発およびトレーニングされたニューラルネットワークモデルを利用した本番稼働用の人工知能アプリケーションを構築する幅広いユーザーベースが生まれるのを楽しみにしています。たとえば、自動運転の会社である TuSimple は最近、アリゾナ州ユマからカリフォルニア州サンディエゴまで 200 マイルの距離の移動を、MXNet を使用して無人運転トラックで試験しました。このリリースには、Gluon プログラミングインターフェイスの完全な機能とパフォーマンスに最適化したバージョンも含まれています。この使いやすさと幅広い一連のチュートリアルにより、ディープラーニングを初めて学習する開発者の間でもかなり採用が進んでいます。このインターフェイスの柔軟性が、研究コミュニティ (特に自然言語処理分野) 内で関心を高めています。

MXNet の使用開始
MXNet の開始は簡単です。Gluon インターフェイスとディープラーニングの詳細については、この包括的な一連のチュートリアルを参照できます。これらのチュートリアルでは、ディープラーニングの概要から最先端のニュートラルネットワークモデルを実装する方法まで紹介しています。機械学習フレームワークに携わっている場合は、GitHub でインターフェイスの仕様をご確認ください。

Apache MXNet 向けモデルサーバーの使用を開始するには、以下のコマンドを使用してライブラリをインストールします。

$ pip install mxnet-model-server

モデルサーバーのライブラリには、SqueezeNet 1.1 オブジェクト分類モデルを含む Model Zoo と 10 個のトレーニング済みディープラーニングモデルが含まれています。次のコマンドを使用するだけで SqueezeNet モデルの提供を開始できます。

$ mxnet-model-server \
  --models squeezenet=https://s3.amazonaws.com/model-server/models/squeezenet_v1.1/squeezenet_v1.1.model \
  --service dms/model_service/mxnet_vision_service.py

モデルサーバーの詳細とソースコード、リファレンスサンプル、チュートリアルの表示方法については、https://github.com/awslabs/mxnet-model-server/ を参照してください。

-Dr. Matt Wood

AWS DeepLens の拡張機能: 独自のプロジェクトの構築

AWS DeepLens では、ディープラーニング、Internet of Things (IoT) などの新しいテクノロジーを知ることができるだけでなく、現実的な問題を解決する革新的なシステムを構築することができます。このデバイスおよびサービスには、定義済みのプロジェクトセットが付属しており、プロジェクトをすばやく実行することができます。また、開発者が初心者か経験豊富かに関係なく、同様にエキサイティングなプロジェクトを新しく構築 (および共有) できるようにするオープンプラットフォームとして設計されています。

このブログ投稿では、独自のプロジェクトを構築するプロセスについて説明します。以下に一部のステップを紹介します。

  • ディープラーニングモデルのトレーニング (Amazon SageMaker を使用)
  • AWS DeepLens エッジデバイス上で実行できるように、トレーニング済みのモデルを最適化する
  • モデルをロードし、ビデオストリーム上で推論を実行できるように、AWS Lambda 関数を開発する
  • AWS Greengrass を使用して AWS Lambda 関数を AWS DeepLens にデプロイする
  • コマンドを送信し、推論を出力できるように、エッジ AWS Lambda 関数をクラウドに接続する
  • 完成

ディープラーニングモデルのトレーニング (Amazon SageMaker を使用)

Amazon SageMaker は、データサイエンスで手間のかかる作業を排除する新しいサービスです。このサービスには、推奨のエンジンから Alexa や Amazon Go、Amazon Robotics などの機械学習に基づくシステムまで、Amazon.com のビジネスのさまざまな側面で、Amazon データサイエンティストの長年の経験が反映されています。

優れた機械学習モデルを設計、構築する全体のプロセスは非常に興味深いですが、今回のブログ投稿では割愛します。実際、DeepLens デバイスにディープラーニングモデルをデプロイして再接続し、その出力を活用するフローで生産性を高めれば、現実の新しい問題を解決するために新たなモデルの構築にますます多くの時間を費やすことになります。

機械学習の初心者が、データサイエンティストのエキスパートと同じ開始ポイントに立つには、Amazon SageMaker でノートブックインスタンスを作成する際に利用できる Jupyter ノートブック内のノートブックセットから始めることをお勧めします。たとえば、以下は、転移学習のプロセスと、推論エンドポイントホスティング向けに微調整されたディープラーニングモデルを構築、トレーニング、デプロイするために Amazon SageMaker SDK を使用するフローの両方を示すノートブックです。

このブログ投稿では、プロセスの次のステップに進められるように、Amazon S3 におけるモデルアーティファクトの保存に焦点を当てています。

以下は、SageMaker のトレーニングジョブを使用してトレーニングされたモデルの例です。このトレーニングで使用した出力ディレクトリやハイパーパラメータなどがあります。

ハイパーパラメータは、モデルの使用方法を理解するのに役立ちます。たとえば、カラーイメージ (3=RGB チャネル) を処理するには、image_shape (3,224,224) に基づき、224*224 ピクセルにリサイズする必要があります。また、今後のトレーニングジョブで、トレーニングデータ (epochs>2) を超える実行、learning_rate の変更、num_training_samples 数の増加など、詳細にモデルを設定するのにも役立ちます。

AWS DeepLens エッジデバイス上で実行できるように、トレーニング済みのモデルを最適化する

実際のディープラーニングシステムにおけるこのステップの重要な例として、モデルのハードウェアを DeepLens デバイスに最適化するステップがあります。前のステップでは、モデルのトレーニング用にほぼ無制限のクラウドリソースがありましたが、モデルを推論に使用する場合は、スケーリングなど、新しいビジネス制約に直面します。クラウドでは、GPU ベースのインスタンスの大規模なクラスターを容易に取得できるため、数時間のトレーニングで複数のことを実行できます。しかし、モデルをエッジデバイスにデプロイする場合は、チップセット (CPU/GPU)、メモリ、ネットワーク帯域幅、安定性などの点から、デバイスの仕様を検討する必要があります。DeepLens デバイスは、高フレームレートで高解像度のビデオストリームのモデルを複数実行する上で十分強力ですが、ほとんどの場合、それほど高いスペックは必要ないでしょう。そこで、インテルは、MXNet モデルのアーティファクトを取り、DeepLens デバイスに搭載されているインテルのチップボードに最適化するライブラリを開発しました。このライブラリは、前のステップでモデルをインポートした後、DeepLens コンソールを使用してモデルをデプロイするときに自動的に実行されます。

モデルのトレーニングが終了したら、DeepLens にインポートする際にトレーニングジョブ ID を指定することができます。(モデルをインポートするには、Sagemaker と DeepLens のいずれも、同じ AWS リージョンに存在する必要があります。)

モデルをロードし、ビデオストリーム上で推論を実行できるように、AWS Lambda 関数を開発する

IoT デバイス (ここでは AWS DeepLens カメラ) 上で動作している AWS Greengrass コアでは、デプロイされている AWS Lambda Python 関数を実行することができます。次回以降の投稿では、Greengrass Group、Core、および登録デバイスを作成するステップについて説明します。「入門ガイド」については、Greengrass ドキュメントをご覧ください。AWS DeepLens は、これらのステップのほとんどで自動化されています。ここでは、Lambda 関数を開発して、登録、構成されたデバイスにデプロイする方法について説明します。

それぞれの Lambda 関数において、以下のステップを行います。

  • モデルのロード
  • フレームのキャプチャ
  • フレームでのモデル推論の実行
  • 推論結果の解析
  • MQTT トピックに結果を発行する

これらのステップの例をいくつか見ていきましょう。

モデルのロード

AWS DeepLens デバイスは、ヘルパーライブラリ awscam に事前にインストールされています。このライブラリを使用すると、Lambda 関数のロジックに統一しやすくなります。このロジックでは、モデルのロードなど、最も一般的なステップで行われます。次の例で示すように、モデル XML ファイルへのパスとモデルのコンテキスト (GPU/CPU) を指定する必要があります。モデルの読み込みとバインディングはライブラリで自動的に行われます。

import awscam
modelPath = "/opt/awscam/artifacts/mxnet_deploy_CaltechTransfer_224_FP16_FUSED.xml"
# Load model to GPU (use {"GPU": 0} for CPU)
mcfg = {"GPU": 1}
model = awscam.Model(modelPath, mcfg)

このステップは、内部の推論関数 (例: 以下の greengrass_infer_image_run) 外で定義する必要があります。このステップは、モデルがディスクからメモリおよび GPU にロードされるまでに数秒かかる場合があるため、1 回だけ実行する必要があります。

フレームのキャプチャ

OpenCV (cv2) は、ディープラーニングモデルの (リサイズ) 前と (ボックスとラベルの描画) 後の画像を操作するために使用されます。トレーニングの入力仕様はモデルごとに異なるため、最初のステップとして、キャプチャされたフレームを適切なサイズにリサイズします。

import cv2
input_width = 224
input_height = 224
ret, frame = awscam.getLastFrame()
# Resize frame to fit model input requirement
frameResize = cv2.resize(frame, (input_width, input_height))

フレームでのモデル推論の実行

ヘルパーライブラリ awscam は、predict コマンドがシンプルな doInference 関数に含まれているため、この Lambda 関数の部分を簡潔にすることができます。

# リサイズされたフレームでモデルの推論を実行する
inferOutput = model.doInference(frameResize)

推論結果の解析

ヘルパーライブラリは、従来のいくつかのコンピュータビジョン問題に対応しています。たとえば、ラベルでオブジェクトを分類する「分類」、オブジェクトのラベルと境界ボックスを提供する、オブジェクト検出およびローカリゼーションの「ssd」 (「single-shot-multibox-detector」)、イメージをリージョンに分割し、ピクセルレベルの出力を提供する「セグメンテーション」 (例: スタイル転送) などがあります。次の例は、一般的な「ssd」タイプのモデルを対象としています。

modelType = "ssd"
parsed_results = model.parseResult(modelType, inferOutput)['ssd']

MQTT トピックに結果を発行する

最後に、モデルの出力を送信します。このロジックは、モデルのタイプと、解決を試みる問題のタイプによって異なります。シンプルな出力としては、以下の例で示す Dog/Cat または Hotdog/Not Hotdog などの画像のラベルがあります。他の出力タイプには、顔検出モデルから顔認識に送信される画像内の顔の切り抜きや、ビデオストリーム内のオブジェクトの境界ボックス、画像/ビデオのニューラルスタイル転送などがあります。最もかんたんにデバイスからの出力を送信するには、次のコードに示すように、Greengrass クライアントを使用して MQTT を経由します。このチャネルは、テキストメッセージだけでなく、テキストエンコード後の画像 (境界ボックスやラベルなどを含む) にも対応しています。

# Greengrass コアの sdk クライアントを作成する
client = greengrasssdk.client('iot-data')
iotTopic = 'iot-data'
for obj in parsed_results:
    if obj['prob'] > max_threshold:
        label = '{{"label":"{}", "prob":{:.2f}%'.format(outMap[obj['label']], obj['prob']*100 )
        client.publish(topic=iotTopic, payload = label)

AWS Greengrass を使用して AWS Lambda 関数を DeepLens にデプロイする

Greengrass では、主な 2 つのモード (固定およびオンデマンド) で Lambda 関数を実行することができます。AWS DeepLens モデルでは、Lambda 関数の起動時に固定オプションを使用することが推奨されています。ディープラーニングモデルが大きい場合 (数百 MB から数 GB) は時間がかかります。推論がトリガーされる頻度や時間は以下のモードで制御することができます。

  • 高フレームレート – フレーム間に「スリープ」がない無限ループで関数を実行します。フレームレートは、モデル推論の速度、前処理および後処理に応じて、10~30 FPS に設定することができます。
  • 特定フレームレート – フレーム間に定義済みの「スリープ」を含む無限ループで関数を実行します。顔検出などのタスクでは、1 秒あたり 1~5 フレームレートで実行することができ、リージョン内のすべての顔を検出するのに必要な機能が搭載されています。関数の推論のレートを制御するには、Timer を使用します。
    インポートタイマーのスレッディング
    def greengrass_infer_image_run():
        # 画像の読み取り
        # 前処理
        # 画像のモデル推論を実行する
        # 結果を解析する
        # 結果を出力する
        
        # この関数が 0.5 秒で再実行されるように非同期でスケジュールする
        Timer(0.5, greengrass_infer_image_run).start()
  • オンデマンド – この関数は、手動または別のイベントからトリガーする場合に実行します。固定の関数を実行している場合でも、イベントハンドラーを使用して実行できます。この例では、各イベントの推論をトリガーする方法を表していますが、イベントのパラメータを解析して、イベントハンドラーから関数を制御する (モデルまたはモデルモードの切替えなど) こともできます。
    インポートタイマーのスレッディング
    def greengrass_infer_image_run():
        # 画像の読み取り
        # 前処理
        # 画像のモデル推論を実行する
        # 結果を解析する
        # 結果を出力する
        
    def lambda_handler(event, context):
        client.publish(topic=iotTopic, payload="About to call image inference function")
        greengrass_infer_image_run()
    return

Lambda 関数の Greengrass スケルトンをかんたんに取得するには、AWS Lambda コンソールで Greengrass のいずれかの設計図を使用します。パッケージにすでに Greengrass クライアントライブラリが含まれているため、できれば greengrassHelloWorld を使用します。この設計図を使用して Lambda 関数を作成し、この関数の Python コードをお客様のコードに置き換え、新しく作成した Lambda 関数を発行します。これで、プロジェクトに追加し、AWS DeepLens コンソールからデバイスにデプロイできるようになりました。

コマンドを送信し、推論出力を受信できるように、ローカル Lambda 関数をクラウドに接続する

以前に説明したように、Lambda 関数では、MQTT プロトコルを介して IoT トピックスに書き出すことができます。組み込みプロジェクトで使用されているデフォルトの出力トピックは以下のとおりです。

iotTopic = '$aws/things/{}/infer'.format(os.environ['AWS_IOT_THING_NAME'])

これは AWS DeepLens コンソールまたは AWS IoT コンソールをご覧ください。同じ形式を使用するか、前の例の iotTopic = ‘iot-data’ など、Lambda 関数のトピック名を使用することもできます。

lambda_handler を使用して、オンデマンドモードで Lambda 関数をトリガーできることも説明しました。これを行うには、IoT コンソールを使用して、IoT クラウドと Lambda 関数の間にサブスクリプションをセットアップする必要があります。たとえば、Lambda 関数のインバウンドサブスクリプションとアウトバウンドサブスクリプション (ImageInferenceTest バージョン 19) は以下のとおりです。

この例では、トピック「trigger-image-inference」をリッスンすると、エッジ Lambda 関数は、イベントがこのトピックに発行される度にトリガーされます。もう一方のサブスクリプションでは、エッジ Lambda から出力メッセージを表示し、クラウド側で確認することができます。たとえば、AWS IoT ルールエンジンを使用して、特定のメッセージ (例: 「顔が検出されました」) をフィルタリングし、他のクラウドサイド の Lambda 関数や、Amazon Elasticsearch Service、Amazon Kinesis などに送信することができます。また、DeepLens デバイスでもサブスクリプションが有効になるように必ずサブスクリプションをデプロイ (「Actions」の下) してください。

また、Lambda 関数のログや、Greengrass の主要情報 (またはデバッグ) のログを表示できるように、デバイスの Greengrass グループの Amazon CloudWatch ログを有効にすることをお勧めします。詳細については、「Greengrass グループコンソールページ」の「設定」セクションで確認できます。

まとめ

今回は、AWS DeepLens で使用できるオープンプロジェクト環境を拡張する方法について説明しました。次回以降は、同様の構造を使用してブロックを構築しながら、このフロー上で構築されている例を紹介していきます。以下の図は、既存のプロジェクトを拡張するか (モデルの改善または Lambda 関数の変更)、一から新しいプロジェクトを作成するステップを示します。


その他の参考資料

AWS DeepLens を拡張して AWS Lambda で SMS 通知を送信する方法について説明します。


今回のブログの投稿者について

Guy Ernest 氏は Amazon AI のプリンシパルソリューションアーキテクトです。マインドシェア構築の戦略に携わり、Amazon の AI、Machine Learning、ディープラーニングのユースケースのクラウドコンピューティングプラットフォームを幅広く使用しています。時間がある時は家族との時間を楽しみ、面白くちょっと恥ずかしい話しを集めたり、Amazon や AI の今後について話し合ったりしています。

Whooshkaa と Amazon Polly: 視覚と聴覚を組み合わせてパブリッシングの世界を広げる

これは、Robert Loewenthal 氏 (Whooshkaa 社 CEO 兼創立者) のゲストブログ投稿です。

Whooshkaa は、オーストラリアを本拠地とするクリエイティブなオーディオオンデマンドのポッドキャストプラットフォームであり、パブリッシャーや広告主によるオーディエンス到達範囲の拡大を支援しています。当社は、常に新しい製品と手法を試しており、これらを組み合わせてお客様のための新しいソリューションを生み出しています。

Amazon Polly のテキスト読み上げ (TTS) 機能が好例です。当社のお客様の中には、すでに Amazon Polly を使用して既存の配信方法を拡張している大手のパブリッシャー、スポーツ団体、オーストラリア最大の通信会社があります。

これらの従来の情報プロバイダーは、今日の購読者が目だけでなく、耳を通した情報の取得に関心がある点に注目しています。Whooshkaa では、Amazon Polly TTS を使用することで、情報プロバイダーが 48 種類の音声と 24 言語で購読者に情報を提供できます。

今年初めに、オーストラリアを代表する全国紙 The Australian に Amazon Polly が導入されました。購読者は、運転やエクササイズなどで手や目を放せないときに Amazon Polly が読み上げる新聞の記事、レシピ、スポーツの試合結果などを聴くことができます。

Whooshkaa では、Amazon Polly を使用することで、特定のパートナーは選択した任意の新聞記事を数秒以内にポッドキャストエピソードに変換できます。当社が提供するツールでは、複数の記事をマージし、音声をカスタマイズしてアクセント、ピッチ、速度、音量を変更することもできます

Whooshkaa の配信ネットワークは多様であり、ユーザーは様々な手段から選んでコンテンツを再生できます。代表的な手段はお気に入りのポッドキャストアプリを使うことです。Whooshkaa は Facebook と独自の提携をしているため、ポッドキャストエピソードをネイティブのオーディオプレイヤーで再生できます。当社のカスタマイズ可能なウェブプレイヤーは Twitter でもサポートされています。ただし、任意のウェブサイトに埋め込むことができます。

このテクノロジーが充実すれば、世界の地域と言語を問わず、パブリッシャーは新聞記事を自由に提供できるようになります。新聞記事は、読者の設定とニーズに応じてカスタマイズすることもできます。

当社はまた、オーストラリア最大の通信会社 Telstra およびナショナルラグビーリーグと提携し、接続されたスマートスピーカーを通じてユーザーのお気に入りのチームの試合結果をライブ配信しています。ユーザーがデバイスに尋ねるだけで、最新の結果が即座に読み上げられます。

当社の開発者 Christian Carlsson によると、Amazon Polly TTS の即応性と幅広い言語は、あらゆるタイプのパブリッシャーに無限の可能性をもたらします。

「人工知能と Whooshkaa の既存の強力なプラットフォームを統合することで、30 秒未満でテキストから完全な自動ポッドキャストエピソードを作成できるようになりました。しかも、これは始まりにすぎません」と Carlsson は述べています。

AFL 統合の技術的な実装

オーストラリアンフットボールリーグ (AFL) は、ファンがスマートスピーカーに話しかけてお気に入りのチームをフォローできるようにしたいと考えました。そのために、Whooshkaa では RSS フィードを作成し、最新の結果を 2 分ごとに更新する必要がありました。次は、この実装の概略図です。

必要なデータが含まれている AFL の API のクロールをトリガーするために、API を呼び出すシンプルな AWS Lambda 関数を設定しました。Whooshkaa API は、データをフェッチして解析し、テキストを音声に変換して、新しく作成した RSS フィードを Amazon S3 に発行します。

まず、2 分ごとにリクエストを初期化するための serverless.yml ファイルを準備しました。このファイルは特別なものではありません。

Serverless.yml:
createAFLFeeds:
 handler: api.createAFLFeeds
 events:
   - schedule:
       rate: rate(2 minutes)
       enabled: ${self:custom.${opt:stage}.ScheduledEvents}

これにより、次のコードがトリガーされます。

WhooshkaaAPI.js
createAFLFeeds() {
    return new Promise((resolve, reject) => {
      this.fetchAFLTeams().then(result => {
        for (const team of result) {
          this.createAFLFeedByTeamID(team['id']);
        }
      }, error => {
        console.log(error);
        reject(error);
      });
      resolve({message: "success"});
    });
}

次に、 createAFLFeedByTeamID メソッドから POST リクエストがエンドポイントに送信され、エンドポイントで以下の操作が行われます。

  1. AFL API からデータをフェッチします。このメソッドをできるだけ読み取り可能にするために、データの正規化が別の AFL パッケージに抽象化されます。どのデータを解析するかは、いくつかの異なる条件で決まります。チームが試合中であるか過去 24 時間以内に試合をしている場合は、チームの一致するデータが取得されます。それ以外の場合は、デフォルトで、チームの最新のニュースが取得されます。
  2. ハッシュを Amazon S3 に保存することで、返されたデータが最新であることを確認します。$this->publisher は抽象化されたクラスであり、3 つの異なるストレージアダプターとして、ローカル、Whooshkaa S3 バケット、および AFL S3 バケットが含まれます。ローカルアダプターではデータを操作し、Whooshkaa S3 バケットではハッシュを保存します。AFL S3 バケットには、生成した RSS フィードを発行します。
  3. 取得したテキストを Amazon Polly を通じてオーディオストリームに変換します。 makeAudio メソッドは、一部の単語を操作して期待どおりの音声で生成する方法を示しています。たとえば、マジソンスクエアガーデンの略である MCG は「McGee」と解釈されるため、代わりに、これをスペルアウトするよう Amazon Polly に指示します。
  4. RSS フィードを作成して AFL の S3 バケットに発行します。
AFLController.php:
public function team(string $id)
{
    if (!$team = Team::findById($id)) {
        $this->response->errorNotFound('Invalid team ID.');
    }

    if ($team->isPlayingOrHasRecentlyPlayed()) {
        $story = $team->match;
    } else {
        $story = $team->news;
    }

    $this->publisher->setTeamId($id);
    $this->publisher->setStory($story->getStory());

    $hash = Hash::make($story, $this->publisher->getRemoteStorageAdapter());
    if ($hasBeenUpdated = $hash->hasBeenUpdated()) {
        $fileName = $this->publisher->getFileName();

        $audio = $this->makeAudio($story);
        $this->publisher->store($fileName, $audio->getContent());

        $feed = $this->makeFeed($team, $story);
        $this->publisher->store('feed.xml', $feed->getContent());

        $this->publisher->moveToCloud([$fileName, 'feed.xml']);
        $this->publisher->cleanUp();

        $hash->store();
    }

    return response([
        'rss' => $this->publisher->getRemoteUrl('feed.xml'),
        'updated' => $hasBeenUpdated,
    ]);
}

private function makeAudio($story)
{
   $polly = new Polly;
   $polly->setPhonemes(['live' => 'laɪve']);
   $polly->setProsody('AFL', ['rate' => 'fast']);
   $polly->setSayAs(['MCG' => 'spell-out']);

   $text = $story->getStory();
   // Trim the text to a maximum of 1500 characters.
   if (strlen($text) > 1499) {
       $text = $this->text->setText($text)->trimToWordBoundary(1499);
   }

   try {
       $audioStream = $polly->fetchAudioStream($text);
   }
   catch (\Exception $e) {
       $this->response->error($e->getMessage(), $e->getStatusCode());
   }

   return response()->make($audioStream)->header('Content-Type', 'audio/mpeg');
}

private function makeFeed(Team $team, $story)
{
   $feed = new Feed($this->publisher->getRemoteURL('feed.xml'));
   $feed->setTitle($team->getName() . "'s Official Live Feed");
   $feed->setDescription('An official live feed from the Australian Football League.');
   $feed->setLink('http://www.afl.com.au');
   $feed->setOwner('The Australian Football League', 'podcast@afl.com.au');
   $feed->setImage($team->getImage());
   $feed->appendElements([
       'itunes:subtitle' => "Follow {$team->getName()}'s Live Matches and Latest News",
       'itunes:explicit' => 'no',
       'language' => 'en-us',
       'lastBuildDate' => Carbon::now('UTC')->toRssString(),
       'ttl' => 2,
       'copyright' => 'The Australian Football League',
   ]);

   $feed->setCategories([
       'Sports & Recreation' => [
           'Professional',
       ]
   ]);

   $fileName = $this->publisher->getFileName();
   $metaData = $this->getMetaData($fileName);

   $item = $feed->addItem([
       'title' => $story->getTitle(),
       'link' => $story->getArticleURL(),
       'pubDate' => Carbon::now('UTC')->toRssString(),
       'itunes:duration' => $metaData['playtime_string'],
   ]);
   $item->appendDescription($story->getStory());
   $item->appendEnclosure($this->publisher->getRemoteUrl($fileName, true), $metaData['filesize'], $metaData['mime_type']);
   $item->append('itunes:image', null, ['href' => $team->getImage()]);
   $item->append('guid', $this->publisher->getGuid(), ['isPermaLink' => 'false']);

   return response()->make($feed->output())->header('Content-Type', 'text/xml');
}

オーストラリアの「Daily News」の技術的な実装

The Australian は News Corp 傘下の新聞社です。この新聞社は、毎日 10 大ニュースを読者に音声で提供することを考えました。ニュースをポッドキャストエピソードとして 1 日に 5 回更新する必要があります。当社では、Amazon Polly との統合により、この要件を簡単に実装できました。この実装の概略図は次のとおりです。

この実装は AFL の統合と酷似していますが、1 つの例外があります。RSS フィードを生成する代わりに、エピソードの発行先を Whooshkaa のオーストラリアのアカウントの指定されたショーにします。これにより、エピソードはほぼ即座に iTunes、Pocket Casts、またはその他のポッドキャストプレイヤーで再生できます。

この実装をビルドするために、AFL 実装の場合と同じように AWS Lambda 関数をセットアップしました。「Daily News」エンドポイントを毎日の特定の時間にトリガーする必要があるためです。

Serverless.yml
createDailyNewsStory:
 handler: api.createDailyNewsStory
 events:
   - schedule:
       rate: cron(0 2,6,10,22 * * ? *)
       enabled: ${self:custom.${opt:stage}.ScheduledEvents}
   - schedule:
       rate: cron(30 14 * * ? *)
       enabled: ${self:custom.${opt:stage}.ScheduledEvents}
WhooshkaaAPI.js
createDailyNewsStory() {
 const options = {
   hostname: this.commonOptions.hostname,
   port: this.commonOptions.port,
   path: '/news-corp/daily-news',
   method: 'POST',
 };
 return new Promise((resolve, reject) => {
   this.sendRequest(options).then(result => {
     return resolve(result);
   }, error => {
     console.log(error);
     return reject('Could not create "Daily News" story.');
   });
 });
}

次に、 createDailyNewsStory ハンドラで createDailyNewsStory 関数を呼び出し、以下のように、API で dailyNews エンドポイントをトリガーします。

NewsCorpController.php
public function dailyNews()
{
   $show = Show::find(DailyNewsStory::SHOW_ID);
   $storyBuilder = new StoryBuilder($show);

   $dateTime = Carbon::now('Australia/Sydney')->format('F j (g:00 a)');
   $title = $show->title . ' - ' . $dateTime;

   $story = new DailyNewsStory;
   $story->setLimit(10);
   $story->setTitle($title);
   $story->setDescription($title);

   $episode = $storyBuilder->fetch($story)->publish();

   return $this->response->item($episode, new EpisodesTransformer);
}

DailyNewsStory で拡張される StoryBase クラスには、 NewsCorpApi クラスの依存関係が挿入されています。 DailyNewsStory の値は NewsCorpApi クラスに渡されます。ここでデータを取得して正規化します。

次に、取得したすべての記事のオーディオを生成し、1 つのエピソードとして発行します。これは StoryBuilder クラスで次のように行われます。

StoryBuilder.php
public function publish()
{
   $title = $this->story->getTitle();
   $description = $this->story->getDescription();

   if (!$episode = $this->episodes->findByTitleAndDescription($title, $description)) {
       $audio = $this->makeAudio();
       $fileName = $this->storage->putContent($audio->content(), Polly::OUTPUT_FORMAT);

       $data = [
           'podcast_id' => $this->show->id,
           'title' => $title,
           'description' => $description,
           'media_file' => $fileName,
           'length' => $this->storage->getSize($fileName),
       ];

       $episode = $this->episodes->create($data);
   }

   return $episode;
}

public function makeAudio()
{
   $polly = new Polly;

   $audioStream = null;
   foreach ($this->story->getBody() as $body) {
       $audioStream .= $polly->makeAudioStream($body);
   }

   return $polly->makeAudioResponse($audioStream);
}

次に $this->story->getBody() をループさせます。これは配列であり、前述した 10 個すべての記事が含まれているためです。これにより、Amazon Polly から継続的なオーディオストリームが作成されます。次に、オーディオストリームは mp3 ファイルとして S3 バケットにアップロードされ、そのファイル名が残りの情報と共にデータベースに保存されてリクエストで返されます。

当社の多くのお客様は、大量のリッチコンテンツを生成しています。当社が提供するプラットフォームでは、お客様は Amazon Polly を使用してコンテンツをオーディオに変換し、配信、分析、営利化できます。あるニュースパブリッシャーは、Whooshkaa および Amazon Polly のテキスト読み上げを使用してレシピライブラリを提供する予定です。

Whooshkaa では、常にオーディオを使用したイノベーションの方法を追求しています。クリエイターに最も広範な配信ネットワークを提供するために新しい市場とテクノロジーを開拓しています。従来のパブリッシャーと Amazon Polly の組み合わせは極めて有望です。


今回のブログの投稿者について

Robert Loewenthal 氏は、Whooshkaa の CEO 兼創立者です。Whooshkaa は、オーストラリアのシドニーを本拠地とするフルサービスのオーディオオンデマンド企業であり、クリエイターおよびブランドによるコンテンツの生成、ホスト、共有、追跡および収益化を支援しています。

AWS DeepLens プロジェクトの出力をラップトップでカスタマイズして表示する

AWS DeepLens は、ディープラーニング対応の開発者ツールキットを搭載したビデオカメラです。コンピュータビジョンのハンズオンチュートリアル、事前構築されたモデルを使用して Machine Learning スキルを開発し、拡張することができます。事前構築されたモデルの例としては、TV モニター、人物、ボトルなど室内の様々な物体を認識および検出するための物体検出、さらに歯磨きをする、口紅を塗る、ドラムを打つ、バイオリンを弾く、バスケットボールをするなどの様々な動作を認識するための動作認識が挙げられます。

AWS DeepLens では、デバイスのカメラからのストリームと、IoT コンソールおよびローカルデバイスからのモデルの出力を表示できます。各方法の詳細については、関連ドキュメントを参照してください。このブログでは、AWS DeepLens からのプロジェクト出力をカスタマイズして HTML ページに表示する方法について説明します。

以下のサービスを使用します。

  • Amazon Cognito: IoT WebSockets を介して HTML ページから AWS DeepLens MQTT メッセージにアクセスできるようにします。
  • AWS IoT: データのサブスクリプションと発行を処理します。
  • Amazon S3: 出力表示用の HTML ファイルを保存します。

AWS CLI または AWS マネジメントコンソールを使用して AWS DeepLens のプロジェクト出力をカスタマイズできます。CLI およびコンソールの使用手順について以下に詳しく説明します。

前提条件

手順に従って AWS DeepLens をカスタマイズする前に、以下の準備が必要です。

  • AWS DeepLens デバイスを所有する
  • デバイスを登録する
  • プロジェクトを作成してデバイスにデプロイする

詳細については、関連ドキュメントを参照してください。AWS DeepLens デバイスを所有していない場合は、サインアップして待ちリストに登録してください。

AWS CLI を使用して開始する手順

開始するには、AWS CLI を使用して、以下の手順に従ってください。

ステップ 1: Cognito ID プールを作成する

AWS DeepLens デバイスを登録するたびに、サービスは一意の MQTT トピックを作成します。このトピックでは、デプロイ済みのモデルの出力を AWS IoT コンソールに表示します。たとえば、AWS DeepLens にデプロイしたプロジェクトで周囲のオブジェクトが検出された場合、検出されたオブジェクトの名前を MQTT トピックを使用して IoT コンソールに発行できます。このブログ投稿では、カスタマイズした HTML ページに MQTT メッセージを表示します。そのために Amazon Cognito を使用します。

Amazon Cognito では、AWS 認証情報をソースコードやウェブページに含めなくても、一時認証情報を使用して安全な方法で AWS リソースに簡単にアクセスできます。

そのために、まず ID プールを作成する必要があります。後で、この IdentityPoolId を HTML ページに渡し、一時認証情報を使用して MQTT トピックへの受信登録ができるようにします。

AWS CLI で、以下のコマンドを貼り付けます。ステップを実行する前に、ID の作成先が目的の AWS リージョンであることを確認してください。

> aws cognito-identity create-identity-pool \ 
  --identity-pool-name DeepLens_Console  \
  --allow-unauthenticated-identities --region us-east-1

レスポンスは次の形式になります。

{
    "IdentityPoolId": "us-east-1:XXXXXXX-1cd1-4c3a-9a39-dac267545277",
    "AllowUnauthenticatedIdentities": true,
    "IdentityPoolName": "DeepLensConsole"
}

IdentityPoolId に注目してください (黄色でハイライトされています)。後で、これを HTML ページへのパラメータとして使います。

注意: この ID プールを使用すると、未認証ユーザーは AWS リソースにアクセスする一部の権限を取得できます。これらの権限については、以降のステップで定義します。これは HTML ページを簡単に扱うための便宜的な方法です。ページのセキュリティを強化する場合は、未認証ユーザーに対するサポートを完全に削除するか、ページへのアクセスを一部の機能に制限できます。ページにサインアップ機能を追加して様々なログインプロバイダーを使用してユーザーを認証することもできます。

ステップ 2: IAM ロールを作成して AWS IoT MQTT のサブスクリプションを許可する

AWS DeepLens デバイスは、MQTT トピックおよびメッセージを使用して IoT サブスクリプション経由でクラウドと通信します。これらのチャネルは、IoT 環境の安全で信頼できる通信用に最適化されています。これらのメッセージを受信して HTML ページで表示するには、以下の IAM ロールとアクセス許可を定義する必要があります。

まず、IAM ロールのポリシードキュメントを作成します。そのために、CLI コマンドを実行している同じディレクトリで、DeepLensConsoleUnauthName.json というファイルに以下のコンテンツを保存します。IdentityPoolId は、前のステップで取得したものに置き換えてください。

このステップでは、AWS リソースにアクセスする未認証ユーザーのための信頼ポリシーを定義します。現時点では、ロールにアクセス許可がありませんが、Amazon Cognito でアクセス許可を引き受けられるようにします。

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": {
        "Federated": "cognito-identity.amazonaws.com"
      },
      "Action": "sts:AssumeRoleWithWebIdentity",
      "Condition": {
        "StringEquals": {
          "cognito-identity.amazonaws.com:aud": "us-east-1:XXXXX-1cd1-4c3a-9a39-dac267545277"
        },
        "ForAnyValue:StringLike": {
          "cognito-identity.amazonaws.com:amr": "unauthenticated"
        }
      }
    }
  ]
}

次に、IAM ロールを作成し、このロールに先ほど作成したポリシーをアタッチします。前のステップで作成した同じパスとファイル名を使用する必要があります。ロール名を書き留めておきます。以降のステップで必要になります。

> aws iam create-role --role-name DeepLensConsoleUnauthName \  
  --assume-role-policy-document file://DeepLensConsoleUnauthName.json

次に、先ほど作成したロールに AWSIoTDataAccess ポリシーをアタッチします。この管理ポリシーのアタッチにより、このロールで IoT エンドポイントのすべてのトピックに対してメッセージの読み取りと書き込みができるようになります。より厳しいポリシーを作成してトピックとコマンドの許可を制限したり、逆にロールにアクセス許可を追加したりできます。たとえば、次の policy-arn を使用してラベルの読み上げを Amazon Polly に許可できます。arn:aws:iam::aws:policy/AmazonPollyReadOnlyAccess.

> attach-role-policy \
  --role-name DeepLensConsoleUnauthName \
  --policy-arn arn:aws:iam::aws:policy/AWSIoTDataAccess

ステップ 3: ID プールと IAM ロールを関連付ける

次に Cognito ID プールを IAM ロールに関連付ける必要があります。この関連付けを行うには、次のコマンドを使用します。

> aws cognito-identity set-identity-pool-roles \ 
--identity-pool-id "us-east-1:XXXXX-1cd1-4c3a-9a39-dac267545277" \ 
--roles unauthenticated=DeepLensConsoleUnauthName

ステップ 4: アカウントの IoT エンドポイントを見つける

AWS CLI を使用し、以下の手順に従います。

次のコマンドを入力します。

aws iot describe-endpoint

これで、IoT エンドポイントが返されます。

{
       "endpointAddress": "XXXXXXXXXXXXX.iot.us-east-1.amazonaws.com"
}

ステップ 5: HTML ページを開いてプロジェクト出力を表示する

次に、前に定義したパラメータを渡して、静的な HTML ページを Amazon S3 で開くことができます。

https://s3-us-west-2.amazonaws.com/im-examples/console/index.html?region=us-east-1&host=IoTEndpoint&id-pool=IdentityPoolId

たとえば、このガイドでの値を使用したリンクは以下のとおりです。

https://s3-us-west-2.amazonaws.com/im-examples/console/index.html?region=us-east-1&host=XXXXXXXXX.iot.us-east-1.amazonaws.com&id-pool=us-east-1:XXXXXXXX-XXXX-4a79-8dd4-568590df9298

プロジェクトで表示される結果に応じて、この HTML ページの境界ボックスに MQTT メッセージ、イメージ、およびビデオストリームを表示できます。

AWS マネジメントコンソールでの開始手順

AWS マネジメントコンソールを使用して開始するには、以下に手順に従います。

ステップ 1: Cognito ID プールを作成する

AWS DeepLens デバイスを登録するたびに、サービスは一意の MQTT トピックを作成します。このトピックでは、デプロイ済みのモデルの出力を AWS IoT コンソールに表示します。たとえば、AWS DeepLens にデプロイしたプロジェクトで周囲のオブジェクトが検出された場合、検出されたオブジェクトの名前を MQTT トピックを使用して IoT コンソールに発行できます。このブログ投稿では、カスタマイズした HTML ページに MQTT メッセージを表示します。そのために Amazon Cognito を使用します。

Amazon Cognito では、AWS 認証情報をソースコードやウェブページに含めなくても、一時認証情報を使用して安全な方法で AWS リソースに簡単にアクセスできます。

そのために、まず ID プールを作成する必要があります。後で、この IdentityPoolId を HTML ページに渡し、一時認証情報を使用して MQTT トピックへの受信登録ができるようにします。

Amazon Cognito コンソールで、[Manage Federated Identities] と [Create new identity pool] を選択します。名前 (「DeepLens_Console」など) を付けて、オプションの [Enable access to unauthenticated identities] チェックボックスをオンにします。

注意: この ID プールを使用すると、未認証ユーザーは AWS リソースにアクセスする一部の権限を取得できます。これらの権限については、以降のステップで定義します。これは HTML ページを簡単に扱うための便宜的な方法です。ページのセキュリティを強化する場合は、未認証ユーザーに対するサポートを完全に削除するか、ページへのアクセスを一部の機能に制限できます。ページにサインアップ機能を追加して様々なログインプロバイダーを使用してユーザーを認証することもできます。

ユーザーに代わって Amazon Cognito でロールを引き受けることを許可します。

次の画面で、モバイルおよびウェブインターフェイスで IdentityPoolId を使用する方法の手順とコード例が表示されます。ここでは、[Edit identity pool] ボタンを選択し、未認証アイデンティの IdentityPoolId とロール名を書き留めます。

ステップ 2: IAM ロールを編集して AWS IoT MQTT のサブスクリプションを許可する

AWS DeepLens デバイスは、MQTT トピックおよびメッセージを使用して IoT サブスクリプション経由でクラウドと通信します。これらのチャネルは、IoT 環境の安全で信頼できる通信用に最適化されています。これらのメッセージを受信してローカル HTMP ページで表示するには、IoT リソースにアクセスする権限を持つ IAM ロールを定義します。

IAM コンソールに移動し、未認証ロールの名前を検索します。Unauth_Role サフィックスが付いたロール (リストの 2 番目) を選択します。

[Attach policy] をクリックしてロールにポリシーを追加し、IoT 管理ポリシーを探して、[AWSIoTDataAccess] を選択します。

[Attach policy] を選択します。

この管理ポリシーのアタッチにより、このロールで IoT エンドポイントのすべてのトピックに対してメッセージの読み取りと書き込みができるようになります。より厳しいポリシーを作成してトピックとコマンドの許可を制限したり、逆にロールにアクセス許可を追加したりできます。たとえば、次の policy:arn を使用してラベルの読み上げを Amazon Polly に許可できますarn:aws:iam::aws:policy/AmazonPollyReadOnlyAccess ).

ステップ 3: アカウントの IoT エンドポイントを見つける

AWS IoT コンソールを使用して、[Settings] オプションを選択します。

ステップ 4: HTML ページを開いてプロジェクト出力を表示する

次に、前に定義したパラメータを渡して、静的な HTML ページを Amazon S3 で開くことができます。

https://s3-us-west-2.amazonaws.com/im-examples/console/index.html?region=us-east-1&host=IoTEndpoint&id-pool=IdentityPoolId

たとえば、このブログ投稿での値を使用したリンクは以下のとおりです。

https://s3-us-west-2.amazonaws.com/im-examples/console/index.html?region=us-east-1&host=XXXXXXXXX.iot.us-east-1.amazonaws.com&id-pool=us-east-1:XXXXXXXX-XXXX-4a79-8dd4-568590df9298

プロジェクトで表示される結果に応じて、この HTML ページの境界ボックスに MQTT メッセージ、イメージ、およびビデオストリームを表示できます。

デバイスのイメージを送信してプロジェクト出力ページで表示する

エッジ AWS Lambda 関数のシンプルな機能は、テキストメッセージを IoT トピックに発行することです。これらのメッセージはプロジェクト出力ページで表示できます (または AWS IoT コンソールの [test] タブで表示できます)。

最初の拡張は、イメージをモデル推定の前または後に (境界ボックスと共に) 表示することです。この例では、イメージを Amazon S3 にアップロードし、イメージ URL を IoT トピックにアップロードします。

S3 へのイメージのアップロード

まず、イメージを Amazon S3 にアップロードするには、Python 関数をエッジ Lambda 関数に追加します。

# Function to write to S3
# The function is creating an S3 client every time to use temporary credentials
# from the GG session over TES 
def write_image_to_s3(img):
    session = Session()
    s3 = session.create_client('s3')
    file_name = 'DeepLens/image-'+time.strftime("%Y%m%d-%H%M%S")+'.jpg'
    # You can contorl the size and quality of the image
    encode_param=[int(cv2.IMWRITE_JPEG_QUALITY),90]
    _, jpg_data = cv2.imencode('.jpg', img, encode_param)
    response = s3.put_object(ACL='public-read', Body=jpg_data.tostring(),Bucket='<BUCKET_NAME>',Key=file_name)

    image_url = 'https://s3.amazonaws.com/<BUCKET_NAME>/'+file_name
    return image_url

次に、推定 Python 関数から、この関数を呼び出します。

    ...
    # Upload to S3 to allow viewing the image in the browser
    image_url = write_image_to_s3(frame_with_bb)

さらに出力メッセージに追加します。

    client.publish(topic=iotTopic, payload='{{"img":"{}"}}'.format(image_url))

イメージへの別の追加は、モデルからの出力 (「ssd」型) 時に境界ボックスを表示することです。

# Adding top n bounding boxes results
def apply_bounding_box(img, topn_results):
        '''
        cv2.rectangle(img, (x1, y1), (x2, y2), RGB(255,0,0), 2)
        x1,y1 ------
        |          |
        --------x2,y2
        '''
        for obj in topn_results:
            class_id = obj['label']
            class_prob = obj['prob']
            img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
            cv2.rectangle(img, (int(obj['xmin']), int(obj['ymin'])), (int(obj['xmax']), int(obj['ymax'])), (255,0,0), 2)
        return img

次のコードを使用して top n (5 など) の結果を取得してイメージに適用します。

     ...
     results = model.parseResult('ssd',results)
     tops = results['ssd'][0:5]
     frame_with_bb = apply_bounding_box(frame_resize,tops)

まとめ

このような出力ページには他にも多くを追加できます。一部は今後のブログ投稿で紹介します。一部の例としては、MQTT メッセージでビデオをストリーミングし、出力ページでストリームを再構築します。または、Amazon CloudWatch グラフやダッシュボードなどを埋め込みます。

AWS DeepLens は、教育用プロジェクトと本番稼働用プロジェクトの両方を構築するためのオープンプラットフォームとして設計されています。組み込みプロジェクトを自由に拡張してください。たとえば、新しいディープラーニングモデル、新しい Lambda エッジ関数、新しいクラウドロジックの機能、プロジェクトの出力を制御および表示するための新しいヒューマンインターフェイスなどを構築できます。
このブログ投稿では、デバイスおよびデバイス上で実行されているプロジェクトに安全に接続できるシンプルな HTML ベースのページと、プロジェクトの推定の出力を紹介しました。より高度なインターフェイスやユースケースを構築するための参考や基礎としてご利用いただければ幸いです。AWS DeepLens に関するアイデアをお寄せください。また、コミュニティで共有してください。


その他の参考資料

AWS DeepLens を拡張して AWS Lambda で SMS 通知を送信する方法も参考にしてください。


今回のブログの投稿者について

Guy Ernest 氏は Amazon AI のプリンシパルソリューションアーキテクトです。マインドシェア構築の戦略に携わり、Amazon の AI、Machine Learning、ディープラーニングのユースケースのクラウドコンピューティングプラットフォームを幅広く使用しています。時間がある時は家族との時間を楽しみ、面白くちょっと恥ずかしい話しを集めたり、Amazon や AI の今後について話し合ったりしています。

Sunil Mallya は AWS Deep Learning チームのシニアソリューションズアーキテクトです。彼は、お客様のビジネスを拡大するために Machine Learning とディープラーニングのソリューション構築を支援しています。プライベートな時間には、料理、セーリング、RC 自動運転カーの製作を楽しんでいます。

AWS DeepLens を拡張し AWS Lambda で SMS 通知を送信

AWS DeepLens は、ディープラーニング対応の開発者ツールキットを搭載したビデオカメラです。コンピュータビジョンのハンズオンチュートリアル、事前構築されたモデルを使用して Machine Learning スキルを開発し、拡張することができます。

このブログでは、AWS IoT ルールエンジンと Lambda 関数を使用し、クラウド機能で DeepLens のローカルな機能を拡張する方法について説明します。このシンプルな機能は、たとえば DeepLens デバイスでホットドッグを見た後に、あなたの電話番号に SMS 通知を送信することができます。Amazon Elasticsearch Service (タイムラインやフレームで検出されたすべてのオブジェクトや顔を対象にするダッシュボードや検索インターフェイスの構築)、Amazon Kinesis Analytics (店の前を通り過ぎる人数の異常検出モデルの構築)、Amazon Rekognition (有名人の認識や顔検出の API を使用して近辺にいる VIP を識別) や、その他の AWS クラウドサービスでこの機能を拡張するために上級ユーザーが今後この機能を利用していくだろうと我々は予測しています。

次の図はカメラの前のオブジェクトからポケットの中にあるモバイルデバイスまでに渡るシステム内のデータフローを示しています。

Lambda 関数の作成

まず、クラウドで実行が可能で DeepLens デバイスからのホットドッグの確率が高い (>0.5) メッセージをフィルターできる AWS Lambda 関数を作成します。このプロセス中に、AWS Greengrass を使用するデバイスでデプロイした Lambda 関数からメッセージを取得できるように、AWS IoT ルールエンジンでルールを作成します。

  • AWS Lambda コンソールで [Create Function] にアクセスします。
  • 「iot-button-email」がある設計図をフィルターに掛け、それを設計図のテンプレートに選びます。
  • Lambda 関数の名前を入力します。たとえば「Hotdog_Notifier」といったようなものをお使いください。
  • Role フィールドは [Create a new Role from template(s)] のままにします。
  • 新しいロールに名前を指定します。たとえば「Hotdog_Notifier_Role」といったようなものをお使いください。
  • 「SNS Publish policy」ポリシーのポリシーテンプレートを追加します。
  • [aws-iot] セクションで [Custom IoT Rule] を使用するように切り替えます。
    • [Create a new rule] を選択します。
  • 名前を指定し (たとえば「search_hotdogs」など)、説明を追加します。
  • ルールクエリステートメントに [SELECT] クエリを選びます。[/$aws/deeplens/KJHFD-DKJO87-LJLKD/inference] から [Hotdog] を選択します。このクエリは次の JSON 形式で DeepLens デバイスからメッセージをキャッチできます。 { "Hotdog" : 0.5438 }
  • 次のチェックボックスでトリガーを有効にします。
  • 次のステップで Lambda 関数のコードを変更します。
  • 環境パラメーターを [email] から [phone_number] に変更し、自分の電話番号を値として入力します。この際、電話番号には国コードを忘れずに入れてください (たとえば米国の場合は +15555555555)。SMS の海外サポートについては AWS SNS に関するよくある質問をご覧ください: https://aws.amazon.com/sns/faqs/#sms-related-questions
  • [Create Function] ボタンを選択します。
  • 先ほど作成した Lambda 関数の [Configuration] に切り替えます。[Configuration] タブは左側にあります (設定、トリガー、モニタリング)。
  • Lambda 関数のコードで findExistingSubscription、createSubscriptioncreateTopic といった通常の SNS サブスクリプションで必要とされるヘルパー機能をすべて削除することができます。[use strict] まで、すべてのコードを削除します。SMS を直に送信するため、コードも変更します。
    'use strict';
    
    /**
     * This is a sample Lambda function that sends an SMS Notification When your
     * Deep Lens device detects a Hot Dog
     * 
     * Follow these steps to complete the configuration of your function:
     *
     * Update the phone number environment variable with your phone number.
     */
    
    const AWS = require('aws-sdk');
    
    const phone_number = process.env.phone_number;
    const SNS = new AWS.SNS({ apiVersion: '2010-03-31' });
    
    exports.handler = (event, context, callback) => {
        console.log('Received event:', event);
    
        // publish message
        const params = {
            Message: `Your DeepLens device just identified a Hot Dog. Congratulations!`,
            PhoneNumber: phone_number
        };
        if (event.Hotdog > 0.5)
            SNS.publish(params, callback);
    };
  • [Save] を選択します。この画面からでも Lambda 関数をテストすることができますが、DeepLens デバイスからのメッセージフローをシミュレートするため、ここでは IoT ルールエンジンを介してテストを行います。

設定をテストする

  • IoT コンソールで [Test] オプションを選択します。
  • 次のメッセージの前にルールで定義したトピックに [Publish to a Topic] を選択します。 { "Hotdog": 0.68725 }.
  • 「DeepLens デバイスが先ほど… (Your DeepLens device just….)」といった SNS 通知が届きます。これは Lambda 関数で定義したものです。
  • では、DeepLens デバイスに何らかのオブジェクトとホットドッグを見せてみましょう。上手くいくといいですね!
  • デバイスの前にホットドッグを見せてもメッセージが届かない場合は、上記の図に戻り色に合わせた値が設定されているか確認してください。また、国コードを含む正確な電話番号を提供しているかどうかもご確認ください。

まとめ

Amazon DeepLens は教育そしてイノベーションを目的とするオープンプラットフォームとして設計されています。実社会での問題解決に繋がる様々なアイデアを開発者が持ち寄ることを期待しています。店の近辺を行き交う人々の分析や、車庫のドアを自動で開いたり、レストランのテーブルが汚れていることを知らせたり、客がサービスを必要としていることを知らせることができます。これは、このブログで紹介したようなシンプルな拡張方法を使用して AWS DeepLens で構築できるシステムの簡単なサンプルです。


その他の参考資料

HTML ページで AWS DeepLens を使用してプロジェクト出力のカスタマイズや表示する方法をご覧ください。


今回のブログの投稿者について

Guy Ernest 氏は Amazon AI のプリンシパルソリューションアーキテクトです。マインドシェア構築の戦略に携わり、Amazon の AI、Machine Learning、ディープラーニングのユースケースのクラウドコンピューティングプラットフォームを幅広く使用しています。時間がある時は家族との時間を楽しみ、面白くちょっと恥ずかしい話しを集めたり、Amazon や AI の今後について話し合ったりしています。

Amazon Comprehend – 継続的に学習される自然言語処理

数年前、私はメリーランド大学の図書館 をさまよい、What Computers Can’t Do というタイトルのホコリをかぶった古い本と、その続編 What Computers Still Can’t Do を見つけました。2冊めの本はより分厚く、コンピューター・サイエンスが学ぶべき価値ある領域であることを認識させる内容でした。このブログを書く準備をしている間に、私は最初の1冊の保存されたコピーを見つけ、面白い考えを見つけました。

人間は自然言語で記述された文脈依存する暗黙的な知識を必要とする文章を使い、理解しているので、同じように自然言語を理解し、翻訳できるコンピューターを作る唯一の方法は、チューリングが嫌疑していたように、多分コンピューターが世界について学ぶようにプログラムすることだろう。

これは、とても先見の明のある考えでした。そして、私は Amazon Comprehend についてお話したいと考えています。Amazon Comprehend は現実に世界のことを相当詳しく知っている新しいサービスで、そのことを共有できるのがとても幸せです。

Amazon Comprehend の紹介

Amazon Comprehend はテキストを分析し、最初にアフリカ語からヨルバ語まで、その間にある 98 以上の言語に始まり、見つけたことを教えてくれます。Amazon Comprehend は英語かスペイン語で記述されたテキストからエンティティ(人、場所、ブランド、製品、など)の違い、キーフレーズや感情(ポジティブ、ネガティブ、混合、中立)を識別し、キーフレーズやその他全ての情報を抽出することができます。最後に、Comprehend のトピックモデリングサービスが巨大なドキュメントセットの中から分析やトピックに基づくグルーピングのために複数のトピックを抽出します。

(more…)