第4回:姿勢推定・自動採寸・3D再構成
![]()
はじめに --- 試着エンジンを支える周辺技術
前回は、PF-AFNの実装をコードレベルで解説しました。衣服をワーピングしてコンポジットする試着エンジンの中核部分です。しかし、実用的な仮想試着アプリケーションを構築するためには、試着エンジン単体では不十分です。
「この服は自分の体に合うサイズだろうか」「自分の体型だとどう見えるだろうか」 --- こうしたユーザーの素朴な疑問に答えるには、人体の構造を正確に理解する技術が欠かせません。
今回は、META FITの周辺を支える技術群を解説します。OpenPoseによる骨格検出、Graphonomyによる人体パーシング、独自に開発した自動採寸アルゴリズム。そして、2D画像から3Dメッシュを復元するPiFuの探索と、ブラウザ上でリアルタイム動作するWebプロトタイプの実装についてもお伝えします。
OpenPose --- 身体構造を理解する
OpenPoseは、2D写真から人体の骨格キーポイントを検出するモデルです。META FITではbody_pose_model.pthとして組み込まれており、PASTA-GAN++の補助入力と、自動採寸の基盤という2つの重要な役割を担っています。
18個のキーポイント
OpenPoseは1枚の写真から18個の骨格キーポイントを検出します。首、左右の肩、左右の肘、左右の手首、左右の腰、左右の膝、左右の足首、そして顔の主要ポイントです。各キーポイントには座標値(x, y)と信頼度スコアが付与されます。
これらのキーポイントを関節として骨格に組み上げるのが、**Part Affinity Fields(PAFs)**の技術です。PAFsは、あるキーポイントが別のどのキーポイントとつながるべきかを示すベクトルフィールドで、複数人が写っている画像でも各個人の骨格を正しく組み立てることができます。
META FITにおける2つの役割
1つ目は、衣服ワーピングのガイドです。PASTA-GAN++では、OpenPoseの出力をモデルへの補助入力として与えることで、衣服のワーピングをより正確にコントロールします。たとえば、肩のキーポイント位置に基づいて衣服の肩幅を調整し、腰のキーポイントでボトムスの配置位置を決定します。PF-AFNが「Parser-Free」でこの情報なしに動作したのに対し、PASTA-GAN++ではこの骨格情報が生成品質の向上に役立っています。
2つ目は、後述する自動採寸の基準点としての役割です。骨格キーポイント間のピクセル距離を実寸に変換することで、身体の各寸法を推定します。
Graphonomy --- 人体パーシング
Graphonomyは、人物画像を体の部位ごとにセマンティックセグメンテーションするモデルです。META FITではinference.pthとして組み込まれ、PASTA-GAN++の補助入力を生成します。
セグメンテーションの対象
Graphonomyは人物画像の各ピクセルを以下のようなカテゴリに分類します。
- 髪
- 顔
- 上半身(胴体)
- 左腕・右腕
- 左脚・右脚
- 靴
- 背景
このセグメンテーション結果は、衣服を「どの領域に配置すべきか」を特定するうえで欠かせない情報です。上半身の衣服を着せ替える場合、ジェネレータは胴体と腕の領域に新しい衣服を描く必要がありますが、顔や髪、背景はそのまま保たなければなりません。パーシング結果がこの判断を的確にガイドしてくれます。
OpenPoseとの連携
OpenPoseとGraphonomyは互いを補い合う関係にあります。OpenPoseが提供するのは構造(骨格のトポロジー、関節の接続関係)で、Graphonomyが提供するのは領域(体の各部位がどのピクセルを占めているか)です。PASTA-GAN++はこの2つの情報を組み合わせることで、人体の形状と構造を精度高く把握し、衣服の配置精度を高めています。
自動採寸システム
仮想試着で「見た目」を確認できても、実際に購入するとなればサイズの確認は欠かせません。META FITでは、OpenPoseの骨格検出結果を活用した自動採寸アルゴリズムを独自に開発しました。
測定の仕組み
get_body_measure.pyに実装された自動採寸の中心部分を見てみましょう。
class BodyMeasure:
def __init__(self):
self.pose_detector = PoseDetector()
def measure(self, image, height_cm):
# OpenPoseで骨格キーポイントを検出
keypoints = self.pose_detector.detect(image)
# 身長のピクセル値と実寸(cm)から比率を算出
pixel_ratio = height_cm / pixel_height
# キーポイント間の距離から各寸法を導出
measurements = {
'body_length': neck_to_waist_midpoint * 2 * pixel_ratio,
'shoulder_width': right_shoulder_to_left_shoulder * pixel_ratio,
'sleeve_length': (shoulder_to_elbow + elbow_to_wrist) * pixel_ratio,
'inseam': (hip_to_knee + knee_to_ankle) * pixel_ratio,
}
return measurements
アルゴリズムの流れは以下の通りです。
- キーポイント検出: OpenPoseで人物画像から18個の骨格キーポイントを検出
- スケール算出: ユーザーが入力した身長(cm)と、画像上のピクセル身長からスケール比率を計算
- 寸法導出: キーポイント間のピクセル距離にスケール比率を掛けて実寸に変換
各寸法の導出ロジック
具体的な寸法と、それを算出するのに使うキーポイントの対応関係をまとめます。
| 測定項目 | 使用するキーポイント | 計算方法 |
|---|---|---|
| 着丈 | 首 → ウエスト中点 | 首からウエスト中点までの距離 x 2 |
| 肩幅 | 右肩 → 左肩 | 2点間のユークリッド距離 |
| 袖丈 | 肩 → 肘 → 手首 | 各区間の距離の合計 |
| 股下 | 腰 → 膝 → 足首 | 各区間の距離の合計 |
「着丈」の計算で「x 2」を掛けているのは、首からウエスト中点までの距離がトップスの着丈のおおよそ半分に相当するという経験則に基づいています。
検証結果
10名のテスト被験者(身長158cm〜178cm)を対象に、自動採寸の結果と実測値を比較検証しました。測定項目はバスト、ヒップ、ウエスト、股下、着丈、肩幅、袖丈の7項目です。
2D画像からの寸法推定には、避けられない限界があります。正面からの写真では奥行き方向の情報が失われるため、バストやヒップのような周囲長の推定は、肩幅や着丈のような幅・長さの推定に比べて精度が落ちます。また、ユーザーの姿勢(猫背、腕の位置など)がキーポイントの検出精度に影響し、測定値にも誤差が出てきます。
それでも、サイズ推薦の目的 --- SサイズかMサイズか、あるいはこの衣服は自分に合いそうかどうかの大まかな判断 --- においては、実用的な精度が得られることを確認しました。
PiFu --- 2Dから3Dへの再構成を探索
仮想試着の最終的な理想は、2D画像上の合成ではなく、3Dアバターでの試着ではないでしょうか。META FITでは、この可能性を検証するために**PiFu(Pixel-aligned Implicit Function)**を用いた3D再構成に取り組みました。
PiFuのアーキテクチャ
PiFuは、1枚の2D写真から3Dメッシュを生成するモデルです。中核のアーキテクチャは**HGPIFuNet(Hourglass PIFu Network)**で、以下の2つの主要コンポーネントから成り立っています。
Hourglass画像フィルタ: 入力画像からマルチスケールの特徴を抽出するネットワークです。名前の通り砂時計型のエンコーダ-デコーダ構造を持ち、これを繰り返し適用することで(num_hourglass=2)、より精緻な特徴表現を得ています。hourglass_dim=256、num_stack=4の設定で、十分な表現力を確保しています。
表面分類器: 3D空間上の任意の点が物体の「内部」か「外部」かを判定するMLP(多層パーセプトロン)です。層構成は [257, 1024, 512, 256, 128, 1] で、最終層のsigmoid関数が内部確率を0〜1の値で出力します。入力の257次元は、ピクセル整列特徴(256次元)とZ座標(1次元)の結合です。
入力: 2D写真
→ Hourglass画像フィルタ: マルチスケール特徴抽出
→ 3D空間の各点に対して:
ピクセル整列特徴 + Z座標 → MLP → 内部/外部確率
→ Marching Cubes → .obj 3Dメッシュファイル
「ピクセル整列」という概念が重要です。3D空間上の点を2D画像平面に投影し、その投影位置に対応する画像特徴を取得することで、3D再構成と2D画像特徴を直接的に結びつけています。
3D試着の理想と現実
3D再構成から3D試着を実現するには、人体の3Dメッシュだけでなく、衣服の3Dモデルとその物理シミュレーション(ドレープ、シワ、重力による挙動)が必要です。PiFuで人体の3Dメッシュを生成すること自体はできましたが、その上に衣服を自然にシミュレーションする工程の複雑さが、当時の技術では大きなハードルでした。
この判断から、META FITの初期プロトタイプでは2Dベースの試着に集中する方針を採りました。PiFuによる3D再構成は、将来のバージョンで再検討する価値のある技術として位置づけています。3D衣服シミュレーション技術が進歩すれば、より没入感のある試着体験の実現が見えてきます。
Webプロトタイプ --- TensorFlow.js + PoseNet
GANベースの試着エンジンはサーバーサイドGPUが必要ですが、仮想試着のコンセプトをもっと手軽に体験できる形で見せたいと考え、ブラウザ上で完結するWebプロトタイプも作りました。
実装アプローチ
使用したのはTensorFlow.jsとPoseNetです。PoseNetはGoogleが公開したブラウザ内姿勢推定モデルで、TensorFlow.jsを通じてブラウザのJavaScript環境で直接動かせます。
プロトタイプの動作フローは以下の通りです。
- デバイスのカメラでユーザーをリアルタイム撮影
- PoseNetでフレームごとに骨格キーポイントを検出(特に肩の位置)
- 検出した肩幅に基づいて、衣服PNG画像のスケールと位置を算出
- 衣服画像を正しい位置とサイズでカメラ映像の上にオーバーレイ
コンセプトの実証と限界
このプロトタイプがスムーズなフレームレートでブラウザ内動作したことは、大きな収穫でした。サーバーサイドのGPU処理なしに、クライアントサイドだけで「カメラに映った自分に服を重ねて見る」という体験が成り立つことを確認できたのです。
ただし、これはあくまで単純なオーバーレイであり、GANベースのコンポジットとは根本的に異なります。衣服画像を体の上に「貼り付ける」だけで、体型に合わせたワーピングや、自然な影・ブレンディングは行いません。ARフィルターに近い体験です。
それでも、このプロトタイプから2つの重要な気づきが得られました。
1つ目は、リアルタイム性の価値です。多少の精度を犠牲にしても、即座にフィードバックが得られる体験はユーザーにとって魅力的です。GANベースの高品質な試着画像とリアルタイムオーバーレイは、異なるユースケースに対応する互いに補い合うアプローチとして共存できます。
2つ目は、エッジコンピューティングの可能性です。モデルの軽量化と推論の最適化が進めば、より高品質な試着処理をクライアントサイドで動かせるようになるかもしれません。
次回予告
今回は、試着エンジンの周辺を支える技術群を解説しました。OpenPoseによる骨格検出、Graphonomyによる人体パーシング、独自の自動採寸アルゴリズム、PiFuによる3D再構成の探索、そしてTensorFlow.jsによるWebプロトタイプ。これらの技術が組み合わさることで、META FITは「ただ衣服を合成する」だけでなく、「体型を理解してサイズを推薦する」「3Dで試着する」「ブラウザで手軽に体験する」といった多面的なアプローチを模索してきました。
次回(最終回)は、これらすべてを統合した結果として、何がうまくいき、何が課題として残ったのかを率直に振り返ります。GANベース試着の具体的な失敗パターン、スマートフォンアプリのUI設計、そして拡散モデルが開く次世代META FITの展望についてお話しします。
META FIT シリーズ:
- 第1回:プリクラから仮想試着へ — 20年越しのビジョン
- 第2回:GANを理解する — 仮想試着を支えるエンジン
- 第3回:PF-AFNの実装 — 試着エンジンのコードを読む
- 第4回:姿勢推定・自動採寸・3D再構成(この記事)
- 第5回:成果・課題・次世代画像生成への道