Za pomocą metadanych LiteRT programiści mogą generować kodu opakowującego, aby włączyć integrację na Androidzie. W przypadku większości programistów interfejs graficzny Android Studio ML Model Binding to jest najłatwiejsza w użyciu. Jeśli potrzebujesz większych możliwości dostosowania lub korzystasz z wiersza poleceń dostępny jest też LiteRT Codegen.
Używanie powiązania modeli ML w Android Studio
W przypadku modeli LiteRT wzbogaconych o metadane
deweloperzy mogą używać powiązania modeli ML w Android Studio do automatycznej konfiguracji
ustawień projektu i generuj klasy kodu na podstawie modelu
metadanych. Kod opakowania eliminuje potrzebę bezpośredniej interakcji z
ByteBuffer
Zamiast tego deweloperzy mogą wchodzić w interakcje z modelem LiteRT.
z wpisanymi obiektami, takimi jak Bitmap
i Rect
.
Importowanie modelu LiteRT w Android Studio
Kliknij prawym przyciskiem myszy moduł, w którym chcesz używać modelu TFLite, lub kliknij
File
, a późniejNew
>Other
>LiteRT Model
Wybierz lokalizację pliku TFLite. Pamiętaj, że narzędzia skonfigurować w Twoim imieniu zależność modułu za pomocą powiązania modelu ML oraz wszystkie zależności automatycznie wstawione do modułu Androida
build.gradle
.Opcjonalnie: zaznacz drugie pole wyboru do importowania GPU TensorFlow, jeśli chcą używać akceleracji GPU.
Kliknij
Finish
.Po zakończeniu importowania zostanie wyświetlony następujący ekran. Na początek za pomocą modelu, wybierz Kotlin lub Java, skopiuj i wklej kod pod
Sample Code
. Aby wrócić do tego ekranu, kliknij dwukrotnie model TFLite w kataloguml
w Android Studio.
Przyspieszanie wnioskowania modelu
ML Model Binding umożliwia programistom przyspieszenie tworzenia kodu liczbę przedstawicieli i liczbę wątków.
Krok 1. Sprawdź plik build.gradle
modułu, aby upewnić się, że zawiera on następujące elementy
zależność:
dependencies {
...
// TFLite GPU delegate 2.3.0 or above is required.
implementation 'com.google.ai.edge.litert:litert-gpu:2.3.0'
}
Krok 2. Wykrywanie, czy GPU działający na urządzeniu jest zgodny z GPU TensorFlow przekazać dostęp, jeśli model nie zostanie uruchomiony z użyciem wielu wątków procesora:
Kotlin
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
Java
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 modelu za pomocą generatora kodu LiteRT
W przypadku modelu LiteRT wzbogaconego o metadane
deweloperzy mogą korzystać z generatora kodu opakowań LiteRT na Androida,
kod otokowy platformy. Kod otoki eliminuje potrzebę interakcji
bezpośrednio w ByteBuffer
. Deweloperzy mogą natomiast wchodzić w interakcje z TensorFlow,
Model Lite z wpisywanymi obiektami, takimi jak Bitmap
i Rect
.
Przydatność generatora kodu zależy od kompletności
Wpis metadanych modelu LiteRT. Więcej informacji znajdziesz w sekcji <Codegen usage>
w odpowiednich polach
metadata_schema.fbs,
aby zobaczyć, jak narzędzie Codegen analizuje poszczególne pola.
Wygeneruj kod otoki
Musisz zainstalować w terminalu te narzędzia:
pip install tflite-support
Gdy skończysz, możesz użyć generatora kodu, korzystając z tej 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
Powstały kod będzie się znajdować w katalogu docelowym. Jeśli jesteś przy użyciu Google Colab lub innego pilota najlepiej skompresować wyniki do archiwum ZIP i pobrać do projektu w 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')
Używanie wygenerowanego kodu
Krok 1. Zaimportuj wygenerowany kod
W razie potrzeby rozpakuj wygenerowany kod do struktury katalogu. Pierwiastek
Przyjmuje się, że wygenerowany kod ma postać SRC_ROOT
.
Otwórz projekt Android Studio, w którym chcesz używać LiteRT.
model i zaimportuj wygenerowany moduł przez: I plik -> Nowe -> Importuj moduł ->
wybierz SRC_ROOT
W podanym wyżej przykładzie zaimportowany katalog i zaimportowany moduł nazywałyby się
classify_wrapper
Krok 2. Zaktualizuj plik build.gradle
aplikacji
W module aplikacji, który będzie korzystać z wygenerowanego modułu biblioteki:
W sekcji dotyczącej Androida dodaj te elementy:
aaptOptions {
noCompress "tflite"
}
W sekcji zależności dodaj te 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 modelu
Wygenerowany kod umożliwia programistom przyspieszenie procesu dzięki delegacjom oraz liczbie osób, . Można je ustawić podczas inicjowania obiektu modelu, ponieważ parametry:
Context
: kontekst z aktywności lub usługi na Androidzie- (Opcjonalnie)
Device
: przedstawiciel przyspieszenia TFLite. Na przykład: GPUDelegate - (Opcjonalnie)
numThreads
: liczba wątków używanych do uruchomienia modelu – domyślnie wynosi 1.
Aby na przykład użyć delegata GPU i maksymalnie 3 wątków, możesz zainicjować w ten sposób:
try {
myImageClassifier = new MyClassifierModel(this, Model.Device.GPU, 3);
} catch (IOException io){
// Error reading the model
}
Rozwiązywanie problemów
W przypadku wystąpienia błędu „java.io.FileNotFoundException: tego pliku nie można otworzyć jako deskryptor pliku; prawdopodobnie jest skompresowany”, wstaw następujące wiersze w sekcji dotyczącej Androida, która będzie korzystać z modułu biblioteki:
aaptOptions {
noCompress "tflite"
}