3DDFA_V2による3次元顔復元実験 Colab プログラムによる実験・研究スキルの基礎

【概要】本記事では、3DDFA_V2フレームワークを用いた3次元顔モデル生成プログラムについて解説する。単一の顔画像から3次元形状を復元し、OBJ/PLY形式で出力する技術をGoogle Colab環境で提供する。

Colabのページ(ソースコードと説明): https://colab.research.google.com/drive/1fNfAdCRxnxxcxj9mH7lFVsP-uz4DAWoV?usp=sharing

3DDFA_V2による3次元顔復元の処理結果例1
3DDFA_V2による3次元顔復元の処理結果例2

【目次】

  1. プログラム利用ガイド
  2. プログラムコードの説明
  3. 実験・研究スキルの基礎

プログラム利用ガイド

1. このプログラムの利用シーン

顔写真から3次元モデルを自動生成するツールである。人物の顔画像(正面、斜め、横顔を含む様々な角度)を入力すると、その顔の立体形状をコンピュータ上で再現できる。生成されたモデルは、3Dプリンタでの出力、アニメーション制作、仮想現実コンテンツ、顔認識研究などで活用できる。

2. 主な機能

3. 基本的な使い方

  1. 実行環境の準備:
    Google Colabのノートブックを開く
    Colabのページ(ソースコードと説明): https://colab.research.google.com/drive/1fNfAdCRxnxxcxj9mH7lFVsP-uz4DAWoV?usp=sharing
  2. コードセルの実行:
    コードセルを実行すると、リポジトリのクローン、依存パッケージのインストール、numpy互換性修正、Cythonモジュールのビルド、モデルの初期化が自動的に行われる。
  3. 画像の選択:
    ビルド完了後、画像選択メニューが表示される。
    • 0: 画像ファイルアップロード(独自の画像を使用)
    • 1: サンプル画像(デフォルトのテスト画像)
    使用したい画像に応じて、0または1を入力する。0を選択した場合は、ファイル選択ダイアログが表示されるので、顔画像をアップロードする。1を選択した場合は、GitHubリポジトリからサンプル画像が自動的に読み込まれる。
  4. 処理の完了を待つ:
    コンソールに進行状況が表示される。「Detecting faces with FaceBoxes...」のメッセージから、顔検出と3DMMパラメータ回帰、頂点再構成が順次実行される。
  5. 結果の確認:
    処理が完了すると、以下の3枚の画像が縦に並んで表示される。
    • Original Image (FaceBoxes Detector): 元画像
    • Sparse Landmarks (68 points): スパースランドマーク(68点)
    • Dense Landmarks (sampled): デンスランドマーク(サンプリング表示)
  6. ファイルのダウンロード:
    生成された3Dモデルファイルは、Google Colabの左側のファイルパネルから「output_3d_models」フォルダを開いてダウンロードできる。各顔について以下のファイルが生成される。
    • face_N.obj: 3Dモデルのジオメトリ
    • face_N.mtl: テクスチャ参照を含むマテリアル定義
    • face_N.jpg: 元の顔画像からUVマッピングされたテクスチャ
    • face_N.ply: 形状のみのPLY形式ファイル
    (Nは検出された顔の番号: 0, 1, 2...)

4. 便利な機能

5. 3Dモデリングソフトウェアでの利用

ダウンロードしたOBJファイルは、Blenderなどの3Dモデリングソフトウェアで開いて編集できる。OBJファイルをインポートすると、MTLファイルで定義されたマテリアルとテクスチャが自動的に適用される。

Blenderでのインポートと表示方法:

  1. Blenderを起動する
  2. メニューバーから「ファイル」→「インポート/エクスポート」→「Wavefront (.obj)」を選択
  3. ダウンロードしたface_N.objファイルを選択してインポート
  4. オブジェクトが原点から離れた位置にある場合は、以下の操作でオブジェクトにフォーカスする
    • アウトライナー(画面右上のパネル)でインポートしたオブジェクトを選択
    • メニューバーから「ビュー」→「選択をフレームイン」を実行
    • または、テンキーの「.」キーを押す

プログラムコードの説明

1. 概要

このプログラムは、単一の顔画像から3次元顔モデルを生成し、テクスチャ付きの3Dモデルファイル(OBJ形式、PLY形式)として出力する。3DDFA_V2(3D Dense Face Alignment Version 2)フレームワークFaceBoxes顔検出器を統合している。Cythonモジュールのビルド時に発生するnumpy互換性問題を事前に修正することで、Google Colab環境での安定動作を実現する。

2. 主要技術

3DDFA_V2(3D Dense Face Alignment Version 2)

Guo et al.が2020年に開発した3次元顔位置合わせフレームワークである[1]。3DMM(3D Morphable Model)パラメータを軽量なバックボーンネットワークを用いて回帰することで、速度、精度、安定性のバランスを実現する。メタジョイント最適化戦略により、少数の3DMMパラメータを動的に回帰し、単一のCPUコアで50fps以上の処理速度を達成する。

FaceBoxes

Zhang et al.が2017年に提案したCPUリアルタイム顔検出器である[2]。Rapidly Digested Convolutional Layers(RDCL)とMultiple Scale Convolutional Layers(MSCL)を組み合わせた軽量ネットワーク構造を持つ。アンカー密度化戦略により、小さな顔の検出率を向上させ、VGA解像度画像に対してCPUで20fps、GPUで125fpsの処理速度を実現する。このプログラムでは、FaceBoxes_ONNXとして実装された公式検出器を使用する。

3. 技術的特徴

• numpy互換性の事前修正

Cythonモジュールのビルド前に、cpu_nms.pyxcpu_soft_nms.pyxbfm.pyの各ファイル内の非推奨型(np.intnp.long)を互換型(np.intpnp.int_)に正規表現で置換する。この処理により、numpy 1.20以降の環境でのビルドエラーを回避する。

