TensorFlow Lite 是 TensorFlow 針對移動和嵌入式設備的輕量級解決方案。它允許您在低延遲的移動設備上運行機器學習模型,因此您可以利用它進行分類,回歸或獲取你想要的任何東西,而無需與服務器交互。
注:TensorFlow Lite 鏈接
https://www.tensorflow.org/mobile/tflite/
目前,TensorFlow Lite 為 Android 和 iOS 設備提供了 C ++ API,并且為 Android 開發人員提供了 Java Wrapper。此外,在 Android 設備上,解釋器還可以使用 Android 經網絡 API 進行硬件加速,否則它將默認為 CPU 執行。在本文中,我將重點介紹如何在 Android 應用中使用它。
TensorFlow Lite 包含一個運行時環境,我們可以在其上運行預先存在的模型,并且它還提供了一套工具,可以為移動和嵌入式設備準備模型。
TensorFlow Lite 目前尚未支持訓練模型。我們可以在高性能的機器上訓練模型,然后將該模型轉換為 TFLITE 格式,最終將其加載到解釋器中。
TensorFlow Lite 目前處于開發人員預覽階段,因此可能不支持 TensorFlow 模型中的所有操作。但是它支持常見的圖像分類模型,包括 Inception 和 MobileNets。在本文中,您將了解如何在 Android 上運行 MobileNet 模型。該應用程序將查看相機信息并使用經過訓練的 MobileNet 對圖像進行分類。
將 TensorFlow Lite 與 MobileNets 配合使用
例如,在這張圖片中,我將相機對準了我最喜歡的咖啡杯,應用程序將它歸類為 “杯子”。有趣的是,它有一個寬大的手柄,你可以看到它非常像一個茶壺!
這是如何做到的?它使用 MobileNet 模型,該模型針對移動設備上的多種圖像場景進行設計和優化,包括對象檢測,分類,面部屬性檢測和地標識別。
MobileNet 有許多變種,在此站點托管了 TensorFlow Lite 的訓練模型。你會注意到每個文件都是一個包含兩個文件的 zip 包:一個 labels.txt 文件,其中包含與模型相關的標簽;一個 tflite 文件,其中包含可以與 TensorFlow Lite 一起使用的模型版本。如果你想要構建一個使用 MobileNets 的 Android 應用程序,則需要從此站點下載模型。你馬上就會看到。
使用 TensorFlow Lite 構建 Android 應用程序
要構建使用 TensorFlow Lite 的 Android 應用程序,首先需要將 tensorflow-lite 庫添加到您的應用程序中。這可以通過將以下行添加到 build.gradle 文件的依賴項部分來完成:
compile ‘org.tensorflow:tensorflow-lite:+’
完成此操作后,你可以導入 TensorFlow Lite 解釋器。解釋器通過為其提供一組輸入來加載模型并允許你運行它。然后 TensorFlow Lite 將執行模型并輸出結果,這真的很簡單。
import org.tensorflow.lite.Interpreter;
要使用它,你需要創建一個 Interpreter 實例,然后使用 MappedByteBuffer 加載它。
protected Interpreter tflite;tflite = new Interpreter(loadModelFile(activity));
在 GitHub 上的 TensorFlow Lite 示例中有一個輔助函數。只需確保函數 getModelPath() 返回一個指向特定模型的路徑,并且加載該模型。
注:TensorFlow Lite 示例鏈接
https://github.com/tensorflow/tensorflow/blob/master/tensorflow/contrib/lite/java/demo/app/src/main/java/com/example/android/tflitecamerademo/ImageClassifier.java
/** Memory-map the model file in Assets. */privateMappedByteBuffer loadModelFile(Activity activity)throwsIOException {AssetFileDescriptor fileDescriptor = activity.getAssets().openFd(getModelPath());FileInputStream inputStream =newFileInputStream(fileDescriptor.getFileDescriptor());FileChannel fileChannel = inputStream.getChannel();longstartOffset = fileDescriptor.getStartOffset();longdeclaredLength = fileDescriptor.getDeclaredLength();returnfileChannel.map(FileChannel.MapMode.READ_ONLY, startOffset, declaredLength);}
然后,要對圖像進行分類,我們只需要在 Interpeter 上調用 run 方法,并將圖像數據和標簽數組傳遞給它,它將完成剩下的工作:
tflite.run(imgData, labelProbArray);
詳細介紹如何從相機中獲取圖像,并為 tflite 做準備超出了本文的范圍,但是在 tensorflow github 中有一個完整示例詳細闡明了這一切。通過單步執行此示例,你可以了解到如何從相機中獲取圖像,如何利用數據進行分類,以及如何采用將加權輸出優先級列表從模型映射到標簽數組的方式來處理輸出。
要運行該示例,請確保擁有完整的 TensorFlow 源代碼。你可以通過以下方式獲取源代碼:
> git clone https://www.github.com/tensorflow/tensorflow
完成后,你可以利用 Android Studio 打開 TensorFlow 示例項目(示例代碼路徑為:
/tensorflow/contrib/lite/java/demo):
演示文件不包含任何模型,但我們需要使用 mobilenet_quant_v1_224.tflite 文件,我們可以通過這個網站下載該模型。最后解壓縮并將其放在 assets 文件夾中。
注:這個網站鏈接
https://github.com/tensorflow/tensorflow/blob/master/tensorflow/contrib/lite/g3doc/models.md
現在應該能夠運行該應用程序了。
請注意,該應用程序同時支持 Inception 和 Quantized MobileNet。它默認支持后者,因此您需要確保模型存在,否則應用程序將運行失敗??梢栽?ImageClassifier.java 文件中找到用于從相機捕獲數據并將其轉換為字節緩沖區以便加載到模型中的代碼。
核心功能可以在 Camera2BasicFragment.java 文件的 classifyFrame() 方法中找到:
/** Classifies a frame from the preview stream. */
private voidclassifyFrame() { if(classifier==null|| getActivity() ==null||cameraDevice== null) { showToast(“Uninitialized Classifier or invalid context.”) return;}Bitmap bitmap =textureView.getBitmap( classifier.getImageSizeX(),classifier.getImageSizeY());String textToShow =classifier.classifyFrame(bitmap);bitmap.recycle();showToast(textToShow);}
在這里,您可以看到位圖加載并調整為適合分類器的大小。然后 classifyFrame() 方法將返回包含與圖像匹配的前 3 個類的列表及其權重的文本。
-
機器學習
+關注
關注
66文章
8418瀏覽量
132634 -
tensorflow
+關注
關注
13文章
329瀏覽量
60536 -
TensorFlow Lite
+關注
關注
0文章
26瀏覽量
626
原文標題:在 Android 上使用 TensorFlow Lite
文章出處:【微信號:tensorflowers,微信公眾號:Tensorflowers】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
評論