Начало работы с MediaPipe и использование его с вашей собственной моделью tflite

Прежде чем мы начнем, расскажу кое-что обо мне.
Я инженер машинного обучения, работающий с Fynd почти год, и я работал над множеством вещей, начиная от инженерии данных и заканчивая развертыванием. Модели на Kubernetes и Edge.

Из того, что я испытал с проектами машинного обучения, требуется от 40% до 60% вашего времени и усилий, чтобы заставить модель работать, а позже, когда вы захотите развернуть ее на периферии или масштабировать, это совершенно новая проблема. Остальные усилия направлены на оптимизацию развертывания вашей модели для более быстрого вывода.

Я столкнулся с аналогичной ситуацией, когда работал над GlamAR - виртуальным примерочным приложением, Вот где MediaPipe помог мне провести примерку в реальном времени и быстро получить результаты логического вывода из модели машинного обучения.

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

Мы рассмотрим следующее:

  • Что такое MediaPipe?
  • Основные понятия и терминология MediaPipe
  • Обзор репозитория (файлы, калькуляторы, система сборки)
  • Методы, используемые в MediaPipe для отличной оптимизации
  • Использование пользовательской модели tflite с MediaPipe
  • использованная литература

Что такое MediaPipe?

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

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

MediaPipe - это то, что Google использует для своих продуктов внутри компании с 2012 года, а в июне 2019 года открыла его исходный код на CVPR.

Почему именно MediaPipe?

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

Быстрое прототипирование:
Например, детектор тяжелых объектов на основе NN может быть заменен детектором сопоставления с легким шаблоном, а остальная часть графика может остаться неизменной.

Давайте разберемся с терминологией использования этого фреймворка

Концепции MediaPipe

  • Пакет: базовая единица потока данных.
  • Потоки: последовательность пакетов с меткой времени (например, видеопоток с камеры).
  • Боковые пакеты: один пакет без отметок времени. Их можно использовать для предоставления статических / одноразовых входных данных, таких как ml_model, файл конфигурации и т. Д.
  • Узел: узлы принимают поток ввода или пакеты ввода как ввода, обработайте их с помощью преобразования данных, обработки мультимедиа или вывода модели и вывод обработанного потока вывода или пакетов вывода.

У каждого узла есть один файл калькулятора, в котором есть функциональный код узла.

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

Теперь, когда мы понимаем основную терминологию MediaPipe, давайте взглянем на их компоненты и репозиторий.

Наряду с Framework они также предоставили множество примеров проектов с использованием MediaPipe, таких как : Обнаружение объектов и обнаружение лиц (на основе Обнаружение объектов) , Сегментация волос (Сегментация объекта) , Отслеживание рук (Объект Обнаружение + Обнаружение ориентира). Все примеры выполняются со скоростью вывода в реальном времени на различных аппаратных платформах.

Вы можете клонировать или загрузить репозиторий здесь.

Структура репозитория

Фреймворк Mediapipe - это фреймворк для сборки Базель. Давайте теперь пройдемся по репозиторию.

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

