ディープ ニューラル ネットのパフォーマンスは、過去 20 年間で大きく進歩しました。毎年、最先端の結果を上回る新しいアーキテクチャが考案されています。ただし、アーキテクチャの改善だけでは、高品質のデータセットがなければ機能しません。データセットは最終的なパフォーマンスに大きな影響を与えます。多様で正確なデータセットを収集してラベル付けすることは、手間と費用がかかる可能性があり、既存のデータセットは通常、実際のデータ分布の多様性全体をカバーしていないため、データ拡張技術が使用されます。
この記事では、3Dジオメトリ変換によって人間の顔のデータセットを充実させ、モデルのパフォーマンスを向上させる方法を説明します。オープンソースコードの実装は以下で提供されています[1]。
データ拡張は、サンプルにさまざまな変更を適用することでデータ量を増やす手法です。一般的な画像拡張は、幾何学的変換と色変換の 2 つのカテゴリに分けられます。幾何学的変換は、スケーリング、クロッピング、反転、回転、変換などで構成されます。一方、色変換は、色のジッタリング、ノイズの追加、グレースケール化、明るさ/コントラストの調整などで構成されます。
人間の顔があることがわかっている場合、画像をどのように拡張できるかを考えてみましょう。どのようにして人を区別するのでしょうか? 肌の色、顔の形、髪型、しわ、目の色など、アイデンティティを構成する顔の特徴があります。最も区別しやすいものの 1 つは顔の形です。
したがって、入力顔画像の形状を変更すると、トレーニング可能なモデルにとってはわずかに異なる人物になります。そこで、このプロパティを使用してデータセットを拡張してみましょう。
3Dモーフィングモデル(3DMM)、具体的にはFLAME[2]モデルを使用して顔の形状を変更します。3DMMは、形状、ポーズ、表情を操作するためのパラメータを持つ3次元メッシュです。3DMMは、実際の人物によって登録された3次元メッシュから構築されます。
したがって、実際の顔の形状の分布を表すことができます。内部的には、平均形状と、形状と表情の変化の方向を指定する主成分のセットで構成されています。アルファとベータはモデルのパラメーターです。
顔の形を変える前に、入力写真に対応する 3DMM のパラメータを見つける必要があります。これを行うには、ランドマークの最適化、測光最適化、または 1 ステップでパラメータを予測する回帰モデルなど、いくつかの方法があります。実装が簡単で、妥当な時間で正確な結果が得られるため、2D ランドマーク最適化を使用しました。
Dlib 顔検出モデルを使用して、入力画像上で顔のランドマークが検出されました。ランドマークの MSE 損失を伴う Adam 最適化アルゴリズムを使用して、3DMM を顔画像に適合させました。収束するまでに約 150 回の反復が必要でした。
これで、顔の形状を変更する準備ができました。まず、顔の画像に合わせた 3 次元メッシュがすでにあります。3DMM の形状パラメータを変更すると、画像空間内のメッシュ頂点がシフトします。シフトがわかれば、それを使用して画像のピクセルを移動できます。
シフトの密なマップを取得するために、OpenGL ライブラリを使用し、頂点カラーではなく x 方向と y 方向のシフトを使用して 3DMM メッシュをレンダリングしました。考慮すべきことが 1 つ残っています。それは、面メッシュ領域外のピクセルをどのように処理するかです。
この目的のために、私は外挿法を使用しました。外挿法は、変更された顔を静的な背景と滑らかに結び付けます。x方向とy方向の密なシフトマップがあれば、顔のランドマーク、セグメンテーションマスク、ペア画像など、あらゆるタイプのラベルに適用できます。下の図は、幾何学的変換による顔の拡張の例です。詳細を知りたい場合は、ソースコード[1]を参照してください。
これで、データセットで試すことができます。この拡張テクニックは、モデルを改善して、入力のバリエーションに対して安定させるのに役立ちます。この記事では、3D ジオメトリ変換について学びましたが、それ以外にも、顔データセットをさらに改善するテクスチャの変更があり、次の記事で説明します。
参考文献
[1] GitHubコード。
[2] FLAMEモデル