В этой статье будет описано многое из того, что я узнал об уже созданных в 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