[ROMP] AIで動画から3Dモデルを生成する

2022年1月2日日曜日

Artificial Intelligence

本記事では、ROMPを使って、写真や、動画の人物から3Dモデルを生成する方法を紹介します。

アイキャッチ

ROMPとは

ROMPとは、単一のRGB画像から複数の3D人物の回帰(regression of multiple 3D people)を行うEndtoEndモデルです。

サンプル3D

3Dの回帰と聞くと複雑に思えますが、上図を見ていただくと一目瞭然かと思います。
簡単な表現としては、1枚の画像から、人物の3DモデルをAIが予測し生成するタスクです。

ROMPの新規性は、End to Endである点です。
従来手法は、画像中の人物の位置をバウンディングボックスを用いて検出し、検出結果を用いて、3Dモデルを独立して予測する多段階パイプライン(または、2 stage)を構成しています。

これに対して、ROMPは複数の人物の検出、及び3Dモデルの予測を一度に行います。

この2StageからEnd to Endへと発展していくケースはAIOCRなどでも見られますね。従来文字検出と文字認識を別のタスクとして実現していましたが、
後継のモデルでは、文字検出と文字認識を一度に実現するモデルが考案されるようになっています。

上記のような新規性を持つROMPですが以下の特徴を備えています。

  1. シンプル: 人の検出と、3Dモデルの生成をシンプルな1ステージで実現
  2. 高速: わずか8GBの1070Ti GPUでリアルタイムの推論を実行可能
  3. 頑強: 複数人の推論等ベンチマークで高いパフォーマンスを発揮
  4. 使いやすい: 推論の実施などにテストAPIを提供

ROMPの導入手順

セットアップ①: conda環境構築

それでは早速、開発環境にROMPをセットアップしていきます。
動作確認は下記の環境で行っています。

OS: Ubuntu 18.04.3 LTS
GPU: GeForce GTX 1080

なお、このデモはPythonで実装しています。
Pythonの実装に不安がある方、Pythonを使った機械学習について詳しく勉強したい方は、以下の書籍やオンライン講座などがおすすめです。

それでは、ROMPをインストールしていきます。他の機械学習環境に影響を与えないためにMinicondaの仮想環境上に構築していきます。Minicondaのインストール手順は公式ドキュメントをご参照ください。

$ git clone -b master --single-branch https://github.com/Arthur151/ROMP

# python version 3.7のconda環境を作成
$ conda create -n ROMP python==3.7.6 -y

# 作成した環境をアクティベート
$ conda activate ROMP

# Proxy配下の場合は事前に下記を設定
$ export http_proxy="http://"username":"password"@proxy:port"
$ export https_proxy="http://"username":"password"@proxy:port"

# Pytorchのインストール
# https://pytorch.org/get-started/previous-versions/ からcudaバージョンが一致するものをインストール
$ conda install pytorch=1.10.0 torchvision torchaudio cudatoolkit=11.3 -c pytorch
# torchの動作確認
$ python -c "import torch; print(torch.__version__); print(torch.cuda.is_available()); print(torch.cuda.device_count());"
1.10.0
True
2

$ pip3 install https://github.com/Arthur151/ROMP/releases/download/v1.1/pytorch3d-0.6.1-cp37-cp37m-linux_x86_64.whl
$ cd ROMP
$ pip3 install -r requirements.txt

以上で、環境構築は完了です。
GPUを使用する場合は、事前にtorchの動作確認を行いGPUを認識しているかご確認ください。

セットアップ②: 学習済みモデル

次に学習済みモデルをダウンロードします。
以下には、学習用データ、デモデータ、学習済みモデル(試作版)、学習済みモデル(提供版)の4つのダウンロード方法を記載していますが、
最低限デモデータ、学習済みモデル(提供版)の2つがあればデモの実行には問題ありません。

$ pwd
中略/ROMP

$ wget https://github.com/Arthur151/ROMP/releases/download/v1.1/model_data.zip # 学習用データ
$ wget https://github.com/Arthur151/ROMP/releases/download/v1.1/demo_videos.zip # デモデータ
$ wget https://github.com/Arthur151/ROMP/releases/download/v1.1/trained_models_try.zip # 学習済みモデル(試作版)
$ wget https://github.com/Arthur151/ROMP/releases/download/v1.1/trained_models.zip # 学習済みモデル(提供版)

