(или проект, ранее известный как DeepBackSub)
(За красивые фоны спасибо Мэри Сабель и PhotoFunia)
backscrub распространяется по лицензии Apache License 2.0. Подробности смотрите в файле ЛИЦЕНЗИИ.
Установите зависимости ( sudo apt install libopencv-dev build-essential v4l2loopback-dkms curl
).
Клонируйте этот репозиторий с помощью git clone --recursive https://github.com/floe/backscrub.git
. Чтобы ускорить оформление заказа, вы можете дополнительно передать --depth=1
в git clone
. Это нормально, если вы хотите только скачать и собрать код, однако для разработки это не рекомендуется.
Используйте cmake
для сборки проекта: создайте подпапку (например, build
), перейдите в эту папку и запустите: cmake .. && make -j $(nproc || echo 4)
.
Устарело : Другой вариант сборки всего — запустить make
в корневом каталоге репозитория. Несмотря на то, что при этом будут загружены и собраны все зависимости, у него есть несколько недостатков, таких как отсутствие поддержки XNNPACK. Также это может не работать в более новых версиях Tensorflow Lite, поскольку поддержка этой опции была удалена. Используйте на свой страх и риск.
Сначала загрузите модуль v4l2loopback (для работы Chrome необходимы дополнительные настройки):
sudo modprobe v4l2loopback devices=1 max_buffers=2 exclusive_caps=1 card_label="VirtualCam" video_nr=10
Затем запустите backscrub (-d -d для полной отладки, -c для устройства захвата, -v для виртуального устройства, -b для обоев):
./backscrub -d -d -c /dev/video0 -v /dev/video10 -b ~/wallpapers/forest.jpg
Некоторым камерам (например, Logitec Brio
) необходимо переключить источник видео на MJPG
, передав -f MJPG
, чтобы более высокие разрешения стали доступны для использования.
Для регулярного использования настройте файл конфигурации /etc/modprobe.d/v4l2loopback.conf
:
# V4L loopback driver
options v4l2loopback max_buffers=2
options v4l2loopback exclusive_caps=1
options v4l2loopback video_nr=10
options v4l2loopback card_label="VirtualCam"
Чтобы автоматически загружать драйвер при запуске, создайте /etc/modules-load.d/v4l2loopback.conf
со следующим содержимым:
v4l2loopback
Протестировано со следующими зависимостями:
Протестировано со следующим программным обеспечением:
-c read
)-c read
)В наше время, когда все сидят дома и все время пользуются скайпом, масштабированием или веб-интерфейсом, меня немного раздражало то, что я всегда показывал миру свой грязный домашний офис. В Skype есть функция «размытия фона», но через некоторое время она начинает надоедать (и она менее приватна, чем мне лично хотелось бы). В Zoom есть встроенная функция подмены фона, но я не трогаю это программное обеспечение с помощью шеста (и эта функция все равно недоступна в Linux). Поэтому я решил изучить, как реализовать свою собственную реализацию, не завися от какого-либо конкретного программного обеспечения для видеоконференций, поддерживающего эту функцию.
Весь этот процесс включает в себя три основных этапа разной сложности:
Раньше я много работал с камерами глубины, в том числе над сегментацией фона (см. SurfaceStreams), поэтому просто взял из лаборатории оставшуюся камеру RealSense и попробовал ее. Однако данные о глубине в загроможденном офисе довольно зашумлены, и как бы я ни настраивал настройки камеры, она не могла предоставить никаких данных о глубине моих волос...? Я был похож на средневекового монаха, которому отрубили макушку, так что... дальше.
См. https://docs.opencv.org/3.4/d1/dc5/tutorial_background_subtraction.html для ознакомления. Должно работать нормально для преимущественно статического фона и небольших движущихся объектов, но не работает для преимущественно статического человека на статическом фоне. Следующий.
См. https://docs.opencv.org/3.4/db/d28/tutorial_cascade_classifier.html для ознакомления. Работает нормально, но, очевидно, распознает только лицо, а не остальную часть человека. Кроме того, лишь приблизительно соответствует эллипсу, который в конечном итоге выглядит довольно странно. Следующий.
Я слышал хорошие отзывы об этом методе глубокого обучения, так что давайте попробуем. Сначала мне пришлось перебирать кучу фреймворков (Keras, Tensorflow, PyTorch и т. д.), но после того, как я нашел готовую модель семантической сегментации на базе Tensorflow Lite (DeepLab v3+), я остановился на ней.
Я просмотрел соответствующий пример Python, пример C++ и пример Android и на их основе сначала собрал демо-версию Python. Это работало со скоростью около 2,5 кадров в секунду, что действительно мучительно медленно, поэтому я создал версию на C++, которая обеспечивает 10 кадров в секунду без слишком большой ручной оптимизации. Достаточно хорошо.
Я также протестировал преобразованную в TFLite версию модели Body-Pix, но результаты для этого варианта использования не сильно отличались от результатов DeepLab.
Совсем недавно Google выпустила модель, специально предназначенную для сегментации людей, которая используется в Google Meet. Его производительность намного выше, чем у DeepLab, как с точки зрения скорости, так и с точки зрения точности, поэтому теперь это значение по умолчанию. Для этого требуется одна специальная операция из среды MediaPipe, но ее довольно легко интегрировать. Спасибо @jiangjianping за указание на это в соответствующем выпуске.
По сути, это одна строка кода OpenCV: bg.copyTo(raw,mask);
Я же говорил тебе, что это самая легкая часть.
Я использую v4l2loopback для передачи данных из моего инструмента пользовательского пространства в любое программное обеспечение, которое может открыть устройство V4L2. Это не так уж сложно из-за хороших примеров, но есть некоторые нюансы, в первую очередь цветовое пространство. Потребовалось немало проб и ошибок, чтобы найти общий формат пикселей, который принимается Firefox, Skype и guvcview, и это YUYV. Приятно, что моя веб-камера может выводить YUYV напрямую в виде необработанных данных, так что это экономит мне некоторые преобразования цветового пространства.
Поток данных во всей программе примерно следующий:
write()
данные на виртуальное видеоустройство(*) это обязательные входные параметры для этой модели.
Как обычно: пул-реквесты приветствуются.
См. раздел «Проблемы и запросы на включение» для обсуждаемых/находящихся в настоящее время расширений, а также ознакомьтесь с experimental
веткой.
Предпочтительные форматы Firefox: https://searchfox.org/mozilla-central/source/ Third_party/libwebrtc/webrtc/modules/video_capture/linux/video_capture_linux.cc#142-159
Мы были уведомлены о том, что некоторые версии obs-studio
, упакованные в Snap, не могут обнаружить/использовать виртуальную камеру, предоставляемую backscrub
. Пожалуйста, проверьте подробную информацию об обходных путях, если это применимо к вам.