スタディ 03 · コンピュータービジョン・バーチャル試着
人物写真に服を着せて試せるバーチャル試着アプリ
2021年・学部研究生Androidアプリで人物写真と着せたい衣服を選ぶと、サーバーがバーチャル試着画像を返す処理フローを実装しました。
- 1人物写真・着せる服の選択
Androidアプリでポートレート写真と衣類IDを転送する
- 2人体パージング、ポーズ、衣服マスク
ACGPN入力形式で整理
- 3着用イメージの生成
Flaskサーバーがアプリに戻る
ACGPNと人体解析、ポーズ推定公開モデルを結んだ統合実装
担当した役割と成果
- 担当する役割
- 公開されているバーチャル試着モデルに必要な入力前処理と衣類マスクを構築し、FlaskアップロードAPIとKotlin・Retrofit Androidクライアントを接続しました。
- 成果
- 人物写真と選択した衣類を受け取り、前処理、試着画像の生成、そしてアプリへの結果の返却までの一連の統合フローを構築しました。生成モデル、ポーズ推定モデル、人体パースモデルは既存のものを再利用し、入力構成、マスク処理、サーバーとアプリ間の連携部分は独自に実装しました。
自ら実装・分析したもの
- 人体パージング、ポーズ、衣服マスクをACGPN入力形式に整理
- OpenCV GrabCutによる衣服マスクの作成
- Flaskアップロード、結果戻りAPI
- Kotlin、Retrofit Androidクライアント接続
ベースとなった研究・公開モデル
- ACGPN仮想着用モデル
- 人体パージングおよびポーズ推定の公開モデル
実験結果と試行錯誤
アップロードから試着結果の返却までを確認し、マスクエラーを分析しました
公開コードの実行・VITON-HDテスト画像(CC BY-NC 4.0)・顔はモザイク処理・以下の時間はCPUでの実験値
サーバーのアップロードAPIで試着画像を取得したところ、40着のうち13着でGrabCutの矩形が画像の外にはみ出し、マスクが背景まで広がりました。
- Apple M1 Pro CPU
- PyTorch
- 公開モデルの重み
- サーバーアップロードAPIの実行

- 13 / 40着マスクが背景にはみ出している服
- 0.93 → 0.96矩形修正後のマスクIoU
- 4.9秒1リクエストあたりのCPU中央値
問題と解決策
問題バーチャル試着モデルでは、人物写真に加え、ポーズ、身体部位、衣類領域の情報を所定の形式で入力する必要があります。
解決公開されている人体パース(セグメンテーション)およびポーズ推定モデルの出力をACGPNの入力形式に合わせ、GrabCutを用いて衣類のマスクを作成する前処理を組み込みました。
問題複数のモデルのファイル入出力は、ユーザーが直接扱うには手順が複雑です。
解決Flask Upload APIは前処理と推論を実行し、結果の画像を返すように設定し、AndroidクライアントをRetrofitにリンクしました。
問題衣類のマスクに背景が混ざると、生成された服と胴体が一緒にぼやけてしまう可能性があります。
補完実験公開コードを実行する中で、GrabCutの初期矩形が画像の境界を越える問題を見つけました。矩形を画像内に収めた比較実験では、マスクIoUの中央値が0.929から0.957に上がりました。
実験の比較と詳細な結果
| 項目 | 結果 | 条件 |
|---|---|---|
| 1リクエストの処理時間 | 中央値 4.90秒(四分位範囲 3.57~6.57秒) | リクエスト40回、CPU |
| そのうちACGPN生成 | 中央値 2.27秒 | 同一の40回(試行) |
| 同一の衣服の復元におけるSSIM | 平均 0.869 · 中央値 0.884 | 20人の人物 |
| GrabCutマスクのIoU | 中央値 0.929 → 0.957 | 40着の服 · コードそのまま → 画像内に四角形を配置 |
観察された原因と残された課題
- GrabCut正方形エラー
矩形 (1, 1, w, h) が画像の境界を越えており、背景の手がかりが上と左の1列分しかなかったため、40件中13件でマスクが背景にまで広がってしまいました。
- 3種類の失敗パターン
マスクが背景にはみ出すと胴体がぼやけ、袖の長さを変えると腕に残像が生じ、丈が異なると元の服の模様が裾の下に残ってしまいます。
- SSIMの読み方
同じ衣服を再度着せて、オリジナルと比較した値です。衣服の外側部分は入力がそのまま使用されるためスコアが高く、ACGPN論文の値とは比較できません。
- データと重み
VITONデータは配布が妨げられ、VITON-HDテストイメージを書き、ACGPNとOpenPoseの重みは非商業研究用に公開されたものです。
結果の読み方
- 画質や速度の改善ではなく、統合的な実装
- 公開されている重みを使用して、数十枚のテスト画像を実行した結果
- 製品レベルのパフォーマンスや商用運用が可能かどうかは示されません
異なるモジュールの入出力を整合させて連結する作業は、サーバー側で作成した加工計画をFusion上で実行させる、現在のプロセスと似ています。
3Dモデルを読み、加工戦略まで設計するAI