Korzystając z metadanych TensorFlow Lite , programiści mogą generować kod opakowania, aby umożliwić integrację z systemem Android. Dla większości programistów interfejs graficzny Android Studio ML Model Binding jest najłatwiejszy w użyciu. Jeśli potrzebujesz większego dostosowania lub używasz narzędzi wiersza poleceń, dostępny jest również TensorFlow Lite Codegen .
Użyj powiązania modelu Android Studio ML
W przypadku modeli TensorFlow Lite wzbogaconych o metadane programiści mogą używać powiązania modelu Android Studio ML w celu automatycznego konfigurowania ustawień projektu i generowania klas opakowań na podstawie metadanych modelu. Kod opakowania eliminuje potrzebę bezpośredniej interakcji z ByteBuffer
. Zamiast tego programiści mogą wchodzić w interakcję z modelem TensorFlow Lite za pomocą obiektów wpisanych, takich jak Bitmap
i Rect
.
Zaimportuj model TensorFlow Lite w Android Studio
Kliknij prawym przyciskiem myszy moduł, w którym chcesz użyć modelu TFLite, lub kliknij
File
, a następnieNew
>Other
>TensorFlow Lite Model
Wybierz lokalizację pliku TFLite. Pamiętaj, że narzędzie skonfiguruje w Twoim imieniu zależność modułu za pomocą powiązania modelu ML, a wszystkie zależności zostaną automatycznie wstawione do pliku
build.gradle
modułu Android.Opcjonalnie: Zaznacz drugie pole wyboru importowania procesora graficznego TensorFlow, jeśli chcesz używać akceleracji GPU.
Kliknij
Finish
.Po pomyślnym zakończeniu importu pojawi się następujący ekran. Aby rozpocząć korzystanie z modelu, wybierz Kotlin lub Java, skopiuj i wklej kod w sekcji
Sample Code
. Możesz wrócić do tego ekranu, klikając dwukrotnie model TFLite w kataloguml
w Android Studio.
Przyspieszanie wnioskowania o modelu
Powiązanie modelu ML umożliwia deweloperom przyspieszenie kodu poprzez użycie delegatów i liczby wątków.
Krok 1. Sprawdź plik build.gradle
modułu, czy zawiera następującą zależność:
dependencies {
...
// TFLite GPU delegate 2.3.0 or above is required.
implementation 'org.tensorflow:tensorflow-lite-gpu:2.3.0'
}
Krok 2. Sprawdź, czy procesor graficzny działający na urządzeniu jest kompatybilny z delegatem GPU TensorFlow, jeśli nie, uruchom model przy użyciu wielu wątków procesora:
Kotlina
import org.tensorflow.lite.gpu.CompatibilityList import org.tensorflow.lite.gpu.GpuDelegate val compatList = CompatibilityList() val options = if(compatList.isDelegateSupportedOnThisDevice) { // if the device has a supported GPU, add the GPU delegate Model.Options.Builder().setDevice(Model.Device.GPU).build() } else { // if the GPU is not supported, run on 4 threads Model.Options.Builder().setNumThreads(4).build() } // Initialize the model as usual feeding in the options object val myModel = MyModel.newInstance(context, options) // Run inference per sample code
Jawa
import org.tensorflow.lite.support.model.Model import org.tensorflow.lite.gpu.CompatibilityList; import org.tensorflow.lite.gpu.GpuDelegate; // Initialize interpreter with GPU delegate Model.Options options; CompatibilityList compatList = CompatibilityList(); if(compatList.isDelegateSupportedOnThisDevice()){ // if the device has a supported GPU, add the GPU delegate options = Model.Options.Builder().setDevice(Model.Device.GPU).build(); } else { // if the GPU is not supported, run on 4 threads options = Model.Options.Builder().setNumThreads(4).build(); } MyModel myModel = new MyModel.newInstance(context, options); // Run inference per sample code
Generuj interfejsy modeli za pomocą generatora kodu TensorFlow Lite
W przypadku modelu TensorFlow Lite wzbogaconego o metadane programiści mogą użyć generatora kodu opakowania TensorFlow Lite dla systemu Android, aby utworzyć kod opakowania specyficzny dla platformy. Kod opakowania eliminuje potrzebę bezpośredniej interakcji z ByteBuffer
. Zamiast tego programiści mogą wchodzić w interakcję z modelem TensorFlow Lite za pomocą obiektów wpisanych, takich jak Bitmap
i Rect
.
Przydatność generatora kodu zależy od kompletności wpisu metadanych modelu TensorFlow Lite. Zapoznaj się z sekcją <Codegen usage>
w odpowiednich polach w metadata_schema.fbs , aby zobaczyć, jak narzędzie codegen analizuje każde pole.
Wygeneruj kod opakowania
Będziesz musiał zainstalować następujące narzędzia w swoim terminalu:
pip install tflite-support
Po zakończeniu generator kodu może być używany przy użyciu następującej składni:
tflite_codegen --model=./model_with_metadata/mobilenet_v1_0.75_160_quantized.tflite \
--package_name=org.tensorflow.lite.classify \
--model_class_name=MyClassifierModel \
--destination=./classify_wrapper
Wynikowy kod będzie znajdować się w katalogu docelowym. Jeśli korzystasz z Google Colab lub innego środowiska zdalnego, być może łatwiej będzie spakować wynik w archiwum ZIP i pobrać go do projektu Android Studio:
# Zip up the generated code
!zip -r classify_wrapper.zip classify_wrapper/
# Download the archive
from google.colab import files
files.download('classify_wrapper.zip')
Korzystanie z wygenerowanego kodu
Krok 1: Zaimportuj wygenerowany kod
W razie potrzeby rozpakuj wygenerowany kod do struktury katalogów. Zakłada się, że katalogiem głównym wygenerowanego kodu jest SRC_ROOT
.
Otwórz projekt Android Studio, w którym chcesz użyć modelu TensorFlow lite i zaimportuj wygenerowany moduł poprzez: And File -> New -> Import Module -> wybierz SRC_ROOT
Korzystając z powyższego przykładu, zaimportowany katalog i moduł będą miały nazwę classify_wrapper
.
Krok 2: Zaktualizuj plik build.gradle
aplikacji
W module aplikacji, który będzie korzystał z wygenerowanego modułu biblioteki:
W sekcji Android dodaj następujące informacje:
aaptOptions {
noCompress "tflite"
}
W sekcji zależności dodaj następujące elementy:
implementation project(":classify_wrapper")
Krok 3: Korzystanie z modelu
// 1. Initialize the model
MyClassifierModel myImageClassifier = null;
try {
myImageClassifier = new MyClassifierModel(this);
} catch (IOException io){
// Error reading the model
}
if(null != myImageClassifier) {
// 2. Set the input with a Bitmap called inputBitmap
MyClassifierModel.Inputs inputs = myImageClassifier.createInputs();
inputs.loadImage(inputBitmap));
// 3. Run the model
MyClassifierModel.Outputs outputs = myImageClassifier.run(inputs);
// 4. Retrieve the result
Map<String, Float> labeledProbability = outputs.getProbability();
}
Przyspieszanie wnioskowania o modelu
Wygenerowany kod umożliwia programistom przyspieszenie kodu poprzez użycie delegatów i liczby wątków. Można je ustawić podczas inicjowania obiektu modelu, ponieważ przyjmuje on trzy parametry:
-
Context
: kontekst z działania lub usługi systemu Android - (Opcjonalnie)
Device
: Delegat akceleracji TFLite, na przykład GPUDelegate lub NNAPIDelegate - (Opcjonalnie)
numThreads
: Liczba wątków używanych do uruchomienia modelu — wartość domyślna to jeden.
Na przykład, aby użyć delegata NNAPI i maksymalnie trzech wątków, możesz zainicjować model w następujący sposób:
try {
myImageClassifier = new MyClassifierModel(this, Model.Device.NNAPI, 3);
} catch (IOException io){
// Error reading the model
}
Rozwiązywanie problemów
Jeśli otrzymasz wyjątek „java.io.FileNotFoundException: tego pliku nie można otworzyć jako deskryptora pliku; prawdopodobnie jest to błąd skompresowany, wstaw następujące wiersze w sekcji Android modułu aplikacji, która będzie korzystać z modułu bibliotecznego:
aaptOptions {
noCompress "tflite"
}