Aktualizowanie importów Gradle
Nowy pakiet SDK wymaga tylko 1 zależności dla każdego interfejsu ML Kit API. Nie musisz określać wspólnych bibliotek, takich jak firebase-ml-vision
czy firebase-ml-natural-language
.
ML Kit używa przestrzeni nazw com.google.android.gms
na potrzeby bibliotek zależnych od Usług Google Play.
Interfejsy API Vision
Modele z pakietu są dostarczane w ramach aplikacji. Trzeba pobrać cienkie modele. Niektóre interfejsy API są dostępne zarówno w pakietach, jak i w formie cienkiej, a inne tylko w jednej lub drugiej:
API | Łączenie w pakiety | Cienka |
---|---|---|
Rozpoznawanie tekstu | x (beta) | x |
Wykrywanie twarzy | x | x |
Skanowanie kodów kreskowych | x | x |
Oznaczanie obrazów etykietami | x | x |
Wykrywanie i śledzenie obiektów | x | - |
Zaktualizuj zależności dla bibliotek ML Kit na Androida w pliku Gradle modułu (na poziomie aplikacji) (zwykle app/build.gradle
), zgodnie z tymi tabelami:
Modele połączone
API | Stare artefakty | Nowy artefakt |
---|---|---|
Skanowanie kodów kreskowych | com.google.firebase:firebase-ml-vision:24.0.1 com.google.firebase:firebase-ml-vision-barcode-model:16.0.1 |
com.google.mlkit:barcode-scanning:17.2.0 |
Konturowanie twarzy | com.google.firebase:firebase-ml-vision:24.0.1 com.google.firebase:firebase-ml-vision-face-model:19.0.0 |
com.google.mlkit:face-detection:16.1.6 |
Oznaczanie obrazów etykietami | com.google.firebase:firebase-ml-vision:24.0.1 com.google.firebase:firebase-ml-vision-image-label-model:19.0.0 |
com.google.mlkit:image-labeling:17.0.8 |
Wykrywanie obiektów | com.google.firebase:firebase-ml-vision:24.0.1 com.google.firebase:firebase-ml-vision-object-detection-model:19.0.3 |
com.google.mlkit:object-detection:17.0.1 |
Cienkie modele
API | Stare artefakty | Nowy artefakt |
---|---|---|
Skanowanie kodów kreskowych | com.google.firebase:firebase-ml-vision:24.0.1 | com.google.android.gms:play-services-mlkit-barcode-scanning:18.3.0 |
Wykrywanie twarzy | com.google.firebase:firebase-ml-vision:24.0.1 | com.google.android.gms:play-services-mlkit-face-detection:17.1.0 |
Rozpoznawanie tekstu | com.google.firebase:firebase-ml-vision:24.0.1 | com.google.android.gms:play-services-mlkit-text-recognition:19.0.0 |
AutoMLVision Edge
API | Stary artefakt | Nowy artefakt |
---|---|---|
AutoML bez pobierania | com.google.firebase:firebase-ml-vision:24.0.1 com.google.firebase:firebase-ml-vision-automl:18.0.3 |
com.google.mlkit:image-labeling-custom:17.0.2 |
AutoML z pobieraniem | com.google.firebase:firebase-ml-vision:24.0.1 com.google.firebase:firebase-ml-vision-automl:18.0.3 |
com.google.mlkit:image-labeling-custom:17.0.2
com.google.mlkit:linkfirebase:17.0.0 |
Interfejsy API Natural Language
Modele z pakietu są dostarczane w ramach aplikacji. Trzeba pobrać cienkie modele:
API | Łączenie w pakiety | Cienka |
---|---|---|
Identyfikator języka | x | x |
Inteligentna odpowiedź | x | x (beta) |
Zaktualizuj zależności dla bibliotek ML Kit na Androida w pliku Gradle modułu (na poziomie aplikacji) (zwykle app/build.gradle
), zgodnie z tymi tabelami:
Modele połączone
API | Stare artefakty | Nowy artefakt |
---|---|---|
Identyfikator języka | com.google.firebase:firebase-ml-natural-language:22.0.0 com.google.firebase:firebase-ml-natural-language-language-id-model:20.0.7 |
com.google.mlkit:language-id:17.0.5 |
Inteligentna odpowiedź | com.google.firebase:firebase-ml-natural-language:22.0.0 com.google.firebase:firebase-ml-natural-language-smart-reply-model:20.0.7 |
com.google.mlkit:smart-reply:17.0.3 |
Cienkie modele
API | Stare artefakty | Nowy artefakt |
---|---|---|
Identyfikator języka | com.google.firebase:firebase-ml-natural-language:22.0.0 com.google.firebase:firebase-ml-natural-language-language-id-model:20.0.7 |
com.google.android.gms:play-services-mlkit-language-id:17.0.0 |
Inteligentna odpowiedź | com.google.firebase:firebase-ml-natural-language:22.0.0 com.google.firebase:firebase-ml-natural-language-smart-reply-model:20.0.7 |
com.google.android.gms:play-services-mlkit-smart-reply:16.0.0-beta1 |
Zaktualizuj nazwy zajęć
Jeśli zajęcia pojawiają się w tej tabeli, wprowadź wskazaną zmianę:
Stara klasa | Nowe zajęcia |
---|---|
com.google.firebase.ml.common.FirebaseMLException | com.google.mlkit.common.MlKitException |
com.google.firebase.ml.vision.common.FirebaseVisionImage | com.google.mlkit.vision.common.InputImage |
com.google.firebase.ml.vision.barcode.FirebaseVisionBarcodeDetector | com.google.mlkit.vision.barcode.BarcodeScanner |
com.google.firebase.ml.vision.labeler.FirebaseVisionImageLabel | com.google.mlkit.vision.label.ImageLabeler |
com.google.firebase.ml.vision.barcode.FirebaseVisionBarcodeDetector | com.google.mlkit.vision.barcode.BarcodeScanner |
com.google.firebase.ml.vision.automl.FirebaseAutoMLLocalModel | com.google.mlkit.common.model.LocalModel |
com.google.firebase.ml.vision.automl.FirebaseAutoMLRemoteModel | com.google.mlkit.common.model.CustomRemoteModel |
com.google.firebase.ml.vision.label.FirebaseVisionOnDeviceImageLabelerOptions | com.google.mlkit.vision.label.defaults.ImageLabelerOptions |
com.google.firebase.ml.vision.label.FirebaseVisionImageLabel | com.google.mlkit.vision.label.ImageLabel |
com.google.firebase.ml.vision.label.FirebaseVisionOnDeviceAutoMLImageLabelerOptions | com.google.mlkit.vision.label.custom.CustomImageLabelerOptions |
com.google.firebase.ml.vision.objects.FirebaseVisionObjectDetectorOptions | com.google.mlkit.vision.objects.defaults.ObjectDetectorOptions |
W przypadku innych zajęć przestrzegaj tych reguł:
- Usuń prefiks
FirebaseVision
z nazwy zajęć. - Usuń z nazwy klasy inne prefiksy, które zaczynają się prefiksem
Firebase
.
Poza tym w nazwach pakietów zastąpisz prefiks com.google.firebase.ml
ciągiem com.google.mlkit
.
Zaktualizuj nazwy metod
Wprowadź nieznaczne zmiany w kodzie:
- Wykrywacz/skaner/oznaczający/tłumacz... wystąpienia zostały zmienione. Każda z tych funkcji ma teraz własny punkt wejścia. Na przykład: skanowanie kodów kreskowych, rozpoznawanie tekstu, etykiety obrazów, tłumaczenie... Wywołania usługi Firebase
getInstance()
są zastępowane wywołaniami metodygetClient()
punktu wejścia funkcji. - Domyślna instancja narzędzia TextRecognizer została usunięta, ponieważ wprowadziliśmy dodatkowe biblioteki do rozpoznawania innych skryptów, takich jak chiński i koreański. Aby używać opcji domyślnych w modelu rozpoznawania tekstu alfabetu łacińskiego, zadeklaruj zależność od
com.google.android.gms:play-services-mlkit-text-recognition
i użyj metodyTextRecognition.getClient(TextRecognizerOptions.DEFAULT_OPTIONS)
. - Domyślne tworzenie instancji ImageLabeler i ObjectDetector zostało usunięte, ponieważ wprowadziliśmy obsługę modeli niestandardowych w przypadku tych 2 funkcji. Aby na przykład używać opcji domyślnych z modelem podstawowym w funkcji ImageLabeling, zadeklaruj zależność od
com.google.mlkit:image-labeling
i użyj elementuImageLabeling.getClient(ImageLabelerOptions.DEFAULT_OPTIONS)
w języku Java. - Można zamknąć wszystkie uchwyty (wykrywacz/skaner/oznaczanie etykietami/tłumacz...). Upewnij się, że metoda
close()
jest wywoływana, gdy te obiekty nie będą już używane. Jeśli używasz ich w elemencie Fragment lub AppCompatActivity, możesz to łatwo zrobić, używając wywołania LifecycleOwner.getLifecycle() z fragmentu lub AppCompatActivity, a potem wywołując Lifecycle.addObserver. - Aby zachować spójność, nazwa
processImage()
idetectInImage()
w interfejsach Vision API została zmieniona naprocess()
. - Interfejsy Natural Language API używają teraz terminu „tag języka” (zgodnie z definicją w standardzie BCP 47), a nie „kod języka”.
- Metody pobierania z klas xxxOptions zostały usunięte.
- Metoda getBitmap() w klasie wejściowej(zastępująca
FirebaseVisionImage
) nie jest już obsługiwana jako część interfejsu publicznego. Aby dowiedzieć się, jak przekonwertować mapę bitową z różnych danych wejściowych, zapoznaj się zBitmapUtils.java
w przykładzie krótkiego wprowadzenia do pakietu ML Kit. - Usunięto metadane obrazu FirebaseVisionImageMetadata, dlatego możesz po prostu przekazać metadane obrazu, takie jak szerokość, wysokość, kierunek obrotów, format, do metod tworzenia elementu InternalImages.
Oto kilka przykładów starych i nowych metod Kotlin:
Stara wersja
// Construct image labeler with base model and default options. val imageLabeler = FirebaseVision.getInstance().onDeviceImageLabeler // Construct object detector with base model and default options. val objectDetector = FirebaseVision.getInstance().onDeviceObjectDetector // Construct face detector with given options val faceDetector = FirebaseVision.getInstance().getVisionFaceDetector(options) // Construct image labeler with local AutoML model val localModel = FirebaseAutoMLLocalModel.Builder() .setAssetFilePath("automl/manifest.json") .build() val autoMLImageLabeler = FirebaseVision.getInstance() .getOnDeviceAutoMLImageLabeler( FirebaseVisionOnDeviceAutoMLImageLabelerOptions.Builder(localModel) .setConfidenceThreshold(0.3F) .build() )
Nowi
// Construct image labeler with base model and default options. val imageLabeler = ImageLabeling.getClient(ImageLabelerOptions.DEFAULT_OPTIONS) // Optional: add life cycle observer lifecycle.addObserver(imageLabeler) // Construct object detector with base model and default options. val objectDetector = ObjectDetection.getClient(ObjectDetectorOptions.DEFAULT_OPTIONS) // Construct face detector with given options val faceDetector = FaceDetection.getClient(options) // Construct image labeler with local AutoML model val localModel = LocalModel.Builder() .setAssetManifestFilePath("automl/manifest.json") .build() val autoMLImageLabeler = ImageLabeling.getClient( CustomImageLabelerOptions.Builder(localModel) .setConfidenceThreshold(0.3F).build())
Oto kilka przykładów starych i nowych metod w Javie:
Stara wersja
// Construct image labeler with base model and default options. FirebaseVisionImageLabeler imagelLabeler = FirebaseVision.getInstance().getOnDeviceImageLabeler(); // Construct object detector with base model and default options. FirebaseVisionObjectDetector objectDetector = FirebaseVision.getInstance().getOnDeviceObjectDetector(); // Construct face detector with given options FirebaseVisionFaceDetector faceDetector = FirebaseVision.getInstance().getVisionFaceDetector(options); // Construct image labeler with local AutoML model FirebaseAutoMLLocalModel localModel = new FirebaseAutoMLLocalModel.Builder() .setAssetFilePath("automl/manifest.json") .build(); FirebaseVisionImageLabeler autoMLImageLabeler = FirebaseVision.getInstance() .getOnDeviceAutoMLImageLabeler( FirebaseVisionOnDeviceAutoMLImageLabelerOptions.Builder(localModel) .setConfidenceThreshold(0.3F) .build());
Nowi
// Construct image labeler with base model and default options. ImageLabeler imageLabeler = ImageLabeling.getClient(ImageLabelerOptions.DEFAULT_OPTIONS); // Optional: add life cycle observer getLifecycle().addObserver(imageLabeler); // Construct object detector with base model and default options. ObjectDetector objectDetector = ObjectDetection.getClient(ObjectDetectorOptions.DEFAULT_OPTIONS); // Construct face detector with given options FaceDetector faceDetector = FaceDetection.getClient(options); // Construct image labeler with local AutoML model LocalModel localModel = new LocalModel.Builder() .setAssetManifestFilePath("automl/manifest.json") .build(); ImageLabeler autoMLImageLabeler = ImageLabeling.getClient( new CustomImageLabelerOptions.Builder(localModel) .setConfidenceThreshold(0.3F).build());
Zmiany związane z interfejsem API
Skanowanie kodu kreskowego
W przypadku interfejsu Barcode Scanning API modele można teraz dostarczać na 2 sposoby:
- Za pomocą Usług Google Play nazywanych „cienkim” (zalecane) – zmniejsza to rozmiar aplikacji, a model jest współużytkowany przez aplikacje. Deweloperzy muszą jednak pobrać model, zanim będą go używać po raz pierwszy.
- W przypadku pliku APK aplikacji nazywanego „pakietem” – rozmiar aplikacji zwiększa się, ale model jest od razu gotowy do użycia.
Te 2 implementacje nieco się różnią, a „pakiet” oferuje szereg ulepszeń w porównaniu z wersją „cieńką”. Szczegółowe informacje na temat tych różnic można znaleźć w wytycznych dotyczących Barcode Scanning API.
Wykrywanie twarzy
W przypadku interfejsu Face Detection modele można dostarczać na 2 sposoby:
- Za pomocą Usług Google Play nazywanych „cienkim” (zalecane) – zmniejsza to rozmiar aplikacji, a model jest współużytkowany przez aplikacje. Deweloperzy muszą jednak pobrać model, zanim będą go używać po raz pierwszy.
- W przypadku pliku APK aplikacji nazywanego „pakietem” – rozmiar aplikacji zwiększa się, ale model jest od razu gotowy do użycia.
Sposób działania implementacji jest taki sam.
Tłumaczenie
Wartością stałej
TranslateLanguage
są teraz czytelne nazwy (np.ENGLISH
) zamiast tagów języka (EN
). Obecnie są to @StringDef, a nie @IntDef. Wartością stałej jest pasujący tag języka BCP 47.Jeśli Twoja aplikacja korzysta z opcji pobierania „Urządzenie bezczynne”, pamiętaj, że ta opcja została usunięta i nie można jej już używać. Nadal możesz korzystać z opcji ładowania urządzenia. Jeśli chcesz uzyskać bardziej złożone działanie, możesz opóźnić wywołanie metody
RemoteModelManager.download
, korzystając z własnych algorytmów.
Oznaczanie obrazów etykietami za pomocą AutoML
Jeśli Twoja aplikacja korzysta z opcji pobierania „Urządzenie bezczynne”, pamiętaj, że ta opcja została usunięta i nie można jej już używać. Nadal możesz korzystać z opcji ładowania urządzenia.
Jeśli chcesz uzyskać bardziej złożone działanie, możesz opóźnić wywołanie funkcji RemoteModelManager.download
, które działają samodzielnie.
Wykrywanie i śledzenie obiektów
Jeśli Twoja aplikacja używa wykrywania obiektów z przybliżoną klasyfikacją, pamiętaj, że nowy pakiet SDK zmienił sposób, w jaki zwraca kategorię klasyfikacji wykrytych obiektów.
Kategoria klasyfikacji jest zwracana jako instancja DetectedObject.Label
, a nie liczba całkowita. Wszystkie możliwe kategorie przybliżonego klasyfikatora są uwzględnione w klasie PredefinedCategory
.
Oto przykład starego i nowego kodu Kotlin:
Stara wersja
if (object.classificationCategory == FirebaseVisionObject.CATEGORY_FOOD) { ... }
Nowi
if (!object.labels.isEmpty() && object.labels[0].text == PredefinedCategory.FOOD) { ... } // or if (!object.labels.isEmpty() && object.labels[0].index == PredefinedCategory.FOOD_INDEX) { ... }
Oto przykład starego i nowego kodu Java:
Stara wersja
if (object.getClassificationCategory() == FirebaseVisionObject.CATEGORY_FOOD) { ... }
Nowi
if (!object.getLabels().isEmpty() && object.getLabels().get(0).getText().equals(PredefinedCategory.FOOD)) { ... } // or if (!object.getLabels().isEmpty() && object.getLabels().get(0).getIndex() == PredefinedCategory.FOOD_INDEX) { ... }
Kategoria „Nieznany”. Gdy wiarygodność klasyfikacji obiektu jest niska, po prostu nie zwracamy żadnej etykiety.
Usuń zależności Firebase (opcjonalnie)
Ten krok ma zastosowanie tylko wtedy, gdy są spełnione te warunki:
- Firebase ML Kit to jedyny komponent Firebase, z którego korzystasz.
- Używasz tylko interfejsów API działających na urządzeniu.
- Nie używasz udostępniania modelu.
W takim przypadku możesz usunąć zależności Firebase po zakończeniu migracji. Aby to zrobić:
- Usuń plik konfiguracji Firebase, usuwając plik konfiguracyjny google-services.json znajdujący się w katalogu modułu (na poziomie aplikacji) swojej aplikacji.
- Zastąp wtyczkę usług Google do obsługi Gradle w pliku Gradle modułu (na poziomie aplikacji) (zwykle app/build.gradle) wtyczką Strict Version Matcher:
Przed
apply plugin: 'com.android.application' apply plugin: 'com.google.gms.google-services' // Google Services plugin android { // … }
Po
apply plugin: 'com.android.application' apply plugin: 'com.google.android.gms.strict-version-matcher-plugin' android { // … }
- Zastąp ścieżkę klasy wtyczki usług Google do obsługi Gradle w pliku Gradle (build.gradle) w projekcie (na poziomie katalogu głównym) tą z wtyczki Strict Version Matcher:
Przed
buildscript { dependencies { // ... classpath 'com.google.gms:google-services:4.3.3' // Google Services plugin } }
Po
buildscript { dependencies { // ... classpath 'com.google.android.gms:strict-version-matcher-plugin:1.2.1' } }
Usuń aplikację Firebase w konsoli Firebase zgodnie z instructions na stronie pomocy Firebase.
Jak uzyskać pomoc
Jeśli napotkasz jakieś problemy, zajrzyj na stronę Społeczność, gdzie znajdziesz informacje o kanałach, za pomocą których można się z nami skontaktować.