DEV Community

melpon
melpon

Posted on

Jetson AGX Xavier と Momo で背景ぼかしの映像を配信する

最近、Jetson AGX Xavier 上で Momo を使って、背景ぼかしの映像を配信するのを試してみました。

こんな感じに配信できるようになります。

Momo で背景ぼかしの映像を配信している様子 - YouTube
Momo で背景ぼかしの映像を配信している様子

自分の顔を映すのは嫌だったので、ディスプレイにヒカキンを表示して、それをWebカメラで撮影して配信しています。

元動画はこちらです: 【昔は好きだったけど今は嫌い】でエゴサしたらメンタル崩壊…【ヒカキンTV】【ツイッター】 - YouTube

ちゃんと背景がぼかされて配信されているのが分かります。

jtop コマンドで確認した CPU や GPU、メモリ使用量はこんな感じになっています。

Alt Text

ちゃんと GPU も使って計算していることが分かります。

構成

今回の構成はこんな風になっています。

構成図

Python の tf-bodypix を使って、実カメラの映像を取り込んで、背景ぼかしした映像に変換し、それを v4l2loopback という仮想カメラ(仮想ビデオデバイス)に出力しています。
あとは、Momo がその仮想カメラのデータを読んで Sora に配信しているだけです。

つまり、今回はほぼコードを書いていません。
tf-bodypix に Web カメラから読み取る部分も、仮想カメラへ出力する実装も入っていたため、単にいろいろインストールしてコマンドラインから実行するだけでした。

実際に動かすまでの手順

準備

まず Tensorflow を入れます。これは Jetson 用のインストール方法 があるので、それの通りに入れるだけです。
(インストール方法が変わっている可能性もあるので、最新の情報に関してはドキュメントを参照して下さい)

# apt で入れるパッケージのインストール
sudo apt-get update
sudo apt-get install libhdf5-serial-dev hdf5-tools libhdf5-dev zlib1g-dev zip libjpeg8-dev liblapack-dev libblas-dev gfortran

# pip3 のインストール
sudo apt-get install python3-pip
sudo pip3 install -U pip testresources setuptools==49.6.0 

# 依存ライブラリのインストール
sudo pip3 install -U numpy==1.16.1 future==0.18.2 mock==3.0.5 h5py==2.10.0 keras_preprocessing==1.1.1 keras_applications==1.0.8 gast==0.2.2 futures protobuf pybind11

# tensorflow のインストール
sudo pip3 install --pre --extra-index-url https://developer.download.nvidia.com/compute/redist/jp/v44 tensorflow
Enter fullscreen mode Exit fullscreen mode

virtualenv とかを使っても良いです。詳細は上記のドキュメントを見てください。

次に tf-bodypix を入れます。
既に Tensorflow は入っているので不要で、Web カメラと JS モデルは必要なので、以下のようにインストールします。

sudo pip3 install tf-bodypix[tfjs,webcam]
Enter fullscreen mode Exit fullscreen mode

次に、v4l2loopback な仮想デバイスを作成するためのパッケージをインストールします。

sudo apt install v4l2loopback-dkms
Enter fullscreen mode Exit fullscreen mode

あとは Momo のパッケージを Momo のリリース からダウンロードして展開して配置しておきます。

修正

tf-bodypix は、そのまま利用すると GPU を使ってくれなかったので、ちょっとだけコードを弄る必要があります。

/usr/local/lib/python3.6/dist-packages/tf_bodypix/cli.py を開いて、以下のように書き換えます。

--- a/cli.py    2020-12-19 20:49:46.398000000 +0900
+++ b/cli.py    2020-12-19 20:49:41.145000000 +0900
@@ -1,3 +1,6 @@
+import tensorflow as tf
+tf.config.experimental.list_physical_devices('GPU')
+
 import argparse
 import logging
 import os
@@ -14,7 +17,6 @@
 # pylint: disable=wrong-import-position
 # flake8: noqa: E402

-import tensorflow as tf
 import numpy as np

 from tf_bodypix.utils.timer import LoggingTimer
Enter fullscreen mode Exit fullscreen mode

詳細は分からないのですが、Tensorflow を先に import して特定の関数を読んでおくことで、GPU を使うための初期化が正常に走って、GPU が使えるようになります。いろいろ弄ってたら偶然動きました。

実行

まず仮想ビデオデバイスを作成します。今回は /dev/video1 になるようにしましたが、適当に変えても良いです。

sudo modprobe v4l2loopback video_nr=1 card_label=BlurCamera
Enter fullscreen mode Exit fullscreen mode

次に tf-bodypix を実行します。
CLI 上から、Web カメラから映像を読んで、背景ぼかしをして、仮想ビデオデバイスに出力するところまで全部出来るので、凄く楽です。

python3 -m tf_bodypix \
    blur-background \
    --internal-resolution 0.5 \
    --source-width 640 \
    --source-height 480 \
    --source-fps 30 \
    --source webcam:0 \
    --background-blur 20 \
    --output /dev/video1 \
    --threshold 0.5
Enter fullscreen mode Exit fullscreen mode

あとはこの仮想ビデオデバイスを入力として、Momo で配信するだけです。
tf_bodypix での出力は YUYV 形式で、MJPEG ではないため、ハードウェア MJPEG デコーダが使えないことに注意して実行します。

./momo \
  --hw-mjpeg-decoder=false \
  --no-audio-device \
  --video-device=/dev/video1 \
  sora wss://<適切な接続先>/signaling <適切なチャンネル名> \
  --audio=false \
  --role=sendonly
Enter fullscreen mode Exit fullscreen mode

これで配信できます。あとは Sora 経由で送られてきた映像をブラウザで見れば、最初の動画のようになります。

感想

Momo で背景ぼかしを配信するのは大変だと思ってたのですが、仮想ビデオデバイスを使って、tf-bodypix を使えばすごく楽でした(その後 GPU を使ってくれない問題を解決するのは大変でしたが)。
Momo 本体を弄るのではなく、仮想ビデオデバイスを使って解決していく方法は、割と良さそうな気がします。

Top comments (0)