$ unzip demo_videos.zip
$ unzip model_data.zip
$ unzip trained_models.zip
$ unzip trained_models_try.zip

画像から3Dモデルを生成

それでは早速、3Dモデルの推論を行っていきます。
始めに画像から3Dモデルの生成を行います。

今回の実験には、以下の画像を使用します。複数人の全身が映っている画像を選定しました。

画像から3Dモデルを生成のサンプル

--inputsに入力画像のディレクトリを、--output_dirに出力先のディレクトリを設定します。
--configs_ymlは実行時のコンフィグレーションが記載されています。
推論時に使用するモデルなどもこのimage.ymlで設定しています。

# imageから3Dモデル生成
$ python -m romp.predict.image --inputs=demo/images --output_dir=./image_results --configs_yml=configs/image.yml

pyglet.canvas.xlib.NoSuchDisplayException: Cannot connect to "None"

上記が発生した場合、DISPLAYの環境変数が設定されていない可能性が高いです。
Xサーバーを起動し、DISPLAYの設定を行うか、image.ymlのrendererをpyrenderからpytorch3dに変更してください。

画像から3Dモデルを生成した結果

画像から推論された3Dモデルを以下の通りです。

画像から3Dモデルを推論した結果画像

写真には10人の子供が映っていますが、全員の3Dモデルが生成されています。
また、この時検出したそれぞれの人物ごとにobjファイルが出力されます。このobjファイルをCADソフトなどでインポートすると
以下のような3Dモデルを確認することができます。

objファイルの出力結果

動画から3Dモデルを生成

続いて動画から3Dモデルを生成してみます。
今回は、Pixabay様の子供達のワルツダンスを使用させていただきます。

# videoから3Dモデル生成
$ python -m romp.predict.video --inputs=demo/videos/sample_video.mp4 --output_dir=demo/sample_video_results --configs_yml=configs/video.yml

TypeError: forward() missing 1 required positional argument: 'meta_data'

上記エラーが発生した場合、入力した動画のframe数に問題がある場合が高いです。
下記のようにROMP/romp/predict/video.py
internet_loader = self._create_single_data_loader(dataset='internet', train_flag=False, shuffle=False, file_list=frame_list)
の直前に修正を加えることで解消します。

# frame数が64の倍数でない場合にエラーが発生
# 64の倍数でないフレームは落とす処理を追加
target_len = len(frame_list) - (len(frame_list)%64)
frame_list = frame_list[:target_len]

internet_loader = self._create_single_data_loader(dataset='internet', train_flag=False, shuffle=False, file_list=frame_list)

動画から3Dモデルを生成した結果

実行結果は以下の通りです。

動画から3Dモデルを生成した結果

動画の場合、生成された3Dモデルのバタつきがやや気になりますね。
また、2人がカメラに対して垂直に位置する場面では、検出されるモデルが1人になっています。
この点カメラに対して一人は映っていないので仕方がないとも言えます。

まとめ

本記事では、ROMPを使って、画像や動画から人物の3Dモデルを生成する方法を紹介しました。
写真を撮影するだけで様々な人物の3Dモデルを生成できるため、将来的には3Dモデルの制作コストを下げることができそうですね。
動画から3Dモデルを生成するケースにおいてはフレームごとの誤差をうまく丸め込み、3Dモデルの滑らかな動きを実現する必要がありそうです。

また本記事では、機械学習を動かすことにフォーカスしてご紹介しました。
もう少し学術的に体系立てて学びたいという方には以下の書籍などがお勧めです。ぜひご一読下さい。


また動かせるだけから理解して応用できるエンジニアの足掛かりに下記のUdemyなどもお勧めです。

参考文献

1.  論文 - Monocular, One-stage, Regression of Multiple 3D People

2. GitHub - Arthur151/ROMP

AIで副業ならココから!

まずは無料会員登録

プロフィール

メーカーで研究開発を行う現役エンジニア
組み込み機器開発や機会学習モデル開発に従事しています

本ブログでは最新AI技術を中心にソースコード付きでご紹介します


Twitter

カテゴリ

このブログを検索

ブログ アーカイブ

TeDokology