Миграция для Android

Обновление импорта Gradle

Новый SDK требует только одну зависимость для каждого API ML Kit. Вам не нужно указывать общие библиотеки, такие как firebase-ml-vision или firebase-ml-natural-language . ML Kit использует пространство имен com.google.android.gms для библиотек, которые зависят от Google Play Services.

API-интерфейсы Vision

Связанные модели поставляются как часть вашего приложения. Тонкие модели должны быть загружены. Некоторые API доступны как в связанной, так и в тонкой форме, другие только в одной или другой форме:

API В комплекте Тонкий
Распознавание текста х (бета) х
Распознавание лиц х х
Сканирование штрих-кода х х
Маркировка изображений х х
Обнаружение и отслеживание объектов х -

Обновите зависимости для библиотек Android ML Kit в файле Gradle вашего модуля (уровня приложения) (обычно app/build.gradle ) в соответствии со следующими таблицами:

Модели в комплекте

API Старые Артефакты Новый Артефакт
Сканирование штрих-кода com.google.firebase:firebase-ml-vision:24.0.1
com.google.firebase:firebase-ml-vision-штрихкод-модель:16.0.1
com.google.mlkit:сканирование-штрихкода: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:распознавание-лиц: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:обнаружение-объектов:17.0.2

Тонкие модели

API Старые Артефакты Новый Артефакт
Сканирование штрих-кода com.google.firebase:firebase-ml-vision:24.0.1 com.google.android.gms:play-services-mlkit-сканирование-штрихкодов:18.3.1
Распознавание лиц com.google.firebase:firebase-ml-vision:24.0.1 com.google.android.gms:play-services-mlkit-распознавание-лиц:17.1.0
Распознавание текста com.google.firebase:firebase-ml-vision:24.0.1 com.google.android.gms:play-services-mlkit-распознавание-текста: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 В комплекте Тонкий
Идентификатор языка х х
Умный ответ х х (бета)

Обновите зависимости для библиотек Android ML Kit в файле Gradle вашего модуля (уровня приложения) (обычно app/build.gradle ) в соответствии со следующими таблицами:

Модели в комплекте

API Старые Артефакты Новый Артефакт
Идентификатор языка com.google.firebase:firebase-ml-естественный-язык:22.0.0
com.google.firebase:firebase-ml-естественный-язык-идентификатор-языка-модель:20.0.7
com.google.mlkit:идентификатор-языка:17.0.6
Умный ответ com.google.firebase:firebase-ml-естественный-язык:22.0.0
com.google.firebase:firebase-ml-естественный-язык-умный-ответ-модель:20.0.7
com.google.mlkit:smart-reply:17.0.4

Тонкие модели

API Старые Артефакты Новый Артефакт
Идентификатор языка com.google.firebase:firebase-ml-естественный-язык:22.0.0
com.google.firebase:firebase-ml-естественный-язык-идентификатор-языка-модель:20.0.7
com.google.android.gms:play-services-mlkit-язык-id:17.0.0
Умный ответ com.google.firebase:firebase-ml-естественный-язык:22.0.0
com.google.firebase:firebase-ml-естественный-язык-умный-ответ-модель: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.Сканер штрих-кода
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.Сканер штрих-кода
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 .

Обновить имена методов

Изменения кода минимальны:

  • Изменена реализация Detector/scanner/labeler/translator… Теперь у каждой функции есть своя точка входа. Например: BarcodeScanning, TextRecognition, ImageLabeling, Translation… Вызовы службы Firebase getInstance() заменены вызовами метода 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 Services, также известный как «тонкий» (рекомендуется) — это уменьшает размер приложения, и модель делится между приложениями. Однако разработчикам необходимо убедиться, что модель загружена, прежде чем использовать ее в первый раз.
  • С помощью APK вашего приложения, также известного как «связанный» — это увеличивает размер приложения, но означает, что модель готова к использованию немедленно.

Эти две реализации немного отличаются, причем «связанная» версия имеет ряд улучшений по сравнению с «тонкой» версией. Подробности этих различий можно найти в руководстве Barcode Scanning API .

Распознавание лиц

Для API распознавания лиц модели могут быть доставлены двумя способами:

  • Через Google Play Services, также известный как «тонкий» (рекомендуется) — это уменьшает размер приложения, и модель делится между приложениями. Однако разработчикам необходимо убедиться, что модель загружена, прежде чем использовать ее в первый раз.
  • С помощью APK вашего приложения, также известного как «связанный» — это увеличивает размер загружаемого приложения, но означает, что модель готова к использованию немедленно.

Поведение реализаций одинаково.

Перевод

  • TranslateLanguage теперь использует читаемые имена для своих констант (например, ENGLISH ) вместо языковых тегов ( EN ). Они также теперь @StringDef вместо @IntDef, а значение константы — соответствующий языковой тег BCP 47 .

  • Если ваше приложение использует опцию условия загрузки «device idle», имейте в виду, что эта опция удалена и больше не может использоваться. Вы по-прежнему можете использовать опцию «device chargeing». Если вам нужно более сложное поведение, вы можете отложить вызов 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.

Получение помощи

Если у вас возникнут какие-либо проблемы, посетите страницу нашего сообщества , где мы описываем доступные каналы связи с нами.