TensorFlow を使用して Android デバイスでディープラーニング推論を実装する方法

TensorFlow を使用して Android デバイスでディープラーニング推論を実装する方法

[[211369]]

個人や企業にとって、ローカルデバイスでディープラーニング推論を実行することが望ましい状況は数多くあります。たとえば、旅行中に信頼できるインターネット接続がない場合や、クラウド サービスにデータを送信する際にプライバシーや遅延の問題に対処しなければならない場合などを想像してみてください。エッジ コンピューティングは、データが生成される場所に物理的に近い場所でデータを処理および分析する方法であり、これらの問題の解決策を提供します。

「OK Google」機能を例に挙げてみましょう。ユーザーの音声を使用して「OK Google」をトレーニングすると、このキーワードを受信すると携帯電話が起動します。この小さなフットプリントのキーワードスポッティング (KWS) 推論は通常、デバイス上でローカルに実行されるため、サービス プロバイダーがいつでも音声を聞いていることを心配する必要はありません。クラウド サービスは、コマンドを実行した場合にのみ開始されます。同様の概念は、インターネットに依存せずにハンズフリーの音声制御が必要なスマート家電やその他の IoT デバイスのアプリケーションにも拡張できます。

さらに、エッジ コンピューティングは IoT の世界に人工知能をもたらすだけでなく、他の多くの可能性と利点も提供します。たとえば、画像や音声データをローカルデバイス上で圧縮表現に事前処理してから、クラウドに送信することができます。このアプローチはプライバシーと遅延の問題に対処します。

Insight 在職中、私は TensorFlow を使用して事前トレーニング済みの WaveNet モデルを Android にデプロイしました。私の目標は、ディープラーニング モデルをデバイスに展開して動作させるためのエンジニアリング上の課題を探求することです。この投稿では、TensorFlow を使用して Android 上で汎用の音声テキスト認識アプリケーションを構築する方法について簡単に説明します。

図 1. プロセスの概要。 Android に WaveNet をインストールする 3 つの手順。

開発環境情報:

  • ピクセル、CPU タイプ: ARM64
  • アンドロイド7.1.1
  • Android 15.2 リリース
  • Android Gradle プラグイン 2.3.0
  • テンソルフロー 1.3.0
  • bazel 0.5.4-自作

詳細なチュートリアルと実装: https://github.com/chiachunfu/speech

ステップ1: モデルの圧縮

ディープラーニング モデルをモバイル/組み込みデバイスに展開するには、モデルのメモリ フットプリントを削減し、推論時間を短縮し、消費電力を削減するよう努める必要があります。これらの要件を満たすには、量子化、重みの削減、大規模なモデルから小規模なモデルへの分割など、いくつかの方法があります。

このプロジェクトでは、TensorFlow の量子化ツールを使用してモデル圧縮を実行しました。現在、私はモデル サイズを縮小するためにのみ重み量子化を使用しています。これは、Mac でのテスト結果に基づくと、完全な 8 ビット変換では推論時間の短縮などの追加の利点が得られないためです。 (requant_range のバグのため、Pixel 上で完全な 8 ビット モデルを実行できません)。 8 ビットの量子化ツールは CPU に適していないため、時間は 2 倍になります。量子化に関するより実践的なアドバイスに興味がある場合は、Pete Warden によるこの素晴らしい記事を読んでみてください。

