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

1. Введение

657431be3173fa86.pngandroid.png

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

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

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

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

Если у вас его еще не установлено, скачайте и установите Android Studio 4.1 или выше, пока обучаете свою модель TensorFlow Lite.

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

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

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

Простое приложение для камеры, запускающее программу распознавания изображений 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 или выше.

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

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

Чтобы открыть проект в Android Studio, выполните следующие действия:

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

f3b8bea7e3b39376.png

  1. В окне выбора файла выберите TFLClassify/build.gradle из вашей рабочей директории.
  1. При первом открытии проекта появится всплывающее окно "Gradle Sync" с вопросом об использовании Gradle Wrapper. Нажмите "OK".

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 . Для доступа к списку задач можно:

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

5de29b413574f25c.png

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

5d8fe7b102340208.png

  1. Разверните все элементы в разделе «Начальные модули»:

8d0f14a039995b20.png

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

  1. Щелкните по TODO 1 в списке задач или откройте файл 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. Внутри метода analyze в 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. Дополнительно: Ускорьте вывод с помощью делегата GPU.

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

  1. Откройте файл build.gradle в папке start модуля или нажмите на кнопку TODO 5 в списке задач и добавьте следующую зависимость:
// TODO 5: Optional GPU Delegates    
implementation 'org.tensorflow:tensorflow-lite-gpu:2.3.0'
  1. Вернитесь к файлу MainActivity.kt или нажмите на TODO 6 в списке задач. Замените простую инициализацию 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. Что дальше?

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