Быстрый старт для Android

В этом руководстве показано, как создать приложение для Android с помощью TensorFlow Lite для анализа прямой трансляции с камеры и идентификации объектов с помощью модели машинного обучения с использованием минимального объема кода. Если вы обновляете существующий проект, вы можете использовать образец кода в качестве справочного материала и сразу перейти к инструкциям по изменению вашего проекта .

Обнаружение объектов с помощью машинного обучения

Анимированная демонстрация обнаружения объектов Модель машинного обучения в этом руководстве выполняет обнаружение объектов. Модель обнаружения объектов берет данные изображения в определенном формате, анализирует их и пытается классифицировать элементы изображения как один из набора известных классов, для распознавания которых она была обучена. Скорость, с которой модель может идентифицировать известный объект (называемая предсказанием или выводом объекта), обычно измеряется в миллисекундах. На практике скорость логического вывода зависит от аппаратного обеспечения, на котором размещается модель, размера обрабатываемых данных и размера модели машинного обучения.

Пример установки и запуска

Для первой части этого руководства загрузите образец с GitHub и запустите его с помощью Android Studio . В следующих разделах этого руководства рассматриваются соответствующие разделы примера кода, чтобы вы могли применить их к своим собственным приложениям для Android. Вам необходимо установить следующие версии этих инструментов:

  • Android Studio 4.2.2 или выше
  • Android SDK версии 31 или выше

Получить пример кода

Создайте локальную копию примера кода. Вы будете использовать этот код для создания проекта в Android Studio и запуска примера приложения.

Чтобы клонировать и настроить пример кода:

  1. Клонируйте репозиторий git
    git clone https://github.com/android/camera-samples.git
    
  2. Настройте свой экземпляр git для использования разреженной проверки, чтобы у вас были только файлы для примера приложения обнаружения объектов:

    cd camera-samples
    git sparse-checkout init --cone
    git sparse-checkout set CameraXAdvanced
    

Импортируйте и запустите проект

Создайте проект из загруженного примера кода, соберите проект и запустите его.

Чтобы импортировать и построить пример проекта кода:

  1. Запустите Android-студию .
  2. На странице приветствия Android Studio выберите «Импорт проекта » или « Файл» > «Создать» > «Импорт проекта» .
  3. Перейдите в каталог примера кода, содержащий файл build.gradle ( .../android/camera-samples/CameraXAdvanced/build.gradle ), и выберите этот каталог.

Если вы выберете правильный каталог, Android Studio создаст новый проект и соберет его. Этот процесс может занять несколько минут, в зависимости от скорости вашего компьютера и от того, использовали ли вы Android Studio для других проектов. Когда сборка завершится, Android Studio отобразит сообщение BUILD SUCCESSFUL на панели состояния Build Output .

Необязательно: чтобы исправить ошибки сборки, обновив версию подключаемого модуля Android:

  1. Откройте файл build.gradle в каталоге проекта.
  2. Измените версию инструментов Android следующим образом:

    // from:
    classpath 'com.android.tools.build:gradle:4.2.2'
    // to:
    classpath 'com.android.tools.build:gradle:4.1.2'
    
  3. Синхронизируйте проект, выбрав: File > Sync Project with Gradle Files .

Чтобы запустить проект:

  1. В Android Studio запустите проект, выбрав Run > Run… и CameraActivity .
  2. Выберите подключенное устройство Android с камерой, чтобы протестировать приложение.

В следующих разделах показаны изменения, которые необходимо внести в существующий проект, чтобы добавить эту функциональность в собственное приложение, используя этот пример приложения в качестве ориентира.

Добавить зависимости проекта

В вашем собственном приложении вы должны добавить конкретные зависимости проекта для запуска моделей машинного обучения TensorFlow Lite и получить доступ к служебным функциям, которые преобразуют данные, такие как изображения, в тензорный формат данных, который может обрабатываться используемой вами моделью.

В примере приложения используется несколько библиотек TensorFlow Lite, чтобы обеспечить выполнение модели машинного обучения обнаружения объектов:

  • Основная библиотека TensorFlow Lite — предоставляет необходимые классы ввода данных, выполнение модели машинного обучения и вывод результатов обработки модели.
  • Библиотека поддержки TensorFlow Lite . Эта библиотека предоставляет вспомогательный класс для преобразования изображений с камеры в объект данных TensorImage , который может обрабатываться моделью машинного обучения.
  • Библиотека графического процессора TensorFlow Lite . Эта библиотека обеспечивает поддержку ускорения выполнения модели с использованием процессоров графического процессора на устройстве, если они доступны.

В следующих инструкциях объясняется, как добавить необходимые зависимости проекта и модуля в собственный проект приложения для Android.