• クリーンビルドの実施

既存の3DDFA_V2ディレクトリが存在する場合は削除し、GitHubリポジトリから最新のコードをクローンする。これにより、以前のビルドの影響を受けることなく、安定した環境を構築する。

• 3つのCythonモジュールの自動ビルド

以下のモジュールを順次ビルドする。

各ビルド処理でエラーハンドリングを行い、警告メッセージを表示する。

• 3DMMパラメータ回帰

検出された顔領域に対し、3DDFA_V2は3DMM(3D Morphable Model)[3]のパラメータセットを畳み込みニューラルネットワークにより推定する。3DMMは、Blanz and Vetterが1999年に提案した統計的顔モデルである。複数の3次元顔スキャンデータに主成分分析を適用し、線形モデル空間を構築する。このプログラムは形状と表情のパラメータを推定し、顔の3次元構造を復元する。

• 密な頂点再構成

推定された3DMMパラメータから、顔表面の3次元座標を持つ頂点群を生成する。dense_flagパラメータにより、スパース(68点の主要ランドマーク点)またはデンス(数千点の頂点)のいずれかの密度で再構成を実行できる。

• UVマッピングによるテクスチャ生成

元画像から顔領域のテクスチャを抽出し、3Dメッシュの表面にマッピングする。OBJファイルのエクスポート時に、以下の処理を実行する。

  1. ser_to_obj関数でOBJファイルを生成
  2. 元画像をJPG形式でテクスチャファイルとして保存
  3. MTLファイルを手動で生成し、テクスチャファイルへの参照(map_Kd)を記述
  4. OBJファイルにmtllibusemtl行を追加してMTLファイルを参照

この処理により、3Dビューアでの現実的なレンダリングが可能になる。

• 可視化の実装

matplotlib.pyplotを使用し、3つのサブプロットを縦に配置する。

4. 実装の特色

このプログラムは、Google Colab環境での実行を想定した完全自動化パイプラインを提供する。主な特色は以下の通りである。

5. 参考文献

[1] Guo, J., Zhu, X., Yang, Y., Yang, F., Lei, Z., & Li, S. Z. (2020). Towards Fast, Accurate and Stable 3D Dense Face Alignment. In Proceedings of the European Conference on Computer Vision (ECCV). https://arxiv.org/abs/2009.09960

[2] Zhang, S., Zhu, X., Lei, Z., Shi, H., Wang, X., & Li, S. Z. (2017). FaceBoxes: A CPU Real-time Face Detector with High Accuracy. In 2017 IEEE International Joint Conference on Biometrics (IJCB), 1-9. https://arxiv.org/abs/1708.05234

[3] Blanz, V., & Vetter, T. (1999). A Morphable Model For The Synthesis Of 3D Faces. In Proceedings of the 26th Annual Conference on Computer Graphics and Interactive Techniques (SIGGRAPH '99), 187-194. https://doi.org/10.1145/311535.311556

実験・研究スキルの基礎:Google Colabで学ぶ3D顔モデル生成実験

1. 実験・研究のスキル構成要素

実験や研究を行うには、以下の5つの構成要素を理解する必要がある。

1.1 実験用データ

このプログラムでは顔画像ファイルが実験用データである。

1.2 実験計画

何を明らかにするために実験を行うのかを定める。

計画例:

1.3 プログラム

実験を実施するためのツールである。このプログラムは3DDFA_V2フレームワークとFaceBoxes顔検出器を使用している。

1.4 プログラムの機能

このプログラムは顔画像から3次元モデルを生成する。

入力パラメータ

処理プロセス

出力情報

1.5 検証(結果の確認と考察)

プログラムの実行結果を観察し、パラメータや入力画像の影響を考察する。

基本認識:

観察のポイント:

2. 間違いの原因と対処方法

2.1 プログラムのミス(人為的エラー)

Cythonモジュールのビルドエラーが発生する

モデルのダウンロードやビルドに時間がかかる

2.2 期待と異なる結果が出る場合

顔が検出されない

ランドマークの位置がずれている

生成された3Dモデルが元の顔と異なる

テクスチャが歪んでいる

処理時間が長い

3. 実験レポートのサンプル

顔の角度が3D再構成精度に与える影響

実験目的

正面、斜め、横顔の3種類の角度で撮影された同一人物の画像を用いて、顔の角度が3D再構成の精度に与える影響を明らかにする。

実験計画

dense_flagをTrueに固定し、同一人物の異なる角度の画像で3Dモデルを生成する。視覚的評価により精度を比較する。

実験方法

プログラムを実行し、img_url変数を変更して以下の基準で評価する:

実験結果

顔の角度 顔検出 ランドマーク精度 3Dモデル品質 テクスチャ品質
正面(0度) 成功(架空の値) 高精度(架空の値) 良好(架空の値) 良好(架空の値)
斜め(45度) 成功(架空の値) やや低下(架空の値) やや低下(架空の値) やや歪み(架空の値)
横顔(90度) 成功(架空の値) 大幅低下(架空の値) 不良(架空の値) 大幅な歪み(架空の値)

考察

結論

本実験により、顔の角度が3D再構成精度に大きく影響することが確認された(架空の結果)。正面に近い画像ほど精度が高く、角度が大きくなるほど精度が低下する傾向が明確に現れた(架空の結果)。実用的な3D顔モデル生成には、正面から±xxxx度以内の画像を使用することが望ましい(架空の結果)。また、3DDFA_V2は単一画像からの再構成を行うため、見えない部分は統計的平均顔で補完されることが確認できた(架空の結果)。より正確な3Dモデルを得るには、複数角度からの画像を統合する手法が必要であることが示唆された(架空の結果)。