Распознавайте цветы с помощью TensorFlow Lite на Android

1. Введение

657431be3173fa86.pngandroid.png

Примечание. Для тестирования этой лаборатории кода требуется физическое устройство.

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

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

Установите Android Studio 4.1 или выше.

Если он у вас еще не установлен, загрузите и установите AndroidStudio 4.1 или более поздней версии во время обучения модели TensorFlow Lite.

Что вы узнаете

  • Как обучить собственный классификатор изображений с помощью TensorFlow Lite Model Maker .
  • Как использовать Android Studio для импорта модели TensorFlow Lite для интеграции пользовательской модели в приложение Android с помощью CameraX.
  • Как использовать графический процессор на телефоне для ускорения вашей модели.

Что вы построите

Простое приложение для камеры, которое запускает программу распознавания изображений TensorFlow для идентификации цветов.

f11c2821f2c8311d.png

Лицензия: Бесплатное использование.

2. Обучите распознаватель цветов с помощью Colab

Прежде чем приступить к обучению модели, начните загрузку и установку Android Studio 4.1 или более поздней версии .

Откройте Colab , в котором показано, как обучить классификатор с помощью Keras распознавать цветы с помощью трансферного обучения TensorFlow Lite.

3. Настройте рабочий каталог.

Клонировать репозиторий Git

Следующая команда клонирует репозиторий Git, содержащий файлы, необходимые для этой лаборатории кода:

git clone https://github.com/hoitab/TFLClassify.git

Затем перейдите в каталог, в который вы только что клонировали репозиторий. Именно здесь вы будете работать до конца этой лаборатории кода:

cd TFLClassify

4. Настройте скелетное приложение Android.

android.png

Установите Android Studio 4.1 или выше.

Если он у вас еще не установлен, установите AndroidStudio 4.1 или выше .

Откройте проект с помощью Android Studio.

Откройте проект с помощью Android Studio, выполнив следующие шаги:

  1. Открыть Android-студию 7f2480ded53a193b.png . После загрузки выберите «Открыть существующий проект» в этом всплывающем окне:

f3b8bea7e3b39376.png

  1. В селекторе файлов выберите TFLClassify/build.gradle из вашего рабочего каталога.
  1. При первом открытии проекта вы получите всплывающее окно «Gradle Sync» с вопросом об использовании оболочки Gradle. Нажмите «ОК».

d68b4d7189e6c1e4.png

  1. Включите модель разработчика и отладку по USB на своем телефоне, если вы еще этого не сделали. Это разовая установка. Следуйте этим инструкциям .
  2. Как только ваш проект и ваш телефон будут готовы, вы можете запустить его на реальном устройстве, выбрав TFL_Classify.start и нажав кнопку запуска. 86934b7b01ad7565.png на панели инструментов:

60a77ef126c1373d.png

  1. Теперь разрешите демо-версии Tensorflow доступ к вашей камере:

b63cba02bb36b7e3.png

  1. Вы увидите на своем телефоне следующий экран со случайными числами вместо реальных результатов.

82c603596afa35f1.png

5. Добавьте TensorFlow Lite в приложение для Android.

  1. Выберите start модуль в проводнике проекта слева:

cede7f2b8b23c1a7.png

  1. Щелкните правой кнопкой мыши start модуль или выберите File , затем New > Other > TensorFlow Lite Model

bf243d9fdd27e20a.png

  1. Выберите местоположение модели, в которую вы ранее загрузили специально обученный файл FlowerModel.tflite .

cfee18cc6674a408.png

  1. Нажмите Finish .
  2. В конце вы увидите следующее. FlowerModel.tflite успешно импортирован и показывает высокоуровневую информацию о модели, включая ввод/вывод, а также пример кода, который поможет вам начать работу.

82840065f0d59def.png

6. Необязательно: просмотр всего списка дел.

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

  1. Отличный способ увидеть, что мы собираемся делать, — это просмотреть список TODO. Для этого выберите в верхней строке меню View > Tool Windows > TODO

5de29b413574f25c.png

  1. По умолчанию в нем перечислены все TODO во всех модулях, что немного сбивает с толку. Мы можем отсортировать только начальные TODO, нажав кнопку «Сгруппировать за» сбоку панели TODO и выбрав Modules

5d8fe7b102340208.png

  1. Разверните все элементы в стартовых модулях:

8d0f14a039995b20.png

7. Запустите пользовательскую модель с помощью TensorFlow Lite.

  1. Нажмите TODO 1 в списке TODO или откройте файл MainActivity.kt и найдите TODO 1, инициализируйте модель, добавив эту строку:
