Обновление импорта Gradle
 Новый SDK требует только одну зависимость для каждого API ML Kit. Вам не нужно указывать распространённые библиотеки, такие как firebase-ml-vision или firebase-ml-natural-language . ML Kit использует пространство имён com.google.android.gms для библиотек, зависящих от сервисов Google Play.
API-интерфейсы Vision
Связанные модели поставляются как часть вашего приложения. Тонкие модели необходимо загрузить. Некоторые API доступны как в связанной, так и в тонкой форме, другие — только в одной из этих форм:
| API | В комплекте | Тонкий | 
|---|---|---|
| Распознавание текста | х (бета) | х | 
| Распознавание лиц | х | х | 
| Сканирование штрих-кода | х | х | 
| Маркировка изображений | х | х | 
| Обнаружение и отслеживание объектов | х | - | 
 Обновите зависимости для библиотек ML Kit Android в файле Gradle вашего модуля (уровня приложения) (обычно app/build.gradle ) в соответствии со следующими таблицами:
Модели в комплекте
| API | Старые артефакты | Новый Артефакт | 
|---|---|---|
| Сканирование штрих-кода | 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 | 
| Контур лица | 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 | 
| Маркировка изображений | 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 | 
| Обнаружение объектов | 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 | 
Худые модели
| API | Старые артефакты | Новый Артефакт | 
|---|---|---|
| Сканирование штрих-кода | com.google.firebase:firebase-ml-vision:24.0.1 | com.google.android.gms:play-services-mlkit-barcode-scanning:18.3.1 | 
| Распознавание лиц | com.google.firebase:firebase-ml-vision:24.0.1 | com.google.android.gms:play-services-mlkit-face-detection:17.1.0 | 
| Распознавание текста | com.google.firebase:firebase-ml-vision:24.0.1 | com.google.android.gms:play-services-mlkit-text-recognition:19.0.1 | 
AutoMLVision Edge
| API | Старый артефакт | Новый Артефакт | 
|---|---|---|
| AutoML без скачивания | 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 с загрузкой | 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 | 
API естественного языка
Модели в комплекте поставляются вместе с заявкой. Тонкие модели необходимо загрузить:
| API | В комплекте | Тонкий | 
|---|---|---|
| Идентификатор языка | х | х | 
| Умный ответ | х | х (бета) | 
 Обновите зависимости для библиотек ML Kit Android в файле Gradle вашего модуля (уровня приложения) (обычно app/build.gradle ) в соответствии со следующими таблицами:
Модели в комплекте
| API | Старые артефакты | Новый Артефакт | 
|---|---|---|
| Идентификатор языка | 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 | 
| Умный ответ | 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 | 
Худые модели
| API | Старые артефакты | Новый Артефакт | 
|---|---|---|
| Идентификатор языка | 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 | 
| Умный ответ | 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 | 
Обновить имена классов
Если ваш класс присутствует в этой таблице, внесите указанные изменения:
| Старый класс | Новый класс | 
|---|---|
| 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 | 
Для других классов следуйте следующим правилам:
-  Удалите префикс FirebaseVisionиз имени класса.
-  Удалите из имени класса другие префиксы, начинающиеся с префикса Firebase.
 Также в названиях пакетов замените префикс com.google.firebase.ml на com.google.mlkit .
