12 просмотров
Рейтинг статьи
1 звезда2 звезды3 звезды4 звезды5 звезд
Загрузка...

Распознавание жестов движений на Android используя Tensorflow

Использование TensorFlow на Android: шаг за шагом

Сегодня почти все слышали о машинном или глубоком обучении. Но знаете ли вы, что это такое конкретно и как это использовать? Я, например, не знал. На самом деле я начал интересоваться этой темой только пару месяцев назад, и это оказалось очень интересным.

Я хотел создать приложение, которое использует машинное обучение. Для этой цели подходит TensorFlow, библиотека Google с открытым исходным кодом. С её помощью мы можем создать нейронную сеть, обучить её, сохранить и использовать в своем приложении.

Если вам интересно, как работает нейронная сеть, я предлагаю вам прочитать эту статью. Это хорошее начало, но для работы с TensorFlow нам не нужно знать все. Android-разработчику пригодится минимальное знание, которое даст понимание использования библиотеки в приложении.

В этой статье мы будем использовать в качестве примера приложение Hot or Not, в котором разберем все аспекты кода и пошагово объясним, что происходит.

Hot or Not?

Само приложение довольно простое. Мы делаем фото, оно классифицируется как “горячее” или “нет”, а результаты появляются на экране.

Делаем фото

Начнем с фото. Код выглядит таким образом:

Мы просто делаем фотографию, а классифицировать фото будет onActivityresult().

Классификация фото

Следующий шаг — создать интерфейс классификатора, который будет использовать TensorFlow.

Как вы можете видеть, нам нужен только один метод с параметром Bitmap, который является нашим фото. Этот метод возвращает Result.

Класс Result имеет два свойства — строка с результатом (hot или not) и уверенность в результате. Мы будем использовать уверенность после классификации.

Время создать классификатор внутри MainActivity.

Мы немного изменили код MainActivity. Давайте посмотрим на метод createClassifier(). Для его создания мы будем использовать ImageClassifierFactory. Но сначала взглянем на параметры.

Параметр assets находится в AssetManager, остальные параметры — в классе Constants.

Что это за параметры?

  • GRAPH_FILE_PATH — путь к классификатору в папке ассетов. Мы будем использовать слова “классификатор” и “граф”, так как наш классификатор является сохраненным графом нейронной сети. Его можно также назвать моделью.

  • LABELS_FILE_PATH — путь к нашим ярлыкам в папке. Проще говоря, лейблы — это наши возможные результаты. Наш классификатор обучен оценивать фото, поэтому у нас есть всего два ярлыка — hot и not.

  • GRAPH_INPUT_NAME — название входных данных от классификатора. Мы отправляем сюда изображение.
  • GRAPH_OUTPUT_NAME — название выходных данных классификатора.
  • IMAGE_SIZE — размер изображения в пикселях. Наш классификатор может понимать изображения размером 224×224 пикселя.

Для лучшего понимания работы классификатора посмотрим на изображение ниже.

Нам нужно считать классификатор чем-то вроде черного ящика. Мы берем фото размером 224×224 и загружаем его. Затем происходит классификация, после которой мы получаем ярлыки со степенью уверенности. Например, для hot эта степень составляет 0,7, а для not — 0,3, поэтому мы можем считать это вероятностью.

Теперь надо использовать классификатор в Activity, а потом перейдем к его реализации. Отправляем фото в метод classifyPhoto().

Здесь мы обрезаем изображение до нужного размера. После этой операции мы вызываем метод recognizeImage() и получаем результаты.

Чтобы обрезать изображение, мы используем ImageUtils.getCroppedBitmap(). Я взял алгоритм из класса ImageUtils из урока по TensorFlow и конвертировал этот класс в Kotlin. Перейдем к методу Factory.

На основе параметров из Activity он создает экземпляр классификатора, но самому классификатору нужна более конкретная информация. Вот некоторые параметры:

  • labels — список строк. Мы используем класс FileUtils, чтобы получить ярлыки и текстового файла.
  • imageBitmapPixels — массив, который заполняется на основе размера изображения. Мы заполним его во время классификации.
  • imageNormalizedPixels — массив на основе размера изображения и количества цветовых каналов. Наш классификатор использует нормированные значения, поэтому нам нужно конвертировать целые числа в float.
  • results — массив на основе количества ярлыков. Классификатор возвращает вероятность каждого ярлыка.
  • tensorFlowInference — API из библиотеки TensorFlow. Для загрузки графа требуется менеджер ассетов и путь к файлу графа.

