Catch up on everything announced at Firebase Summit, and learn how Firebase can help you accelerate app development and run your app with confidence. Learn More

Wykrywaj obiekty na obrazach za pomocą modelu nauczonego AutoML na Androidzie

Zadbaj o dobrą organizację dzięki kolekcji Zapisuj i kategoryzuj treści zgodnie ze swoimi preferencjami.

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
  • Model jest częścią pakietu APK Twojej aplikacji
  • Model jest dostępny natychmiast, nawet gdy urządzenie z Androidem jest offline
  • Nie ma potrzeby posiadania projektu Firebase
Hostowane z Firebase
  • Hostuj model, przesyłając go do Firebase Machine Learning
  • Zmniejsza rozmiar pliku APK
  • Model jest pobierany na żądanie
  • Wypychaj aktualizacje modelu bez ponownego publikowania aplikacji
  • Łatwe testowanie A/B dzięki zdalnej konfiguracji Firebase
  • Wymaga projektu Firebase

Zanim zaczniesz

  1. 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.

  2. 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ą:

  1. Wyodrębnij model z archiwum ZIP pobranego z Google Cloud Console.
  2. Dołącz swój model do pakietu aplikacji:
    1. 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 .
    2. Skopiuj plik modelu tflite z osadzonymi metadanymi do folderu zasobów.
  3. 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 i GraphicOverlay 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
  • Model jest częścią pakietu APK Twojej aplikacji
  • Model jest dostępny natychmiast, nawet gdy urządzenie z Androidem jest offline
  • Nie ma potrzeby posiadania projektu Firebase
Hostowane z Firebase
  • Hostuj model, przesyłając go do Firebase Machine Learning
  • Zmniejsza rozmiar pliku APK
  • Model jest pobierany na żądanie
  • Wypychaj aktualizacje modelu bez ponownego publikowania aplikacji
  • Łatwe testowanie A/B dzięki zdalnej konfiguracji Firebase
  • Wymaga projektu Firebase

Zanim zaczniesz

  1. 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.

  2. 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ą:

  1. Wyodrębnij model z archiwum ZIP pobranego z Google Cloud Console.
  2. Dołącz swój model do pakietu aplikacji:
    1. 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 .
    2. Skopiuj plik modelu tflite z osadzonymi metadanymi do folderu zasobów.
  3. 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 i GraphicOverlay 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
  • Model jest częścią pakietu APK Twojej aplikacji
  • Model jest dostępny natychmiast, nawet gdy urządzenie z Androidem jest offline
  • Nie ma potrzeby posiadania projektu Firebase
Hostowane z Firebase
  • Hostuj model, przesyłając go do Firebase Machine Learning
  • Zmniejsza rozmiar pliku APK
  • Model jest pobierany na żądanie
  • Wypychaj aktualizacje modelu bez ponownego publikowania aplikacji
  • Łatwe testowanie A/B dzięki zdalnej konfiguracji Firebase
  • Wymaga projektu Firebase

Zanim zaczniesz

  1. 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.

  2. 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ą:

  1. Wyodrębnij model z archiwum ZIP pobranego z Google Cloud Console.
  2. Dołącz swój model do pakietu aplikacji:
    1. 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 .
    2. Skopiuj plik modelu tflite z osadzonymi metadanymi do folderu zasobów.
  3. 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 i GraphicOverlay 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 .