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に投稿しました。

4 件のコメント

  • 自分で用意した人物画像でデモを実行したくやってみたく思っています。画面左側にあるファイルの中のsample_imagesにはすでに4つのフォルダがあり、この中に自分で用意した黒背景のtower.pngとtower_mask.pngを入れアップロードしてやっているのですが、デモを実行できません。resultsフォルダの中にもあらかじめ、この要したtowerフォルダを入れておく必要があるのでしょうか?それとも必要ないですか?それか、そもそも自分が要した人物画像のデモの実行自体ができないのでしょうか?
    それかアップロードの仕方が悪いのでしょうか?アドバイスをいただけたらありがたいです。

    • 森さん
      sample_imagesにtowerフォルダを作成し、その中にtower.pngとtower_mask.pngをアップロードして下さい。「使用するデータの選択」と「mp4の作成」は、他の例を参考に書き換えて下さい。これで行けると思います。

      • cedro様
        早速の返信ありがとうございます。アドバイスいただいた通りに、sample_imagesにtower.pngとtower_mask.pngを入れアップロードしました。そして「使用するデータの選択」と「mp4の作成」は、該当部分をtowerに書き換えました。ですが、目的のmp4ができません。Name Errorと表示され、name’tower’is not defind.と表示されます。resultsのところを見ると、objファイルとpngファイルはできています。mp4ファイルだけができません。
        どこが悪いのでしょうか?お忙しいところ本当にすみません。

        • 試行錯誤しながらやった結果、何とか成功しました。問題点は、mp4を作成します の冒頭部分の1行目が tower# となっていたのを、tower を削除したところ、mp4の作成に成功しました。今回はcedroの記事を参考にさせていただいた結果、何とか
          PIFuを使うことができました。本当にありがとうございました。最後にひとつ、顔の顎(あご)の部分が実際より突き出ているのが少し気になります。こういう場合、微調整による修正はできないんでしょうか?

  • コメントを残す

    メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

    日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)

    ABOUTこの記事をかいた人

    アバター

    ディープラーニング・エンジニアを趣味でやってます。E資格ホルダー。 好きなものは、膨大な凡ショットから生まれる奇跡の1枚、右肩上がりのワクワク感、暑い国の新たな価値観、何もしない南の島、コード通りに動くチップ、完璧なハーモニー、仲間とのバンド演奏、数えきれない流れ星。