Z tego przewodnika dowiesz się, jak przejść z ML Kit na Firebase na Androida.
Aktualizowanie importów Gradle
Pakiet SDK ML Kit wymaga tylko jednej zależności dla każdego interfejsu API ML Kit. Nie musisz określać popularnych bibliotek, takich jak firebase-ml-vision czy firebase-ml-natural-language. ML Kit używa przestrzeni nazw com.google.android.gms
w przypadku bibliotek, które zależą od Usług Google Play.
Interfejsy Vision API
Modele pakietowe są dostarczane w ramach aplikacji. Modele cienkie muszą być pobrane. Niektóre interfejsy API są dostępne w wersji pakietowej i uproszczonej, a inne tylko w jednej z nich:
| Interfejs API | Łączenie w pakiety | Cienka |
|---|---|---|
| Rozpoznawanie tekstu | x (beta) | x |
| Wykrywanie twarzy | x | x |
| Skanowanie kodów kreskowych | x | x |
| Dodawanie etykiet do obrazów | 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.kts) zgodnie z tymi tabelami:
Modele łączone w pakiety
| Interfejs 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.3.0 |
| Kontur 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.7 |
| Dodawanie etykiet do obrazów | 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.9 |
| 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.2 |
Modele cienkie
| Interfejs 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.1 |
| 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.1 |
AutoMLVision Edge
| Interfejs 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.3 |
| 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.3
Aby hostować i pobierać modele niestandardowe, przenieś je do Cloud Storage i dodaj do aplikacji logikę pobierania, aby wczytywać je za pomocą LocalModel. Szczegółowe informacje znajdziesz w
przewodniku po migracji z Firebase ML do Cloud Storage. |
Interfejsy Natural Language API
Modele pakietowe są dostarczane w ramach aplikacji. Modele cienkie muszą być pobrane:
| Interfejs 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.kts) zgodnie z tymi tabelami:
Modele łączone w pakiety
| Interfejs 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.6 |
| 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.4 |
Modele cienkie
| Interfejs 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 |
Aktualizowanie nazw zajęć
Jeśli Twoja klasa pojawi 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.LocalModel Wymaga ręcznego pobrania. Modele zdalne hostowane w Firebase zostały wycofane. Szczegółowe informacje znajdziesz w przewodniku po migracji z Firebase ML do Cloud Storage. |
| 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 klas postępuj zgodnie z tymi regułami:
- Usuń prefiks
FirebaseVisionz nazwy zajęć. - Usuń z nazwy klasy inne prefiksy, które zaczynają się od prefiksu
Firebase.
W nazwach pakietów zastąp też prefiks com.google.firebase.ml prefiksem com.google.mlkit.
Aktualizowanie nazw metod
Wymaga to minimalnych zmian w kodzie:
- Zmieniono instancję detektora, skanera, etykietowania lub tłumacza. Każda funkcja ma teraz własny punkt wejścia. Na przykład:
BarcodeScanning,TextRecognition,ImageLabeling,Translation... Wywołania usługi FirebasegetInstance()są zastępowane wywołaniami metodygetClient()punktu wejścia funkcji. - Domyślna instancja dla
TextRecognizerzostał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 z modelem rozpoznawania tekstu w alfabecie łacińskim, zadeklaruj zależność odcom.google.android.gms:play-services-mlkit-text-recognitioni użyjTextRecognition.getClient(TextRecognizerOptions.DEFAULT_OPTIONS). - Domyślne tworzenie instancji dla
ImageLabeleriObjectDetectorzostało usunięte, ponieważ wprowadziliśmy obsługę modeli niestandardowych w przypadku tych 2 funkcji. Aby na przykład użyć opcji domyślnych z modelem podstawowym w usłudzeImageLabeling, zadeklaruj zależność odcom.google.mlkit:image-labelingi użyjImageLabeling.getClient(ImageLabelerOptions.DEFAULT_OPTIONS)w Javie. - Wszystkie uchwyty (detektor, skaner, etykietujący, tłumacz...) można zamknąć. Upewnij się, że metoda
close()jest wywoływana, gdy te obiekty nie będą już używane. Jeśli używasz ich wFragmentlubAppCompatActivity, możesz to zrobić, wywołując funkcję callLifecycleOwner.getLifecycle()wFragmentlubAppCompatActivity, a następnie wywołując funkcjęLifecycle.addObserver. processImage()idetectInImage()w interfejsach Vision API zostały zmienione naprocess(), aby zachować spójność.- Interfejsy Natural Language API używają teraz terminu „tag języka” (zgodnie z standardem BCP 47) zamiast „kodu języka”.
- Metody pobierania w klasach
xxxOptionszostały usunięte. - Metoda
getBitmap()w klasieInputImage(zastępującaFirebaseVisionImage) nie jest już obsługiwana w ramach interfejsu publicznego. Aby uzyskać mapę bitową przekonwertowaną z różnych danych wejściowych, zapoznaj się zBitmapUtils.javaw przykładowym projekcie ML Kit. FirebaseVisionImageMetadatazostał usunięty, możesz po prostu przekazać metadane obrazu, takie jakwidth,height,rotationDegrees,format, do metod konstrukcyjnychInputImage.
Oto kilka przykładów starych i nowych metod Kotlin:
Stary
// 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() )
Nowy
// Construct image labeler with base model and default options. val imageLabeler = ImageLabeling.getClient(ImageLabelerOptions.DEFAULT_OPTIONS) // Optional: add lifecycle 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 przykłady starych i nowych metod w Javie:
Stary
// 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());
Nowy
// Construct image labeler with base model and default options. ImageLabeler imageLabeler = ImageLabeling.getClient( ImageLabelerOptions.DEFAULT_OPTIONS ); // Optional: add lifecycle 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 dotyczące interfejsu API
Skanowanie kodów kreskowych
W przypadku interfejsu Barcode Scanning API modele mogą być teraz dostarczane na 2 sposoby:
- Za pomocą usług Google Play, czyli „cienki” (zalecany) – zmniejsza rozmiar aplikacji, a model jest współdzielony między aplikacjami. Deweloperzy muszą jednak zadbać o to, aby model został pobrany przed pierwszym użyciem.
- Z plikiem APK aplikacji, czyli „w pakiecie” – zwiększa to rozmiar aplikacji, ale oznacza, że model jest od razu gotowy do użycia.
Te 2 implementacje nieco się od siebie różnią. Wersja „pakietowa” ma kilka ulepszeń w porównaniu z wersją „uproszczoną”. Szczegółowe informacje o tych różnicach znajdziesz we wskazówkach dotyczących interfejsu Barcode Scanning API.
Wykrywanie twarzy
W przypadku interfejsu Face Detection API modele mogą być dostarczane na 2 sposoby:
- Za pomocą usług Google Play, czyli „cienki” (zalecany) – zmniejsza rozmiar aplikacji, a model jest współdzielony między aplikacjami. Deweloperzy muszą jednak zadbać o to, aby model został pobrany przed pierwszym użyciem.
- Z plikiem APK aplikacji, czyli „w pakiecie” – zwiększa to rozmiar pobierania aplikacji, ale oznacza, że model jest od razu gotowy do użycia.
Działanie tych implementacji jest takie samo.
Tłumaczenie
TranslateLanguageużywa teraz czytelnych nazw stałych (np.ENGLISH) zamiast tagów języków (EN). Są one też teraz@StringDefzamiast@IntDef, a wartością stałej jest pasujący tag języka w standardzie BCP 47.
AutoML Image Labeling (wycofane)
Pobieranie modeli niestandardowych do etykietowania obrazów za pomocą AutoML zostało wycofane i zostanie wyłączone 15 czerwca 2027 r. Do hostowania modeli należy używać Cloud Storage i dodać do aplikacji logikę pobierania, aby pobierać modele. Szczegółowe informacje znajdziesz w przewodniku po migracji z Firebase ML do Cloud Storage.
Wykrywanie i śledzenie obiektów
Jeśli Twoja aplikacja korzysta z wykrywania obiektów z grubym podziałem na kategorie, pamiętaj, że nowy pakiet SDK zmienił sposób zwracania kategorii klasyfikacji wykrytych obiektów.
Kategoria klasyfikacji jest zwracana jako instancja DetectedObject.Label zamiast liczby całkowitej. Wszystkie możliwe kategorie klasyfikatora zgrubnego są uwzględnione w klasie PredefinedCategory.
Oto przykład starego i nowego kodu w Kotlinie:
Stary
if (object.classificationCategory == FirebaseVisionObject.CATEGORY_FOOD) { ... }
Nowy
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 w Javie:
Stary
if (object.getClassificationCategory() == FirebaseVisionObject.CATEGORY_FOOD) { ... }
Nowy
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 „Nieznane” została usunięta. Gdy ufność klasyfikacji obiektu jest niska, nie zwracamy żadnej etykiety.
Usuwanie zależności Firebase
Po migracji usuń zależności Firebase. Wykonaj te czynności:
- Usuń plik konfiguracyjny Firebase, usuwając plik konfiguracyjny
google-services.jsonw katalogu modułu (na poziomie aplikacji). - Zastąp wtyczkę Gradle usług Google w pliku Gradle na poziomie modułu (aplikacji) (zwykle
app/build.gradle.kts) wtyczką Strict Version Matcher:
Przed
plugins { id("com.android.application") id("com.google.gms.google-services") } android { // … }
Po
plugins { id("com.android.application") id("com.google.android.gms.strict-version-matcher-plugin") } android { // … }
- Zastąp ścieżkę klasy wtyczki Gradle usług Google w pliku Gradle projektu (na poziomie głównym) (
build.gradle.kts) ścieżką klasy wtyczki Strict Version Matcher:
Przed
buildscript { dependencies { // ... classpath("com.google.gms:google-services:4.3.3") } }
Po
buildscript { dependencies { // ... classpath("com.google.android.gms:strict-version-matcher-plugin:1.2.1") } }
Usuń aplikację Firebase w konsoli Firebase zgodnie z instrukcjami na stronie pomocy Firebase.
Uzyskiwanie pomocy
Jeśli napotkasz jakiekolwiek problemy, zajrzyj na naszą stronę społeczności, gdzie znajdziesz informacje o kanałach, za pomocą których możesz się z nami skontaktować.