Если у вас есть сложный вопрос, на который вы не можете ответить, начните с более простого вопроса, на который вы не можете ответить.
- Макс Тегмарк
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. Эта СБОРКА должна содержать зависимости, необходимые для построения ЦЕЛИ.
Каковы наши зависимости в этом случае?
- demo_run_graph_main: файл BUILD в mediapipe / examples / desktop / инструктирует создать demo_run_graph_main.cc, который является типичным файлом драйвера, содержащим функцию main (). .
- 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/.
Если вы заметили какие-либо несоответствия в этой статье, оставьте комментарий ниже, чтобы я мог решить проблему как можно скорее.