TensorFlow LiteでAndroid Neural Networks APIを(強制的に)利用する
TensorFlow Liteとは
TensorFlow LiteはTensor Flowのモバイル向けライブラリで、モバイル端末で機械学習モデルを実行するための機能が備わっています。
また、AndroidでTensorFlow Liteを利用する場合、Android8.1から提供されているNeural Networks API(以下NNAPI)によるハードウェア高速化が行えます。
しかし、ハードウェア高速化が見込めない場合(エミュレータ等でアプリを実行する場合)、デフォルトでNNAPIをコールせずに、CPUにフォールバックして処理を行ってしまいます。
自分のケースでは、この挙動を把握しておらず、NNAPIを利用する場合としない場合で推論の結果が微妙に変わってしまうことがあったため、今回TensorFlow Liteを用いる場合に、強制的にNNAPIを利用する方法を書こうと思います。
強制的に利用する方法
implementation 'org.tensorflow:tensorflow-lite:1.10.0'
val interpreter = Interpreter(modelFile)
interpreter.setUseNNAPI(true) // interpreterの作成時にこの1行を追加
interpreter.setUseNNAPI(true)
を呼ぶことで、強制的にNNAPIを利用することができます。
注意点
しかし注意点が1つあり、自分はここでハマってしまいました。
setUseNNAPI(true)
を利用する際、minSdkVersion
を28以降にする必要があります
Android Neural Networks API自体はAndroid8.1(API Level 27)から追加されたものですが、API Level 27のデバイスでsetUseNNAPI(true)
を有効にした場合、アプリがクラッシュしてしまいました。
まとめ
TensorFlow LiteでNNAPIを強制的に利用する場合
-
interpreter.setUseNNAPI(true)
を呼ぶ -
minSdkVersion
は28以降にする