モデルの重みを量子化します。

  1. モデルをプロトコル バッファ ファイルに書き込みます。
  2. ソースから TensorFlow をインストールして構成します (https://www.tensorflow.org/install/install_sources)。
  3. TensorFlow ディレクトリで次のコマンドラインを実行します。

  1. bazel ビルド tensorflow/tools/graph_transforms:transform_graph
  2. bazel-bin/tensorflow/tools/graph_transforms/transform_graph \
  3. --in_graph=/your/.pb/ファイル \  
  4. --outputs="出力ノード名" \  
  5. --out_graph=/the/quantized/.pb/ファイル \  
  6. --transforms='量子化重み'  

私のプロジェクトを例にとると、重みを量子化した後、事前トレーニング済みの WaveNet モデルのサイズは 15.5 Mb から 4.0 Mb に減少しました。これで、このモデル ファイルを Android プロジェクトの「assets」フォルダーに移動できます。

ステップ2: Android用TensorFlowライブラリ

TensorFlow を使用して Android アプリを構築するには、TensorFlow Android デモから始めることをお勧めします。私のプロジェクトでは、TF スピーチの例をテンプレートとして使用しました。この例の gradle ファイルは、Android 用の TF ライブラリのビルドとコンパイルに役立ちます。ただし、この事前に構築された TF ライブラリには、モデルに必要なすべての操作が含まれていない可能性があります。 WaveNet で必要なすべての操作を検討し、それらを Android apk に適した .so ファイルにコンパイルする必要があります。オペレーションの完全なリストを見つけるために、まず tf.train.write_graph を使用してグラフの詳細を出力します。次に、ターミナルで次のコマンドを実行します。

  1. grep "op: " PATH/ TO /mygraph.txt | sort | uniq | sed -E 's/^.+"(.+)".?$/\1/g'  

次に、/tensorflow/tensorflow/core/kernels/ にある BUILD ファイルを編集し、Android ライブラリ セクションの「android_extended_ops_group1」または「android_extended_ops_group2」に不足しているオペレーションを追加します。不要なオペレーションを削除して、.so ファイルを小さくすることもできます。次に、次のコマンドを実行します。

  1. bazel ビルド -c opt //tensorflow/contrib/android:libtensorflow_inference.so \
  2. --crosstool_top=//外部:android/crosstool \  
  3. --host_crosstool_top=@bazel_tools//tools/cpp:ツールチェーン \  
  4. --cpu=アームアビv7a  

libtensorflow_inference.so ファイルはここにあります:

  1. bazel-bin/tensorflow/contrib/android/libtensorflow_inference.so

.so ファイルに加えて、JAR ファイルも必要です。走る:

  1. ベゼルビルド
  2.  
  3. //Tensorflow/contrib/android:android_tensorflow_inference_java

ファイルはここにあります:

  1. bazel-bin/tensorflow/contrib/android/libandroid_tensorflow_inference_java.jar

これで、.so ファイルと .jar ファイルを一緒に Android プロジェクトの「libs」フォルダーに移動できます。

ステップ3: Androidでのデータ前処理

***、入力データをモデルのトレーニングに必要な形式に処理しましょう。オーディオ システムでは、生の音声波形がメル周波数ケプストラム係数 (MFCC) に変換され、人間の耳が音を認識する方法をシミュレートします。 TensorFlow には、この機能抽出を実行できるオーディオ オペレーションがあります。ただし、この変換を実現するにはいくつかのバリエーションがあることがわかりました。図 2 に示すように、TensorFlow オーディオ オペレーションからの MFCC は、librosa によって提供される MFCC とは異なります。 librosa は、事前トレーニング済みの WaveNet の作成者がトレーニング データを変換するために使用する Python ライブラリです。

図 2. librosa と TensorFlow オーディオ オペレーションの MFCC はスケールが異なります。

独自のモデルをトレーニングする場合、または事前トレーニング済みのモデルを再トレーニングする場合は、トレーニング データを処理するときにデバイス上のデータ パイプラインを考慮することが重要です。最終的に、変換を処理するために librosa MFCC を Java で書き直しました。

結果

図 3 にアプリのスクリーンショットと例を示します。モデルには言語モデルがなく、認識は文字レベルのみであるため、文章にはスペルミスがいくつかあります。厳密にテストしたわけではありませんが、量子化後に精度がわずかに低下し、システム全体が周囲のノイズに敏感になっていることがわかりました。

図 3. アプリ内の 2 つの例のスクリーンショット。

以下の表に示す推論時間は、5 秒間の音声に対する 10 回のテストの平均です。重みの量子化はファイル サイズの削減には役立ちますが、推論時間や電力消費の改善にはほとんど役立たないため、両方のプラットフォームで推論時間が短縮されるのではなく、わずかに増加しました。

表 1. 重み量子化前後の推論時間。テスト環境は、Pixel スマートフォンと Macbook air です。

次に何をすればいいでしょうか?

このプロジェクトをさらに一歩進め、エッジ デバイスに現実的な音声認識システムを展開するための追加のチュートリアルとウォークスルーをコミュニティに提供する重要なことが 2 つあります。

  • 音声認識パフォーマンスの向上: スペル修正用の言語モデルと周囲のノイズの影響を軽減するノイズ ダウンサンプリング モデルを追加します。
  • 推論時間と電力消費を改善します。低レベルの最適化には NEON またはその他のアーキテクチャを使用し、低精度の行列計算には gemmlowp を使用します。

<<:  堅牢な機械学習アルゴリズムの構築方法: ブースティングとバギング

>>:  顔認証の過去と現在の徹底分析

ブログ    
ブログ    

推薦する

データセンターの物理的セキュリティに AI を活用する方法

機械学習と人工知能は、データセンターの問題に対する万能薬として宣伝されてきました。その多くは誇大宣伝...

...

百度、599ドルのスマートビデオスピーカーを発売

[元記事は51CTO.comより]「アリスマートスピーカーTmall Genie原価499元、クーポ...

スタンフォードのAIエージェント研究が熱い! 「好奇心リプレイ」アルゴリズムにより、AIは自分自身を振り返り、積極的に新しい世界を探索することができる。

一夜にして、AI エージェントが突然インターネット全体を支配しました。業界のリーダーたちは、その焦点...

新しい形の人工知能が登場: AIaaSについてお話しましょう

「サービスとしての」配信モデルの誕生以来、SaaS と PaaS は日常的な技術用語の一部となり、企...

機械学習アルゴリズム(1):決定木とランダムフォレスト

モデルの組み合わせ (ブースティング、バギングなど) と決定木に関連するアルゴリズムは多数あります。...

...

中国工程院院士の李軍氏:単一車両知能には5つの大きな問題があり、自動運転には新たな技術的ルートが必要

Leifeng.com(公式アカウント:Leifeng.com)注:少し前、2020年世界インテリジ...

多くの場所でAI顔認識の使用が制限されており、監視は技術開発のペースに追いついています

最近、南京、江蘇省、天津などではAI顔認識技術の使用を禁止し始めている。 11月末、南京市のある男性...

2022 年の AIOps トレンド予測

[[429163]]人工知能、機械学習、自動化などの先進技術の普及により、企業のビジネスシナリオは大...

NSA、RSA暗号化アルゴリズムに2つ目のバックドアを追加

ロイター通信は12月、米国国家安全保障局(NSA)が、携帯端末で広く使用されている暗号化技術にバック...

テスラのヒューマノイドロボットが再び進化:視覚のみに基づいて物体を自律的に分類し、ヨガができる

数ヶ月沈黙していたテスラのヒューマノイドロボット、オプティマスプライムがついに新たな展開を見せた。私...

2021年に注目すべき5つのAI関連の仕事スキル

困難な一年であったにもかかわらず、世界中の多くの企業が、ビジネスを最大化するために人工知能(AI)を...

...