最近一直在考慮在Android系統上做一些AI的項目,但現在的AI項目大多數采用Python語言。在網上搜了一些移動端AI的例子,覺得Google的TensorFlow Lite比較适合。看到這樣一篇介紹Android上的TensorFlow Lite的文章,翻譯出來和大家分享。翻譯并非逐句翻譯,加入了我的一些了解。如果有問題請參看原文或和我聯系。原文位址:https://medium.com/tensorflow/using-tensorflow-lite-on-android-9bbc9cb7d69d
什麼是TensorFlow Lite?
TensorFlow Lite是TensorFlow針對移動和嵌入式裝置的輕量級解決方案。它可以在移動裝置上高效運作機器學習模型,是以您可以利用這些模型進行分類、回歸或其他功能,而無需和伺服器互動。
目前它在Android和iOS上支援C++ API,并為Android開發人員提供Java Wrapper。另外,在支援它的Android裝置上,解釋器也可以使用Android神經網絡API進行硬體加速,否則預設在CPU上執行。 在本文中,我将重點介紹如何在Android應用中使用它。
TensorFlow Lite包含一個運作時,在上面可以運作預先訓練好的模型,還包含一套工具,您可以使用這些工具準備用于移動裝置和嵌入式裝置上的模型。
TensorFlow上還無法訓練模型,您需要在更高性能的機器上訓練模型,然後将該模型轉換為.TFLITE格式,将其加載到移動端的解釋器中。
TensorFlow Lite目前處于開發人員預覽版,是以它可能不支援TensorFlow模型中的所有操作。 盡管如此,它仍然可以與常見的圖像分類模型(包括Inception和MobileNets)一起工作。在本文中,您将看到在Android上運作MobileNet模型。該應用将接收攝像頭資料,使用訓練好的MobileNet對圖檔中的主體圖像進行分類。
TensorFlow Lite中使用MobileNet
例如,在這幅圖像中,我将相機指向了我最喜愛的咖啡杯,可以看到它主要被分類為“杯子”。考慮到其形狀,很容易了解! 令人感興趣的是,它有一個很大、很寬的搖桿,也很像茶壺!
這是如何工作的? 它使用MobileNet模型,該模型針對移動裝置上的多種圖像場景進行設計和優化,包括對象檢測、分類、面部屬性檢測和地辨別别。
MobileNet有多種變體,該網站(https://goo.gl/tvaiY9)托管着許多TensorFlow Lite的訓練模型。 您會注意到每個檔案都是一個包含兩個檔案的zip檔案 - 一個labels.txt檔案,其中包含模型所訓練的标簽以及一個.tflite檔案,其中包含可與TensorFlow Lite配合使用的模型。如果您想照着建構使用MobileNets的Android應用,則需要從此網站下載下傳模型。稍後你會了解到這一過程。
您可以在此視訊中了解有關TensorFlow Lite的更多資訊:
建構TensorFlow Lite Android應用程式
要建構使用TensorFlow Lite的Android應用程式,您需要做的第一件事就是将tensorflow-lite庫添加到應用程式中。 這可以通過将以下行添加到build.gradle檔案的依賴項部分來完成:
compile ‘org.tensorflow:tensorflow-lite:+’
複制
完成此操作後,您可以導入TensorFlow Lite解釋器。解釋器加載一個模型,并提供一組輸入來運作它。 然後TensorFlow Lite将執行該模型并寫到輸出,非常簡單。
import org.tensorflow.lite.Interpreter;
複制
要使用它,您需要建立一個解釋器的執行個體,然後用一個MappedByteBuffer來加載它。
protected Interpreter tflite;
tflite = new Interpreter(loadModelFile(activity));
複制
GitHub上的TensorFlow Lite示例 (https://github.com/tensorflow/tensorflow/blob/master/tensorflow/contrib/lite/java/demo/app/src/main/java/com/example/android/tflitecamerademo/ImageClassifier.java) 中有一個輔助函數。隻需確定getModelPath()傳回一個指向assets檔案夾中的檔案的字元串,然後加載模型。
/** Memory-map the model file in Assets. */
private MappedByteBuffer loadModelFile(Activity activity) throws IOException {
AssetFileDescriptor fileDescriptor = activity.getAssets().openFd(getModelPath());
FileInputStream inputStream = new FileInputStream(fileDescriptor.getFileDescriptor());
FileChannel fileChannel = inputStream.getChannel();
long startOffset = fileDescriptor.getStartOffset();
long declaredLength = fileDescriptor.getDeclaredLength();
return fileChannel.map(FileChannel.MapMode.READ_ONLY, startOffset, declaredLength);
}
複制
接下來,要對圖像進行分類,您隻需調用Interpeter上的run方法,将圖像資料和标簽數組傳遞給它,剩下的工作就完成了:
tflite.run(imgData, labelProbArray);
複制
詳細讨論如何從相機中擷取圖像并準備給到tflite已經超出了本文的範圍,但在tensorflow github上有完成此操作的完整示例。深入到這個示例中,您可以看到它如何從相機中抓取、準備用于分類的資料,并通過将權重輸出優先級清單映射模型到标簽數組來處理輸出。
您可以在此視訊中了解有關建構TensorFlow Lite Android應用程式的更多資訊:
擷取并運作Android示例
要運作該示例,請確定您有完整的TensorFlow源碼。 您可以使用指令:
git clone https://www.github.com/tensorflow/tensorflow
複制
完成之後,您可以在Android Studio中打開的TensorFlow示例項目的/tensorflow/contrib/lite/java/demo檔案夾:
該示例代碼不包含任何模型,但示例需要mobilenet_quant_v1_224.tflite檔案,是以請務必從該站點 (https://goo.gl/tvaiY9) 下載下傳模型。解壓并将其放入assets檔案夾中。
現在您應該可以運作該應用程式。
請注意,該應用程式可支援初始(Inception)和量化(Quantized )的MobileNet。預設使用後者,是以您需要確定模型存在,否則應用程式将失敗!從相機捕獲資料并将其轉換為位元組緩沖區并加載到模型中的代碼可以在ImageClassifier.java檔案中找到。
該功能的核心位于Camera2BasicFragment.java檔案的classifyFrame()方法中:
/** Classifies a frame from the preview stream. */
private void classifyFrame() {
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個類的清單及其權重的文本。
TensorFlow Lite仍在不斷發展中,您可以通過 https://github.com/tensorflow/tensorflow/tree/master/tensorflow/contrib/lite 進行跟蹤。