(または以前は DeepBackSub として知られていたプロジェクト)
(素敵な背景のクレジットは Mary Sabell と PhotoFunia です)
backscrub は、Apache License 2.0 に基づいてライセンスされています。詳細については、LICENSE ファイルを参照してください。
依存関係をインストールします ( 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
次に、バックスクラブを実行します (完全なデバッグの場合は -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
で動作します)誰もが家に座って、常にスカイプ、ズーム、ウェブRTCをしている現代において、私は自分の散らかったホームオフィスを常に世界に公開することに少しイライラしていました。 Skype には「背景をぼかす」機能がありますが、しばらくすると退屈し始めます (そして、私が個人的に望むほどプライベートではありません)。 Zoom には背景置換機能が組み込まれていますが、私はそのソフトウェアにバージポールを使っているわけではありません (そしてその機能は Linux では利用できません)。そこで、これをサポートする特定のビデオ会議ソフトウェアに依存せずに独自の実装を行う方法を検討することにしました。
このシバン全体には、さまざまな難易度の 3 つの主要なステップが含まれます。
私はこれまで、背景のセグメンテーション (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 で実行されており、これは本当に耐え難いほど遅いため、あまり手動で最適化せずに 10 FPS を管理する C++ バージョンを構築しました。十分です。
Body-Pix モデルの TFLite 変換バージョンもテストしましたが、この使用例では結果は DeepLab とあまり変わりませんでした。
最近では、Google は、Google Meet で使用される人物セグメンテーション用に特別にトレーニングされたモデルをリリースしました。これは、速度と精度の両方の点で DeepLab よりもはるかに優れたパフォーマンスを備えているため、現在はこれがデフォルトになっています。 MediaPipe フレームワークからのカスタム op が 1 つ必要ですが、これは統合するのが非常に簡単でした。対応する問題でこれを指摘してくれた @jiangjianping に感謝します。
これは基本的に OpenCV の 1 行のコードです: bg.copyTo(raw,mask);
それは簡単なことだと言いました。
v4l2loopback を使用して、ユーザースペース ツールから V4L2 デバイスを開くことができるソフトウェアにデータをパイプしています。素晴らしい例があるため、これはそれほど難しいことではありませんが、いくつかの注意点、特に色空間の問題があります。 Firefox、Skype、guvcview で受け入れられる共通のピクセル形式、それが YUYV を見つけるには、かなりの試行錯誤が必要でした。ありがたいことに、私の Web カメラは 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
の一部のスナップ パッケージ バージョンでは、 backscrub
によって提供される仮想カメラを検出/使用できないという通知を受けました。これに該当する場合は、回避策の詳細を確認してください。