- Подмена фона в видеочате
- ManyCam — наложение эффектов и смена фона на видео с веб-камеры
- Zoom: как заменить фон во время видеочата
- Что такое виртуальный фон в Zoom
- Настройка виртуального фона в Zoom
- Изменить фон в Zoom через Snap Camera
- Видеозвонки с виртуальным фоном и опенсорсные инструменты
- Чтение данных с камеры
- Обнаружение фона
- Интересные эксперименты
- Вывод видео
- Итоги
Подмена фона в видеочате
14 июля 1995 года на киноэкраны вышел фильм «Under Siege 2: Dark Territory» (в российском прокате — «Захват 2: Тёмная территория»). Один из персонажей этого фильма — злой гений-компьютерщик Трэвис Дэйн — создавал видеозапись своего лица на подменённом фоне, чтобы нельзя было установить подлинное местонахождение террористов (он использовал для этой цели фотографию Эйфелевой башни в Париже).
Прошло пятнадцать лет.
Сегодня не нужно быть компьютерным гением, чтобы подменить фон в своём видеочате. И в Chatroulette, и в Skype, и в видеокомнатах Smotri.com многие делают это. Однако, чем больше я вижу таких трюков, тем чаще вижу поверх них название программы WebcamMax. это и неудивительно: программа эта — платная, а в демонстрационной версии поверх видео накладывается неотключаемый «баннер». Но почему же любители видеочата не могут найти и использовать бесплатный аналог её? Я ненавистник баннерной рекламы, поэтому желал бы, чтобы все эти люди использовали другой софт.
Обращаюсь тотчас же через Хабрахабр, чтобы открытым текстом всем рекомендовать неплохую программу, freeware, обладающую достаточными способностями для замены фона во время видеочата на любую фотографию или подвижную видеозапись из файла. Она доступна не только для Windows, но также и для Mac.
Когда киношники монтируют современные фильмы на компьютере, то они также массово подменяют фон, и им для этого на съёмках требуется специальный одноцветный, однотонный экран неестественного синего или салатового цвета (его ещё называют «хромакей», от англ. chromakey). Однако в видеочате, в отличие от фильма, съёмка ведётся неподвижной видеокамерою, так что (судя по пособию ManyCam) достаточно дать команду компьютеру, а самому убраться из поля зрения видеокамеры для того, чтобы компьютер запечатлел произвольный подлинный фон видеочата и в дальнейшем мог подменять его на какой угодно другой желаемый.
ManyCam — наложение эффектов и смена фона на видео с веб-камеры
Наткнулся на интересную программу для настройки веб-камеры ManyCam, которая позволяет не просто настраивать вашу веб-камеру, но и накладывать различные эффекты на картинку. Вы легко сможете записать видео с любой точки планеты, находясь при этом дома (накладывание фона), вы можете надеть на себя забавную шляпу, усы или, допустим, очки. Можно накладывать различные тексты, дату и время съемки. При сохранении настроек в ManyCam и открытии Skype вы имеете на своей камере картину уже с выбранными вами эффектами.
При замене фона необходимо знать один важный момент, без которого замена фона невозможна. Чтобы корректно заменить фон на картинке, необходимо иметь монотонный непрозрачный фон. После установки фона, программа сделает снимок экрана (вас в кадре быть не должно) и подставит на фоновый оттенок рисунок или видео изображение. То есть все точки, имеющие цвет фона, будут автоматически меняться на выбранное изображение или видео. Затем, вы можете появляться в кадре, уже на фоне красивого водопада, пустыни или любого другого места нашей планеты (и не только).
Выбирать различные наложения (шляпки, носы, очки, брови, усы и прочее) можно без специального оборудования. Программа автоматически распознает части человеческого лица и сама выбирает место наложения. При этом даже во время вашего движения наложенные эффекты будут двигаться вместе с вами, сохраняя правильное расположение.
В настройках программы также можно переключить вид камеры на рабочий стол вашего компьютера, что позволит собеседнику видеть все, что происходит на вашем рабочем столе. Это крайне удобно при объяснении собеседнику чего-либо, связанного с компьютером. Например, ваш собеседник не может понять, как включить ту или иную опцию в какой-то программе. Нет ничего проще, переключаете вид камеры на рабочий стол вашего компьютера и показываете, как это делается.
Zoom: как заменить фон во время видеочата
Как быть, когда надо срочно связаться с коллегами по видеосвязи, а вокруг бегают дети или в кадр попадает неубранная комната? Есть простой выход – поменять фон в программе для видеоконференций. Как это сделать в популярном приложении Zoom, рассказываем в статье.
Из-за массового перехода на удаленку стали популярны всевозможные сервисы для видеоконференций. При этом большая часть людей работает не из личных кабинетов, а прямом смысле из дома — где вокруг компьютера крутятся дети, домашние животные и прочие обитатели обычной квартиры. Кто-то и вовсе начал делать ремонт до начала карантина и не успел его закончить по понятным причинам, а кто-то не любит лишний раз делать уборку. К счастью, все эти детали можно легко замаскировать и не делиться с коллегами подробностями своего быта в прямом эфире.
Видеоконференции с Zoom становятся все более актуальными, поскольку их легко использовать в домашнем офисе даже без регистрации. В Зум также легко изменить виртуальный фон во время видеочата.
Что такое виртуальный фон в Zoom
Обычно во время видеоконференции в качестве фона вам служит либо интерьер комнаты, либо унылая белая стена переговорки. С виртуальным фоном в Zoom вы можете изменить эту традицию и настроить вид фона индивидуально.
В качестве фона для участия в конференции можно использовать предложенные варианты «обоев» или выбранное вами изображение. Это может быть, например, логотип вашей компании или изображение какого-то особого места. Этот виртуальный фон будет виден всем, кто участвует вместе с вами в видеоконференции.
Настройка виртуального фона в Zoom
Поменять фон в Зуме довольно легко:
Наш совет: чтобы фон был хорошо виден другим участникам конференции, обратите внимание на равномерное освещение.
Изменить фон в Zoom через Snap Camera
Если набора предустановленных виртуальных фонов в Zoom вам недостаточно, можете использовать дополнительный инструмент с множеством фильтров. Приложение Snap Camera позволяет применять фильтры для лица, а также настраивать фон в видеочатах — не только в Зуме, но и в других подобных программах. Поскольку все пользователи Snap Camera также могут загружать и делиться фильтрами, выбор здесь действительно большой.
Скачать Snap Camera
Как использовать Snap Camera в Zoom:
Видеозвонки с виртуальным фоном и опенсорсные инструменты
Сейчас, когда многие из нас находятся на карантине из-за COVID-19, видеозвонки стали куда более частым явлением, чем раньше. В частности, сервис ZOOM неожиданно стал очень популярным. Вероятно, самой интересной возможностью Zoom является поддержка виртуального фона (Virtual Background). Она позволяет пользователям, в интерактивном режиме, заменять фон, находящийся позади них, на любое изображение или видео.
Я уже давно применяю Zoom на работе, на опенсорсных встречах, посвящённых Kubernetes, делая это обычно с корпоративного ноутбука. Теперь я, в режиме работы из дома, склонен к использованию более мощного и удобного персонального настольного компьютера для решения некоторых из моих опенсорсных задач.
К несчастью, Zoom поддерживает лишь способ удаления фона, известный как «хромакей» или «зелёный экран». Для использования этого метода нужно, чтобы фон был бы представлен неким сплошным цветом, в идеале — зелёным, и был бы равномерно освещён.
Так как зелёного экрана у меня нет, я решил просто реализовать собственную систему удаления фона. А это, конечно, куда лучше, чем наведение порядка в квартире, или постоянное использование рабочего ноутбука.
Как оказалось, применив готовые опенсорсные компоненты и написав буквально несколько строк собственного кода, можно получить весьма достойные результаты.
Чтение данных с камеры
Начнём с начала и ответим на следующий вопрос: «Как получить видео с веб-камеры, которое будем обрабатывать?».
Так как я на домашнем компьютере использую Linux (когда не играю в игры), я решил использовать Python-привязки Open CV, с которыми я уже знаком. Они, помимо V4L2-биндингов для чтения данных с веб-камеры, включают в себя и полезные базовые функции по обработке видео.
Чтение кадра с веб-камеры в python-opencv устроено очень просто:
Я, чтобы улучшить результаты при работе с моей камерой, перед захватом с неё видео применил следующие настройки:
Возникает такое ощущение, что большинство программ для видеоконференций ограничивают видео параметрами 720p @ 30 FPS, или ниже. Но мы, в любом случае, можем и не читать каждый кадр. Такие настройки задают верхний лимит.
Поместим механизм захвата кадра в цикл. Теперь у нас есть доступ к видеопотоку с камеры!
Сохранить кадр в тестовых целях можно так:
После этого мы можем убедиться в том, что камера работает. Замечательно!
Надеюсь, вы не против моей бороды
Обнаружение фона
Теперь, когда у нас есть доступ к видеопотоку, подумаем о том, как обнаружить фон, сделав так, чтобы, найдя его, его можно было бы заменить. А вот это — уже достаточно сложная задача.
Хотя возникает такое ощущение, что создатели Zoom нигде не рассказывают о том, как именно программа убирает фон, то, как ведёт себя система, заставляет меня задуматься о том, что тут не обошлось без нейронных сетей. Это сложно объяснить, но результаты выглядят именно так. Кроме того, я нашёл статью о том, как в Microsoft Teams реализовано размытие фона с помощью свёрточной нейронной сети.
В принципе, создать собственную нейронную сеть не так уж и сложно. Существует множество статей и научных трудов на тему сегментации изображений. Есть масса опенсорсных библиотек и инструментов. Но нам нужен, для получения хороших результатов, весьма специализированный датасет.
В частности, нам нужно множество изображений, напоминающих те, что получены с веб-камеры, с идеальной картинкой человека на переднем плане. Каждый пиксель такой картинки должен быть промаркирован как отличающийся от фона.
Построение такого датасета при подготовке к обучению нейронной сети, возможно, не потребует больших усилий. Это — благодаря тому, что команда исследователей из Google уже сделала всё самое тяжёлое и выложила в опенсорс предварительно обученную нейронную сеть для сегментации людей. Эта сеть называется BodyPix. Работает она очень хорошо!
Сеть BodyPix сейчас доступна лишь в форме, подходящей для TensorFlow.js. В результате, легче всего её применить, воспользовавшись библиотекой body-pix-node.
Для ускорения получения вывода сети (прогноза) в браузере предпочтительно пользоваться WebGL-бэкендом, но в среде Node.js можно воспользоваться бэкендом Tensorflow GPU (обратите внимание на то, что для этого понадобится видеокарта от NVIDIA, которая у меня есть).
Для того чтобы упростить настройку проекта, воспользуемся маленьким контейнеризованным окружением, обеспечивающим работу TensorFlow GPU и Node.js. Использование всего этого с помощью nvidia-docker — гораздо легче, чем самостоятельный сбор необходимых зависимостей на своём компьютере. Для этого на компьютере понадобится лишь наличие Docker и актуальных графических драйверов.
Вот содержимое файла bodypix/package.json :
Вот — файл bodypix/Dockerfile :
Теперь поговорим о получении результатов. Но сразу предупреждаю: я не отношусь к Node.js-экспертам! Это — лишь результат моих вечерних экспериментов, поэтому будьте ко мне снисходительны :-).
Следующий простой скрипт занят обработкой изображения с двоичной маской, отправленного на сервер с использованием HTTP POST-запроса. Маска — это двумерный массив пикселей. Пиксели, представленные нулями — это фон.
Вот — код файла app.js :
Для преобразования кадра в маску мы, в Python-скрипте, можем воспользоваться пакетами numpy и requests:
В результате получается примерно следующее.
Пока я всем этим занимался, я наткнулся на следующий твит.
Это, определённо, самый лучший фон для видеозвонков
Теперь, когда у нас имеется маска для отделения переднего плана от фона, заменить фон на что-то другое будет очень просто.
Я взял из ветки того твита фоновое изображение и обрезал его так, чтобы получилась бы картинка формата 16×9.
После этого я сделал следующее:
Вот что у меня после этого получилось.
Результат замены фона
Такая маска, очевидно, недостаточно точна, причиной этого являются те компромиссы в сфере производительности, на которые мы пошли, настраивая BodyPix. В общем, пока всё выглядит более или менее терпимо.
Но, когда я смотрел на этот фон, меня посетила одна идея.
Интересные эксперименты
Теперь, когда мы разобрались с маскированием, зададимся вопросом о том, как улучшить результат.
Первый очевидный шаг заключается в смягчении краёв маски. Например, это можно сделать так:
Это позволит немного улучшить ситуацию, но особого продвижения вперёд тут нет. Да и простая замена — дело довольно-таки скучное. Но, так как мы дошли до всего этого сами, это значит, что мы можем сделать с картинкой всё что угодно, а не просто убрать фон.
Учитывая то, что мы используем виртуальный фон из «Звёздных войн», я решил создать эффект голограммы для того чтобы сделать картинку интереснее. Это, кроме того, позволяет сгладить размытие маски.
Для начала обновим код пост-процессинга:
Края теперь оказываются размытыми. Это хорошо, но нам ещё нужно создать эффект голограммы.
Голливудские голограммы обычно отличаются следующими свойствами:
Сначала, чтобы окрасить изображение в оттенок синего, можем воспользоваться методом applyColorMap :
Далее — добавляем линии развёртки с эффектом, напоминающим уход в полутона:
Далее, реализуем «эффект привидения», добавляя к изображению сдвинутые взвешенные копии текущего эффекта:
И наконец, мы хотим сохранить какие-то из исходных цветов, поэтому скомбинируем голографический эффект с оригинальным кадром, поступив примерно так, как при добавлении «эффекта привидения»:
Вот как выглядит кадр с эффектом голограммы:
Кадр с эффектом голограммы
Сам по себе этот кадр выглядит неплохо.
Попробуем теперь совместить его с фоном.
Изображение, наложенное на фон
Готово! (обещаю — видео такого рода будет выглядеть интереснее).
Вывод видео
А теперь надо сказать о том, что мы тут кое-что упустили. Дело в том, что всем этим мы пока не можем воспользоваться для совершения видеозвонков.
Для того чтобы это исправить, воспользуемся pyfakewebcam и v4l2loopback для создания фиктивной веб-камеры.
Мы, кроме того, планируем прицепить эту камеру к Docker.
Сначала создадим файл fakecam/requirements.txt с описанием зависимостей:
Теперь создадим файл fakecam/Dockerfile для приложения, реализующего возможности фиктивной камеры:
Теперь, из командной строки, установим v4l2loopback:
Настроим фиктивную камеру:
Теперь внесём в скрипт изменения, позволяющие создать фиктивную камеру:
Нужно отметить, что pyfakewebcam ожидает изображения с каналами RGB (Red, Green, Blue — красный, зелёный, синий), а Open CV работает с порядком каналов BGR (Blue, Green, Red).
Исправить это можно до вывода кадра, а затем отправить кадр так:
Вот — полный код скрипта fakecam/fake.py :
Теперь соберём образы:
Итоги
Вот клип, который демонстрирует результаты моей работы.
Результат замены фона
Видите! Я звоню с Сокола Тысячелетия, пользуясь опенсорсным стеком технологий для работы с камерой!
То, что у меня получилось, мне очень понравилось. И я, определённо, всем этим воспользуюсь на следующей видеоконференции.
Уважаемые читатели! Планируете ли вы поменять то, что видно при видеозвонках у вас за спиной, на что-то другое?
Наверное, каждый, кто вынужден периодически совершать рабочие видеозвонки, хотя бы раз сталкивался с проблемой выбора подходящего фона. Камеру включать надо, но при этом совсем не хочется демонстрировать, что находится за спиной. Мы попробовали найти способ максимально качественно решить этот вопрос.
Наложение масок
Сегодня в сети можно отыскать разнообразные программы, которые пытаются накладывать фильтры на изображение. Некоторые из них работают по принципу популярного приложения MSQRD. То есть, они фиксируют определенные контрольные точки на изображении и на них накладывают маску. Тот же MSQRD накладывает маски на лицо пользователя, но существуют и альтернативные варианты, которые пытаются аналогичным образом прятать фон.
Звучит, конечно, неплохо, но что имеем по факту? Увы, вся эта автоматика очень часто и очень сильно ошибается. Если Вы пользовались MSQRD, то уже знаете, что по-настоящему хорошо его маски выглядят на скриншотах. В режиме обработки в реальном времени изображение заметно подрагивает, постоянно подстраиваясь под объект.
То же и с попыткой менять фон. Мы протестировали несколько программ, включая популярные решения VideoSkin и WebcamMax. Для замены фона этим программам необходимо, чтобы пользователь сперва сфотографировал этот самый фон. Маска накладывается поверх, а любой объект, который входит в кадр после этого, накладывается уже поверх маски. Увы, очень часто это работает некорректно. Маска частенько «запрыгивает» на лицо пользователя. Таким образом, во время видеозвонка весь человек или части его лица могут спонтанно исчезать и обрезаться самым причудливым образом. Кроме того, использование масок требует, чтобы фон был статичным. Малейшее изменение ракурса, освещения или фокуса камеры приведет к тому, что маска слетит.
Конечно же, тот же WebcamMax имеет множество забавных эффектов, которые могут накладываться поверх изображения, как, к примеру, новые стикеры в SnapChat. Но для профессиональной замены фона такой метод не подходит.
Старый добрый хромакей
Увы, но у человечества пока нет иного способа качественно заменять фон, кроме как использовать эффект хромакей (англ. chroma key). Хромакей – технология совмещения двух и более изображений или кадров в одной композиции при помощи особого цветового ключа. Этот метод используется Голливудом с 1930-х годов. Почти за сто лет ему не нашли равных. Самые современные блокбастеры снимаются на зеленом фоне. К счастью, этот метод доступен и простым пользователям.
Единственный недостаок – для использования технологии хромакей потребуется физический однотонный экран. Подойдет и однотонная стена, но всё же желательно, чтобы экран был какого-нибудь яркого цвета, к примеру, синего или зеленого. Если Вы регулярно совершаете видеозвонки или, к примеру, решитесь когда-либо зарабатывать на YouTube, такой экран Вам, в любом случае, потребуется, чтобы выглядеть более-менее презентабельно.
Как пользоваться хромакеем
Для использования метода зеленого экрана Вам потребуется программа, поддерживающая технологию хромакей. Одна из простых и удобных программ такого типа – ManyCam. Она позволяет обрабатывать видеопоток и транслировать его в большое количество сервисов, включая и Skype.
При запуске ManyCam Вы увидите вкладку «Видео», где можно выбрать источник потока. Для выбора достаточно щелкнуть по окошку с предполагаемым видео. Источником может быть изображение с камеры, видеоигра, поток с удаленной интернет-камеры, прочие устройства, медиафайлы, ролики прямиком с YouTube, Ваш рабочий стол или цветная заставка.
При работе с камерой Вам нужно будет выбрать соответствующий пункт «Камеры», а затем – свое подключенное устройство. Мы же в качестве демонстрации используем видео с YouTube, где актер Жан-Клод Ван Дамм скачет, стреляет и говорит пафосные фразы на готовом зеленом фоне.
Для начала работы с технологией хромакей, нужно в нижней части окна программы выбрать вкладку Chroma Key и включить этот эффект, нажав на кнопку ON. Затем нужно выбрать фон, который следует заменять. Сделать это можно, нажав на кнопку «Определить цвет» (кнопка с изображением пипетки по соседству с кнопкой ON). Затем – просто щелкните по своему экрану в окошке видео. Экран автоматически начнет заменяться изображением или фоном, который Вы установите.
Три цветовые шкалы под кнопками нужны для того, чтобы тонко настроить фильтр фона и убрать возможную границу между экраном и объектом съемки. Когда изображение будет подогнано идеально, пора переходить к трансляции видео. По умолчанию программа ManyCam создает в системе виртуальную камеру под именем ManyCam Virtual WebCam (N), где N – количество видеопотоков. Чтобы начать транслировать поток, к примеру, в Skype, достаточно выбрать его в настройках.
Как только Skype подключится к потоку, в ManyCam зажжется красная кнопка ON AIR (в эфире).
Обратите внимание, изображение в Skype может быть развернуто на 180 градусов по отношению к тому, что выдает ManyCam. Чтобы исправить это, нужно повернуть изображение в самом ManyCam. Для этого в нижней части окна нужно выбрать вкладку «Картинка» и задать зеркальную ориентацию, используя кнопки «Повернуть и отразить».
Таким нехитрым способом Вы сможете не только красиво позвонить по Skype, но и начать свою карьеру в качестве видеоблогера.