1. Введение
Примечание. Для тестирования этой лаборатории кода требуется физическое устройство.
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 для идентификации цветов.
Лицензия: Бесплатное использование.
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 или выше.
Если он у вас еще не установлен, установите AndroidStudio 4.1 или выше .
Откройте проект с помощью Android Studio.
Откройте проект с помощью Android Studio, выполнив следующие шаги:
- Открыть Android-студию . После загрузки выберите «Открыть существующий проект» в этом всплывающем окне:
- В селекторе файлов выберите
TFLClassify/build.gradle
из вашего рабочего каталога.
- При первом открытии проекта вы получите всплывающее окно «Gradle Sync» с вопросом об использовании оболочки Gradle. Нажмите «ОК».
- Включите модель разработчика и отладку по 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, вы можете:
- Отличный способ увидеть, что мы собираемся делать, — это просмотреть список TODO. Для этого выберите в верхней строке меню
View
>Tool Windows
>TODO
- По умолчанию в нем перечислены все TODO во всех модулях, что немного сбивает с толку. Мы можем отсортировать только начальные TODO, нажав кнопку «Сгруппировать за» сбоку панели TODO и выбрав
Modules
- Разверните все элементы в стартовых модулях:
7. Запустите пользовательскую модель с помощью TensorFlow Lite.
- Нажмите 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)
...
}
- Внутри метода анализа для 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. Необязательно: Ускорьте вывод с помощью делегата графического процессора.
TensorFlow Lite поддерживает несколько аппаратных ускорителей для ускорения вывода на вашем мобильном устройстве. Графический процессор — это один из ускорителей, который TensorFlow Lite может использовать с помощью механизма делегирования, и он довольно прост в использовании.
- Откройте build.gradle в
start
модуле или нажмите TODO 5 в списке TODO и добавьте следующую зависимость:
// TODO 5: Optional GPU Delegates
implementation 'org.tensorflow:tensorflow-lite-gpu:2.3.0'
- Вернитесь к файлу 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()
}
...
}
- Измените инициализатор модели, чтобы использовать его, добавив
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, совместимые с привязкой модели ML, с сайта tfhub.dev .
- Узнайте больше о TFLite из документации на tensorflow.org и репозитория кода .
- Попробуйте другие предварительно обученные модели TFLite, включая детектор речевых слов и версию интеллектуального ответа на устройстве.
- Узнайте больше о TensorFlow в целом из нашей документации по началу работы .