Чтобы добавить зависимости модулей:

  1. В модуле, использующем TensorFlow Lite, обновите файл build.gradle модуля, включив в него следующие зависимости. В коде примера этот файл находится здесь: .../android/camera-samples/CameraXAdvanced/tflite/build.gradle ( ссылка на код )

    ...
    dependencies {
    ...
        // Tensorflow lite dependencies
        implementation 'org.tensorflow:tensorflow-lite:2.8.0'
        implementation 'org.tensorflow:tensorflow-lite-gpu:2.8.0'
        implementation 'org.tensorflow:tensorflow-lite-support:2.8.0'
    ...
    }
    
  2. В Android Studio синхронизируйте зависимости проекта, выбрав: File > Sync Project with Gradle Files .

Инициализировать интерпретатор модели ML

В своем приложении для Android вы должны инициализировать интерпретатор модели машинного обучения TensorFlow Lite с параметрами, прежде чем выполнять прогнозы с помощью модели. Эти параметры инициализации зависят от используемой модели и могут включать в себя такие настройки, как минимальные пороги точности для прогнозов и метки для идентифицированных классов объектов.

Модель TensorFlow Lite включает файл .tflite , содержащий код модели, и часто включает файл меток, содержащий имена классов, предсказанных моделью. В случае обнаружения объектов классами являются такие объекты, как человек, собака, кошка или автомобиль. Модели обычно хранятся в каталоге src/main/assets основного модуля, как в примере кода:

  • CameraXAdvanced/tflite/src/main/assets/coco_ssd_mobilenet_v1_1.0_quant.tflite
  • CameraXAdvanced/tflite/src/main/assets/coco_ssd_mobilenet_v1_1.0_labels.txt

Для удобства и удобочитаемости кода в примере объявляется сопутствующий объект, определяющий параметры модели.

Чтобы инициализировать модель в вашем приложении:

  1. Создайте объект-компаньон, чтобы определить параметры модели: ( ссылка на код )

    companion object {
       private val TAG = CameraActivity::class.java.simpleName
    
       private const val ACCURACY_THRESHOLD = 0.5f
       private const val MODEL_PATH = "coco_ssd_mobilenet_v1_1.0_quant.tflite"
       private const val LABELS_PATH = "coco_ssd_mobilenet_v1_1.0_labels.txt"
    }
    
  2. Используйте настройки этого объекта для создания объекта TensorFlow Lite Interpreter , содержащего модель: ( ссылка на код )

    private val tflite by lazy {
       Interpreter(
           FileUtil.loadMappedFile(this, MODEL_PATH),
           Interpreter.Options().addDelegate(nnApiDelegate))
    }
    

Настроить аппаратный ускоритель

При инициализации модели TensorFlow Lite в вашем приложении вы можете использовать функции аппаратного ускорения, чтобы ускорить прогнозные расчеты модели. В приведенном выше примере кода делегат NNAPI используется для аппаратного ускорения выполнения модели:

Interpreter.Options().addDelegate(nnApiDelegate)

Делегаты TensorFlow Lite — это программные модули, которые ускоряют выполнение моделей машинного обучения с использованием специализированного оборудования для обработки на мобильном устройстве, такого как графические процессоры, TPU или DSP. Использование делегатов для запуска моделей TensorFlow Lite рекомендуется, но не обязательно.

Дополнительные сведения об использовании делегатов с TensorFlow Lite см. в разделе Делегаты TensorFlow Lite .

Предоставление данных модели

В вашем приложении для Android ваш код предоставляет модели данные для интерпретации путем преобразования существующих данных, таких как изображения, в формат данных Tensor , который может быть обработан вашей моделью. Данные в тензоре должны иметь определенные размеры или форму, которые соответствуют формату данных, используемых для обучения модели.

Чтобы определить требуемую форму тензора для модели:

  • Используйте инициализированный объект Interpreter , чтобы определить форму тензора, используемого вашей моделью, как показано во фрагменте кода ниже: ( ссылка на код )

    private val tfInputSize by lazy {
       val inputIndex = 0
       val inputShape = tflite.getInputTensor(inputIndex).shape()
       Size(inputShape[2], inputShape[1]) // Order of axis is: {1, height, width, 3}
    }
    

Модель обнаружения объектов, используемая в примере кода, предполагает квадратные изображения размером 300 на 300 пикселей.

Прежде чем вы сможете предоставлять изображения с камеры, ваше приложение должно получить изображение, привести его в соответствие с ожидаемым размером, отрегулировать его поворот и нормализовать данные изображения. При обработке изображений с помощью модели TensorFlow Lite вы можете использовать класс ImageProcessor библиотеки поддержки TensorFlow Lite для предварительной обработки этих данных, как показано ниже.

