「着たい服」をテキストで入力して自撮りするだけで、商品検索・バーチャル試着・コーディネートアドバイスを自動でこなす Android アプリです。
処理を4つの専門クラスに役割分担したシーケンシャルパイプライン設計を採用しており、各ステップが独立しているため、使用する API やモデルの差し替えが容易な構成になっています。
| 項目 | 内容 |
|---|---|
| アプリ名 | VirtualFit AI |
| 対象端末 | Android 6.0 (API 23) 以上の端末 / 動作確認: Nexus 7 |
| 言語 | Java |
| 主要技術 | Camera2 API / Gemini API (2.5 Flash / 2.5 Flash Image) / Rakuten API / OkHttp / Gson / Glide |
「白いリネンシャツが欲しい」とテキストを入力して撮影ボタンを押すだけで、楽天市場から候補商品を自動取得し、自分の写真にその服を合成したバーチャル試着画像とコーディネートコメントが返ってきます。
生成された試着画像に対して、そのままチャットで「もう少しカジュアルに」「色を変えて」などと追加リクエストを送ると、Gemini が画像を再生成して即座に反映されます。
試着→修正→購入を1アプリで完結させることをゴールとして、以下の処理を自動化しています。
| ステップ | 処理内容 |
|---|---|
| 1. 撮影 | Camera2 API でその場で自撮り |
| 2. テキスト入力 | 欲しい服をテキストで自由記述 |
| 3. 商品検索 | 入力を解析して楽天市場 API で商品を自動検索 |
| 4. バーチャル試着 | 自撮りから体型を分析し Gemini で試着ファッション画像を生成 |
| 5. コメント生成 | 試着画像をもとにコーディネートアドバイスを生成 |
| 6. チャットで修正 | 試着結果に追加リクエストを送ると Gemini が画像を再生成 |
| 7. 購入へ | 気に入った商品はそのまま購入ページへ遷移 |
- Android Studio(最新版推奨)
- JDK 11 以上
- Android SDK(API 23+)
- 各種 API キー(下記参照)
プロジェクトルートの local.properties(Git には含めない)に以下を追記してください。
gemini_api_key=YOUR_GEMINI_API_KEY
rakuten_app_id=YOUR_RAKUTEN_APP_ID
rakuten_access_key=YOUR_RAKUTEN_ACCESS_KEY- このリポジトリをクローンする
- Android Studio でプロジェクトを開く
local.propertiesに API キーを設定する- 実機またはエミュレータ(API 23+)で実行する
処理は AgentPipeline が1スレッド上で以下の4ステップを順番に実行します。各ステップは独立したクラスとして実装されており、前ステップの出力を受け取って次ステップへ渡す構造です。
| ステップ | クラス | 使用 API | 担当タスク |
|---|---|---|---|
| 1 | StyleAnalystAgent | Gemini 2.5 Flash | テキスト入力を構造化データ(JSON)に変換 |
| 2 | ShoppingAgent | Rakuten Ichiba API | 商品検索・購入 URL リスト取得 |
| 3 | TryOnAgent | Gemini 2.5 Flash + Gemini 2.5 Flash Image | 自撮りから体型をテキスト分析し、ファッション画像を生成 |
| 4 | StylistAgent | Gemini 2.5 Flash | 試着描写テキスト・元リクエスト・商品名をもとにスタイリングコメントを生成(楽天商品画像URLがある場合はマルチモーダル) |
各クラスの差し替えは AgentPipeline を編集するだけで対応でき、たとえば別の試着モデルや別のショッピング API への変更も容易です。
flowchart LR
subgraph UI
A([CameraActivity\n自撮り]) --> B([InputActivity\nテキスト入力])
B --> C([ProcessingActivity\n進捗表示])
R([ResultActivity\n結果表示])
end
subgraph Pipeline["処理パイプライン (シングルスレッド / 順次実行)"]
direction TB
SA["Step1: StyleAnalystAgent\nGemini API\nテキスト → 構造化JSON"]
SH["Step2: ShoppingAgent\nRakuten API\n商品検索"]
TO["Step3: TryOnAgent\nGemini 2.5 Flash + Flash Image\nバーチャル試着画像生成"]
ST["Step4: StylistAgent\nGemini API multimodal\nコメント生成"]
SA -->|StyleAnalysis| SH
SH -->|List<Product>| TO
TO -->|TryOnResult| ST
end
C --> SA
ST --> R
com.example.cameramaltiagent/
├── ui/
│ ├── CameraActivity.java # Camera2 プレビュー・撮影
│ ├── InputActivity.java # テキスト入力・パイプライン起動
│ ├── ProcessingActivity.java # 進捗表示
│ └── ResultActivity.java # 結果表示
├── agent/
│ ├── AgentPipeline.java # 4 ステップの順次実行
│ ├── StyleAnalystAgent.java # テキスト構造化
│ ├── ShoppingAgent.java # 商品検索
│ ├── TryOnAgent.java # 体型分析 + 試着画像生成
│ └── StylistAgent.java # スタイリングコメント生成
├── api/
│ ├── GeminiApiClient.java # Gemini API HTTP 通信
│ └── ShoppingApiClient.java # Rakuten API 通信
├── model/
│ ├── StyleAnalysis.java # ステップ間データ
│ ├── Product.java # 商品データ
│ ├── TryOnResult.java # 試着結果データ
│ └── AgentResult.java # パイプライン最終結果
└── MainActivity.java # エントリーポイント
-
パイプライン設計
AgentPipelineがExecutorService上で 4 つの処理を順次実行する- 各ステップの出力が次ステップの入力になるデータパイプライン構造
-
非同期ポーリングとタイムアウト制御(廃止済み)
- 当初は Replicate IDM-VTON を使用していたが、現在は Gemini 2.5 Flash Image による画像生成に変更
- 体型分析(gemini-2.5-flash)→ ファッション画像生成(gemini-2.5-flash-image)の2ステップ方式を採用
-
StylistAgent のフォールバック対応
- 生成画像はローカルファイルとして保存されるため、StylistAgent には楽天商品画像URL と試着描写テキストを渡す
- 商品画像URLがある場合はマルチモーダル(画像+テキスト)、ない場合はテキストのみで自動切り替え
-
JSON 出力の安定化
- JSON 形式のみを返すようプロンプトを設計
- 正規表現による JSON ブロック抽出のフォールバック処理を実装
-
Camera2 API のリソース管理
onPause()でのcloseCamera()実装によりメモリリークを防止- Nexus 7 向けに
inSampleSizeによる画像縮小処理を適用
このプロジェクトは個人・学習目的で作成されています。
本アプリは Gemini API を APIキー経由で使用しています。 Google の公式ポリシーにより、API 経由で送信した画像・テキストはモデルの学習には使用されません。