1. Введение


Примечание: Для выполнения этого практического задания требуется физическое устройство.
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 для идентификации цветов.

Лицензия: Бесплатно для использования
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 Studio версии 4.1 или выше.
Если у вас его еще не установлено, установите Android Studio 4.1 или выше .
Откройте проект с помощью Android Studio.
Чтобы открыть проект в Android Studio, выполните следующие действия:
- Откройте Android Studio
После загрузки выберите в появившемся окне «Открыть существующий проект»:

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

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

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

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

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

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

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

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

6. Необязательно: Проверить весь список дел
Список задач (TODO) упрощает навигацию к нужному месту в коде. Вы также можете использовать его в своем Android-проекте, чтобы не забывать о предстоящей работе. Добавить задачи можно с помощью комментариев к коду, введя ключевое слово TODO . Для доступа к списку задач можно:
- Отличный способ увидеть, что мы собираемся делать, — это посмотреть список задач (TODO). Для этого выберите в верхней строке меню
View>Tool Windows>TODO

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

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

7. Запустите пользовательскую модель с помощью TensorFlow Lite.
- Щелкните по 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)
...
}
- Внутри метода 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))
...
}
- Обработайте изображение и выполните над результатом следующие операции:
- Отсортируйте результаты по вероятности в порядке
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
...
}
- Преобразуйте отсортированные и отфильтрованные результаты в объекты данных
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))
}
...
}
- Закомментируйте или удалите следующие строки, которые способствуют генерации поддельных результатов, которые мы видим ранее:
// 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.
- Запустите приложение на реальном устройстве, выбрав файл
TFL_Classify.startи нажав кнопку «Запустить».
на панели инструментов:

- На экране вашего телефона отобразятся следующие результаты, где вместо реальных чисел будут показаны случайные числа:

8. Дополнительно: Ускорьте вывод с помощью делегата GPU.
TensorFlow Lite поддерживает несколько аппаратных ускорителей для ускорения вывода данных на мобильных устройствах. Графический процессор (GPU) — один из ускорителей, который TensorFlow Lite может использовать через механизм делегата, и он довольно прост в использовании.
- Откройте файл build.gradle в папке
startмодуля или нажмите на кнопку TODO 5 в списке задач и добавьте следующую зависимость:
// TODO 5: Optional GPU Delegates
implementation 'org.tensorflow:tensorflow-lite-gpu:2.3.0'
- Вернитесь к файлу 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()
}
...
}
- Измените инициализатор модели, добавив
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)
}
}
- Запустите приложение на реальном устройстве, выбрав файл
TFL_Classify.startи нажав кнопку «Запустить».
на панели инструментов:

9. Что дальше?
Вот несколько ссылок для получения дополнительной информации:
- Попробуйте другие модели TFLite, совместимые с привязкой моделей машинного обучения, с сайта tfhub.dev .
- Подробнее о TFLite можно узнать из документации на tensorflow.org и репозитория кода .
- Попробуйте другие предварительно обученные модели TFLite , включая детектор ключевых слов в речи и встроенную версию функции интеллектуального ответа.
- Узнайте больше о TensorFlow в целом, ознакомившись с нашей документацией для начинающих .