Наши параметры созданы, и теперь мы можем заглянуть внутрь ImageClassifier.

Все происходящее мы можем видеть внутри метода recognizeImage(). В preprocessImageToNormalizedFloats() находится алгоритм нормализации пикселей, и его я тоже взял с Github из TensorFlowImageClassifier.

Теперь мы можем классифицировать изображение. Этот процесс состоит из трех фаз.

  • Загрузите классификатор с помощью метода feed(). К этому методу мы должны передать три параметра — название входных данных, массив с нормализованными значениями и размеры входных данных. В нашем случае размеры составляют: 1 (потому что мы помещаем одно изображение) * размер изображения * размер изображения * количество цветных каналов.
  • Запустите классификатор при помощи метода run(). Этому методу нужны два параметра: массив с возможными результатами (в нашем случае один — final_result) и flag для включения статистики.
  • Получите результаты из классификатора при помощи метода fetch(). Параметры здесь — это название выходных данных и массив, в котором будут содержаться результаты. Это FloatArray, так как классификатор возвращает вероятности для каждого из двух ярлыков.

Последний шаг — указать путь к объекту Result. Для этого используем PriorityQueue, который мы заполним результатами и покажем только один с наибольшим показателем вероятности.

Читать еще:  Как быстро разделить видеофайл на фрагменты.

Результат

Ничего особенного — просто текст и цветной фон, которые зависят от результата. Весь код вы можете найти на Github.

TensorFlow для мобильных устройств на Android и iOS

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

Перед вами перевод статьи TensorFlow on Mobile: Tutorial, автор — Sagar Sharma. Ссылка на оригинал — в подвале статьи.

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

Больше туториалов по Tensorflow:

Я опубликую два туториала о том, как запустить модели машинного обучения на вашем Android или iOS устройстве. В этом туториале используется более стабильная версия TensorFlow — TensorFlow Mobile, так что следуйте инструкциям по реализации своей модели и оптимизации ее для мобильных устройств.

Мы собираемся создать классификатор изображений путем тренировки финального слоя (Bottleneck) модели Inception-v3 и затем оптимизировать модель для смартфонов.

Туториал содержит всего 6 шагов.

Шаг 1: Создаем модель с помощью TensorFlow

Я уверен, что вы уже знакомы с этим шагом, поскольку вы учитесь запускать ту же модель на смартфонах.

Кроме того, чтобы этот туториал был строго ориентирован на внедрение модели на смартфоны, изучите этот быстрый урок Распознавание изображений с TensorFlow и Python API на CPU. Таким образом, мы будем на одной странице, и вы можете начать работу в новой директории с помощью обученной модели.

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

После вы должны иметь эти два файла:

  1. tf_files/retrained_graph.pb, который содержит версию выбранной сети с натренированным на ваших категориях последним слоем и
  2. tf_files/retrained_labels.txt, который является текстовым файлом, содержащим ярлыки.

Шаг 2: Создание оптимизированной модели

Выполните следующую команду (соблюдайте путь):

Это создаст новый оптимизированный файл модели tf_files/optimized_graph.pb

Примечание. Если вы получаете сообщение об ошибке KeyError: «Следующие входные узлы не были найдены: <‘input’>n, то замените «input» на «Mul».

Компромиссы

Чтобы одновременно уменьшить предварительную обработку приложения и уменьшить размер библиотеки, tensorflow поддерживает только подмножество операций, которые обычно используются во время вывода. Операции, которые не поддерживаются, tensorflow/contrib/makefile/tf_op_files.txt

Проверка

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

Сравните вывод одного и того же изображения с помощью файла label_file на графах retrained_graph.pb и optimized_graph.pb:

Выполняйте эти команды одну за другой, и если оба выхода идентичны, то optimized_graph.pb создан верно.

Шаг 3: Квантуем модель, затем сжимаем

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

