一、TensorFlowライト
TensorFlow Liteは、モバイルデバイスや組み込みデバイスのための軽量なソリューションです。TensorFlow Liteはアンドロイド、iOSと他のプラットフォームとさえラズベリーパイをサポートしています。
二、tfliteフォーマット
TensorFlowモデルは可動最終用途に直接生成することができない、.tfliteオフラインファイルフォーマットを変換する必要があります。
tflite保存形式はflatbuffersです。
FlatBuffersは、シリアル化形式を実装するための無料のオープンソース・ソフトウェア・ライブラリGoogleのです。これは、プロトコルバッファ、スリフト、Apacheのアブロに似ています。
動きは最終用途を与える場合したがって、それはFlatBuffers形式にTensorFlow訓練を受けいるProtobufモデルファイルを変換する必要があります。公式には、変換モデルの形式を達成するためのトコを提供します。
三、API
TensorFlow Liteは、C ++とJavaは、APIの2種類があり用意されています。どちらのモデルAPIは、モデルをロードして実行する必要があります。
TensorFlow Liteは、タスクのロードモデルとオペレーティングモデルを完了するためのJava APIクラスの通訳(通訳)を使用しています。後者の例としては、インタープリタを使用する方法について説明します。
四、TensorFlow Liteは手書き数字認識
次のデモはすでにmnist.tfliteモデルファイルが含まれています。(、あなたはPBとしてファイルを保存するために自分自身を訓練する必要がない場合は、フォーマットをtfliteに変換)// tensorflow liteのファイル プライベートlateinitするvar tflite:通訳 // 入力バイトバッファ プライベートlateinitするvar INPUTBUFFER:のByteBuffer // 出力配列[BATCH_SIZE、10] プライベート lateinitするvar mnistOutput:アレイ<FloatArray> 初期化 { してみてください{ tflite = インタープリタ(loadModelFile(活性)) 入力バッファ = ByteBuffer.allocateDirect( BYTE_SIZE_OF_FLOAT * DIM_BATCH_SIZE * DIM_IMG_SIZE_X * DIM_IMG_SIZE_Y * DIM_PIXEL_SIZE) inputBuffer.order(ByteOrder.nativeOrder()) mnistOutput = アレイ(DIM_BATCH_SIZE){FloatArray(NUMBER_LENGTH)} Log.d(TAG、 "TensorflowライトMNIST分類子を作成しました。" ) } キャッチ(E:にIOException){ Log.e(TAGは、 "tfliteファイルをロードするにIOExceptionが失敗しました。" ) } }
Mnist.tfliteモデルはファイルからロードされたアサート:
/ ** *資産フォルダからモデルファイルをロードします * / @throws(IOExceptionを:: クラス) プライベートの楽しみloadModelFile(アクティビティ:アクティビティ):{れるMappedByteBuffer ヴァルファイル記述子 = activity.assets.openFd(MODEL_PATH) ヴァルのinputStream = FileInputStreamを(fileDescriptor.fileDescriptor) ヴァルのFileChannel = inputStream.channel startOffsetのval = fileDescriptor.startOffset ヴァルdeclaredLength = fileDescriptor.declaredLengthの リターンfileChannel.map(FileChannel.MapMode.READ_ONLY、startOffset、declaredLength) }
手書き認識は実数分類()メソッドです。
ヴァル桁= mnistClassifier.classify(Bitmap.createScaledBitmap(paintView.bitmap、PIXEL_WIDTH、PIXEL_WIDTH、偽))
分類()メソッドはINPUTBUFFER、mnist動作モデル識別番号を初期化するための前処理を含みます。
/ ** * mnistモデルで番号を分類します。 * * @paramのビットマップ * @return 識別番号 * / 楽しい分類(ビットマップ:ビットマップ):のInt { もし(tflite == NULL ){ Log.e(TAGは、「画像の分類器が初期化されていない;スキップします」) } 前処理(ビットマップ) runModel() 返す後処理を() } / ** *モデルに供給するために、バイトバッファに変換 * * @paramのビットマップ * / プライベート楽しい前処理(ビットマップ:?ビットマップ){ もし(ビットマップ== NULL || INPUTBUFFER == NULL ){ リターン } // 画像データリセット )(inputBuffer.rewindを ヴァル幅 = bitmap.width ヴァル高さ = bitmap.height // ビットマップの形があるべき28×28 ヴァルピクセル= IntArray(幅* 高さ) bitmap.getPixels(画素、 0、幅、0、0 、幅、高さ) ため(I pixels.indicesで){ // 白と黒の画素255で0に設定 ヴァル画素= ピクセルを[I] // 青チャンネルが0xFFであろうように、入力の色は黒色です。 ヴァルチャネル=ピクセルと0xFFの inputBuffer.putFloat(( 0xFFで- チャネル).toFloat()) } } / ** * TFLiteモデルを実行します * / プライベートの楽しみrunModel()= tflite.run(INPUTBUFFER、mnistOutput) / ** *出力を通過し、同定された番号を見つけます。 * * @return (1が見つからなかった場合は-1を返す)を同定した数 * / プライベートの楽しみ後処理():のInt { 以下のための(I 0までmnistOutput [0 ] .size){ valの値 = mnistOutput [0 ] [i]の 場合(値== 1F){ 戻りI } } 返す -1 }
Androidの注意を払うように、あなたはbuild.gradleアプリモジュールで、次のステートメントを追加しなければならない必要性、それ以外のモデルはロードできませんでしたがあります。
アンドロイド{ ...... aaptOptions { NOCOMPRESS "tflite" } }
効果:
V.の概要
この記事では、デモgithubのに対処しますhttps://github.com/fengzhizi715/TFLite-MnistDemo
もちろん、あなたも公式の例で実行することができます。https://github.com/tensorflow/tensorflow/tree/master/tensorflow/lite/examples/android/app
精度は、あなたがたはありませんが。。。
さらに興味深いのTensorFlow Liteの例:https://www.tensorflow.org/lite/examples/