こんにちは、パレイド技術部の夏目です。
この連載では、Google が 2026 年 7 月に公開した実在人体の 3D 統計モデル「GNM Head」を手元の Mac に導入し、地形から検出した顔メッシュを「実在しうる人間の顔」へ寄せる作業を記録してきました。第 1 回で GNM Head 本体のセットアップ、第 2 回で MediaPipe(顔を 478 点で捉える検出器)と GNM の 68 点をつなぐ対応表を自力で導出しています。最終回の今回は、そのフィット結果を実際の画像生成につなぎ、アニメ調のアバターに変換する応用編です。
ただ、素直に繋いだ最初の出力は「顔が上を向いて見える」という妙な癖を持っていました。厄介だったのは、この一つの症状の裏に、独立した原因が複数重なっていたことです。本記事は応用手順の紹介であると同時に、その症状を切り分け、途中で一度誤診断し、基準を実測して訂正するまでのデバッグ記録でもあります。
本記事はローカル LLM による自動執筆パイプラインで生成されました。現段階ではクラウド AI(Claude 等)の補助や人間の編集が介在していますが、pareido.jp では最終的に AI が自律的にコンテンツを制作できる仕組みの構築を目指しています。
フィット結果を 2 枚の画像にして生成へ渡す
GNM でフィットした顔メッシュを、そのまま SDXL に食べさせることはできません。間に「画像 2 枚」を挟みます。ひとつは陰影を付けた init 画像(img2img の出発点になる初期画像。img2img は完成画像をゼロから描くのではなく、渡した画像を下敷きに描き直す方式です)、もうひとつは各画素の奥行きを明るさで表した depth 画像(深度画像)です。同じフィット結果から、この 2 枚を自前のレンダラで書き出します。
init 画像は img2img の初期画像として、depth 画像は ControlNet-depth(構図や奥行きを生成に効かせる補助ネットワーク)の制御入力として、両方を同時に SDXL へ渡します。init が「だいたいの見た目」を、depth が「顔の起伏と向き」を担う二重の拘束です。

構造上おさえておきたいのは、重い処理は最後の SDXL 生成だけという点です。GNM フィットそのものは 253 次元の線形最小二乗で、CPU で数百ミリ秒しかかかりません。MediaPipe の再走査を含めても GPU は不要で、GPU が要るのはアニメ化の一手だけ。地形から顔骨格を作る前段は驚くほど軽量です。
チェックポイント比較 ── 同一条件で並べる
アニメ化の絵柄は、SDXL のチェックポイント(学習済みモデルの重み一式)で大きく変わります。そこで init / depth・プロンプト・seed(乱数の種)をすべて固定し、チェックポイントだけを差し替えて並べました。seed を固定するのは、絵柄の違いだけを見たいのに乱数のブレが混ざると比較にならないからです。

| チェックポイント | 出る絵柄 | 苔・花冠・装飾との相性 | 判定 |
|---|---|---|---|
| nova3DCGXL_ilV80 | ゲームキャラ調の艶のある 3DCG レンダー | 質感がよく乗る | ○ 基準採用 |
| illustriousXL_v01 | 石像・大理石調に寄る | 装飾は控えめ | △ 用途次第 |
以後は nova3DCGXL_ilV80 を基準チェックポイントとします。苔緑や花冠といった、このキャラに乗せたい記号の描写と相性がよかったためです。ただし illustriousXL_v01 の石像・大理石調は失敗ではなく、「地形の顔を彫像として見せたい」用途なら別途有望でした。おすすめを一つに絞るより、用途で分けておくのが実際に近い判断です。
上を向いて見える ── 原因は 2 つ独立にあった
さて本題です。出力の顔が上を向いて見える。切り分けたところ、原因は無関係な 2 つが重なっていました。
原因 A は img2img の denoise が高すぎたことでした。denoise(ノイズ除去強度)は、渡した init 画像をどれだけ描き直すかを決める値です。初期値の 0.7 では SDXL が顔の向きやポーズまで自由に再解釈してしまい、こちらが init で指定した向きが無視されていました。0.6 に下げると大幅に改善します。ただし下げすぎにも罠があり、0.45 まで落とすと髪の描き込みが薄くなって目が眠そうになりました。描き直しの余地と向きの保持がトレードオフの関係にあり、0.6 が両者の折り合う推奨値です。

原因 B は、フィット後のメッシュ自体が実際に上を向いていたことです。耳と目の位置関係を見ればわかる、というユーザー指摘で発覚しました。GNM 公式の可視化コードと同じ考え方(耳の頂点グループから左右軸、鼻まわりの頂点グループから前方軸を取る)でメッシュの実際の向きを算出すると、約 5.36°の上向き pitch(顔の上下の振り角)が乗っていました。フィッティングで導入された形状の歪みが、そのまま角度になって現れていたわけです。そこで耳・鼻の頂点から求めた向きを正面(右 = +X、前 = +Z)へ回転補正する処理を新設し、既定で通すようにしました。補正後の pitch は 0.00°。これは denoise の調整とは独立した対処です。
訂正 ── regularization は主因ではなかった
ここで一度、診断を誤りました。補正を入れてもまだ「見上げている」という指摘を受け、再調査したのです。当初は、第 2 回で扱った regularization(正則化。フィットの数値的な安定化のために入れる項)の強さが顔を寝かせている、と見立てていました。
これを実測で潰します。まず未フィットの中立モデルで「目から顎へ向かうベクトルと真下方向のなす角」を測り、9.39°を基準としました。次に regularization を 1e-7 から 1e-5 まで強めても、この角度は 2.25°から 0.58°へ動くだけで、基準の 9.39°へは近づきもしません。つまり regularization は角度をほとんど説明していませんでした。
真因は別の 2 点でした。ひとつは、地形由来の MediaPipe ターゲット自体が基準より寝た値(3.88°)を示していたこと。これは地形データの特性として許容できる範囲です。もうひとつは、線形フィットがその目標をさらに行き過ぎて顎を潰す(0.6〜2.3°)こと。regularization は主要因ではなかったわけです。実用上は 1e-6 あたりが「個性を保ちつつ行き過ぎを抑える」妥当な範囲だったので、既定値を 1e-7 から 1e-6 へ戻しました。前回 1e-7 を既定と書いた点は、ここで訂正します。

残る 2 つのバグ ── 透ける顔と、上を向く視線
顔の向きが決着しても、まだ 2 つ残っていました。
ひとつは 目と歯が肌を透けて見える現象です。原因は、地形メッシュ用に書いたラスタライザ(三角形を画素に塗る処理)を顔メッシュへ流用したことにありました。この関数は z-buffer 判定(各画素で最も手前の面だけを残す奥行き判定)に使う値と、画面に表示する値が同じという前提で書かれていました。地形では奥行き=明るさで問題ありませんが、顔では話が別です。奥にある目玉や歯が、たまたま手前の肌より明るいと、z-buffer の勝敗でも「明るいほうが勝ち」になって肌を突き抜けて表示される。「顔のポリゴンが不透明ではないのでは」というユーザー指摘で腑に落ちました。z-buffer 判定には実際の奥行きを、表示には陰影の明るさを使うよう 2 つの値を分離して解決し、口が正しく閉じ、目も正常な陰影になりました。
もうひとつは 視線(瞳の向き)だけが上を向くバグです。頭の向きを直しても瞳が上を見る。init / depth 画像の目は球体そのもので、瞳がどちらを向くかという情報を持っていません。つまり ControlNet では瞳の向きを制御できず、SDXL が自由に決めていたのです。プロンプトに視線の指定も禁止もなかったのが原因でした。ポジティブ側に「looking at viewer, direct gaze」を、ネガティブ側に「looking up, looking away, rolling eyes, eyes closed」を足すと、視線がこちらを向きました。
まとめ ── 最終設定と、残した課題
3 件のバグを踏み終えて落ち着いた設定を、再現用にまとめます(2026-07-20 時点)。
| 項目 | 値 |
|---|---|
| regularization | 1e-6 |
| メッシュ向き補正 | 正面化を既定で適用 |
| レンダリング | 目の外殻を除外 |
| denoise | 0.6 |
| ControlNet 強度 | 0.6 |
| チェックポイント | nova3DCGXL_ilV80.safetensors |
| 視線プロンプト | ポジ / ネガに視線指定を追加 |

正直に残す課題も 2 つあります。ひとつは、この経路がまだ手動でスクリプトを組んで動かしている段階で、既存の生成スクリプトへの正式統合はこれからだということ。もうひとつは、向きの補正が pitch と前方向だけで、roll(左右の傾き)には未対応なことです。必要になれば耳のベクトルを平面に投影して同じ理屈で補正できますが、今回は手を付けていません。
3 回を通してのいちばんの収穫は、一つの症状を安易に単一原因へ還元しなかったことでした。「上を向いて見える」は denoise とメッシュ角度と視線プロンプトの三つ巴で、しかも途中で regularization を主因と誤診断しています。外部に信頼できる基準がなくても、中立モデルの角度を自分で測り、値を振って比較すれば切り分けられる。地形の骨格を実在しうる顔として結ぶ試みは、そういう地道な実測の積み重ねで、ようやく正面を向いてくれました。