スタディ一覧

スタディ 03 · コンピュータービジョン・バーチャル試着

人物写真に服を着せて試せるバーチャル試着アプリ

2021年・学部研究生
公開コード

Androidアプリで人物写真と着せたい衣服を選ぶと、サーバーがバーチャル試着画像を返す処理フローを実装しました。

  1. 1人物写真・着せる服の選択

    Androidアプリでポートレート写真と衣類IDを転送する

  2. 2人体パージング、ポーズ、衣服マスク

    ACGPN入力形式で整理

  3. 3着用イメージの生成

    Flaskサーバーがアプリに戻る

ACGPNと人体解析、ポーズ推定公開モデルを結んだ統合実装

PyTorchVirtual try-onHuman parsingFlaskAndroid

担当した役割と成果

担当する役割
公開されているバーチャル試着モデルに必要な入力前処理と衣類マスクを構築し、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の実行
着用前後の3つの例。元の写真と着用させる服をアップロードすると、トップスだけが変更された着用結果が表示されます。顔にはモザイクをかけています。
公開モデルとサーバーコードで作成した試着例3件です。各行の左は人物写真、中央は着せる服、右はサーバーが返した画像です。顔にはモザイクをかけ、VITON-HDのテスト画像を使用しました。
  • 13 / 40着マスクが背景にはみ出している服
  • 0.93 → 0.96矩形修正後のマスクIoU
  • 4.9秒1リクエストあたりのCPU中央値

問題と解決策

  1. 問題バーチャル試着モデルでは、人物写真に加え、ポーズ、身体部位、衣類領域の情報を所定の形式で入力する必要があります。

    解決公開されている人体パース(セグメンテーション)およびポーズ推定モデルの出力をACGPNの入力形式に合わせ、GrabCutを用いて衣類のマスクを作成する前処理を組み込みました。

  2. 問題複数のモデルのファイル入出力は、ユーザーが直接扱うには手順が複雑です。

    解決Flask Upload APIは前処理と推論を実行し、結果の画像を返すように設定し、AndroidクライアントをRetrofitにリンクしました。

  3. 問題衣類のマスクに背景が混ざると、生成された服と胴体が一緒にぼやけてしまう可能性があります。

    補完実験公開コードを実行する中で、GrabCutの初期矩形が画像の境界を越える問題を見つけました。矩形を画像内に収めた比較実験では、マスクIoUの中央値が0.929から0.957に上がりました。

実験の比較と詳細な結果

4人の人物の写真に重ね合わせたポーズ用スケルトン(上)と、身体部位ごとに色分けされた人体パース(下)。顔にはモザイクをかけています。
リンクされた公開モデルのポーズ推定(上)と人体パース(下)の結果です。独自に実装した前処理により、この出力をバーチャル試着モデルの入力データとして構成します。
VITON-HDテスト画像で測定値・192×256解像度
項目結果条件
1リクエストの処理時間中央値 4.90秒(四分位範囲 3.57~6.57秒)リクエスト40回、CPU
そのうちACGPN生成中央値 2.27秒同一の40回(試行)
同一の衣服の復元におけるSSIM平均 0.869 · 中央値 0.88420人の人物
GrabCutマスクのIoU中央値 0.929 → 0.95740着の服 · コードそのまま → 画像内に四角形を配置

観察された原因と残された課題

  1. GrabCut正方形エラー

    矩形 (1, 1, w, h) が画像の境界を越えており、背景の手がかりが上と左の1列分しかなかったため、40件中13件でマスクが背景にまで広がってしまいました。

  2. 3種類の失敗パターン

    マスクが背景にはみ出すと胴体がぼやけ、袖の長さを変えると腕に残像が生じ、丈が異なると元の服の模様が裾の下に残ってしまいます。

  3. SSIMの読み方

    同じ衣服を再度着せて、オリジナルと比較した値です。衣服の外側部分は入力がそのまま使用されるためスコアが高く、ACGPN論文の値とは比較できません。

  4. データと重み

    VITONデータは配布が妨げられ、VITON-HDテストイメージを書き、ACGPNとOpenPoseの重みは非商業研究用に公開されたものです。

結果の読み方

  • 画質や速度の改善ではなく、統合的な実装
  • 公開されている重みを使用して、数十枚のテスト画像を実行した結果
  • 製品レベルのパフォーマンスや商用運用が可能かどうかは示されません
最近のプロジェクトに関連する点

異なるモジュールの入出力を整合させて連結する作業は、サーバー側で作成した加工計画をFusion上で実行させる、現在のプロセスと似ています。

3Dモデルを読み、加工戦略まで設計するAI