(或该项目以前称为 DeepBackSub)
(美丽的背景归功于 Mary Sabell 和 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
)需要通过传递-f MJPG
将视频源切换为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-ing/WebRTC-ing,我对总是向世界展示我凌乱的家庭办公室感到有点恼火。 Skype 有一个“模糊背景”功能,但过了一段时间后就开始变得无聊(而且它的私密性比我个人想要的要差)。 Zoom 内置了一些背景替换功能,但我不会用 bargepole 来接触该软件(而且该功能在 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 FPS,这确实慢得令人难以忍受,因此我构建了一个 C++ 版本,无需太多手动优化即可管理 10 FPS。足够好了。
我还测试了 Body-Pix 模型的 TFLite 转换版本,但对于此用例,结果与 DeepLab 没有太大不同。
最近,Google 发布了一个专门针对 Google Meet 中使用的人员分割进行训练的模型。无论是在速度还是准确性方面,这都比 DeepLab 具有更好的性能,因此现在这是默认设置。它需要 MediaPipe 框架中的一个自定义操作,但这非常容易集成。感谢@jianjianping 在相应问题中指出了这一点。
这基本上是 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
提供的虚拟相机。如果这适用于您,请检查解决方法的详细信息。