После обучения собственной модели с помощью AutoML Vision Edge вы сможете использовать ее в своем приложении для обнаружения объектов на изображениях.
Существует два способа интеграции моделей, обученных в AutoML Vision Edge: вы можете объединить модель, поместив ее в папку ресурсов вашего приложения, или динамически загрузить ее из Firebase.
| Варианты комплектации моделей | |
|---|---|
| Встроено в ваше приложение |
|
| Хостинг на Firebase |
|
Прежде чем начать
Если вы хотите загрузить модель , обязательно добавьте Firebase в свой проект Android , если вы ещё этого не сделали. При сборке модели это не требуется.
Добавьте зависимости для библиотеки TensorFlow Lite Task в файл Gradle уровня приложения вашего модуля, который обычно называется
app/build.gradle:Для объединения модели с вашим приложением:
dependencies { // ... // Object detection with a bundled Auto ML model implementation 'org.tensorflow:tensorflow-lite-task-vision:0.0.0-nightly-SNAPSHOT' }Для динамической загрузки модели из Firebase также добавьте зависимость Firebase ML:
dependencies { // ... // Object detection with an Auto ML model deployed to Firebase implementation platform('com.google.firebase:firebase-bom:26.1.1') implementation 'com.google.firebase:firebase-ml-model-interpreter' implementation 'org.tensorflow:tensorflow-lite-task-vision:0.0.0-nightly' }
1. Загрузите модель
Настройте локальный источник модели
Чтобы связать модель с вашим приложением:
- Извлеките модель из zip-архива, загруженного из консоли Google Cloud .
- Включите вашу модель в пакет вашего приложения:
- Если в вашем проекте нет папки с ресурсами, создайте ее, щелкнув правой кнопкой мыши папку
app/и выбрав Создать > Папка > Папка ресурсов . - Скопируйте файл модели
tfliteсо встроенными метаданными в папку assets.
- Если в вашем проекте нет папки с ресурсами, создайте ее, щелкнув правой кнопкой мыши папку
Добавьте следующее в файл
build.gradleвашего приложения, чтобы Gradle не сжимал файл модели при сборке приложения:android { // ... aaptOptions { noCompress "tflite" } }Файл модели будет включен в пакет приложения и доступен как необработанный ресурс.
Настройте источник модели, размещенный в Firebase
Чтобы использовать удаленно размещенную модель, создайте объект RemoteModel , указав имя, которое вы присвоили модели при ее публикации:
Ява
// Specify the name you assigned when you deployed the model.
FirebaseCustomRemoteModel remoteModel =
new FirebaseCustomRemoteModel.Builder("your_model").build();
Котлин
// Specify the name you assigned when you deployed the model.
val remoteModel =
FirebaseCustomRemoteModel.Builder("your_model_name").build()
Затем запустите задачу загрузки модели, указав условия, при которых она будет разрешена. Если модели нет на устройстве или доступна более новая версия, задача асинхронно загрузит её из Firebase:
Ява
DownloadConditions downloadConditions = new DownloadConditions.Builder()
.requireWifi()
.build();
RemoteModelManager.getInstance().download(remoteModel, downloadConditions)
.addOnSuccessListener(new OnSuccessListener<Void>() {
@Override
public void onSuccess(@NonNull Task<Void> task) {
// Success.
}
});
Котлин
val downloadConditions = DownloadConditions.Builder()
.requireWifi()
.build()
RemoteModelManager.getInstance().download(remoteModel, downloadConditions)
.addOnSuccessListener {
// Success.
}
Многие приложения запускают задачу загрузки в своем коде инициализации, но вы можете сделать это в любой момент до того, как вам понадобится использовать модель.
Создайте детектор объектов на основе вашей модели
После настройки источников модели создайте объект ObjectDetector из одного из них.
Если у вас есть только локально упакованная модель, просто создайте детектор объектов из файла модели и настройте требуемый порог оценки уверенности (см. раздел Оценка модели ):
Ява
// Initialization
ObjectDetectorOptions options = ObjectDetectorOptions.builder()
.setScoreThreshold(0) // Evaluate your model in the Google Cloud console
// to determine an appropriate value.
.build();
ObjectDetector objectDetector = ObjectDetector.createFromFileAndOptions(context, modelFile, options);
Котлин
// Initialization
val options = ObjectDetectorOptions.builder()
.setScoreThreshold(0) // Evaluate your model in the Google Cloud console
// to determine an appropriate value.
.build()
val objectDetector = ObjectDetector.createFromFileAndOptions(context, modelFile, options)
Если у вас есть удалённо размещённая модель, перед её запуском необходимо убедиться, что она загружена. Вы можете проверить статус задачи загрузки модели с помощью метода isModelDownloaded() менеджера моделей.
Хотя вам нужно подтвердить это только перед запуском детектора объектов, если у вас есть как удаленно размещенная модель, так и локально упакованная модель, может иметь смысл выполнить эту проверку при создании экземпляра детектора объектов: создать детектор объектов из удаленной модели, если она была загружена, и из локальной модели в противном случае.
Ява
FirebaseModelManager.getInstance().isModelDownloaded(remoteModel)
.addOnSuccessListener(new OnSuccessListener<Boolean>() {
@Override
public void onSuccess(Boolean isDownloaded) {
}
});
Котлин
FirebaseModelManager.getInstance().isModelDownloaded(remoteModel)
.addOnSuccessListener { success ->
}
Если у вас есть только удалённо размещённая модель, следует отключить связанные с ней функции (например, сделать её серой или скрыть часть пользовательского интерфейса) до подтверждения загрузки модели. Это можно сделать, добавив прослушиватель к методу download() менеджера моделей.
Как только вы убедитесь, что ваша модель загружена, создайте детектор объектов из файла модели:
Ява
FirebaseModelManager.getInstance().getLatestModelFile(remoteModel)
.addOnCompleteListener(new OnCompleteListener<File>() {
@Override
public void onComplete(@NonNull Task<File> task) {
File modelFile = task.getResult();
if (modelFile != null) {
ObjectDetectorOptions options = ObjectDetectorOptions.builder()
.setScoreThreshold(0)
.build();
objectDetector = ObjectDetector.createFromFileAndOptions(
getApplicationContext(), modelFile.getPath(), options);
}
}
});
Котлин
FirebaseModelManager.getInstance().getLatestModelFile(remoteModel)
.addOnSuccessListener { modelFile ->
val options = ObjectDetectorOptions.builder()
.setScoreThreshold(0f)
.build()
objectDetector = ObjectDetector.createFromFileAndOptions(
applicationContext, modelFile.path, options)
}
2. Подготовьте входное изображение.
Затем для каждого изображения, которое вы хотите подписать, создайте объект TensorImage . Вы можете создать объект TensorImage из Bitmap с помощью метода fromBitmap :
Ява
TensorImage image = TensorImage.fromBitmap(bitmap);
Котлин
val image = TensorImage.fromBitmap(bitmap)
Если данные вашего изображения не находятся в Bitmap , вы можете загрузить массив пикселей, как показано в документации TensorFlow Lite .
3. Запустите детектор объектов.
Чтобы обнаружить объекты на изображении, передайте объект TensorImage методу detect() объекта ObjectDetector .
Ява
List<Detection> results = objectDetector.detect(image);
Котлин
val results = objectDetector.detect(image)
4. Получите информацию о маркированных объектах.
Если операция обнаружения объекта прошла успешно, возвращается список объектов Detection . Каждый объект Detection представляет собой объект, обнаруженный на изображении. Вы можете получить ограничивающую рамку каждого объекта и его метки.
Например:
Ява
for (Detection result : results) {
RectF bounds = result.getBoundingBox();
List<Category> labels = result.getCategories();
}
Котлин
for (result in results) {
val bounds = result.getBoundingBox()
val labels = result.getCategories()
}
Советы по улучшению производительности в реальном времени
Если вы хотите маркировать изображения в приложении реального времени, следуйте этим рекомендациям для достижения наилучшей частоты кадров:
- Устраните вызовы маркировщика изображений. Если во время работы маркировщика изображений появляется новый видеокадр, удалите его. См. пример класса
VisionProcessorBaseв примере приложения для быстрого старта. - Если вы используете выходные данные маркировщика изображений для наложения графики на входное изображение, сначала получите результат, а затем визуализируйте изображение и наложение за один шаг. Таким образом, визуализация на поверхности дисплея выполняется только один раз для каждого входного кадра. См. примеры классов
CameraSourcePreviewиGraphicOverlayв примере приложения для быстрого старта. Если вы используете API Camera2, снимайте изображения в формате
ImageFormat.YUV_420_888.Если вы используете старый API камеры, снимайте изображения в формате
ImageFormat.NV21.