Aktualizowanie importów Gradle
Nowy pakiet SDK wymaga tylko jednej 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 zależnych od Usług Google Play.
Interfejsy Vision API
Modele w pakiecie są dostarczane jako część aplikacji. Musisz pobrać cienkie modele. Niektóre interfejsy API są dostępne zarówno w formie pakietu, jak i w niepełnej postaci, a inne tylko w jednej lub innej postaci:
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 modułu (na poziomie aplikacji) (zwykle app/build.gradle
) zgodnie z tymi tabelami:
Modele w pakiecie
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 |
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.6 |
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.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 języka naturalnego
Modele w pakiecie są dostarczane jako część aplikacji. Musisz pobrać cienkie modele:
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 modułu (na poziomie aplikacji) (zwykle app/build.gradle
) zgodnie z tymi tabelami:
Modele w pakiecie
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 Twoje zajęcia znajdują 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 zajęć inne prefiksy zaczynające się od prefiksu
Firebase
.
Poza tym w nazwach pakietów zastąp com.google.firebase.ml
prefiksem com.google.mlkit
.
Zaktualizuj nazwy metod
W kodzie wprowadzono niewiele zmian:
- Wykrywacz/skaner/etykieter/tłumacz... zmieniono wystąpienie. Każda funkcja 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 cech. - Domyślne wystąpienie narzędzia TextHandler zostało usunięte, 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 alfabetu łacińskiego, zadeklaruj zależność od kolumny
com.google.android.gms:play-services-mlkit-text-recognition
i użyj wartościTextRecognition.getClient(TextRecognizerOptions.DEFAULT_OPTIONS)
. - Domyślna instancja obiektów ImageLabeler i ObjectDetector została usunięta, ponieważ wprowadziliśmy obsługę tych 2 funkcji w modelach niestandardowych. Aby na przykład użyć opcji domyślnych z modelem podstawowym w ImageLabeling, zadeklaruj zależność od parametru
com.google.mlkit:image-labeling
i użyj wartościImageLabeling.getClient(ImageLabelerOptions.DEFAULT_OPTIONS)
w języku Java. - Wszystkie uchwyty (wykrywacz/skaner/etykieter/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 we fragmencie z fragmentem lub AppCompatActivity, możesz to zrobić w prosty sposób, używając metody LifecycleOwner.getLifecycle() we fragmencie lub AppCompatActivity, a następnie wybierając metodę Lifecycle.addObserver. - Nazwy
processImage()
idetectInImage()
w interfejsach Vision API zostały zmienione naprocess()
w celu zachowania spójności. - Interfejsy Natural Language API zamiast „kodu języka” używają teraz terminu „tag języka” (zgodnie ze standardem BCP 47).
- Metody pobierania w klasach xxxOptions zostały usunięte.
- Metoda getBitmap() w klasie wejściowej(zastępujące
FirebaseVisionImage
) nie jest już obsługiwana w ramach interfejsu publicznego. Aby dowiedzieć się, jak przekonwertować bitmapę z różnych danych wejściowych, zapoznaj się zBitmapUtils.java
w przykładzie krótkiego wprowadzenia do pakietu ML Kit. - Metadane FirebaseVisionImageMetadata zostały usunięte. Do metod konstruowania obiektów wejściowych można przesyłać tylko metadane obrazu, takie jak szerokość, wysokość czy format obrotu.
Oto kilka przykładów starych i nowych metod Kotlina:
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() )
Nowość
// 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());
Nowość
// 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 mogą być dostarczane:
- Za pomocą Usług Google Play lub „cienkich” (zalecane) – zmniejsza to rozmiar aplikacji, a model jest wspólny dla wielu aplikacji. Deweloperzy muszą jednak pobrać model przed pierwszym użyciem.
- W przypadku pliku APK aplikacji nazywanego „pakietem” – zwiększa to rozmiar aplikacji, ale oznacza, że z modelu można od razu korzystać.
Obie implementacje nieco się różnią, a wersja „w pakiecie” ma znacznie więcej ulepszeń niż wersja „cienka”. Szczegółowe informacje na temat tych różnic można znaleźć w wytycznych dotyczących interfejsu Barcode Scanning API.
Wykrywanie twarzy
W przypadku interfejsu Face Detection API modele mogą być dostarczane:
- Za pomocą Usług Google Play lub „cienkich” (zalecane) – zmniejsza to rozmiar aplikacji, a model jest wspólny dla wielu aplikacji. Deweloperzy muszą jednak pobrać model przed pierwszym użyciem.
- W przypadku pliku APK aplikacji nazywanego „pakietem” – zwiększa to rozmiar pobieranej aplikacji, ale oznacza, że z modelu można od razu korzystać.
Sposób działania implementacji jest taki sam.
Tłumaczenie
Funkcja
TranslateLanguage
używa teraz czytelnych nazw dla swoich stałych (np.ENGLISH
) zamiast tagów języka (EN
). Zamiast @IntDef mamy też postać @StringDef, a wartością stałej jest pasujący tag języka BCP 47.Jeśli Twoja aplikacja korzysta z opcji pobierania „Bezczynne urządzenie”, 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 bardziej złożone zachowanie, możesz opóźnić wywołanie funkcji
RemoteModelManager.download
za pomocą własnej logiki.
Oznaczanie obrazów etykietami w AutoML
Jeśli Twoja aplikacja korzysta z opcji pobierania „Bezczynne urządzenie”, pamiętaj, że ta opcja została usunięta i nie można już z niej korzystać. Nadal możesz korzystać z opcji ładowania urządzenia.
Jeśli chcesz bardziej złożone zachowanie, możesz opóźnić wywołanie funkcji RemoteModelManager.download
za pomocą własnej logiki.
Wykrywanie i śledzenie obiektów
Jeśli Twoja aplikacja używa wykrywania obiektów z przybliżoną klasyfikacją, nowy pakiet SDK zmienił sposób zwracania kategorii klasyfikacji wykrytych obiektów.
Kategoria klasyfikacji jest zwracana jako instancja DetectedObject.Label
, a nie liczba całkowita. Klasa PredefinedCategory
obejmuje wszystkie możliwe kategorie klasyfikatora przybliżonego.
Oto przykład starego i nowego kodu Kotlin:
Stara wersja
if (object.classificationCategory == FirebaseVisionObject.CATEGORY_FOOD) { ... }
Nowość
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:
Stara wersja
if (object.getClassificationCategory() == FirebaseVisionObject.CATEGORY_FOOD) { ... }
Nowość
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 poziom ufności klasyfikacji obiektu jest niski, po prostu nie zwracamy żadnej etykiety.
Usuń zależności Firebase (opcjonalnie)
Ten krok ma zastosowanie tylko wtedy, gdy są spełnione te warunki:
- Jedynym komponentem Firebase, którego używasz, jest Firebase ML Kit.
- używasz tylko interfejsów API działających na urządzeniu;
- Nie korzystasz z udostępniania modeli.
W takim przypadku możesz usunąć zależności Firebase po migracji. Aby to zrobić:
- Usuń plik konfiguracji Firebase, usuwając plik konfiguracyjny google-services.json w katalogu modułu (na poziomie aplikacji) 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 do obsługi Gradle usług Google w pliku Gradle (build.gradle) projektu (na poziomie głównym) ścieżką dla 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 z konsoli Firebase zgodnie z instructions na stronie pomocy Firebase.
Jak uzyskać pomoc
Jeśli napotkasz jakieś problemy, zajrzyj na stronę społeczności, na której znajdziesz kanały, za pomocą których możesz się z nami skontaktować.