Po wytrenowaniu własnego modelu za pomocą AutoML Vision Edge możesz używać go w swojej aplikacji do wykrywania obiektów na obrazach.
Istnieją dwa sposoby integracji modeli przeszkolonych z AutoML Vision Edge: możesz spakować model, umieszczając go w folderze zasobów aplikacji, lub możesz go dynamicznie pobrać z Firebase.
Opcje łączenia modeli | |
---|---|
W pakiecie w Twojej aplikacji |
|
Hostowane z Firebase |
|
Zanim zaczniesz
Jeśli chcesz pobrać model , pamiętaj o dodaniu Firebase do swojego projektu na Androida , jeśli jeszcze tego nie zrobiłeś. Nie jest to wymagane podczas łączenia modelu.
Dodaj zależności dla biblioteki zadań TensorFlow Lite do pliku gradle na poziomie aplikacji modułu, którym zwykle jest
app/build.gradle
:Aby połączyć model z aplikacją:
dependencies { // ... // Object detection with a bundled Auto ML model implementation 'org.tensorflow:tensorflow-lite-task-vision:0.0.0-nightly-SNAPSHOT' }
Aby dynamicznie pobierać model z Firebase, dodaj również zależność Firebase ML:
dependencies { // ... // Object detection with an Auto ML model deployed to Firebase implementation platform('com.google.firebase:firebase-bom:26.1.1') implementation 'com.google.firebase:firebase-ml-model-interpreter' implementation 'org.tensorflow:tensorflow-lite-task-vision:0.0.0-nightly' }
1. Załaduj model
Skonfiguruj lokalne źródło modelu
Aby połączyć model z aplikacją:
- Wyodrębnij model z archiwum ZIP pobranego z Google Cloud Console.
- Dołącz swój model do pakietu aplikacji:
- Jeśli nie masz folderu zasobów w swoim projekcie, utwórz go, klikając prawym przyciskiem myszy
app/
folder, a następnie klikając opcję Nowy > Folder > Folder zasobów . - Skopiuj plik modelu
tflite
z osadzonymi metadanymi do folderu zasobów.
- Jeśli nie masz folderu zasobów w swoim projekcie, utwórz go, klikając prawym przyciskiem myszy
Dodaj następujące elementy do pliku
build.gradle
aplikacji, aby upewnić się, że Gradle nie kompresuje pliku modelu podczas tworzenia aplikacji:android { // ... aaptOptions { noCompress "tflite" } }
Plik modelu zostanie dołączony do pakietu aplikacji i będzie dostępny jako surowy zasób.
Skonfiguruj źródło modelu hostowane przez Firebase
Aby użyć zdalnie hostowanego modelu, utwórz obiekt RemoteModel
, określając nazwę, którą przypisałeś modelowi podczas jego publikowania:
Jawa
// Specify the name you assigned when you deployed the model.
FirebaseCustomRemoteModel remoteModel =
new FirebaseCustomRemoteModel.Builder("your_model").build();
Kotlin
// Specify the name you assigned when you deployed the model.
val remoteModel =
FirebaseCustomRemoteModel.Builder("your_model_name").build()
Następnie uruchom zadanie pobierania modelu, określając warunki, na jakich chcesz zezwolić na pobieranie. Jeśli modelu nie ma na urządzeniu lub dostępna jest nowsza wersja modelu, zadanie asynchronicznie pobierze model z Firebase:
Jawa
DownloadConditions downloadConditions = new DownloadConditions.Builder()
.requireWifi()
.build();
RemoteModelManager.getInstance().download(remoteModel, downloadConditions)
.addOnSuccessListener(new OnSuccessListener<Void>() {
@Override
public void onSuccess(@NonNull Task<Void> task) {
// Success.
}
});
Kotlin
val downloadConditions = DownloadConditions.Builder()
.requireWifi()
.build()
RemoteModelManager.getInstance().download(remoteModel, downloadConditions)
.addOnSuccessListener {
// Success.
}
Wiele aplikacji uruchamia zadanie pobierania w swoim kodzie inicjującym, ale możesz to zrobić w dowolnym momencie, zanim będzie trzeba użyć modelu.
Utwórz wykrywacz obiektów ze swojego modelu
Po skonfigurowaniu źródeł modelu utwórz obiekt ObjectDetector
na podstawie jednego z nich.
Jeśli masz tylko model w pakiecie lokalnym, po prostu utwórz wykrywacz obiektów z pliku modelu i skonfiguruj wymagany próg ufności (zobacz Oceń swój model ):
Jawa
// Initialization
ObjectDetectorOptions options = ObjectDetectorOptions.builder()
.setScoreThreshold(0) // Evaluate your model in the Google Cloud Console
// to determine an appropriate value.
.build();
ObjectDetector objectDetector = ObjectDetector.createFromFileAndOptions(context, modelFile, options);
Kotlin
// Initialization
val options = ObjectDetectorOptions.builder()
.setScoreThreshold(0) // Evaluate your model in the Google Cloud Console
// to determine an appropriate value.
.build()
val objectDetector = ObjectDetector.createFromFileAndOptions(context, modelFile, options)
Jeśli masz model hostowany zdalnie, przed uruchomieniem musisz sprawdzić, czy został pobrany. Stan zadania pobierania modelu można sprawdzić za pomocą metody isModelDownloaded()
menedżera modelu.
Chociaż musisz to potwierdzić tylko przed uruchomieniem detektora obiektów, jeśli masz zarówno model hostowany zdalnie, jak i model w pakiecie lokalnym, może być sensowne wykonanie tego sprawdzenia podczas tworzenia instancji detektora obiektów: utwórz wykrywacz obiektów ze zdalnego modelu, jeśli został pobrany, aw przeciwnym razie z modelu lokalnego.
Jawa
FirebaseModelManager.getInstance().isModelDownloaded(remoteModel)
.addOnSuccessListener(new OnSuccessListener<Boolean>() {
@Override
public void onSuccess(Boolean isDownloaded) {
}
});
Kotlin
FirebaseModelManager.getInstance().isModelDownloaded(remoteModel)
.addOnSuccessListener { success ->
}
Jeśli masz tylko zdalnie hostowany model, powinieneś wyłączyć funkcje związane z modelem — na przykład wyszarzyć lub ukryć część interfejsu użytkownika — do czasu potwierdzenia, że model został pobrany. Można to zrobić, dołączając odbiornik do metody download()
menedżera modeli.
Kiedy już wiesz, że Twój model został pobrany, utwórz wykrywacz obiektów z pliku modelu:
Jawa
FirebaseModelManager.getInstance().getLatestModelFile(remoteModel)
.addOnCompleteListener(new OnCompleteListener<File>() {
@Override
public void onComplete(@NonNull Task<File> task) {
File modelFile = task.getResult();
if (modelFile != null) {
ObjectDetectorOptions options = ObjectDetectorOptions.builder()
.setScoreThreshold(0)
.build();
objectDetector = ObjectDetector.createFromFileAndOptions(
getApplicationContext(), modelFile.getPath(), options);
}
}
});
Kotlin
FirebaseModelManager.getInstance().getLatestModelFile(remoteModel)
.addOnSuccessListener { modelFile ->
val options = ObjectDetectorOptions.builder()
.setScoreThreshold(0f)
.build()
objectDetector = ObjectDetector.createFromFileAndOptions(
applicationContext, modelFile.path, options)
}
2. Przygotuj obraz wejściowy
Następnie dla każdego obrazu, który chcesz oznaczyć etykietą, utwórz obiekt TensorImage
ze swojego obrazu. Możesz utworzyć obiekt TensorImage
z Bitmap
przy użyciu metody fromBitmap
:
Jawa
TensorImage image = TensorImage.fromBitmap(bitmap);
Kotlin
val image = TensorImage.fromBitmap(bitmap)
Jeśli dane obrazu nie znajdują się w Bitmap
, możesz załadować tablicę pikseli, jak pokazano w dokumentach TensorFlow Lite .
3. Uruchom wykrywacz obiektów
Aby wykryć obiekty na obrazie, przekaż obiekt TensorImage
do metody detect()
obiektu ObjectDetector
.
Jawa
List<Detection> results = objectDetector.detect(image);
Kotlin
val results = objectDetector.detect(image)
4. Uzyskaj informacje o obiektach oznaczonych etykietami
Jeśli operacja wykrywania obiektów powiedzie się, zwraca listę obiektów Detection
. Każdy obiekt Detection
reprezentuje coś, co zostało wykryte na obrazie. Możesz uzyskać obwiednię każdego obiektu i jego etykiety.
Na przykład:
Jawa
for (Detection result : results) {
RectF bounds = result.getBoundingBox();
List<Category> labels = result.getCategories();
}
Kotlin
for (result in results) {
val bounds = result.getBoundingBox()
val labels = result.getCategories()
}
Wskazówki dotyczące poprawy wydajności w czasie rzeczywistym
Jeśli chcesz oznaczać obrazy etykietami w aplikacji działającej w czasie rzeczywistym, postępuj zgodnie z poniższymi wskazówkami, aby uzyskać najlepszą liczbę klatek na sekundę:
- Ogranicz wywołania do narzędzia do etykietowania obrazów. Jeśli nowa klatka wideo stanie się dostępna podczas działania narzędzia do oznaczania obrazów, upuść tę klatkę. Przykład można znaleźć w klasie
VisionProcessorBase
w przykładowej aplikacji szybkiego startu. - Jeśli używasz danych wyjściowych narzędzia do etykietowania obrazów do nakładania grafiki na obraz wejściowy, najpierw uzyskaj wynik, a następnie wyrenderuj obraz i nakładkę w jednym kroku. W ten sposób renderujesz na powierzchni wyświetlania tylko raz dla każdej klatki wejściowej. Przykład można znaleźć w klasach
CameraSourcePreview
iGraphicOverlay
w przykładowej aplikacji szybkiego startu. Jeśli używasz API Camera2, przechwytuj obrazy w formacie
ImageFormat.YUV_420_888
.Jeśli używasz starszego interfejsu Camera API, przechwytuj obrazy w formacie
ImageFormat.NV21
.
Po wytrenowaniu własnego modelu za pomocą AutoML Vision Edge możesz używać go w swojej aplikacji do wykrywania obiektów na obrazach.
Istnieją dwa sposoby integracji modeli przeszkolonych z AutoML Vision Edge: możesz spakować model, umieszczając go w folderze zasobów aplikacji, lub możesz go dynamicznie pobrać z Firebase.
Opcje łączenia modeli | |
---|---|
W pakiecie w Twojej aplikacji |
|
Hostowane z Firebase |
|
Zanim zaczniesz
Jeśli chcesz pobrać model , pamiętaj o dodaniu Firebase do swojego projektu na Androida , jeśli jeszcze tego nie zrobiłeś. Nie jest to wymagane podczas łączenia modelu.
Dodaj zależności dla biblioteki zadań TensorFlow Lite do pliku gradle na poziomie aplikacji modułu, którym zwykle jest
app/build.gradle
:Aby połączyć model z aplikacją:
dependencies { // ... // Object detection with a bundled Auto ML model implementation 'org.tensorflow:tensorflow-lite-task-vision:0.0.0-nightly-SNAPSHOT' }
Aby dynamicznie pobierać model z Firebase, dodaj również zależność Firebase ML:
dependencies { // ... // Object detection with an Auto ML model deployed to Firebase implementation platform('com.google.firebase:firebase-bom:26.1.1') implementation 'com.google.firebase:firebase-ml-model-interpreter' implementation 'org.tensorflow:tensorflow-lite-task-vision:0.0.0-nightly' }
1. Załaduj model
Skonfiguruj lokalne źródło modelu
Aby połączyć model z aplikacją:
- Wyodrębnij model z archiwum ZIP pobranego z Google Cloud Console.
- Dołącz swój model do pakietu aplikacji:
- Jeśli nie masz folderu zasobów w swoim projekcie, utwórz go, klikając prawym przyciskiem myszy
app/
folder, a następnie klikając opcję Nowy > Folder > Folder zasobów . - Skopiuj plik modelu
tflite
z osadzonymi metadanymi do folderu zasobów.
- Jeśli nie masz folderu zasobów w swoim projekcie, utwórz go, klikając prawym przyciskiem myszy
Dodaj następujące elementy do pliku
build.gradle
aplikacji, aby upewnić się, że Gradle nie kompresuje pliku modelu podczas tworzenia aplikacji:android { // ... aaptOptions { noCompress "tflite" } }
Plik modelu zostanie dołączony do pakietu aplikacji i będzie dostępny jako surowy zasób.
Skonfiguruj źródło modelu hostowane przez Firebase
Aby użyć zdalnie hostowanego modelu, utwórz obiekt RemoteModel
, określając nazwę, którą przypisałeś modelowi podczas jego publikowania:
Jawa
// Specify the name you assigned when you deployed the model.
FirebaseCustomRemoteModel remoteModel =
new FirebaseCustomRemoteModel.Builder("your_model").build();
Kotlin
// Specify the name you assigned when you deployed the model.
val remoteModel =
FirebaseCustomRemoteModel.Builder("your_model_name").build()
Następnie uruchom zadanie pobierania modelu, określając warunki, na jakich chcesz zezwolić na pobieranie. Jeśli modelu nie ma na urządzeniu lub dostępna jest nowsza wersja modelu, zadanie asynchronicznie pobierze model z Firebase:
Jawa
DownloadConditions downloadConditions = new DownloadConditions.Builder()
.requireWifi()
.build();
RemoteModelManager.getInstance().download(remoteModel, downloadConditions)
.addOnSuccessListener(new OnSuccessListener<Void>() {
@Override
public void onSuccess(@NonNull Task<Void> task) {
// Success.
}
});
Kotlin
val downloadConditions = DownloadConditions.Builder()
.requireWifi()
.build()
RemoteModelManager.getInstance().download(remoteModel, downloadConditions)
.addOnSuccessListener {
// Success.
}
Wiele aplikacji uruchamia zadanie pobierania w swoim kodzie inicjującym, ale możesz to zrobić w dowolnym momencie, zanim będzie trzeba użyć modelu.
Utwórz wykrywacz obiektów ze swojego modelu
Po skonfigurowaniu źródeł modelu utwórz obiekt ObjectDetector
na podstawie jednego z nich.
Jeśli masz tylko model w pakiecie lokalnym, po prostu utwórz wykrywacz obiektów z pliku modelu i skonfiguruj wymagany próg ufności (zobacz Oceń swój model ):
Jawa
// Initialization
ObjectDetectorOptions options = ObjectDetectorOptions.builder()
.setScoreThreshold(0) // Evaluate your model in the Google Cloud Console
// to determine an appropriate value.
.build();
ObjectDetector objectDetector = ObjectDetector.createFromFileAndOptions(context, modelFile, options);
Kotlin
// Initialization
val options = ObjectDetectorOptions.builder()
.setScoreThreshold(0) // Evaluate your model in the Google Cloud Console
// to determine an appropriate value.
.build()
val objectDetector = ObjectDetector.createFromFileAndOptions(context, modelFile, options)
Jeśli masz model hostowany zdalnie, przed uruchomieniem musisz sprawdzić, czy został pobrany. Stan zadania pobierania modelu można sprawdzić za pomocą metody isModelDownloaded()
menedżera modelu.
Chociaż musisz to potwierdzić tylko przed uruchomieniem detektora obiektów, jeśli masz zarówno model hostowany zdalnie, jak i model w pakiecie lokalnym, może być sensowne wykonanie tego sprawdzenia podczas tworzenia instancji detektora obiektów: utwórz wykrywacz obiektów ze zdalnego modelu, jeśli został pobrany, aw przeciwnym razie z modelu lokalnego.
Jawa
FirebaseModelManager.getInstance().isModelDownloaded(remoteModel)
.addOnSuccessListener(new OnSuccessListener<Boolean>() {
@Override
public void onSuccess(Boolean isDownloaded) {
}
});
Kotlin
FirebaseModelManager.getInstance().isModelDownloaded(remoteModel)
.addOnSuccessListener { success ->
}
Jeśli masz tylko zdalnie hostowany model, powinieneś wyłączyć funkcje związane z modelem — na przykład wyszarzyć lub ukryć część interfejsu użytkownika — do czasu potwierdzenia, że model został pobrany. Można to zrobić, dołączając odbiornik do metody download()
menedżera modeli.
Kiedy już wiesz, że Twój model został pobrany, utwórz wykrywacz obiektów z pliku modelu:
Jawa
FirebaseModelManager.getInstance().getLatestModelFile(remoteModel)
.addOnCompleteListener(new OnCompleteListener<File>() {
@Override
public void onComplete(@NonNull Task<File> task) {
File modelFile = task.getResult();
if (modelFile != null) {
ObjectDetectorOptions options = ObjectDetectorOptions.builder()
.setScoreThreshold(0)
.build();
objectDetector = ObjectDetector.createFromFileAndOptions(
getApplicationContext(), modelFile.getPath(), options);
}
}
});
Kotlin
FirebaseModelManager.getInstance().getLatestModelFile(remoteModel)
.addOnSuccessListener { modelFile ->
val options = ObjectDetectorOptions.builder()
.setScoreThreshold(0f)
.build()
objectDetector = ObjectDetector.createFromFileAndOptions(
applicationContext, modelFile.path, options)
}
2. Przygotuj obraz wejściowy
Następnie dla każdego obrazu, który chcesz oznaczyć etykietą, utwórz obiekt TensorImage
ze swojego obrazu. Możesz utworzyć obiekt TensorImage
z Bitmap
przy użyciu metody fromBitmap
:
Jawa
TensorImage image = TensorImage.fromBitmap(bitmap);
Kotlin
val image = TensorImage.fromBitmap(bitmap)
Jeśli dane obrazu nie znajdują się w Bitmap
, możesz załadować tablicę pikseli, jak pokazano w dokumentach TensorFlow Lite .
3. Uruchom wykrywacz obiektów
Aby wykryć obiekty na obrazie, przekaż obiekt TensorImage
do metody detect()
obiektu ObjectDetector
.
Jawa
List<Detection> results = objectDetector.detect(image);
Kotlin
val results = objectDetector.detect(image)
4. Uzyskaj informacje o obiektach oznaczonych etykietami
Jeśli operacja wykrywania obiektów powiedzie się, zwraca listę obiektów Detection
. Każdy obiekt Detection
reprezentuje coś, co zostało wykryte na obrazie. Możesz uzyskać obwiednię każdego obiektu i jego etykiety.
Na przykład:
Jawa
for (Detection result : results) {
RectF bounds = result.getBoundingBox();
List<Category> labels = result.getCategories();
}
Kotlin
for (result in results) {
val bounds = result.getBoundingBox()
val labels = result.getCategories()
}
Wskazówki dotyczące poprawy wydajności w czasie rzeczywistym
Jeśli chcesz oznaczać obrazy etykietami w aplikacji działającej w czasie rzeczywistym, postępuj zgodnie z poniższymi wskazówkami, aby uzyskać najlepszą liczbę klatek na sekundę:
- Ogranicz wywołania do narzędzia do etykietowania obrazów. Jeśli nowa klatka wideo stanie się dostępna podczas działania narzędzia do oznaczania obrazów, upuść tę klatkę. Przykład można znaleźć w klasie
VisionProcessorBase
w przykładowej aplikacji szybkiego startu. - Jeśli używasz danych wyjściowych narzędzia do etykietowania obrazów do nakładania grafiki na obraz wejściowy, najpierw uzyskaj wynik, a następnie wyrenderuj obraz i nakładkę w jednym kroku. W ten sposób renderujesz na powierzchni wyświetlania tylko raz dla każdej klatki wejściowej. Przykład można znaleźć w klasach
CameraSourcePreview
iGraphicOverlay
w przykładowej aplikacji szybkiego startu. Jeśli używasz API Camera2, przechwytuj obrazy w formacie
ImageFormat.YUV_420_888
.Jeśli używasz starszego interfejsu Camera API, przechwytuj obrazy w formacie
ImageFormat.NV21
.
Po wytrenowaniu własnego modelu za pomocą AutoML Vision Edge możesz używać go w swojej aplikacji do wykrywania obiektów na obrazach.
Istnieją dwa sposoby integracji modeli przeszkolonych z AutoML Vision Edge: możesz spakować model, umieszczając go w folderze zasobów aplikacji, lub możesz go dynamicznie pobrać z Firebase.
Opcje łączenia modeli | |
---|---|
W pakiecie w Twojej aplikacji |
|
Hostowane z Firebase |
|
Zanim zaczniesz
Jeśli chcesz pobrać model , pamiętaj o dodaniu Firebase do swojego projektu na Androida , jeśli jeszcze tego nie zrobiłeś. Nie jest to wymagane podczas łączenia modelu.
Dodaj zależności dla biblioteki zadań TensorFlow Lite do pliku gradle na poziomie aplikacji modułu, którym zwykle jest
app/build.gradle
:Aby połączyć model z aplikacją:
dependencies { // ... // Object detection with a bundled Auto ML model implementation 'org.tensorflow:tensorflow-lite-task-vision:0.0.0-nightly-SNAPSHOT' }
Aby dynamicznie pobierać model z Firebase, dodaj również zależność Firebase ML:
dependencies { // ... // Object detection with an Auto ML model deployed to Firebase implementation platform('com.google.firebase:firebase-bom:26.1.1') implementation 'com.google.firebase:firebase-ml-model-interpreter' implementation 'org.tensorflow:tensorflow-lite-task-vision:0.0.0-nightly' }
1. Załaduj model
Skonfiguruj lokalne źródło modelu
Aby połączyć model z aplikacją:
- Wyodrębnij model z archiwum ZIP pobranego z Google Cloud Console.
- Dołącz swój model do pakietu aplikacji:
- Jeśli nie masz folderu zasobów w swoim projekcie, utwórz go, klikając prawym przyciskiem myszy
app/
folder, a następnie klikając opcję Nowy > Folder > Folder zasobów . - Skopiuj plik modelu
tflite
z osadzonymi metadanymi do folderu zasobów.
- Jeśli nie masz folderu zasobów w swoim projekcie, utwórz go, klikając prawym przyciskiem myszy
Dodaj następujące elementy do pliku
build.gradle
aplikacji, aby upewnić się, że Gradle nie kompresuje pliku modelu podczas tworzenia aplikacji:android { // ... aaptOptions { noCompress "tflite" } }
Plik modelu zostanie dołączony do pakietu aplikacji i będzie dostępny jako surowy zasób.
Skonfiguruj źródło modelu hostowane przez Firebase
Aby użyć zdalnie hostowanego modelu, utwórz obiekt RemoteModel
, określając nazwę, którą przypisałeś modelowi podczas jego publikowania:
Jawa
// Specify the name you assigned when you deployed the model.
FirebaseCustomRemoteModel remoteModel =
new FirebaseCustomRemoteModel.Builder("your_model").build();
Kotlin
// Specify the name you assigned when you deployed the model.
val remoteModel =
FirebaseCustomRemoteModel.Builder("your_model_name").build()
Następnie uruchom zadanie pobierania modelu, określając warunki, na jakich chcesz zezwolić na pobieranie. Jeśli modelu nie ma na urządzeniu lub dostępna jest nowsza wersja modelu, zadanie asynchronicznie pobierze model z Firebase:
Jawa
DownloadConditions downloadConditions = new DownloadConditions.Builder()
.requireWifi()
.build();
RemoteModelManager.getInstance().download(remoteModel, downloadConditions)
.addOnSuccessListener(new OnSuccessListener<Void>() {
@Override
public void onSuccess(@NonNull Task<Void> task) {
// Success.
}
});
Kotlin
val downloadConditions = DownloadConditions.Builder()
.requireWifi()
.build()
RemoteModelManager.getInstance().download(remoteModel, downloadConditions)
.addOnSuccessListener {
// Success.
}
Wiele aplikacji uruchamia zadanie pobierania w swoim kodzie inicjującym, ale możesz to zrobić w dowolnym momencie, zanim będzie trzeba użyć modelu.
Utwórz wykrywacz obiektów ze swojego modelu
Po skonfigurowaniu źródeł modelu utwórz obiekt ObjectDetector
na podstawie jednego z nich.
Jeśli masz tylko model w pakiecie lokalnym, po prostu utwórz wykrywacz obiektów z pliku modelu i skonfiguruj wymagany próg ufności (zobacz Oceń swój model ):
Jawa
// Initialization
ObjectDetectorOptions options = ObjectDetectorOptions.builder()
.setScoreThreshold(0) // Evaluate your model in the Google Cloud Console
// to determine an appropriate value.
.build();
ObjectDetector objectDetector = ObjectDetector.createFromFileAndOptions(context, modelFile, options);
Kotlin
// Initialization
val options = ObjectDetectorOptions.builder()
.setScoreThreshold(0) // Evaluate your model in the Google Cloud Console
// to determine an appropriate value.
.build()
val objectDetector = ObjectDetector.createFromFileAndOptions(context, modelFile, options)
Jeśli masz model hostowany zdalnie, przed uruchomieniem musisz sprawdzić, czy został pobrany. Stan zadania pobierania modelu można sprawdzić za pomocą metody isModelDownloaded()
menedżera modelu.
Chociaż musisz to potwierdzić tylko przed uruchomieniem detektora obiektów, jeśli masz zarówno model hostowany zdalnie, jak i model w pakiecie lokalnym, może być sensowne wykonanie tego sprawdzenia podczas tworzenia instancji detektora obiektów: utwórz wykrywacz obiektów ze zdalnego modelu, jeśli został pobrany, aw przeciwnym razie z modelu lokalnego.
Jawa
FirebaseModelManager.getInstance().isModelDownloaded(remoteModel)
.addOnSuccessListener(new OnSuccessListener<Boolean>() {
@Override
public void onSuccess(Boolean isDownloaded) {
}
});
Kotlin
FirebaseModelManager.getInstance().isModelDownloaded(remoteModel)
.addOnSuccessListener { success ->
}
Jeśli masz tylko zdalnie hostowany model, powinieneś wyłączyć funkcje związane z modelem — na przykład wyszarzyć lub ukryć część interfejsu użytkownika — do czasu potwierdzenia, że model został pobrany. Można to zrobić, dołączając odbiornik do metody download()
menedżera modelu.
Kiedy już wiesz, że Twój model został pobrany, utwórz wykrywacz obiektów z pliku modelu:
Jawa
FirebaseModelManager.getInstance().getLatestModelFile(remoteModel)
.addOnCompleteListener(new OnCompleteListener<File>() {
@Override
public void onComplete(@NonNull Task<File> task) {
File modelFile = task.getResult();
if (modelFile != null) {
ObjectDetectorOptions options = ObjectDetectorOptions.builder()
.setScoreThreshold(0)
.build();
objectDetector = ObjectDetector.createFromFileAndOptions(
getApplicationContext(), modelFile.getPath(), options);
}
}
});
Kotlin
FirebaseModelManager.getInstance().getLatestModelFile(remoteModel)
.addOnSuccessListener { modelFile ->
val options = ObjectDetectorOptions.builder()
.setScoreThreshold(0f)
.build()
objectDetector = ObjectDetector.createFromFileAndOptions(
applicationContext, modelFile.path, options)
}
2. Przygotuj obraz wejściowy
Następnie dla każdego obrazu, który chcesz oznaczyć etykietą, utwórz obiekt TensorImage
ze swojego obrazu. Możesz utworzyć obiekt TensorImage
z Bitmap
przy użyciu metody fromBitmap
:
Jawa
TensorImage image = TensorImage.fromBitmap(bitmap);
Kotlin
val image = TensorImage.fromBitmap(bitmap)
Jeśli dane obrazu nie znajdują się w Bitmap
, możesz załadować tablicę pikseli, jak pokazano w dokumentach TensorFlow Lite .
3. Uruchom wykrywacz obiektów
Aby wykryć obiekty na obrazie, przekaż obiekt TensorImage
do metody detect()
obiektu ObjectDetector
.
Jawa
List<Detection> results = objectDetector.detect(image);
Kotlin
val results = objectDetector.detect(image)
4. Uzyskaj informacje o obiektach oznaczonych etykietami
Jeśli operacja wykrywania obiektów powiedzie się, zwraca listę obiektów Detection
. Każdy obiekt Detection
reprezentuje coś, co zostało wykryte na obrazie. Możesz uzyskać obwiednię każdego obiektu i jego etykiety.
Na przykład:
Jawa
for (Detection result : results) {
RectF bounds = result.getBoundingBox();
List<Category> labels = result.getCategories();
}
Kotlin
for (result in results) {
val bounds = result.getBoundingBox()
val labels = result.getCategories()
}
Wskazówki dotyczące poprawy wydajności w czasie rzeczywistym
Jeśli chcesz oznaczać obrazy etykietami w aplikacji działającej w czasie rzeczywistym, postępuj zgodnie z poniższymi wskazówkami, aby uzyskać najlepszą liczbę klatek na sekundę:
- Ogranicz wywołania do narzędzia do etykietowania obrazów. Jeśli nowa klatka wideo stanie się dostępna podczas działania narzędzia do oznaczania obrazów, upuść tę klatkę. Przykład można znaleźć w klasie
VisionProcessorBase
w przykładowej aplikacji szybkiego startu. - Jeśli używasz danych wyjściowych narzędzia do etykietowania obrazów do nakładania grafiki na obraz wejściowy, najpierw uzyskaj wynik, a następnie wyrenderuj obraz i nakładkę w jednym kroku. W ten sposób renderujesz na powierzchni wyświetlania tylko raz dla każdej klatki wejściowej. Przykład można znaleźć w klasach
CameraSourcePreview
iGraphicOverlay
w przykładowej aplikacji szybkiego startu. Jeśli używasz API Camera2, przechwytuj obrazy w formacie
ImageFormat.YUV_420_888
.Jeśli używasz starszego interfejsu Camera API, przechwytuj obrazy w formacie
ImageFormat.NV21
.