cedro-blog

PIFuで、1枚の人物画像から3Dモデルを作ってみる

1.はじめに

 従来、1枚の人物画像から3Dモデルを作るには3次元空間上の点をN×N×N(Nは解像度)の箱として全ての点で同時処理を行うために、解像度の3乗のメモリが必要なため解像度の高いモデリングは困難でした。

 今回ご紹介するのは、ディープラーニング を使って3次元空間上の点をサンプリングして一点一点別々に処理を行うPIFuというモデルで、メモリ容量に制限されず高解像度なモデルを復元を行うことを実現したものです。

2.PIFuとは?

  PIFu (Pixel-Aligned Implicit Function) は、1枚の画像から服を着た人の3Dモデルを高精度で再現できるディープラーニングのモデルです。このモデルは、3次元形状を推定する部分(Surface Reconstruction)と表面テクスチャーを推定する部分(Texture Inference)の2つで構成されています。

 3次元形状を推定する部分では、入力画像からエンコーダを用いてSurfaceの特徴量(Fv)を抽出します。そして、3次元空間上の点と2次元画像の距離(Depth)から、その点が3次元の人物の内部なのか外部なのかを推定します。学習時の損失関数は以下で表されます。

 そして、3次元形状周辺の正規分布と空間上の一様分布を16:1の割合でサンプリングして処理を行います。

 表面テクスチャーを推定する部分では、入力画像とSurfaceの特徴量からエンコーダを用いてTextureの特徴量(Fc)を抽出します。そして、Surfaceから一定距離の範囲で表面テクスチャーを推定します。学習時の損失関数は以下の式で表されます。

 こちらも、先程同様にサンプリングして処理を行います。

3.コード

 コードはGoogle Colabで動かす形にしてGithubに上げてありますので、それに沿って説明して行きます。自分で動かしてみたい方は、この「リンク」をクリックし表示されたノートブックの先頭にある「Colab on Web」ボタンをクリックすると動かせます。

 まず、3次元モデルを作成する画像データを準備します。

  removebgなどを利用して人物を切り抜き、背景を黒にした mana.png (512×512ピクセル) とマスク mana_mask.png (512×512ピクセル) を作成し、sample_images/manaフォルダーに保存します。この時マスクのファイル名は必ず、***_mask.png という形にしておきます。

 次に、セットアップを行います。

 PIFu デモを実行します。

 コードを実行すると、google colabのインラインにmp4動画を表示します。

 胸の前に持っている本はセーターの柄と認識され、セーターの背中側の柄にも若干反映されました(笑)。これはしょうがないでしょう。

 ビキニを着ている場合はどうなるかと言うと、

 ちゃんと背中側もビキニになっていますが、色は表の赤と青の柄がミックスされた黄色っぽい柄になっているところが面白いですね。

 縞模様のワンピースの場合はどうなるかと言うと、

 ちゃんと背中側も縞模様柄のワンピースになっていますね。縞模様が立体的に見えているところが面白いところです。

 赤のチェック柄のワンピースの場合はどうでしょうか。

 これは、背中側の柄が消えてしまいましたね。

では、また。

(オリジナル)https://github.com/shunsukesaito/PIFu

(Twitterへの投稿)

動画の最後のシーンにPIFuを掛けたものをTwitterに投稿しました。