AndroidでTensorflowモデルをトレーニングして展開するためのワークフローを理解しようとしています。私はStackOverflowでこのような他の質問を知っているが、それらのどれも私が遭遇した問題に対処していないようだ。AndroidでTensorflowモデルを実行する
TensorflowリポジトリからAndroidの例を勉強した後、これは、私はワークフローがあるべきだと思うものです:
- ビルドとPythonでモデルをTensorflow訓練。
- 新しいグラフを作成し、関連するすべてのノード(つまり、トレーニングを担当するノードではない)をこの新しいグラフに転送します。訓練された重み変数は、C++ APIがそれらを読み取ることができるように定数としてインポートされます。
- JavaでAndroid GUIを開発し、nativeキーワードを使用してTensorflowモデルへの呼び出しをスタブアウトします。
- javahを実行して、Tensorflowネイティブコール用のC/C++スタブコードを生成します。
- Tensorflow C++ APIを使用してスタブを記入し、訓練された/シリアル化されたモデルを読み込んでアクセスします。
- Bazelを使用して、JavaアプリケーションとネイティブTensorflowインターフェイス(.soファイル)の両方をビルドし、APKを生成します。
adbを使用してAPKを導入します。
手順6が問題です。 BazelはJNI経由でJavaから呼び出せるネイティブ(OSX).dylibをうれしくコンパイルします。 Android Studioも同様に、必要なGUIを作成するXMLコードを生成します。しかし、BazelはすべてのJavaアプリケーションコードを(ワークスペース)の最上位ディレクトリ(Tensorflowリポジトリ内)に入れることを望んでいます.Android StudioはSDKのあらゆる種類の外部ライブラリを直ちにリンクしてGUIを作成しますこれらのリソースが見つからない場合、Bazelのコンパイルは失敗します)。私がBazelに.soファイルをクロスコンパイルさせる唯一の方法は、それをAndroidルールの従属ルールにすることです。ネイティブlibを直接クロスコンパイルするのは私のA.Sを移植するのが好きです。コードをBazelプロジェクトに追加します。
これをどのように正方形にしますか? BazelはAndroidコードをコンパイルすると思われますが、Android StudioはBazelがコンパイルできないコードを生成します。 Googleのすべての例は、生成された方法についてのヒントなしに、単にレポからコードを提供します。私が知る限り、Androidスタジオアプリの一部であるXMLは、手作業で作られるのではなく、生成されるはずです。手作業で作ることができるのであれば、どうすればそれらの外部ライブラリの必要性を避けることができますか?
私はワークフローが間違っているか、Bazel/Android Studioのいくつかの側面がわかりません。どんな助けもありがたい。
ありがとう!
編集:
- 私は、最新のBazelにアップグレード:
私はそれをやってしまったいくつかのことに成功し、ライブラリの構築に寄与している可能性がありました。
- TensorFlowをソースから再構築しました。 私はお勧めBazelは、(Androidの例から取られた)いくつかの追加で、以下のファイルを作成し実施し
:
cc_binary( name = "libName.so", srcs = ["org_tensorflowtest_MyActivity.cc", "org_tensorflowtest_MyActivity.h", "jni.h", "jni_md.h", ":libpthread.so"], deps = ["//tensorflow/core:android_tensorflow_lib", ], copts = [ "-std=c++11", "-mfpu=neon", "-O2", ], linkopts = ["-llog -landroid -lm"], linkstatic = 1, linkshared = 1, ) cc_binary( name = "libpthread.so", srcs = [], linkopts = ["-shared"], tags = [ "manual", "notap", ], )
を、私はこのライブラリは、Androidにロードして使用することができることを確認していませんまだ; Android Studio 1.5は、ネイティブライブラリの存在を認めることに非常に精通しているようです。
AndroidがOSX-dylibでないため、.dylibを作成することはまったく役に立ちません。OSX-dylibはOSXのみの形式です。それはLinuxだから、あなたは.so(これはほとんど同じ機能ですが、別のファイル形式です)を構築する必要があります。また、AndroidのXMLはすべて手作業で作られたものではありません。どんなGoogleの例でもほとんど何も生成されていません。あなたがそれを期待しているという事実はおそらくあなたの問題の一部です。 –
また、あなたのTensorflowソフトウェアがBazelを使用する必要がない限り、Androidワークに使用されていることは聞いたことがありません。 Gradleは新しい標準であり、Antは従来の標準です。あなたがBazelを使っているなら、あなたは最先端を出ているか、あなた自身のことを完全にやっています。 –
@ammあなたが作ったアプリのサイズはどれくらいですか? – sau