Чтобы преобразовать данные изображения для модели:

  1. Используйте Support Library ImageProcessor для создания объекта для преобразования данных изображения в формат, который ваша модель может использовать для выполнения прогнозов: ( ссылка на код )

    private val tfImageProcessor by lazy {
       val cropSize = minOf(bitmapBuffer.width, bitmapBuffer.height)
       ImageProcessor.Builder()
           .add(ResizeWithCropOrPadOp(cropSize, cropSize))
           .add(ResizeOp(
               tfInputSize.height, tfInputSize.width, ResizeOp.ResizeMethod.NEAREST_NEIGHBOR))
           .add(Rot90Op(-imageRotationDegrees / 90))
           .add(NormalizeOp(0f, 1f))
           .build()
    }
    
  2. Скопируйте данные изображения из системы камеры Android и подготовьте их для анализа с помощью вашего объекта ImageProcessor : ( ссылка на код )

    // Copy out RGB bits to the shared buffer
    image.use { bitmapBuffer.copyPixelsFromBuffer(image.planes[0].buffer)  }
    
    // Process the image in Tensorflow
    val tfImage =  tfImageProcessor.process(tfImageBuffer.apply { load(bitmapBuffer) })
    

Выполнить прогнозы

В приложении для Android после создания объекта TensorImage с данными изображения в правильном формате вы можете запустить модель на основе этих данных, чтобы получить прогноз или вывод . Пример кода для этого руководства использует класс ObjectDetectionHelper , который инкапсулирует этот код в методе predict() .

Чтобы запустить прогноз для набора данных изображения:

  1. Запустите прогноз, передав данные изображения в функцию прогнозирования: ( ссылка на код )

    // Perform the object detection for the current frame
    val predictions = detector.predict(tfImage)
    
  2. Вызовите метод запуска в вашем экземпляре объекта tflite с данными изображения для создания прогнозов: ( ссылка на код )

    fun predict(image: TensorImage): List<ObjectPrediction> {
       tflite.runForMultipleInputsOutputs(arrayOf(image.buffer), outputBuffer)
       return predictions
    }
    

Объект TensorFlow Lite Interpreter получает эти данные, запускает их в модели и создает список прогнозов. Для непрерывной обработки данных моделью используйте метод runForMultipleInputsOutputs() , чтобы объекты Interpreter не создавались, а затем удалялись системой при каждом прогоне прогноза.

Обработка выходных данных модели

В вашем Android-приложении после того, как вы прогоняете данные изображения по модели обнаружения объектов, она создает список прогнозов, которые код вашего приложения должен обрабатывать, выполняя дополнительную бизнес-логику, отображая результаты пользователю или выполняя другие действия.

Выходные данные любой данной модели TensorFlow Lite различаются в зависимости от количества прогнозов, которые она производит (один или несколько), и описательной информации для каждого прогноза. В случае модели обнаружения объектов прогнозы обычно включают данные для ограничивающей рамки, которая указывает, где на изображении обнаружен объект. В примере кода возвращаемые данные форматируются как список объектов ObjectPrediction , как показано ниже: ( ссылка на код )

val predictions get() = (0 until OBJECT_COUNT).map {
   ObjectPrediction(

       // The locations are an array of [0, 1] floats for [top, left, bottom, right]
       location = locations[0][it].let {
           RectF(it[1], it[0], it[3], it[2])
       },

       // SSD Mobilenet V1 Model assumes class 0 is background class
       // in label file and class labels start from 1 to number_of_classes + 1,
       // while outputClasses correspond to class index from 0 to number_of_classes
       label = labels[1 + labelIndices[0][it].toInt()],

       // Score is a single value of [0, 1]
       score = scores[0][it]
   )
}

Скриншот обнаружения объекта Для модели, используемой в этом примере, каждый прогноз включает в себя местоположение ограничивающей рамки для объекта, метку для объекта и оценку прогноза от 0 до 1 в виде числа с плавающей запятой, представляющего достоверность прогноза, где 1 — наивысшая оценка достоверности. . Как правило, прогнозы с оценкой ниже 50% (0,5) считаются неубедительными. Однако то, как вы обрабатываете результаты прогнозирования с низким значением, зависит от вас и потребностей вашего приложения.

Как только модель вернет результат прогноза, ваше приложение может действовать в соответствии с этим прогнозом, представляя результат вашему пользователю или выполняя дополнительную логику. В примере кода приложение рисует ограничивающую рамку вокруг идентифицированного объекта и отображает имя класса на экране. Дополнительные сведения см. в описании функции CameraActivity.reportPrediction() в примере кода.

Следующие шаги

  • Изучите различные варианты использования TensorFlow Lite на примерах .
  • Узнайте больше об использовании моделей машинного обучения с TensorFlow Lite в разделе « Модели ».
  • Узнайте больше о внедрении машинного обучения в ваше мобильное приложение в Руководстве разработчика TensorFlow Lite .