Но сжатие работает за счет использования регулярности данных.

Квантование помогает уменьшить размер нейронной сети, выполняя квантование по весам. Это дает гораздо больше повторений в графе и сильно помогает в дальнейшем сжатии модели.

Используйте скрипт quantize_graph, чтобы применить изменения к графу:

Теперь сжимайте модель:

Это создаст файл rounded_graph.pb

Вы должны увидеть значительное улучшение сжатия.

Примечание. Если вы видите ошибку при запуске файла quantize_graph, загрузите этот файл и вставьте его в tools/quantization/quantize_graph.py в библиотеку Tensorflow (туда где установлен Tensorflow).

Далее туториал делится на два раздела — Android и iOS.

iOS — Шаг 4: Добавляем блок TensorFlow-experimental

Добавьте TensorFlow-experimental в ваш pod файл, который устанавливает универсальную бинарную структуру. Это самый простой способ запустить shadoworflow на iOS.

iOS — Шаг 5: Создайте приложение

  • Создайте собственное приложение или загрузите уже созданное приложение в XCode.
  • Добавьте файл под названием Podfile в корневую директорию проекта со следующим содержимым:
  • Запустите pod install для загрузки и установки TensorFlow-экспериментального модуля.
  • Откройте файл YourProjectName.xcworks и добавьте свой код.
  • В настройках сборки приложения обязательно добавьте $(inherited) к «Other linker flags» и «Header Search Paths».

iOS — Шаг 6: Запускаем сэмплы

Для запуска iOS сэмплов вам понадобится Xcode 7.3 или новее.

Имеется по три примера в simple, бенчмарке (benchmark) и камере (camera). Можете скопировать код.

Загрузите Inception v1 из корня Tensorflow и извлеките ярлык и файлы графов в папки данных внутрь примеров camera и simple, используя следующие шаги:

Перейдите в одну из директорий сэмпла, загрузите экспериментальный модуль Tensorflow-experimental и откройте рабочее пространство Xcode. Обратите внимание, что установка модуля может занять много времени, так как он большой (

450 МБ). Если вы хотите запустить простой пример, то:

Запустите простое приложение в симуляторе XCode. Вы должны увидеть одноэкранное приложение с кнопкой Run Model. Нажмите на него, и вы должны увидеть изображение Grace Hopper. После того, как вы построите и запустите его, вы должны получить изображение с камеры в реальном времени, которую вы можете наводить на объекты, чтобы получить результаты распознавания в реальном времени.

Читать еще:  Мультизагрузочная флешка на все случаи жизни

Примечание: я уверен, что мог допустить какую-то ошибку или что-то недосказать в разделе iOS. Пожалуйста, перейдите по следующим официальным ссылкам и оставьте комментарий, если вы обнаружите какую-либо ошибку, сообщество поможет вам.

Android — Шаг 4. Настройка Android Studio и тестовый запуск

Есть два способа осуществить задачу — это Android Studio и Bazel. Я буду использовать AS, так как с ней знакомы больше людей.

Тестовый прогон

Чтобы проверить, все ли работает правильно в Android Studio, давайте проведем тестовый запуск.

Откройте Android Studio и выберите «Открыть существующий проект Android Studio».

  • Перейдите в директорию tensorflow-for-poets-2/android/tfmobile.
  • Откройте файл Build.gradle и синхронизируйте Gradle. Если все работает отлично, нажмите кнопку BUILD>BUILD APK.

Теперь папка должна идти с файлом app.apk, скопируйте его в телефон и установите. Кроме того, не забудьте включить режим разработчика в вашем телефоне.

Android — Шаг 5: Запустите настроенное приложение

Если до этого момента все работает нормально, то дальше все уже пойдет как по маслу. По умолчанию стоит приложение для классификации изображений с 1000 категориями из Imagenet. Теперь, чтобы запустить наше настроенное приложение, выполните следующие два шага:

  • Добавьте файлы вашей модели в проект.

Прямо сейчас демонстрационное приложение просматривает файл graph.pb и файл label.txt, присутствующий в android/tfmobile/assets, а не ваши файлы roundnded_graph.pb и retrained_labels.txt.

  • Теперь замените файлы следующей командой или вы можете сделать это вручную.