private class ImageAnalyzer(ctx: Context, private val listener: RecognitionListener) :
        ImageAnalysis.Analyzer {

  ...
  // TODO 1: Add class variable TensorFlow Lite Model
  private val flowerModel = FlowerModel.newInstance(ctx)

  ...
}
  1. Внутри метода анализа для CameraX Analyzer нам нужно преобразовать входной ImageProxy камеры в Bitmap и создать объект TensorImage для процесса вывода.
override fun analyze(imageProxy: ImageProxy) {
  ...
  // TODO 2: Convert Image to Bitmap then to TensorImage
  val tfImage = TensorImage.fromBitmap(toBitmap(imageProxy))
  ...
}

  1. Обработайте изображение и выполните над результатом следующие операции:
  • Отсортируйте результаты по убыванию по вероятности в соответствии с score атрибута с наибольшей вероятностью.
  • Возьмите первые k результатов, определенные константой MAX_RESULT_DISPLAY . При желании вы можете изменить значение этой переменной, чтобы получить больше или меньше результатов.
override fun analyze(imageProxy: ImageProxy) {
  ...
  // TODO 3: Process the image using the trained model, sort and pick out the top results
  val outputs = flowerModel.process(tfImage)
      .probabilityAsCategoryList.apply {
          sortByDescending { it.score } // Sort with highest confidence first
      }.take(MAX_RESULT_DISPLAY) // take the top results

  ...
}
  1. Преобразование отсортированных и отфильтрованных результатов в объекты данных Recognition готовые к использованию RecyclerView через привязку данных :
override fun analyze(imageProxy: ImageProxy) {
  ...
  // TODO 4: Converting the top probability items into a list of recognitions
  for (output in outputs) {
      items.add(Recognition(output.label, output.score))
  }
  ...
}
  1. Закомментируйте или удалите следующие строки, которые помогают генерировать фальшивые результаты, которые мы видели раньше:
// START - Placeholder code at the start of the codelab. Comment this block of code out.
for (i in 0..MAX_RESULT_DISPLAY-1){
    items.add(Recognition("Fake label $i", Random.nextFloat()))
}
// END - Placeholder code at the start of the codelab. Comment this block of code out.
  1. Запустите приложение на реальном устройстве, выбрав TFL_Classify.start и нажмите кнопку запуска. 86934b7b01ad7565.png на панели инструментов:

60a77ef126c1373d.png

  1. Вы увидите на своем телефоне следующий экран со случайными числами вместо реальных результатов:

f11c2821f2c8311d.png

8. Необязательно: Ускорьте вывод с помощью делегата графического процессора.

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

  1. Откройте build.gradle в start модуле или нажмите TODO 5 в списке TODO и добавьте следующую зависимость:
// TODO 5: Optional GPU Delegates    
implementation 'org.tensorflow:tensorflow-lite-gpu:2.3.0'
  1. Вернитесь к файлу MainActivity.kt или нажмите TODO 6 в списке TODO. Замените простую инициализацию FlowerModel следующим: Получите экземпляр списка совместимости графических процессоров и инициализируйте графический процессор в зависимости от того, является ли он одним из перечисленных совместимых графических процессоров. В противном случае запустите 4 потока ЦП для запуска модели:
private class ImageAnalyzer(ctx: Context, private val listener: RecognitionListener) :
        ImageAnalysis.Analyzer {
  ...

  // TODO 1: Add class variable TensorFlow Lite Model
  // Initializing the flowerModel by lazy so that it runs in the same thread when the process
  // method is called.
  private val flowerModel: FlowerModel by lazy{

    // TODO 6. Optional GPU acceleration
    val compatList = CompatibilityList()

    val options = if(compatList.isDelegateSupportedOnThisDevice){
        Log.d(TAG, "This device is GPU Compatible ")
        Model.Options.Builder().setDevice(Model.Device.GPU).build()
    } else {
        Log.d(TAG, "This device is GPU Incompatible ")
        Model.Options.Builder().setNumThreads(4).build()
    }

  ...
}
  1. Измените инициализатор модели, чтобы использовать его, добавив options во входные данные метода:
private class ImageAnalyzer(ctx: Context, private val listener: RecognitionListener) :
        ImageAnalysis.Analyzer {

  private val flowerModel: FlowerModel by lazy{

    ...

    // Initialize the Flower Model
    FlowerModel.newInstance(ctx, options)
  }
}

  1. Запустите приложение на реальном устройстве, выбрав TFL_Classify.start и нажмите кнопку запуска. 86934b7b01ad7565.png на панели инструментов:

60a77ef126c1373d.png

9. Что дальше?

Вот несколько ссылок для получения дополнительной информации: