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

    tensorflow mobile туториал

    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: Создание оптимизированной модели

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

    python -m tensorflow.python.tools.optimize_for_inference \
    --input=tf_files/retrained_graph.pb \
    --output=tf_files/optimized_graph.pb \
    --input_names="input" \
    --output_names="final_result"

    Это создаст новый оптимизированный файл модели 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:

    • с retrained_graph.pb
    python -m scripts.label_image \
      --graph=tf_files/retrained_graph.pb \
      --image=tf_files/flower_photos/daisy/3475870145_685a19116d.jpg
    • c optimized_graph.pb
    python -m scripts/label_image \
        --graph=tf_files/optimized_graph.pb \
        --image=tf_files/flower_photos/daisy/3475870145_685a19116d.jpg

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

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

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

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

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

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

    python -m scripts.quantize_graph \
      --input=tf_files/optimized_graph.pb \
      --output=tf_files/rounded_graph.pb \
      --output_node_names=final_result \
      --mode=weights_rounded

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

    gzip -c tf_files/rounded_graph.pb > tf_files/rounded_graph.pb.gz
    gzip -l tf_files/rounded_graph.pb.gz

    Это создаст файл 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 в корневую директорию проекта со следующим содержимым:
    target 'YourProjectName'
    pod 'TensorFlow-experimental'
    • Запустите 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, используя следующие шаги:

    mkdir -p ~/graphs
    curl -o ~/graphs/inception5h.zip \
    https://storage.googleapis.com/download.tensorflow.org/models/inception5h.zip \
    && unzip ~/graphs/inception5h.zip -d ~/graphs/inception5h
    cp ~/graphs/inception5h/* tensorflow/examples/ios/benchmark/data/
    cp ~/graphs/inception5h/* tensorflow/examples/ios/camera/data/
    cp ~/graphs/inception5h/* tensorflow/examples/ios/simple/data/

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

    cd tensorflow/examples/ios/simple
    pod install
    open tf_simple_example.xcworkspace #note .xcworkspace,not .xcodeproj
    

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

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

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

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

    Если 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.

    • Теперь замените файлы следующей командой или вы можете сделать это вручную.
    cp tf_files/rounded_graph.pb android/tfmobile/assets/graph.pb
    cp tf_files/retrained_labels.txt android/tfmobile/assets/labels.txt

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

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

    private static final String INPUT_NAME = "input";
    private static final String OUTPUT_NAME = "final_result";

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

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