Amazon Web Services ブログ

Apache MXNet と Apple Core ML を使用して iOS に Machine Learning を導入

Apple が Core MLWWDC 2017 でリリースしたことにより、iOS、macOS、watchOS、tvOS の開発者が Machine Learning とアプリを容易に統合できるようになりました。開発者は数行のコードでインテリジェントな新機能を取り入れることができます。Core ML により、モバイル開発者が Machine Learning を使いやすくなります。さらにラピッドプロトタイピングと別のセンサー (カメラ、GPS など) の使用も有効にし、今まで以上によりパワフルなアプリを構築することができます。

MXNet コミュニティのメンバーと Apple や Amazon ウェブ サービス (AWS) からの協力者により、MXNet を使用して構築した Machine Learning モデルを Core ML 形式に変換するツールが作成されました。このツールにより、開発者は Apple デバイス対象の Machine Learning を使用するアプリを構築しやすくなりました。この変換ツールを使うと、ディープラーニングを有効にしたアプリケーションで高速パイプラインを利用できます。Apple デバイスでの推測のランタイムを高速にするために MXNet を使用し、AWS クラウドで効率的な分散モデルトレーニングにスケーラブルから移動することができます。

このコンバーターツールのリリースをサポートするため、優れた iOS アプリを構築しました。イメージの場所を推定する LocationNet モデルを紹介した AWS AI ブログの記事「AWS EC2 で MXNet と Multimedia Commons データセットを使用してイメージの場所を推定する (Estimating the Location of Images Using MXNet and Multimedia Commons Dataset on AWS EC2)」に影響を受けました。

このブログ記事では、MXNet モデルを Core ML への変換や既存モデルの変換を行うための環境をセットアップする方法、Swift で作成したサンプル iOS アプリにインポートする方法について説明します。iOS アプリはモデルにイメージをフィードします。これはそのイメージが撮影された場所を推定し、インタラクティブなマップで表示します。パフォーマンスにおいては、iOS 11 ベータ版をインストールした実際の iOS デバイス (iPhone など) でアプリを実行することを推奨していますが、Xcode 9.0 ベータ版に搭載されている Simulator を使用することも可能です。

このブログ記事を書いている現在、Xcode 9、iOS 11、Core ML はまだベータ版の段階にあるため、Xcode と iOS をダウンロードするには Apple Developer Program のアカウントが必要になります。今年末に一般公開された後は、Mac の App Store や iOS デバイスのソフトウェアアップデートで取得することができます。

MXNet とコンバーターツールのインストール

ツールは macOS High Sierra 10.13 ベータ 8 でインストールされテスト済みです。Mac で Core ML モデルの推論を実行しない限り、macOS El Capitan (10.11) 以降のバージョンでコンバーターを実行することができます。

コンバーターツールを実行するには、Python 2.7 をインストールしている必要があります。

MXNet フレームワークと mxnet-to-coreml ツールをインストールするには次のコマンドを実行します。

pip install mxnet-to-coreml

MXNet モデルの変換

LocationNet モデルのトレーニングには、AWS Multimedia Commons データセットからのジオタグが付けられたイメージを使用する単一の p2.16xlarge Amazon EC2 インスタンスで MXNet が使用されています。これは MXNet Model Zoo で公的に共有されています。

他の MXNet モデルと同様に、LocationNet は 2 つのパートで構成されています。

  • モデル定義を含む JSON ファイル
  • パラメータを含むバイナリファイル

Amazon S3 に保存されている .json モデル定義.params モデルパラメータのファイルをダウンロードします。

そして、GitHub リポジトリからモデルのトレーニングで使用したジオグラフィックセルを含むクラスファイル、grids.txt をダウンロードする必要があります。これには Google の S2 Geometry Library を使用し、トレーニングデータでクラスを作成しました。このテキストファイルにある各ラインは S2 セルトークン、緯度、経度です (例: 8644b594 30.2835162512 -97.7271641272)。iOS アプリの Swift コードは S2 セルトークンの情報を排除し座標のみを使用します。

変換ツールの GitHub リポジトリで説明したように、モデルを変換します。

すべて同じディレクトリにダウンロードしたら、次のコマンドを実行します。

mxnet_coreml_converter.py --model-prefix='RN101-5k500' --epoch=12 --input-shape='{"data":"3,224,224"}' --mode=classifier --pre-processing-arguments='{"image_input_names":"data"}' --class-labels grids.txt --output-file="RN1015k500.mlmodel"

内部的には、モデルは最初に MXNet によりロードされ、メモリでシンボリックグラフ全体を再作成します。コンバーターはこのシンボリックグラフをウォークスルーし、各オペレーターを Core ML に相当するように変換します。コンバーターに提供済みの引数にはグラフを生成するために MXNet が使用しているものもあります。その他は入力の事前処理 (ニューラルネットワークに渡す前) や特定の方法でニューラルネットワークの出力を処理するために Core ML により使用されます。

コンバーターツールがモデルの複数のレイヤーを処理しているのを確認してから、ファイル名が生成されていることを SUCCESS で確認します。後のステージで結果として生成されるファイル RN1015k500.mlmodel を Xcode プロジェクトにインポートします。

