Если у вас есть сложный вопрос, на который вы не можете ответить, начните с более простого вопроса, на который вы не можете ответить.
- Макс Тегмарк

MediaPipe постепенно становится модным словом в машинном обучении из-за модульного подхода к созданию конвейеров машинного обучения. Недавно Google запустил несколько интересных новых функций с помощью этой платформы. Подробнее об этом можно прочитать на https://mediapipe.readthedocs.io/.

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

Вступление

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

Что вы узнаете?

Мы создадим очень простое настольное приложение с помощью MediaPipe. Мы напишем индивидуальный калькулятор и все необходимые файлы BUILD. Окончательное приложение будет выполнять следующую функцию:

Он будет принимать входной поток с веб-камеры и выводить его на дисплей как есть.

Клонируйте проект медиа-канала с https://github.com/google/mediapipe.

Начнем с…

Шаг 1. Определите главный файл BUILD

Мы будем создавать пример сквозного рабочего стола с именем face_keypoint. Создайте папку с именем face_keypoint в mediapipe / examples / desktop /. Создайте файл с именем BUILD в этой новой папке и вставьте в него следующий код. Этот файл требуется при сборке системы для определения зависимостей проекта.

licenses([“notice”]) # Apache 2.0
package(default_visibility = [“//mediapipe/examples:__subpackages__”])
cc_binary(
name = “face_keypoint_cpu”,
deps = [
“//mediapipe/examples/desktop:demo_run_graph_main”,
“//mediapipe/graphs/face_keypoint:desktop_tflite_calculators”,
],
)

Синтаксис списка зависимостей:

RELATIVE_FOLDER_PATH:TARGET 

Это говорит - проверьте файл BUILD в RELATIVE_FOLDER_PATH. Эта СБОРКА должна содержать зависимости, необходимые для построения ЦЕЛИ.
Каковы наши зависимости в этом случае?

  1. demo_run_graph_main: файл BUILD в mediapipe / examples / desktop / инструктирует создать demo_run_graph_main.cc, который является типичным файлом драйвера, содержащим функцию main (). .
  2. desktop_tflite_calculators: график определяет порядок, в котором информация (пакеты) проходят через калькуляторы. Каждый узел соответствует экземпляру калькулятора, и может быть несколько экземпляров одного и того же калькулятора. Таким образом, файл BUILD в mediapipe / graphs / face_keypoint / содержит список всех калькуляторов, необходимых для создания целевого desktop_tflite_calculator (мы еще не создали его в этом руководстве).

Шаг 2. Определите простой калькулятор

Мы определим калькулятор в файле «mediapipe / calculators / util / simple_flow_calculator.cc». Каждый пользовательский калькулятор наследуется от одного и того же базового класса CalculatorBase. Для каждого калькулятора необходимо определить три метода. Краткое обсуждение этого выглядит следующим образом:

GetContract( ) : Used to check whether the incoming and outgoing streams types are as expected.
Open( ) : It is a configuration step and invoked once during initialization.
Process ( ) : It define the operatioins to be executed on each input packet.

Исходный код для simple_flow_calculators.cc можно загрузить по этой ссылке на Google Диске. Я также правильно прокомментировал это, чтобы вы могли написать свой собственный калькулятор после прочтения этого файла.

Вопрос: Итак, вы добавили новый файл калькулятора… COOL… НО как вы сообщите об этом системе сборки?
Ответ: Файл BUILD в той же папке должен информировать о прибытии нового члена семьи (т.е. исходный код, реализующий наш собственный калькулятор). Итак, откройте файл BUILD в той же папке, например, mediapipe / calculators / util /, и вставьте следующий код после строки, объявляющей ЛИЦЕНЗИЮ (exports_files ([«LICENSE»])). Как видите, здесь также объявляются все зависимости, необходимые для компиляции исходного файла.

cc_library(
 name = “simple_flow_calculator”,
 srcs = [“simple_flow_calculator.cc”],
 visibility = [
 “//visibility:public”,
 ],
 deps = [
 “//mediapipe/framework:calculator_framework”,
 “//mediapipe/framework:calculator_options_cc_proto”,
 “//mediapipe/framework:timestamp”,
 “//mediapipe/framework/port:status”,
 “@com_google_absl//absl/time”,
 “@com_google_absl//absl/strings”,
 “//mediapipe/framework/formats:rect_cc_proto”,
 “//mediapipe/framework/port:ret_check”,
 “//mediapipe/framework/formats:image_frame”,
 “//mediapipe/framework/formats:image_frame_opencv”,
 “//mediapipe/framework/port:opencv_core”,
 “//mediapipe/framework/port:opencv_imgproc”,
],
 alwayslink = 1,
)

Шаг 3: написание графического конвейера

Пожалуйста, поймите, что каждый калькулятор должен быть написан на C ++, но то, как эти калькуляторы должны быть расположены в конвейере, должно быть определено в формате .pbtxt. Здесь мы напишем очень простой конвейер, составляющий один узел, используя калькулятор, который мы только что построили выше.

Создайте папку face_keypoint в mediapipe / graphs /. В этой новой папке создайте файл face_keypoint_desktop_live. pbtxt ( этот файл будет передан в качестве аргумента основной функции) и вставьте в него следующий код:

input_stream: “input_video”
output_stream: “output_video”
node {
 calculator : “SimpleFlowCalculator”
 input_stream : “IMAGE:input_video”
 output_stream: “IMAGE:output_video”
 }

Вопрос: как уведомить нашу систему сборки о калькуляторах, необходимых для построения этого графика?
Ответ: Создайте локальный файл сборки (т.е. в самой текущей папке, которая называется mediapipe / graphs / face_keypoint /) с именем BUILD и вставьте в него следующий код:

licenses([“notice”]) # Apache 2.0
package(default_visibility = [“//visibility:public”])
cc_library(
 name = “desktop_tflite_calculators”,
 deps = [
 “//mediapipe/calculators/util:simple_flow_calculator”,
 ],
 )

В двух словах

Мы создали:
1. Один новый файл C ++ - Реализация нашего калькулятора .
2. Один файл .pbtxt - Определение графика .
3. Два файла BUILD - один для уведомления системы сборки обо всех зависимостях калькулятора, требуемых для целевого объекта (в данном случае desktop_tflite_calculators), второй является основным файлом BUILD (вверху этого блога).

Мы также изменили уже существующие:
1. Один файл BUILD ( mediapipe / Calculators / util / BUILD) - Список зависимостей для построения нашего нового калькулятора.

Шаг 4. Пример сборки

Перейдите в корневой каталог репозитория MediaPipe. В этом каталоге создайте наш пример с помощью следующей команды:

$ bazel-1.2.1 build -c opt - определить MEDIAPIPE_DISABLE_GPU = 1 mediapipe / examples / desktop / face_keypoint: face_keypoint_cpu

Шаг 5: Выполните это

Чтобы запустить этот пример, выполните следующую команду

Bazel-bin / mediapipe / examples / desktop / face_keypoint / face_keypoint_cpu и передайте файл .pbtxt, определяющий наш график в качестве аргумента, следующим образом

- -calculator_graph_config_file = mediapipe / graphs / face_keypoint / face_keypoint_desktop_live.pbtxt

КТО ЭТОТ ПАРЕНЬ?

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

Чтобы оставить отзыв, напишите на [email protected]. Узнайте больше о наших текущих исследованиях на https://research.fynd.com/.

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