Когда вы клонируете репозиторий, вы найдете указанные выше папки.

  • mediapipe / MediaPipe.tulsiproj: файлы для создания проекта Xcode на IOS с использованием tulsi. Нет необходимости изменять это.
  • mediapipe / калькуляторы: коллекция калькуляторов, предоставленная mediapipe. Эти файлы содержат сценарии кода для преобразования, обработки и вывода данных по изображениям, видео, аудиоданным. Все файлы калькулятора написаны на C ++, и в настоящее время вы можете писать файлы калькулятора только на C ++.
    Они также содержат соответствующие файлы .proto для передачи параметров узла узлам.
  • mediapipe / docs: все readme docs для различных примеров и установки.
  • mediapipe / examples: в нем есть все примеры и соответствующие файлы проектов для сборок Android, IOS, Coral и Desktop.
  • mediapipe / framework: он содержит файлы, используемые внутри MediaPipe для создания и проверки рабочего процесса входных потоков, создания узлов, создания и проверки графиков и т. д. Нет необходимости изменять это.
  • mediapipe / gpu: он содержит калькуляторы, которые используют графический процессор для ускорения обработки.
  • mediapipe / graphs: здесь есть графики MediaPipe и файл BUILD для каждого проекта.
    Графики представляют собой файлы .pbtxt, в которых вы записываете поток своего конвейера с справка по входным потокам, узлам и выходным потокам.
    Файл BUILD в этих соответствующих папках содержит зависимости (калькуляторы, модель и т. д.) и операции базеля, полезные при построении двоичного файла graph и создание cc_library и android_library.
  • mediapipe / java / com / google / mediapipe: он содержит java-файлы фреймворка для таких операций, как обработка кадров, обработка OpenGL и т. д., для передачи входных пакетов с Android на калькуляторы. Нет необходимости изменять это.
  • mediapipe / models: содержит tflite-модели для данных примеров.
  • mediapipe / objc: он содержит файлы, написанные на объективном C ++, необходимые для сборки проекта для IOS.
  • mediapipe / util: содержит некоторые базовые служебные калькуляторы для диспетчера потока кадров, выбора кадра, диспетчера ресурсов и т. д.
  • third_party: эта папка содержит файлы BUILD для сторонних зависимостей mediapipe, таких как TensorFlow, OpenCV и т. д.
    Как упоминалось ранее, mediapipe основан на системе сборки bazel . Итак, в bazel, чтобы создать пакет, вам нужно создать файл BUILD в папке.
  • РАБОЧАЯ ОБЛАСТЬ:
    рабочая область - это каталог в вашей файловой системе, содержащий исходные файлы для программного обеспечения, которое вы хотите создать. В каждом каталоге workspace есть файл WORKSPACE.
    Файл WORKSPACE строит внешние зависимости из папки third_party, которую мы видели ранее.

ПРИМЕЧАНИЕ: файл WORKSPACE всегда находится в корневой папке проекта, т. е. в данном случае mediapipe, поэтому путь ко всем файлам, используемым во время импорта, начинается с путем из папки mediapipe.

  • BUILD: пакет определяется как каталог, содержащий файл с именем BUILD. Этот файл необходим при создании проекта Bazel.
  • Остальные файлы, которые вы видите, предназначены для установки mediapipe. Документация по mediapipe хороша для этого.

Методы, используемые в mediapipe для оптимизации

  • Использование графического процессора для ускорения вычислений
  • Параллельное вычисление кадров
  • Ограничение количества кадров изображения в полете между входным узлом и узлом вывода до 1, это предотвращает чрезмерное формирование очереди входящих изображений и данных узлами между ними, что приводит к увеличению задержки и использования памяти, что нежелательно в мобильных приложениях реального времени. - FlowLimitCalculator
  • Использование результатов одной модели для нескольких вещей
    Итак, в примере отслеживания рук есть две модели: модель palm_detection и модель hand_landmark_detection.
    Для начальных кадров они запускают модель palm_detection за которым следует модель hand_landmark_detection.
    Для последующих кадров для обнаружения ладони они напрямую используют ориентиры, предсказанные для предыдущего кадра. И модель обнаружения ладони запускается только тогда, когда ориентиры предсказываются с низкой достоверностью.

Об этом они говорили больше в этом видео на YouTube.

Использование вашей модели tflite с MediaPipe

Теперь давайте начнем с кодирования, теперь мы увидим, как использовать нашу собственную модель tflite с MediaPipe.

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

Портретная сегментация tflite-модель

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

Он принимает входное изображение 224x224x3 и генерирует выходную маску 224x224x2 с выходным слоем индекса 1, содержащим фоновую маску.

Ознакомиться с архитектурой модели можно здесь.

Чтобы модель работала с конвейером графического процессора mediapipe, мы должны убедиться, что операции, используемые в моей модели, поддерживаются и имеют реализацию для делегата графического процессора TensorFlow Lite.

Что мы будем строить - Android-приложение Portrait Segmentation

1. Клонируйте репозиторий MediaPipe и загрузите модель tflite.

$ git clone https://github.com/google/mediapipe.git
$ wget https://github.com/SwatiModi/portrait-segmentation-mediapipe/blob/master/mediapipe/models/portrait_segmentation.tflite
# Copy the tflite model to mediapipe/models/ directory
$ cp portrait_segmentation.tflite mediapipe/mediapipe/models/

2. Установите необходимые зависимости после this.

Установите зависимости MediaPipe в соответствии с вашей ОС, и для создания приложения для Android мы будем использовать MediaPipe с Bazel, поэтому следуйте этому

3. Создайте файл графика.

$ cd mediapipe/mediapipe/graphs
$ ls 
  edge_detection  
  face_detection  
  face_mesh  
  hair_segmentation  
  hand_tracking  
  media_sequence  
  object_detection  
  object_detection_3d  
  template_matching  
  tracking  
  youtube8m

