TensorFlow Lite 是 TensorFlow 針對(duì)移動(dòng)和嵌入式設(shè)備的輕量級(jí)解決方案。它允許您在低延遲的移動(dòng)設(shè)備上運(yùn)行機(jī)器學(xué)習(xí)模型,因此您可以利用它進(jìn)行分類,回歸或獲取你想要的任何東西,而無(wú)需與服務(wù)器交互。
注:TensorFlow Lite 鏈接
https://www.tensorflow.org/mobile/tflite/
目前,TensorFlow Lite 為 Android 和 iOS 設(shè)備提供了 C ++ API,并且為 Android 開發(fā)人員提供了 Java Wrapper。此外,在 Android 設(shè)備上,解釋器還可以使用 Android 經(jīng)網(wǎng)絡(luò) API 進(jìn)行硬件加速,否則它將默認(rèn)為 CPU 執(zhí)行。在本文中,我將重點(diǎn)介紹如何在 Android 應(yīng)用中使用它。
TensorFlow Lite 包含一個(gè)運(yùn)行時(shí)環(huán)境,我們可以在其上運(yùn)行預(yù)先存在的模型,并且它還提供了一套工具,可以為移動(dòng)和嵌入式設(shè)備準(zhǔn)備模型。
TensorFlow Lite 目前尚未支持訓(xùn)練模型。我們可以在高性能的機(jī)器上訓(xùn)練模型,然后將該模型轉(zhuǎn)換為 TFLITE 格式,最終將其加載到解釋器中。
TensorFlow Lite 目前處于開發(fā)人員預(yù)覽階段,因此可能不支持 TensorFlow 模型中的所有操作。但是它支持常見的圖像分類模型,包括 Inception 和 MobileNets。在本文中,您將了解如何在 Android 上運(yùn)行 MobileNet 模型。該應(yīng)用程序?qū)⒉榭聪鄼C(jī)信息并使用經(jīng)過(guò)訓(xùn)練的 MobileNet 對(duì)圖像進(jìn)行分類。
將 TensorFlow Lite 與 MobileNets 配合使用
例如,在這張圖片中,我將相機(jī)對(duì)準(zhǔn)了我最喜歡的咖啡杯,應(yīng)用程序?qū)⑺鼩w類為 “杯子”。有趣的是,它有一個(gè)寬大的手柄,你可以看到它非常像一個(gè)茶壺!
這是如何做到的?它使用 MobileNet 模型,該模型針對(duì)移動(dòng)設(shè)備上的多種圖像場(chǎng)景進(jìn)行設(shè)計(jì)和優(yōu)化,包括對(duì)象檢測(cè),分類,面部屬性檢測(cè)和地標(biāo)識(shí)別。
MobileNet 有許多變種,在此站點(diǎn)托管了 TensorFlow Lite 的訓(xùn)練模型。你會(huì)注意到每個(gè)文件都是一個(gè)包含兩個(gè)文件的 zip 包:一個(gè) labels.txt 文件,其中包含與模型相關(guān)的標(biāo)簽;一個(gè) tflite 文件,其中包含可以與 TensorFlow Lite 一起使用的模型版本。如果你想要構(gòu)建一個(gè)使用 MobileNets 的 Android 應(yīng)用程序,則需要從此站點(diǎn)下載模型。你馬上就會(huì)看到。
使用 TensorFlow Lite 構(gòu)建 Android 應(yīng)用程序
要構(gòu)建使用 TensorFlow Lite 的 Android 應(yīng)用程序,首先需要將 tensorflow-lite 庫(kù)添加到您的應(yīng)用程序中。這可以通過(guò)將以下行添加到 build.gradle 文件的依賴項(xiàng)部分來(lái)完成:
compile ‘org.tensorflow:tensorflow-lite:+’
完成此操作后,你可以導(dǎo)入 TensorFlow Lite 解釋器。解釋器通過(guò)為其提供一組輸入來(lái)加載模型并允許你運(yùn)行它。然后 TensorFlow Lite 將執(zhí)行模型并輸出結(jié)果,這真的很簡(jiǎn)單。
import org.tensorflow.lite.Interpreter;
要使用它,你需要?jiǎng)?chuàng)建一個(gè) Interpreter 實(shí)例,然后使用 MappedByteBuffer 加載它。
protected Interpreter tflite;tflite = new Interpreter(loadModelFile(activity));
在 GitHub 上的 TensorFlow Lite 示例中有一個(gè)輔助函數(shù)。只需確保函數(shù) getModelPath() 返回一個(gè)指向特定模型的路徑,并且加載該模型。
注: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);}
然后,要對(duì)圖像進(jìn)行分類,我們只需要在 Interpeter 上調(diào)用 run 方法,并將圖像數(shù)據(jù)和標(biāo)簽數(shù)組傳遞給它,它將完成剩下的工作:
tflite.run(imgData, labelProbArray);
詳細(xì)介紹如何從相機(jī)中獲取圖像,并為 tflite 做準(zhǔn)備超出了本文的范圍,但是在 tensorflow github 中有一個(gè)完整示例詳細(xì)闡明了這一切。通過(guò)單步執(zhí)行此示例,你可以了解到如何從相機(jī)中獲取圖像,如何利用數(shù)據(jù)進(jìn)行分類,以及如何采用將加權(quán)輸出優(yōu)先級(jí)列表從模型映射到標(biāo)簽數(shù)組的方式來(lái)處理輸出。
要運(yùn)行該示例,請(qǐng)確保擁有完整的 TensorFlow 源代碼。你可以通過(guò)以下方式獲取源代碼:
> git clone https://www.github.com/tensorflow/tensorflow
完成后,你可以利用 Android Studio 打開 TensorFlow 示例項(xiàng)目(示例代碼路徑為:
/tensorflow/contrib/lite/java/demo):
演示文件不包含任何模型,但我們需要使用 mobilenet_quant_v1_224.tflite 文件,我們可以通過(guò)這個(gè)網(wǎng)站下載該模型。最后解壓縮并將其放在 assets 文件夾中。
注:這個(gè)網(wǎng)站鏈接
https://github.com/tensorflow/tensorflow/blob/master/tensorflow/contrib/lite/g3doc/models.md
現(xiàn)在應(yīng)該能夠運(yùn)行該應(yīng)用程序了。
請(qǐng)注意,該應(yīng)用程序同時(shí)支持 Inception 和 Quantized MobileNet。它默認(rèn)支持后者,因此您需要確保模型存在,否則應(yīng)用程序?qū)⑦\(yùn)行失敗??梢栽?ImageClassifier.java 文件中找到用于從相機(jī)捕獲數(shù)據(jù)并將其轉(zhuǎn)換為字節(jié)緩沖區(qū)以便加載到模型中的代碼。
核心功能可以在 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);}
在這里,您可以看到位圖加載并調(diào)整為適合分類器的大小。然后 classifyFrame() 方法將返回包含與圖像匹配的前 3 個(gè)類的列表及其權(quán)重的文本。
-
機(jī)器學(xué)習(xí)
+關(guān)注
關(guān)注
66文章
8442瀏覽量
133103 -
tensorflow
+關(guān)注
關(guān)注
13文章
329瀏覽量
60634 -
TensorFlow Lite
+關(guān)注
關(guān)注
0文章
26瀏覽量
648
原文標(biāo)題:在 Android 上使用 TensorFlow Lite
文章出處:【微信號(hào):tensorflowers,微信公眾號(hào):Tensorflowers】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論