(或該專案以前稱為 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
提供的虛擬相機。如果這適用於您,請檢查解決方法的詳細資訊。