Zoomを始め各種のビデオ会議アプリでは、人物を背景から切り抜いて仮想背景と合成する機能がついていることが多いです。しかし、私の知る限りどのサービスでもLinux版のクライアントソフトではその仮想背景機能がなぜか削られています。ということで、何百番煎じかわからないんですが、仮想背景を合成した動画を返す仮想カメラを作るプログラムを作りました。
やっていること
今までのやり方と同じで、Bodypixというニューラルネットワークによる人物認識法を使って人物を背景から切り出し、合成した結果をv4l2loopbackモジュールを使って出力しています。これの丸パクリです。じゃあなんでわざわざまた作ったんだって感じですが、今までのやり方では必ず背景合成プログラムを手動で起動するか、常に起動しっぱなしにして常にニューラルネットワークを計算しっぱなしにする必要がありました。いちいちコマンドを叩くのはどうもなんかめんどくさいですが起動しっぱだとエコじゃないし生のカメラ出力が使えなくなってしまうということで、なんかちょっと微妙な感じがします。そこで、inotify
を使って、仮想デバイスが開かれたときだけ推論をするようなプログラムを書き、これをsystemdでデーモン化してみました。キャラクタデバイスをinotify
できるのかどうか若干心配でしたが、今の所ちゃんと動いてるっぽいです。(まあ、もしかしたらすでに誰かがやってるかもしれませんが。。)
ソース
ここ。インストール方法もそちらで。
デモ
仮想カメラ/dev/video2
をffplay
で再生してみました。自分の画像を載せたくなかったのでスマホの画面に人の写真を載せて認識させてみました。(人物のチョイスには特に他意はありません。単にニュースサイトの一番上にいただけです)