Измените «output_name» в файле ClassifierActivity.java

Выходной узел для нашей модели имеет другое имя: «final_result». Откройте ClassifierActivity.java и обновите переменную OUTPUT_NAME следующим образом:

Запустите снова, теперь все должно работать.

Я постарался сделать статью максимально точной и легкой для понимания. Любые комментарии, предложения или вопросы пишите в комментариях

TensorFlow на мобильных устройствах: учебник

Дата публикации Feb 6, 2018

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

Вы являетесь частью этого многомиллионного рынка, потому что, возможно, вы читаете это прямо сейчас на своем Android или iOS или у вас есть в кармане, в зависимости от того, что случится, вы знаете, как ориентировано на будущее машинное обучение на мобильных устройствах…

Я напишу 2 разных урока о том, как запускать модели машинного обучения на устройствах Android и iOS.

Это первый урок.

В этом руководстве используется более стабильная версия tenorflow, которая называется TensorFlow Mobile, поэтому следуйте инструкциям по реализации ваших моделей и их созданию.Оптимизировано для мобильных телефонов,

Мы собираемся сделатьКлассификатор изображений путем повторного обучения последнего (узкого места) слоя модели Inception-v3а затем оптимизировать модель для ваших интеллектуальных устройств.

Учебник содержит всего 5–6 шагов:

Шаг 1: Создайте свою модель с TensorFlow

Я уверен, что вы уже знаете этот шаг, так как вы учитесь запускать ту же модель на смартфонах.

Кроме того, чтобы эти уроки были строго сосредоточены наРеализация моделей на смартфонах,Я бы порекомендовал этот быстрый учебник Начать поезд с пользовательских изображений на процессоре«Так что мы будем на той же странице», и вы можете начать все в новом каталоге с новой обученной моделью.

FYI:Данные на которой обучается модель содержит виды цветов которые являются тюльпаны , Ромашка, подсолнух , Одуванчик и розы

И после этого у вас должны быть эти два файла:

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

который представляет собой текстовый файл, содержащий метки.

Шаг 2. Создание оптимизированной модели

Запустите следующую командную строку (оставьте правильный путь)

Это создаст новый оптимизированный файл модели tf_files/optimized_graph.pb

Заметка:Если вы получаете ошибку KeyError: “The following input nodes were not found: <‘input’>n” затем измените «вход» на «Mul».

Компромиссы

Чтобы уменьшить предварительную обработку приложения и одновременно уменьшить размер библиотеки, тензор потока поддерживает только подмножество операций, которые обычно используются при выводе. Операции, которые не поддерживаютсяtensorflow / вно / Makefile / tf_op_files.txt

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

Подтвердить ✔️

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

Сравните вывод того жеобразиспользуяlabel_fileна обоих графикеretrained_graph.pbсoptimized_graph.pb

сretrained_graph.pb

сoptimized_graph.pb

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

Шаг 3: Квантовать модель, затем сжимать

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

Читать еще:  Как восстановить битую флешку в домашних условиях

Но сжатие работает, используя регулярность в данных, что объясняет сбой здесь.

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

Теперь используйтеquantize_graphскрипт для внесения изменений в график:

а теперь сожмите модель:

Это создастrounded_graph.pbфайл.

Вы должны увидеть некоторые значительные улучшения в сжатии.

Заметка:Если вы получаете какую-либо ошибку при запускеquantize_graphскачать этот файл и вставить его винструменты / квантование /quantize_graph.pyв библиотеке tenorflow (где установлен TensorFlow).

Отсюда урок разделен на два раздела Android и iOS.

Шаг 4: Добавьте экспериментальный модуль TensorFlow

Добавьте TensorFlow-экспериментальный модуль в ваш файл модуля, который устанавливает универсальный двоичный фреймворк. Это самый простой способ запустить тензор потока на iOS.

Шаг 5: Создайте свое приложение

Создайте свое собственное приложение или загрузите уже созданное приложение в XCode.

Добавьте файл с именем Podfile в корневой каталог проекта со следующим содержимым:

Беги pod install скачать и установить TensorFlow-experimental порт назначения

Открыть YourProjectName.xcworkspace и добавьте свой код

