После обучения собственной модели с помощью 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()
}
Советы по улучшению производительности в реальном времени
Если вы хотите маркировать изображения в приложении реального времени, следуйте этим рекомендациям, чтобы добиться наилучшей частоты кадров:
- Throttle вызовы к маркировщику изображений. Если новый видеокадр становится доступным во время работы маркировщика изображений, отбросьте кадр. См. класс
VisionProcessorBase
в примере приложения быстрого запуска для примера. - Если вы используете вывод маркировщика изображений для наложения графики на входное изображение, сначала получите результат, затем визуализируйте изображение и наложение за один шаг. При этом визуализируется поверхность отображения только один раз для каждого входного кадра. См. классы
CameraSourcePreview
иGraphicOverlay
в примере приложения быстрого запуска для примера. Если вы используете API Camera2, снимайте изображения в формате
ImageFormat.YUV_420_888
.Если вы используете старый API камеры, снимайте изображения в формате
ImageFormat.NV21
.