Примечание.
Эта статья также доступна здесь. (Японский)
https://cloud.flect.co.jp/entry/2021/01/19/130105

Примечание: добавлена ​​дополнительная проверка на M1 Mac. Я также обновил BodyPix, чтобы отразить изменение времени обработки. [28 / Март / 2021]

›См. Также: Создайте TFLite Wasm / SIMD и запустите виртуальный фон Google Meet

Введение

В моем предыдущем посте я показал, как добиться виртуального фона с помощью API обработки видео Amazon Chime SDK. В этом посте мы использовали Body Pix для сегментации людей и фона. На этот раз я хотел бы реализовать и оценить функцию виртуального фона, используя модель Google Meet, которая является более легкой.

Вот что мы создали.

Виртуальный фон Google Meet

Команда Google AI опубликовала статью о виртуальном фоне Goole Meet в блоге Google AI в октябре 2020 года. Несмотря на то, что это приложение на основе браузера (а не собственное приложение), функция виртуального фона работает быстро и точно. Это стало горячей темой. Для достижения этой высокой скорости и точности были включены различные идеи. Схема выглядит следующим образом.

Эта функция построена на платформе под названием MediaPipe. В этой виртуальной фоновой функции XNNPACK, которая эффективно обрабатывает вычисления с плавающей запятой в нейронных сетях, и TFLite используются для запуска модели для сегментации. Кроме того, за счет уменьшения разрешения изображения, вводимого в модель, объем вычислений в модели сокращается, чтобы ускорить вывод. Модель имеет архитектуру кодировщика-декодера, которая использует MobileNetV3-Small в качестве кодировщика, а часть Encorder (MobileNetV3-Small) настраивается NAS для работы с меньшими вычислительными ресурсами. Ожидается, что в результате уменьшения разрешения входных данных модели точность сегментации ухудшится. Чтобы компенсировать это, используется постобработка, такая как совместная двусторонняя фильтрация и световое обертывание. Эту постобработку можно пропустить на устройствах, не обладающих высокой вычислительной мощностью.

Для получения дополнительной информации, пожалуйста, обратитесь к блогу Google AI.

Преобразование модели из tflite в tensorflowjs

Как упоминалось выше, виртуальные фоны Google Meet были созданы как решение для MediaPipe. Хотя сам Media Pipe доступен как OSS, исходный код Javascript не планируется выпускать (Проблема). Некоторые из них становятся доступными в виде API (Проблема, Проблема), но функция виртуального фона пока недоступна.

С другой стороны, модель сегментации (формат tflite), используемая внутри функции виртуального фона, выпущена под лицензией Apache-2.0 (ОБНОВЛЕНИЕ [2021/2 февраля]: эта лицензия, похоже, была изменена.). Эта модель является лишь частью виртуального фона Google Meet. Таким образом, с помощью этой модели невозможно достичь такой же производительности, как Google Meet. Однако, как упоминалось выше, эта модель настроена для работы с меньшими вычислительными ресурсами, и вы можете получить от нее пользу.

Модель в формате tflite не может использоваться в Tensorflowjs как есть, но ее можно преобразовать для использования в Tensorflowjs, извлекая из нее веса и заменяя операцию стандартной Tensorflow. Эта процедура описана PINTO. Пожалуйста, обратитесь к блогу PINTO (на японском языке) для подробного объяснения этой процедуры. В этой статье я хотел бы создать виртуальную фоновую функцию, используя модель, созданную PINTO, хотя это не официальная модель tensorflowjs.

Виртуальный фон с моделью сегментации Google Meet TFJS

Модель сегментации Google Meet предоставляет три модели с разным входным разрешением (128x128, 96x160, 144x256). Вот результаты использования каждой модели. Верхняя строка показывает результаты без постобработки, а нижняя строка показывает результаты с постобработкой. Обратите внимание, что постобработка - это моя грубая реализация.

На изображении 128x128 верхняя часть головы женщины слева немного искажена, но изображения 96x160 и 144x256 постепенно улучшаются. После постобработки я думаю, что это почти не отличить.

Затем давайте посмотрим на сравнение с BodyPix, у которого есть множество параметров, все из которых я использовал как значения по умолчанию. Разрешение входного изображения является переменным и нет значения по умолчанию, поэтому я установил его на 480x640 (потому что он используется в примере репозитория BodyPix). В качестве магистрали мы пробовали как MobilenetV1, так и Resnet50. Изображения в (1) получены от Google, соответствуют модели 128x128, без постобработки. Изображения (2) и (3) сделаны с помощью BodyPix. Изображение в (4) использует модель Google Meet 144x256 и подверглось постобработке.

(2) BodyPix MobilenetV1 немного грубоват, и фон виден. (3) ResNet50, как и ожидалось, довольно хорошо удаляет фон. Однако (1) Google Meet (128x128, без постобработки) немного неровный, но я думаю, что он не хуже ResNet50. И было бы несправедливо включать постобработку в сравнение, но я думаю, что (4) соответствие Google (модель 144x256 с постобработкой) выглядит лучше всего среди них.

На этот раз мы не будем сравнивать долговые расписки, поэтому мы не можем делать количественные оценки, но, просто взглянув на изображения, я думаю, вы увидите, что точность довольно высока.

Время обработки оценки

Хотим посмотреть на время обработки. На рисунке ниже показан обзор виртуального фонового процесса. Сначала изображение с камеры преобразуется в тензор и загружается в графический процессор. Затем выполняется предварительная обработка, такая как нормализация. После предварительной обработки выполняется логический вывод, и результаты загружаются в ЦП. Выполняется постобработка результатов, а затем выполняется рендеринг.

Для оценки времени обработки мы хотели бы оценить следующие три диапазона. (а) - только время вывода модели. (b) - время предварительной обработки (например, нормализации) и время загрузки результатов вывода в графический процессор. (c) - время обработки, включая постобработку. На этот раз мы сравним с BodyPix, но BodyPix скрывает часть (а), поэтому мы не можем ее получить. В этом случае сравним (б) и (в).

Я использовал MacBook Pro 2019 2.4Ghz QuadCore Intel Corei5 для измерения времени обработки, в то время как Google AI Blog оценил его с использованием MacBook Pro 2018 2.2GHz 6Core Intel Corei7. Среда немного отличается, но может быть полезна для справки. На этот раз результаты были следующими (я обновил результаты, так как обновил версию TFJS и BodyPix, и производительность BodyPix улучшилась. Я также улучшил пост-обработку GoogleMeet.)

Для (а) это было 8 ~ 9 мс для всех моделей Google Meet, что находится в тесном соответствии с блогом Google AI Blog, в котором также говорится, что вывод выполняется примерно за 8,3 мс. (Честно говоря, это измерение измеряет только время, необходимое функции прогнозирования для возврата управления, и я не совсем понимаю, полностью ли завершена обработка на стороне графического процессора за это время или она выполняется асинхронно. ‹- С дополнительными проверка, начинает казаться правильным то, что это выполняется асинхронно.)

Для (b) модель Google Meet заняла от 22,0 до 28,5 мс. Глядя на детали, кажется, что процесс загрузки результатов обработки графического процессора в центральный процессор занимает время, пропорциональное количеству данных. BodyPix MNv1 занял 55,2 метра, а BodyPix Resnet50 - 114,4 метра. Однако это может быть связано с тем, что мы вводим изображения 640x480, которые имеют более высокое разрешение, и результаты будут иметь такое же разрешение, поэтому загрузка результатов может занять больше времени. В качестве нового случая мы попытались ввести изображение с разрешением 300x300 в BodyPix MNv1 (случай (6)). В результате нам удалось сократить время обработки до 34,5 мс. Однако результат ухудшается из-за пониженного разрешения. На следующем рисунке показан результат. Вы можете увидеть много фона.

(c) составляет около 40 мс для всех моделей. Постобработка занимает примерно столько же времени, что и вывод, но это грубая реализация, так что еще есть возможности для улучшения. Тем не менее, он все еще может обрабатывать примерно 25 кадров в секунду. BodyPix работает почти так же хорошо в случае (6), но, как упоминалось выше, точность немного грубая.

Как упоминалось ранее, виртуальный фон Google Meet предполагает, что постобработку можно пропустить на устройствах с низким уровнем ресурсов. Время обработки с пропуском также показано в строке (3) -p.p. Время обработки составляет 23 ~ 27 мс, что примерно на 60% быстрее, чем (6). Как упоминалось выше, даже в этом случае сегментация достаточно точна.

Исходя из вышеизложенного, используя версию TFJS модели сегментации Google Meet (даже без использования платформы MediaPipe), мы можем сказать следующее.

  • На устройствах с низкими характеристиками: пропуская постобработку, виртуальные фоны могут быть получены с более высоким качеством и примерно на 60% быстрее, чем BodyPix.
  • На устройстве с высокими техническими характеристиками: реализовав постобработку, можно добиться гораздо более высокого качества виртуального фона, даже если скорость не сильно отличается от BodyPix.
  • BodyPix предполагает вход с низким разрешением около 300x300 с использованием MNv1.

Дополнительная оценка

После того, как я опубликовал этот блог, я получил предложение, что Mac M1, использующий UMA ​​(UnifiedMemoryArchtecture), будет еще быстрее, потому что это устранит накладные расходы на передачу памяти от графического процессора к процессору. Я понимаю! Поэтому я опробовал его на своем собственном Mac Book Air (модель M1). Результаты приведены ниже. Общее ускорение соответствует ожиданиям. С другой стороны, с UMA я надеялся, что разница между (a) и (b) почти исчезнет при использовании Google Meet, но, к сожалению, она все еще остается. Этот результат предполагает, что большее время в (b) по сравнению с (a) может быть не из-за накладных расходов на копирование памяти из GPU в CPU, а из-за ожидания, пока GPU синхронизирует свою обработку.

Демо

Вы можете использовать демонстрацию, которую я использовал для оценки.

Виртуальный фон с Amazon Chime SDK

Реализация виртуальных фонов с помощью API обработки видео Amazon Chime SDK была описана в предыдущей статье; это можно сделать, заменив BodyPix на модель GoogleMeet, поэтому мы не будем описывать здесь реализацию. Если вы хотите узнать подробности, обратитесь к репозиторию, описанному ниже. Операция выглядит следующим образом.

Репозиторий

Код для демонстрации находится в этом репозитории.



Демоверсия Amazon Chime SDK уже доступна



Ну наконец то

На этот раз мы использовали версию TFJS модели сегментации Google Meet и реализовали функцию виртуального фона с помощью Amazon Chime SDK. В результате сравнения и оценки с BodyPix мы обнаружили, что можно реализовать более быстрый и качественный виртуальный фон, чем BodyPix (хотя это далеко от исходной функции виртуального фона Google Meet, которая использует MediaPipe).

Обратите внимание, что, как упоминалось выше, на этот раз мы используем не официальную модель, а преобразование TFJS официальной модели TFLite добровольцем. Обратите внимание, что вы используете только на свой страх и риск. В частности, если вы хотите встроить его в продукт, вам нужно уделить особое внимание и проверить качество. И у нас нет опыта с выводом на WASM. Обратите внимание, что нам нужно будет внести еще несколько улучшений.

Благодарности

Я использовал изображения людей, видео людей и фоновые изображения с этого сайта.

Https://pixabay.com/ja/

Https://www.irasutoya.com/