В этой статье будет описано многое из того, что я узнал об уже созданных в Mediapipe калькуляторах за последний год его использования. Я использовал исключительно пример отслеживания рук, поэтому здесь я буду подробно рассказывать о нем. Документация по этим калькуляторам есть в файлах, но я счел ее недостаточной. Здесь я расскажу о калькуляторах и классах, обычно используемых при отслеживании рук. Эта статья предназначена для тех, кто имеет промежуточные знания о том, как работает Mediapipe.

Как поместить файл .tflite в Mediapipe

«TfLiteInferenceCalculator» используется для запуска файлов .tflite. Настройте файл .pbtxt следующим образом:

node {

калькулятор: «TfLiteInferenceCalculator»

input_stream: «ТЕНСОРЫ: input_tensors»

output_stream: «ТЕНСОРЫ: output_tensors»

node_options: {

[type.googleapis.com/mediapipe.TfLiteInferenceCalculatorOptions] {

model_path: «mediapipe / models / filename.tflite»

}

}

}

Убедитесь, что ваша модель .tflite находится в папке / models. Если вы планируете компилировать для Android, убедитесь, что файл моделей также включен в зависимости Android.

Обратите внимание, что входные данные для TfLiteInferenceCalculator должны иметь тег TENSORS. Чтобы получить ТЕНЗОРЫ, вам нужно будет ввести матрицы в «TfLiteConverterCalculator». Добавьте в файл .pbtxt следующее:

node {

калькулятор: «TfLiteConverterCalculator»

input_stream: «МАТРИЦА: input_matrix»

output_stream: «ТЕНСОРЫ: input_tensors»

}

Чтобы использовать поток данных MATRIX, вам понадобится калькулятор, предшествующий TfLiteConverterCalculator, чтобы иметь выходной поток MATRIX. Mediapipe использует библиотеку Eigen c ++. Чтобы использовать его, включите следующий заголовок:

#include «mediapipe / framework / sizes / matrix.h»

Объявите матрицу с помощью следующего кода:

Матричный тест;

test.resize (1, 42);

тест (0, 1) = 3;

Не забудьте также добавить необходимые зависимости в свой файл BUILD.

Как работать с классом NormalizedLandmarkList

NormalizedLandmarkList - это тип данных, в котором хранятся нормализованные координаты руки (нормализованные до разрешения). Отслеживается 21 координата. Каждая координата имеет значения x, y и z. В предыдущих версиях Mediapipe были только x и y. Можно еще удалить координату z, и это может улучшить производительность. По нашему опыту, координата Z может быть неточной. Согласно Mediapipe, координата Z была обучена чисто синтетическим путем, в то время как координаты X и Y были обучены частично с реальными данными, а частично с синтетическими данными. В приведенном ниже примере показана рука, показывающая букву A языка жестов с координатами NormalizedHandLandmark. Каждое значение соответствует значению ориентира.

Для доступа к каждому ориентиру используйте NormalizedLandmarkList.landmark (index), который вернет константу NormalizedLandmark. Чтобы получить доступ к координатам x, y и z, используйте .x (), .y () и .z ().

Чтобы создать новый NormalizedLandmarkList, он должен быть создан с нуля, поскольку NormalizedLandmarkList являются константами. Объявите новый NormalizedLandmarkList и используйте NormalizedLandmarkList.add_landmark (), чтобы добавить набор координат x, y, z. Первый ориентир, который вы создадите, будет иметь индекс 0, а дальнейшие ориентиры будут расположены дальше. Ваш новый NormalizedLandmark будет непостоянным указателем, что позволит вам использовать NormalizedLandmark - ›set_x () для установки значения с плавающей запятой / двойной точности. Точно так же вы можете использовать set_y () и set_z ().

Вы можете найти ссылку на поток NormalizedLandmarkList в «/ mediapipe / graphs / hand_tracking / hand_tracking_desktop», где он будет иметь тег «LANDMARKS: hand_landmarks».

Как использовать класс RenderData для отображения текста

После объявления переменной RenderData используйте RenderData.add_render_annotations () и сохраните ее в переменной, которая теперь называется «label_annotation». Оттуда вы можете создавать несколько текстов, вызывая label_annotation- ›mutable_text (). Он вернет указатель класса RenderAnnotation_Text. Вы можете установить свойства, используя следующие функции.

set_display_text (std :: string) «Установить текст изменяемого текстового объекта»

set_baseline (int) «Установить положение текста вверх / вниз»

set_left (int) «Установить левую / правую позицию текста»

set_font_height (int) «Установить высоту текста»

set_normalized (bool) «Мне не очень повезло, что это значение было истинным»

set_thickness (int) «Установить толщину текста»

mutable_color () - ›set_r (int)« Установить красный цвет в значении RGB текста »

mutable_color () - ›set_g (int)« Установить зеленый цвет в значении RGB текста »

mutable_color () - ›set_b (int)« Установить синий цвет в значении RGB текста »

set_font_face (int) «Изменяет шрифт, принимает значения 0–7 для готовых шрифтов»

После того, как у вас есть RenderData, вы должны передать их в «AnnotationOverlayCalculator». На этот калькулятор есть ссылки в «/mediapipe/graphs/hand_tracking/subgraphs/renderer_gpu.pbtxt» и «/mediapipe/graphs/hand_tracking/subgraphs/renderer_cpu.pbtxt». Калькулятор имеет индексированные входные данные, поэтому просто добавьте вложенный тег вашего потока RENDER_DATA в калькулятор, и он будет автоматически обработан.

Кто я и как я изучил Mediapipe?

Я Ариан Алави, студент прикладной математики Калифорнийского университета в Санта-Барбаре. В течение последнего года я время от времени работал с Mediapipe, чтобы создать живой переводчик алфавита ASL. Большая часть того, что я узнал о Mediapipe, я узнал, изучив их пример отслеживания рук и изменив код.

С помощью многих моих друзей нам удалось развернуть интерпретатор ASL в магазине приложений Android. Чтобы узнать больше о нашем проекте, вы можете посетить нашу страницу GitHub: www.github.com/AriAlavi/SigNN и попробовать наше приложение: https://play.google.com/store/apps/details?id=com. signn.mediapipe.apps.handtrackinggpu