В вашем приложенииНастройки сборки, обязательно добавьте $(inherited) кДругие флаги линкера, а такжеПути поиска заголовкаразделы.

Шаг 6: Запуск образцов

Вам понадобится Xcode 7.3 или более поздняя версия для запуска наших образцов iOS.

Есть три примера: простой, тестовый и камера. Вы можете клонироватькод,

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

Перейдите в один из примеров каталогов, загрузитеTensorflow-экспериментальноеи откройте рабочую область Xcode. Обратите внимание, что установка модуля может занять много времени, так как он большой (

450 МБ). Если вы хотите запустить простой пример, то:

Запустите простое приложение в симуляторе XCode. Вы должны увидеть одноэкранное приложение сЗапустить моделькнопка. Нажмите на него, и вы должны увидеть изображение Grace Hopper. После того, как вы создадите и запустите это, вы должны получить изображение с камеры в реальном времени, которое вы можете указывать на объекты, чтобы получить результаты распознавания в реальном времени.

Заметка:Я уверен, что сделал какую-то ошибку или что-то оставил в разделе iOS. Пожалуйста, перейдите по следующим официальным ссылкам и прокомментируйте ниже, если вы обнаружите какую-либо ошибку, сообщество поможет вам.

Теперь вы можете пропустить раздел Android этой статьи.

Сборка TensorFlow на iOS | TensorFlow

Экспериментальный модуль TensorFlow имеет ток около 450 МБ. Причина, по которой он такой большой, в том, что мы объединяем несколько…

www.tensorflow.org

Android

Шаг 4. Настройка Android Studio и тестовый запуск

Есть два способа сделать это для Android Studio и Bazel. Я буду использовать AS, так как больше людей знакомы с ним.

Если он еще не установлен, перейдите сюда и установите его

Скачать Android Studio и SDK Инструменты | Android Studio

Загрузите официальную Android IDE и инструменты разработчика для создания приложений для телефонов, планшетов, носимых устройств, телевизоров и других устройств…

developer.android.com

Тестовый прогон

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

Android Откройте Android Studio и выберите «penОткрыть существующий проект Android Studio».

Перейти кtensorflow-для-поэтов-2 / Android / tfmobileкаталог.

Открытьbuild.gradleфайл и синхронизироватьGradle.Если все работает отлично, нажмитеСтроить> строить APKкнопка.

Заметка:Если вы новичок в Android Studio, как я, и у вас есть проблемы с чем-то, прокомментируйте ниже.

Теперь папка должна идти сapp.apkфайл, скопируйте его в свой телефон и установите его. Кроме того, имейте в виду, чтобы включитьРежим разработчикав вашем телефоне.

Шаг 5: Запустите настроенное приложение 👏 👏 👏

Если до этого все работает нормально, то теперь это просто прогулка.

Приложение по умолчанию – это приложение для классификации изображений с 1000 категориями изImagenet,

Теперь, чтобы запустить наше настроенное приложение, выполните следующие два шага:

Добавьте файлы вашей модели в проект

Прямо сейчас демо-приложение смотрит наgraph.pbфайл иlabel.txtфайл присутствует вандроид / tfmobile / активыне в вашемrounded_graph.pbа такжеretrained_labels.txt

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

Изменить ” output_name” в ClassifierActivity.java file

Выходной узел для нашей модели имеет другое имя: “final_result” , открыто ClassifierActivity.java и обновить OUTPUT_NAME переменная следующим образом:

👏 👏 👏 Снова бегите и все должно работать. 👏 👏 👏

Заметка:Если вы получили какую-либо ошибку или нажмете комментарий на стене ниже.

«Я старался сделать статью максимально точной и легкой для понимания. Любые комментарии, предложения или если у вас есть какие-либо вопросы,напишите это в комментариях.

Для дальнейшего обучения о том, как использоватьTensorFlow в мобильных приложенияхследуй за мнойсредний,facebook,щебет,LinkedIn,Google+,Quoraчтобы увидеть похожие посты.

Хлопай! Поделиться этим! Подписывайтесь на меня!

голоса
Рейтинг статьи
Ссылка на основную публикацию
Статьи c упоминанием слов: