Как конвертировать ImageFrames и GpuBuffers
Калькуляторы ImageFrameToGpuBufferCalculator
и GpuBufferToImageFrameCalculator
преобразуют пакеты типа ImageFrame
и GpuBuffer
туда и обратно. ImageFrame
относится к данным изображения в памяти ЦП в любом из множества форматов растровых изображений. GpuBuffer
относится к данным изображения в памяти графического процессора. Более подробную информацию можно найти в разделе «Концепции фреймворка». Конвертеры GpuBuffer в ImageFrame . Вы можете увидеть пример:
Как визуализировать результаты восприятия
AnnotationOverlayCalculator
позволяет накладывать результаты восприятия, такие как ограничивающие рамки, стрелки и овалы, на видеокадры, совмещенные с распознанными объектами. Результаты могут отображаться в окне диагностики при запуске на рабочей станции или в рамке текстуры при запуске на устройстве. Вы можете увидеть пример использования AnnotationOverlayCalculator
здесь:
Как запускать калькуляторы параллельно
В графе калькулятора MediaPipe обычно параллельно запускает отдельные узлы калькулятора. MediaPipe поддерживает пул потоков и запускает каждый калькулятор, как только поток становится доступным и все его входные данные готовы. Каждый экземпляр калькулятора запускается только для одного набора входных данных одновременно, поэтому большинство калькуляторов должны быть только поточно-совместимыми , а не поточно-ориентированными .
Чтобы позволить одному калькулятору обрабатывать несколько входных данных параллельно, существует два возможных подхода:
- Определите несколько узлов калькулятора и отправьте входные пакеты всем узлам.
- Сделайте калькулятор потокобезопасным и настройте его параметр
max_in_flight
.
Первому подходу можно следовать, используя калькуляторы, предназначенные для распределения пакетов по другим калькуляторам, например RoundRobinDemuxCalculator
. Один RoundRobinDemuxCalculator
может распределять последовательные пакеты по нескольким одинаково настроенным узлам ScaleImageCalculator
.
Второй подход допускает до max_in_flight
вызовы метода CalculatorBase::Process
на одном и том же узле калькулятора. Выходные пакеты из CalculatorBase::Process
автоматически упорядочиваются по меткам времени, прежде чем они передаются последующим калькуляторам.
При любом подходе вы должны помнить, что калькулятор, работающий параллельно, не может поддерживать внутреннее состояние так же, как обычный последовательный калькулятор.
Временные метки вывода при использовании ImmediateInputStreamHandler
ImmediateInputStreamHandler
доставляет каждый пакет, как только он поступает во входной поток. В результате он может доставить пакет с более высокой временной меткой из одного входного потока, прежде чем доставить пакет с более низкой временной меткой из другого входного потока. Если обе эти входные метки времени используются для пакетов, отправляемых в один выходной поток, этот выходной поток будет жаловаться на то, что временные метки не увеличиваются монотонно. Чтобы исправить это, калькулятор должен позаботиться о том, чтобы выводить пакет только после завершения обработки его временной метки. Этого можно добиться, дождавшись, пока входные пакеты будут получены от всех входных потоков для этой временной метки, или игнорируя пакет, который поступает с уже обработанной временной меткой.
Как изменить настройки во время выполнения
Существует два основных подхода к изменению настроек графика калькулятора во время работы приложения:
- Перезапустите график калькулятора с измененным
CalculatorGraphConfig
. - Отправляйте новые параметры калькулятора через пакеты во входных потоках графа.
Преимущество первого подхода заключается в использовании инструментов обработки CalculatorGraphConfig
, таких как «подграфы». Преимущество второго подхода заключается в том, что активные калькуляторы и пакеты остаются в работе при изменении настроек. Участники Mediapipe в настоящее время исследуют альтернативные подходы для достижения обоих этих преимуществ.
Как обрабатывать входные потоки в реальном времени
Платформу mediapipe можно использовать для обработки потоков данных как в режиме онлайн, так и в автономном режиме. При автономной обработке пакеты помещаются в граф, как только калькуляторы готовы обработать эти пакеты. При онлайн-обработке один пакет для каждого кадра помещается в граф по мере записи этого кадра.
Платформа MediaPipe требует только, чтобы последовательным пакетам присваивались монотонно увеличивающиеся временные метки. По соглашению, калькуляторы и графики реального времени используют время записи или время представления в качестве временной метки для каждого пакета, причем каждая временная метка представляет собой микросекунды с Jan/1/1970:00:00:00
. Это позволяет обрабатывать пакеты из различных источников в глобально согласованном порядке.
Обычно при автономной обработке обрабатывается каждый входной пакет, и обработка продолжается столько, сколько необходимо. Для онлайн-обработки часто необходимо отбрасывать входные пакеты, чтобы успевать за поступлением кадров входных данных. Если входные данные поступают слишком часто, рекомендуемым методом отбрасывания пакетов является использование калькуляторов MediaPipe, разработанных специально для этой цели, таких как FlowLimiterCalculator
и PacketClonerCalculator
.
Для онлайн-обработки также необходимо оперативно определить, когда обработка может быть продолжена. MediaPipe поддерживает это, распространяя границы меток времени между калькуляторами. Границы временных меток указывают интервалы временных меток, которые не будут содержать входные пакеты, и позволяют калькуляторам немедленно начать обработку этих временных меток. Калькуляторы, предназначенные для обработки в реальном времени, должны тщательно рассчитывать границы временных меток, чтобы начать обработку как можно быстрее. Например, MakePairCalculator
использует API SetOffset
для распространения границ метки времени из входных потоков в выходные потоки.
Могу ли я запустить MediaPipe в MS Windows?
В настоящее время переносимость MediaPipe поддерживает Debian Linux, Ubuntu Linux, MacOS, Android и iOS. Ядром платформы MediaPipe является библиотека C++, соответствующая стандарту C++11, поэтому ее относительно легко переносить на дополнительные платформы.