Обновить имена методов
Изменения кода минимальны:
-  Изменена реализация детектора/сканера/маркировщика/транслятора… Теперь у каждой функции есть своя точка входа. Например: BarcodeScanning, TextRecognition, ImageLabeling, Translation… Вызовы метода getInstance()сервиса Firebase заменены вызовами методаgetClient()точки входа функции.
-  Удален экземпляр TextRecognizer по умолчанию, поскольку мы добавили дополнительные библиотеки для распознавания других письменностей, таких как китайская и корейская. Чтобы использовать параметры по умолчанию с моделью распознавания текста на латинице, объявите зависимость от com.google.android.gms:play-services-mlkit-text-recognitionи используйтеTextRecognition.getClient(TextRecognizerOptions.DEFAULT_OPTIONS).
-  Создание экземпляров по умолчанию для ImageLabeler и ObjectDetector было удалено, поскольку мы добавили поддержку пользовательских моделей для этих двух функций. Например, чтобы использовать параметры по умолчанию с базовой моделью в ImageLabeling, объявите зависимость от com.google.mlkit:image-labelingи используйтеImageLabeling.getClient(ImageLabelerOptions.DEFAULT_OPTIONS)в Java.
-  Все обработчики (детектор/сканер/маркировщик/транслятор…) можно закрыть. Убедитесь, что метод close()вызывается, когда эти объекты больше не будут использоваться. Если вы используете их во фрагменте или AppCompatActivity, один из простых способов сделать это — вызвать LifecycleOwner.getLifecycle() во фрагменте или AppCompatActivity, а затем вызвать Lifecycle.addObserver.
-  processImage()иdetectInImage()в API Vision были переименованы вprocess()для обеспечения единообразия.
- API естественного языка теперь используют термин «языковой тег» (согласно определению стандарта BCP 47 ) вместо «языкового кода».
- Методы получения в классах xxxOptions были удалены.
-  Метод getBitmap() в классе InputImage (заменяющий FirebaseVisionImage) больше не поддерживается в качестве части открытого интерфейса. Чтобы преобразовать растровые изображения из различных входных данных, обратитесь к файлуBitmapUtils.javaв кратком руководстве по ML Kit .
- FirebaseVisionImageMetadata удалены, теперь вы можете просто передавать метаданные изображения, такие как ширина, высота, угол поворота и формат, в методы построения InputImages.
Вот несколько примеров старых и новых методов Kotlin:
Старый
// 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() )
Новый
// 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())
Вот несколько примеров старых и новых методов Java:
Старый
// 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());
Новый
// 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());
Изменения, специфичные для API
Сканирование штрих-кода
Для API сканирования штрихкодов теперь есть два способа доставки моделей:
- Через сервисы Google Play (также известные как «тонкие») (рекомендуется) — это уменьшает размер приложения и позволяет использовать модель совместно с другими приложениями. Однако разработчикам необходимо убедиться, что модель загружена перед первым использованием.
- С APK вашего приложения, также известным как «связанный» — это увеличивает размер приложения, но означает, что модель готова к использованию немедленно.
Эти две реализации немного отличаются: «комплектная» версия имеет ряд улучшений по сравнению с «тонкой». Подробности этих различий можно найти в руководстве по API сканирования штрихкодов .
Распознавание лиц
Для API распознавания лиц модели могут быть доставлены двумя способами:
- Через сервисы Google Play (также известные как «тонкие») (рекомендуется) — это уменьшает размер приложения и позволяет использовать модель совместно с другими приложениями. Однако разработчикам необходимо убедиться, что модель загружена перед первым использованием.
- С APK вашего приложения, также известным как «связанный» — это увеличивает размер загружаемого приложения, но означает, что модель готова к использованию немедленно.
Поведение реализаций одинаково.
Перевод
- TranslateLanguageтеперь использует читаемые имена для своих констант (например,- ENGLISH) вместо языковых тегов (- EN). Они также теперь @StringDef вместо @IntDef, а значением константы является соответствующий языковой тег BCP 47 .
- Если ваше приложение использует опцию загрузки при бездействии устройства, учтите, что она удалена и больше не может использоваться. Вы по-прежнему можете использовать опцию зарядки устройства. Если вам требуется более сложное поведение, вы можете отложить вызов - RemoteModelManager.downloadвыполнив собственную логику.
Маркировка изображений AutoML
Если ваше приложение использует опцию загрузки «устройство в режиме ожидания», имейте в виду, что она удалена и больше не может быть использована. Вы по-прежнему можете использовать опцию «устройство заряжается».
 Если вам требуется более сложное поведение, вы можете отложить вызов RemoteModelManager.download в соответствии со своей собственной логикой.
Обнаружение и отслеживание объектов
Если ваше приложение использует обнаружение объектов с грубой классификацией, учтите, что в новом SDK изменился способ возврата категории классификации для обнаруженных объектов.
 Категория классификации возвращается как экземпляр DetectedObject.Label а не как целое число. Все возможные категории для грубого классификатора включены в класс PredefinedCategory .
Вот пример старого и нового кода Kotlin:
Старый
if (object.classificationCategory == FirebaseVisionObject.CATEGORY_FOOD) { ... }
Новый
if (!object.labels.isEmpty() && object.labels[0].text == PredefinedCategory.FOOD) { ... } // or if (!object.labels.isEmpty() && object.labels[0].index == PredefinedCategory.FOOD_INDEX) { ... }
Вот пример старого и нового кода Java:
Старый
if (object.getClassificationCategory() == FirebaseVisionObject.CATEGORY_FOOD) { ... }
Новый
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) { ... }
Категория «неизвестно» удалена. Если достоверность классификации объекта низкая, мы просто не возвращаем метку.
Удалить зависимости Firebase (необязательно)
Этот шаг применим только при соблюдении следующих условий:
- Firebase ML Kit — единственный компонент Firebase, который вы используете.
- Вы используете только API на устройстве.
- Вы не используете модель подачи.
В этом случае вы можете удалить зависимости Firebase после миграции. Выполните следующие действия:
- Удалите файл конфигурации Firebase, удалив файл конфигурации google-services.json в каталоге модуля (уровня приложения) вашего приложения.
- Замените плагин Google Services Gradle в файле Gradle вашего модуля (уровня приложения) (обычно app/build.gradle) на плагин Strict Version Matcher:
До
apply plugin: 'com.android.application'
apply plugin: 'com.google.gms.google-services'  // Google Services plugin
android {
  // …
}После
apply plugin: 'com.android.application'
apply plugin: 'com.google.android.gms.strict-version-matcher-plugin'
android {
  // …
}- Замените classpath плагина Google Services Gradle в файле Gradle вашего проекта (корневого уровня) (build.gradle) на classpath для плагина Strict Version Matcher:
До
buildscript {
  dependencies {
    // ...
    classpath 'com.google.gms:google-services:4.3.3'  // Google Services plugin
  }
}
После
buildscript {
  dependencies {
    // ...
    classpath 'com.google.android.gms:strict-version-matcher-plugin:1.2.1'
  }
}
Удалите приложение Firebase в консоли Firebase, следуя инструкциям на сайте поддержки Firebase.
Получение помощи
Если у вас возникнут какие-либо проблемы, посетите страницу нашего сообщества , где мы описываем доступные каналы связи с нами.