сделайте здесь папку для вашего проекта

$ mkdir portrait_segmentation
$ cd portrait_segmentation

создайте файл графика с именем portrait_segmentation.pbtxt в папке «mediapipe / graphs / portrait_segmentation»

$ touch portrait_segmentation.pbtxt

Поскольку наша модель является моделью сегментации, мы будем использовать конвейер, подобный тому из примера hair_segmentation, приведенного в MediaPipe.

Поэтому просто скопируйте содержимое hair_segmentation_mobile_gpu.pbtxt в пустой файл portrait_segmentation.pbtxt, который вы только что создали.

Как упоминалось ранее, файл pbtxt содержит график / поток конвейера.

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

Итак, теперь мы изменим график в соответствии с деталями ввода / вывода модели.

Модель tflite для портретной сегментации, используемая в этом руководстве, принимает на входе изображение RGB размером 224 x 224 x 3 и выводит маску 224 x 224 x 2.

Начните с изменения узла ImageTransformationCalculator, он принимает кадр камеры в качестве входных данных и изменяет его размер до требуемого входного размера модели.

Поэтому измените следующие параметры узла

output_width: 224
output_height: 224

измените TfLiteConverterCalculator для количества входных каналов

max_num_channels: 3

измените TfLiteInferenceCalculator для пути модели

model_path: "mediapipe/models/portrait_segmentation.tflite"

изменить TfLiteTensorsToSegmentationCalculator для выходных тензорных измерений

tensor_width: 224
tensor_height: 224

Итак, мы закончили с определением графика для нашего конвейера портретной сегментации.

4. СОЗДАТЬ файл для графика.

создайте файл с именем «BUILD» без какого-либо расширения в папке «mediapipe / graphs / portrait_segmentation»

скопируйте содержимое файла BUILD из hair_segmentation в пустой файл BUILD.

Этот файл содержит зависимости калькулятора, используемые в конвейере графа. Он также преобразует текстовый граф (.pbtxt) в двоичный граф (.binarypb).

Здесь мы просто изменим имя графика в методе mediapipe_binary_graph ().

graph = "portrait_segmentation.pbtxt",

5. Создайте андроид-проект.

Перейдите в mediapipe / examples / android / src / java / com / google / mediapipe / apps /

Создайте копию папки «hairsegmentationgpu» и назовите ее «portraitsegmentationgpu».

Здесь мы просто обновим файлы в соответствии с нашими файлами графиков, начиная с файла BUILD.

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

6. Выполните сборку с помощью bazel и установите APK.

# BUILD
bazel build -c opt --config=android_arm64 mediapipe/examples/android/src/java/com/google/mediapipe/apps/portraitsegmentationgpu
# On successfully building the APK, it prints
INFO: Elapsed time: 1499.898s, Critical Path: 753.09s
INFO: 2002 processes: 1849 linux-sandbox, 1 local, 152 worker.
INFO: Build completed successfully, 2140 total actions

При первой сборке это займет около 20–25 минут, поскольку при этом загружаются все внешние зависимости для сборки. В следующий раз он использует кешированные зависимости, поэтому он будет строиться намного быстрее.

# INSTALL
adb install bazel-bin/mediapipe/examples/android/src/java/com/google/mediapipe/apps/portraitsegmentationgpu/portraitsegmentationgpu.apk

Теперь вы готовы запустить APK и протестировать его.

Я тестировал это приложение на своем телефоне M30s, оно работало со скоростью 30+ FPS.

Здесь мы успешно использовали собственную модель tflite с MediaPipe. Подобным образом вы также можете реализовать свои модели, основанные на обнаружении и отслеживании ориентиров, с помощью аналогичных существующих примеров.

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

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

Вы можете узнать обо мне больше на swatimodi.com

Часть 2 вышла !!
Приложение для создания масштабирования как виртуального фона - Пользовательские калькуляторы в MediaPipe

использованная литература

  1. Веб-визуализатор для конвейера графов: https://viz.mediapipe.dev/
  2. Обсуждение MediaPipe: https://www.youtube.com/qXs0QZ6VWS8&
  3. Документация: https://mediapipe.readthedocs.io/en/latest/index.html
  4. Репозиторий GitHub: https://github.com/google/mediapipe
  5. Возьмите код отсюда - https://github.com/SwatiModi/portrait-segmentation-mediapipe.git