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 w przypadku bibliotek, które zależą od Usług Google Play.
Interfejsy Vision API
Modele połączone są dostarczane jako część aplikacji. Modele cienkie trzeba pobrać. Niektóre interfejsy API są dostępne w wersji połączonej i cienkiej, 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 bibliotek ML Kit na Androida w pliku Gradle na poziomie modułu (aplikacji) (zwykle app/build.gradle) zgodnie z tabelami poniżej:
Modele połączone
| 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
com.google.mlkit:linkfirebase:17.0.0 |
Interfejsy Natural Language API
Modele połączone są dostarczane jako część aplikacji. Modele cienkie trzeba pobrać:
| Interfejs API | Łączenie w pakiety | Cienka |
|---|---|---|
| Identyfikator języka | x | x |
| Inteligentna odpowiedź | x | x (beta) |
Zaktualizuj zależności bibliotek ML Kit na Androida w pliku Gradle na poziomie modułu (aplikacji) (zwykle app/build.gradle) zgodnie z tabelami poniżej:
Modele połączone
| 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 znajduje 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 klas postępuj zgodnie z tymi regułami:
- Usuń z nazwy klasy prefiks
FirebaseVision. - Usuń z nazwy klasy inne prefiksy, które zaczynają się od prefiksu
Firebase.
Ponadto w nazwach pakietów zastąp prefiks com.google.firebase.ml prefiksem com.google.mlkit.
Aktualizowanie nazw metod
Wymagane zmiany w kodzie są minimalne:
- Zmieniono sposób tworzenia instancji detektora, skanera, etykietowania, tłumacza itp. Każda funkcja ma teraz własny punkt wejścia. Na przykład: BarcodeScanning, TextRecognition, ImageLabeling, Translation… Wywołania usługi Firebase
getInstance()są zastępowane wywołaniami metodygetClient()punktu wejścia funkcji. - Usunięto domyślne tworzenie instancji TextRecognizer, 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ść od
com.google.android.gms:play-services-mlkit-text-recognitioni użyjTextRecognition.getClient(TextRecognizerOptions.DEFAULT_OPTIONS). - Usunięto domyślne tworzenie instancji ImageLabeler i ObjectDetector, 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 ImageLabeling, zadeklaruj zależność od
com.google.mlkit:image-labelingi użyjImageLabeling.getClient(ImageLabelerOptions.DEFAULT_OPTIONS)w Javie. - Wszystkie uchwyty (detektor, skaner, etykietowanie, tłumacz itp.) można zamknąć. Sprawdź, czy metoda
close()jest wywoływana, gdy te obiekty nie będą już używane. Jeśli używasz ich w fragmencie lub AppCompatActivity, możesz to zrobić, wywołując LifecycleOwner.getLifecycle() w fragmencie lub AppCompatActivity, a następnie wywołując Lifecycle.addObserver. - W celu zachowania spójności nazwy metod
processImage()idetectInImage()w interfejsach Vision API zostały zmienione naprocess(). - Interfejsy Natural Language API używają teraz terminu „tag języka” (zgodnie ze standardem BCP 47) zamiast „kodu języka”.
- Usunięto metody pobierania w klasach xxxOptions.
- Metoda getBitmap() w klasie InputImage(zastępująca
FirebaseVisionImage) nie jest już obsługiwana w ramach interfejsu publicznego. Aby uzyskać bitmapę przekonwertowaną z różnych danych wejściowych, zapoznaj się z plikiemBitmapUtils.javaw przykładzie szybkiego startu ML Kit. - Usunięto FirebaseVisionImageMetadata. Możesz po prostu przekazać metadane obrazu, takie jak szerokość, wysokość, stopień obrotu i format, do metod konstrukcyjnych InputImages.
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 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 Java:
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 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 dotyczące interfejsu API
Skanowanie kodów kreskowych
W przypadku interfejsu Barcode Scanning API modele można teraz dostarczać na 2 sposoby:
- Za pomocą Usług Google Play, czyli „cienki” (zalecane) – zmniejsza to rozmiar aplikacji, a model jest współdzielony między aplikacjami. Deweloperzy będą jednak musieli się upewnić, że model został pobrany przed pierwszym użyciem.
- W pliku APK aplikacji, czyli „połączony” – zwiększa to rozmiar aplikacji, ale oznacza, że model jest od razu gotowy do użycia.
Te 2 implementacje różnią się nieco od siebie, a wersja „połączona” ma kilka ulepszeń w porównaniu z wersją „cienką”. Szczegółowe informacje o tych różnicach znajdziesz w wytycznych dotyczących interfejsu Barcode Scanning API.
Wykrywanie twarzy
W przypadku interfejsu Face Detection API modele można dostarczać na 2 sposoby:
- Za pomocą Usług Google Play, czyli „cienki” (zalecane) – zmniejsza to rozmiar aplikacji, a model jest współdzielony między aplikacjami. Deweloperzy będą jednak musieli się upewnić, że model został pobrany przed pierwszym użyciem.
- W pliku APK aplikacji, czyli „połączony” – zwiększa to rozmiar pobrania aplikacji, ale oznacza, że model jest od razu gotowy do użycia.
Działanie implementacji jest takie samo.
Tłumaczenie
TranslateLanguageużywa teraz czytelnych nazw stałych (np.ENGLISH) zamiast tagów języka (EN). Są one też teraz @StringDef, a nie @IntDef, a wartość stałej to pasujący tag języka BCP 47.Jeśli Twoja aplikacja używa opcji warunku pobierania „urządzenie jest bezczynne”, pamiętaj, że ta opcja została usunięta i nie można jej już używać. Nadal możesz używać opcji „urządzenie się ładuje”. Jeśli chcesz uzyskać bardziej złożone działanie, możesz opóźnić wywołanie
RemoteModelManager.downloadza pomocą własnej logiki.
AutoML Image Labeling
Jeśli Twoja aplikacja używa opcji warunku pobierania „urządzenie jest bezczynne”, pamiętaj, że ta opcja została usunięta i nie można jej już używać. Nadal możesz używać opcji „urządzenie się ładuje”.
Jeśli chcesz uzyskać bardziej złożone działanie, możesz opóźnić wywołanie RemoteModelManager.download za pomocą własnej logiki.
Wykrywanie i śledzenie obiektów
Jeśli Twoja aplikacja używa wykrywania obiektów z klasyfikacją przybliżoną, 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 przybliżonego są zawarte w klasie PredefinedCategory.
Oto przykład starego i nowego kodu Kotlin:
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 Java:
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 „nieznana” została usunięta. Gdy wiarygodność klasyfikacji obiektu jest niska, nie zwracamy żadnej etykiety.
Usuwanie zależności Firebase (opcjonalnie)
Ten krok ma zastosowanie tylko wtedy, gdy są spełnione te warunki:
- Firebase ML Kit to jedyny komponent Firebase, którego używasz.
- Używasz tylko interfejsów API na urządzeniu.
- Nie używasz udostępniania modeli.
W takim przypadku po migracji możesz usunąć zależności Firebase. Aby to zrobić:
- Usuń plik konfiguracyjny Firebase, usuwając plik konfiguracyjny google-services.json w katalogu modułu (na poziomie aplikacji) swojej aplikacji.
- Zastąp wtyczkę Gradle usług Google 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 Gradle usług Google w pliku Gradle projektu (na poziomie głównym) (build.gradle) ścieżką klasy 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ę w Firebase w konsoli Firebase zgodnie z instrukcjami na stronie pomocy Firebase.
Uzyskiwanie pomocy
Jeśli napotkasz jakieś problemy, zajrzyj na stronę społeczności, na której znajdziesz informacje o kanałach, za pomocą których możesz się z nami skontaktować.