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

Обновить импорт Gradle

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

API-интерфейсы визуализации

Модели в комплекте поставляются как часть вашего приложения. Тонкие модели необходимо скачать. Некоторые 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-barcode-model: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:маркировка изображения: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-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

АвтоMLVision Edge

API Старый Артефакт Новый Артефакт
АвтоМЛ без скачивания 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.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-natural-language-language-id-model:20.0.7
com.google.mlkit:идентификатор языка:17.0.6
Умный ответ com.google.firebase:firebase-ml-естественный-язык: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-естественный-язык: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-естественный-язык: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 .

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

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

  • Детектор/сканер/маркировщик/переводчик… экземпляр изменен. У каждой функции теперь есть своя точка входа. Например: сканирование штрих-кода, распознавание текста, маркировка изображений, перевод…. Вызовы службы Firebase getInstance() заменяются вызовами метода getClient() точки входа функции.
  • Создание экземпляра TextRecouncer по умолчанию было удалено, поскольку мы ввели дополнительные библиотеки для распознавания других сценариев, таких как китайский и корейский. Чтобы использовать параметры по умолчанию с моделью распознавания текста на латинице, объявите зависимость от 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() вызывается, когда эти объекты больше не будут использоваться. Если вы используете их во Fragment или AppCompatActivity, один из простых способов сделать это — вызвать LifecycleOwner.getLifecycle() для Fragment или AppCompatActivity, а затем вызвать Lifecycle.addObserver.
  • В целях единообразия processImage() detectInImage() в Vision API были переименованы process() .
  • API естественного языка теперь используют термин «языковой тег» (согласно определению стандарта BCP 47 ) вместо «языкового кода».
  • Методы получения в классах xxxOptions были удалены.
  • Метод getBitmap() в классе InputImage (заменяющий FirebaseVisionImage ) больше не поддерживается как часть общедоступного интерфейса. Пожалуйста, обратитесь к BitmapUtils.java в образце быстрого запуска ML Kit , чтобы преобразовать растровое изображение из различных входных данных.
  • FirebaseVisionImageMetadata были удалены, вы можете просто передать метаданные изображения, такие как ширина, высота, RotationDegrees, формат, в методы построения 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 {
  // …
}
  • Замените путь к классам плагина Google Services Gradle в файле Gradle вашего проекта (корневого уровня) (build.gradle) на путь к плагину 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.

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

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