Xcode をインストールした場合、このモデルファイルをダブルクリックすると、サイズ、名前、パラメータなど、通常であれば Swift コード内で使用する詳しい情報を取得できます。

iOS アプリのコードをダウンロードして設定する

iOS のサンプルアプリは macOS Sierra 10.12.6 を実行している Mac で Xcode 9 ベータ 6 を使用した Swift で作成されています。 このアプリは iOS 11 ベータ 8 を実行している iPhone 7 でテスト済みです。

Core ML モデルが予期している形式とサイズにイメージを自動変換できる Apple の新しい Vision フレームワークで、イメージを使用する Core ML に対応するようにしました。Vision は一貫したインターフェイスを介してコンピュータビジョンのチャレンジにソリューションを提供します。機能には顔の追跡、顔の検出、ランドマーク、テキスト検出、長方形の検出、バーコード検出、オブジェクトのトラッキング、イメージ登録が含まれています。

開始するには次のリソースを使用しました。

アプリ構築を始めましょう!

GitHub リポジトリから iOS サンプルアプリのソースコード MXNet2CoreML_iOS_sample_app をダウンロードします。

Xcode で MXNet2CoreML.xcodeproj を開きます。

先に生成した RN1015k500.mlmodel ファイルを次の図で表示されている右側の Xcode プロジェクトナビゲーターにドラッグアンドドロップし、今取り組んでいるプロジェクトの [Target Membership] ボックスをチェックします。

コンバーターツールをインストールしておらず iOS アプリを試すだけという方のために、Core ML モデル RN1015k500.mlmodel をこちらにアップロードしておきました。ファイルをダウンロードし、Xcode プロジェクトナビゲーターにドラッグアンドドロップします。

アプリを実行して結果をご覧ください。

先に述べたように、iOS 11 を実行している実際のデバイスでアプリをテストすることをお勧めします (このブログを書いている時点ではまだベータ段階になっています)。

Xcode Simulator で実行することもできますが、その場合は特にマップエリアをパンしたりズームする場合にパフォーマンスやアニメーションの質が低下します。

実際の iO デバイスで実行する場合は、次のスクリーンショットのようにチームアカウントでアプリをサインすることを忘れないでください。

先述の通り、これを実行するには Apple Developer アカウントが必要です。

アプリを構築し iPhone で実行するには [play] をクリックします。

iPhone でアプリがインストールされると、次の画面が表示されます。

これには 3 つのセクションがあります。

  • トップセクションには世界のどこかで撮影された写真が表示されています。写真を左または右にスワイプして組み込まれているイメージ 3 つのうち 1 つを表示します。人の目でこうした場所を認識するのは比較的簡単ですが、イメージに GPS データが埋め込まれていない状態で、モデルがここまで正確な場所を推定できるのは見事です。
  • ミドルセクションは 3 つのリアルタイム予測を表示します。「1」は最も適切である確率が高いことを意味しています。ここでは意図的に、モデルが生成した何百件もの予測からトップ 3 だけを表示することにしました。
  • ボトムセクションはモデルが予測した 3 つの各場所にピンを追加したインタラクティブなマップを表示します。ズームしたりパンすると、ピンが追加されているエリアをより詳しく見ることができます。

スクリーンショット 1:

スクリーンショット 2:

まとめ

ご覧のように、これで MXNet を使用し AWS で高機能の Machine Learning を構築してトレーニングしたり、MXNet から Core ML への変換ツールで Core ML 形式を変換して素早く Xcode にインポートすることができます。iOS のアプリやその他の Apple デバイスで新しく優れた機能を実験したり作成することができるようになりました。

次のステップ

自分のコンピュータに保存している写真でアプリを試すには、1.jpg の名前を変更し、既存のファイルを Xcode プロジェクトナビゲーターから削除してドラッグアンドドロップします。この手順については Core ML モデルのセクションで説明しています。

また、アプリ内から写真を撮れるようにするカメラ機能を実装したり、カメラロールから読み取れるようにすることで、サンプルアプリの幅を拡大するように開発したり、すでに撮影した写真やその場所で撮影する写真のロケーション予測をリアルタイムで行うことができます。

皆さんがこのブログから様々な方法を発見できれば幸いです。ご質問、コメント、ご提案があれば 下記のコメントセクションに投稿してください。

お楽しみください。


その他の参考資料

Apache MXNet で作成したトレーニング済みモデルを使用して AWS EC2 でイメージの場所を推定する方法については、こちらをご覧ください。


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

Sebastien Menant 氏はアマゾン ウェブ サービスのソリューションアーキテクトです。 同氏はシドニーでエンタープライズカスタマーと共に働いた経験があり、現在は AWS の新技術を導入するサンフランシスコのベイエリアの顧客をサポートしています。以前 Apple に勤務していた頃に、iOS ソフトウェア開発や Swift プログラミング言語に興味を持ち始めたそうです。

Pracheer Gupta 氏はパロアルトにある AWS ディープラーニングのメンバーです。 同氏は現在 Apache MXNet アプリケーションのテクニカルリードを務め、MXNet の上にインテリジェントなアプリケーションを構築する顧客をサポートしています。過去には、AWS の大半の構築ブロックの基礎となる Paxos ベースの分散ロックマネージャーの構築に携わった経験を持っています。空き時間があれば歴史や心理学の本を好んで読んでいるそうです。