本記事では、ROMPを使って、写真や、動画の人物から3Dモデルを生成する方法を紹介します。
ROMPとは
ROMPとは、単一のRGB画像から複数の3D人物の回帰(regression of multiple 3D
people)を行うEndtoEndモデルです。
3Dの回帰と聞くと複雑に思えますが、上図を見ていただくと一目瞭然かと思います。
簡単な表現としては、1枚の画像から、人物の3DモデルをAIが予測し生成するタスクです。
ROMPの新規性は、End to Endである点です。
従来手法は、画像中の人物の位置をバウンディングボックスを用いて検出し、検出結果を用いて、3Dモデルを独立して予測する多段階パイプライン(または、2
stage)を構成しています。
これに対して、ROMPは複数の人物の検出、及び3Dモデルの予測を一度に行います。
この2StageからEnd to
Endへと発展していくケースはAIOCRなどでも見られますね。従来文字検出と文字認識を別のタスクとして実現していましたが、
後継のモデルでは、文字検出と文字認識を一度に実現するモデルが考案されるようになっています。
[機械学習]AIOCRの仕組みと実装
AIOCRの開発経験を持つ筆者がAIOCRの技術概要と、実際に使える実装とその論文を一挙に紹介します
上記のような新規性を持つROMPですが以下の特徴を備えています。
- シンプル: 人の検出と、3Dモデルの生成をシンプルな1ステージで実現
- 高速: わずか8GBの1070Ti GPUでリアルタイムの推論を実行可能
- 頑強: 複数人の推論等ベンチマークで高いパフォーマンスを発揮
- 使いやすい: 推論の実施などにテストAPIを提供
ROMPの導入手順
セットアップ①: conda環境構築
それでは早速、開発環境にROMPをセットアップしていきます。
動作確認は下記の環境で行っています。
OS: Ubuntu 18.04.3 LTS
GPU: GeForce GTX 1080
なお、このデモはPythonで実装しています。
Pythonの実装に不安がある方、Pythonを使った機械学習について詳しく勉強したい方は、以下の書籍やオンライン講座などがおすすめです。
おすすめの書籍
[初心者向け] Pythonで機械学習を始めるまでに読んだおすすめ書籍一覧
本記事では、現役機械学習エンジニアとして働く筆者が実際に読んだ書籍の中でおすすめの書籍をレベル別に紹介しています。
おすすめのオンライン講座
[初心者向け] 機械学習がゼロから分かるおすすめオンライン講座
本記事では、機械学習エンジニアとして働く筆者が、AI・機械学習をまったく知らない方でも取り組みやすいおすすめのオンライン講座をご紹介しています。
それでは、ROMPをインストールしていきます。他の機械学習環境に影響を与えないためにMinicondaの仮想環境上に構築していきます。Minicondaのインストール手順は公式ドキュメントをご参照ください。
以上で、環境構築は完了です。
GPUを使用する場合は、事前にtorchの動作確認を行いGPUを認識しているかご確認ください。
セットアップ②: 学習済みモデル
次に学習済みモデルをダウンロードします。
以下には、学習用データ、デモデータ、学習済みモデル(試作版)、学習済みモデル(提供版)の4つのダウンロード方法を記載していますが、
最低限デモデータ、学習済みモデル(提供版)の2つがあればデモの実行には問題ありません。
画像から3Dモデルを生成
それでは早速、3Dモデルの推論を行っていきます。
始めに画像から3Dモデルの生成を行います。
今回の実験には、以下の画像を使用します。複数人の全身が映っている画像を選定しました。
--inputs
に入力画像のディレクトリを、--output_dir
に出力先のディレクトリを設定します。
--configs_yml
は実行時のコンフィグレーションが記載されています。
推論時に使用するモデルなどもこのimage.ymlで設定しています。
pyglet.canvas.xlib.NoSuchDisplayException: Cannot connect to "None"
上記が発生した場合、DISPLAY
の環境変数が設定されていない可能性が高いです。
Xサーバーを起動し、DISPLAYの設定を行うか、image.ymlのrendererをpyrenderからpytorch3dに変更してください。
画像から3Dモデルを生成した結果
画像から推論された3Dモデルを以下の通りです。
写真には10人の子供が映っていますが、全員の3Dモデルが生成されています。
また、この時検出したそれぞれの人物ごとにobjファイルが出力されます。このobjファイルをCADソフトなどでインポートすると
以下のような3Dモデルを確認することができます。
動画から3Dモデルを生成
続いて動画から3Dモデルを生成してみます。
今回は、Pixabay様の子供達のワルツダンスを使用させていただきます。
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)
の直前に修正を加えることで解消します。
動画から3Dモデルを生成した結果
実行結果は以下の通りです。
動画の場合、生成された3Dモデルのバタつきがやや気になりますね。
また、2人がカメラに対して垂直に位置する場面では、検出されるモデルが1人になっています。
この点カメラに対して一人は映っていないので仕方がないとも言えます。
まとめ
本記事では、ROMPを使って、画像や動画から人物の3Dモデルを生成する方法を紹介しました。
写真を撮影するだけで様々な人物の3Dモデルを生成できるため、将来的には3Dモデルの制作コストを下げることができそうですね。
動画から3Dモデルを生成するケースにおいてはフレームごとの誤差をうまく丸め込み、3Dモデルの滑らかな動きを実現する必要がありそうです。
また本記事では、機械学習を動かすことにフォーカスしてご紹介しました。
もう少し学術的に体系立てて学びたいという方には以下の書籍などがお勧めです。ぜひご一読下さい。
また動かせるだけから理解して応用できるエンジニアの足掛かりに下記のUdemyなどもお勧めです。
参考文献
1. 論文 - Monocular, One-stage, Regression of Multiple 3D People
0 件のコメント :
コメントを投稿