vlm-outfit-refiner

服の写真だけで、
今日の「正解」を3案出す。

服が増えても「何を合わせるか」で迷う。写真を登録しておけば、 シーン×気温感×雰囲気から 無難 / きれいめ / 攻めの3パターンを理由つきで返します。 しかも ローカル完結(外部クラウド API なし)。

  • 手持ちの服を “検索できる属性” に自動整理(SQLite)
  • 3パターン提案で迷いをゼロに(CLI / Streamlit)
  • VLMの誤分類は reclassify(再推論)か edit(手修正)で即リカバリ
Python 3.10+
Ollama Vision
SQLite local DB
JSON I/O
CLI + Streamlit
ollama serve ollama pull qwen2.5vl:7b python3 -m venv .venv && source .venv/bin/activate pip install -r requirements.txt python main.py add ./photos/shirt.jpg python main.py add ./photos/pants.jpg python main.py add ./photos/shoes.jpg python main.py recommend
※ 画像や属性はローカルの SQLite に保存。外部クラウドへ送信しません。
1分 UI デモ(Add → Edit → Recommend)
Streamlit: デモ3点登録、属性の手修正、3案の推薦
本番利用では画像を VLM 抽出して登録。このGIFは demo=1(3点一括)と no_llm=1(提案文のローカル化)で画面収録専用。静止画は 下のスクショ へ。

迷いが減る

「何着る?」を考える時間を減らし、候補を3つに絞って即決できる。

3 patterns: safe / clean / bold

ローカル完結

外部クラウド API を使わず、Ollama + SQLite で完結。写真を外に出したくない人向け。

Ollama (local) + SQLite

直せる

モデルの誤分類があっても、ワンクリックで取り直し or 手修正して運用できる。

reclassify / edit

Real UI screenshots(実UI)

Streamlit (Edit page)
Streamlit Edit screenshot
Streamlit (Preview)
Streamlit preview

サンプルの服(デモ画像)

※ 外部素材は使わず、このリポジトリ内で生成したデモ画像です。
この3点が登録されていると、`recommend` は最低限動作します(tops/bottoms/shoes)。

サンプルの服(公開データの写真 / CC0)

Wikimedia Commons の CC0 写真を同梱しています(出典は ATTRIBUTION)。

よくある不安(先回り)

写真は外部に送られる?

いいえ。外部クラウド API は使いません。Ollama はローカルで動かし、DB はローカルの SQLite です。

精度が微妙だったら?

まず reclassify で取り直し。それでも変なら edit で人間が直して運用できます。

FAQ

必要な服の枚数は?

tops / bottoms / shoes がそれぞれ1枚以上あると提案できます。

UIは必須?

いいえ。CLIだけでも動きます。UIは streamlit run app.py で起動できます。

おすすめのモデルは?

Vision対応のモデルならOK。例として qwen2.5vl:7b を使っています。

出力例(実データ / JSON)

下は CC0 公開写真(上の “公開データの写真”)を `add` して、`recommend` を1回実行したときの実出力です。
無難safe

カフェでカジュアルな雰囲気を演出するためのシンプルなコーディネート。

・カフェのカジュアルな雰囲気を表現するために、シンプルな白いトップスと動きやすいブルーのパンツを組み合わせました。…

item_ids: top=1 / bottom=2 / shoes=3
きれいめclean

カフェでの清潔感と品格を出すためのカジュアルなきれいめなコーディネート。

・ホワイトのトップスとシルバーの靴の組み合わせで、清潔感と品格を表現しました。…

item_ids: top=1 / bottom=2 / shoes=3
攻めbold

カフェで軽やかに動きながら個性を表現するカジュアルなコーディネート。

・カフェの雰囲気を楽しむための軽やかな動きを楽しめる素材を使用しています。…

item_ids: top=1 / bottom=2 / shoes=3
docs/assets/sample_recommend.json
download
{
  "ok": true,
  "situation": "カフェ",
  "temp_feel": "普通",
  "user_style": "カジュアル",
  "model": "qwen2.5vl:7b",
  "proposals": [
    {
      "pattern_label": "safe",
      "pattern_ja": "無難",
      "item_ids": { "top": 1, "bottom": 2, "shoes": 3 },
      "summary": "カフェでカジュアルな雰囲気を演出するためのシンプルなコーディネート。",
      "reason": "・カフェのカジュアルな雰囲気を表現するために、シンプルな白いトップスと動きやすいブルーのパンツを組み合わせました。…",
      "tips": "靴の色をアクセントにすることで、より洗練された印象に仕上げることができます。"
    },
    { "pattern_label": "clean", "pattern_ja": "きれいめ", "item_ids": { "top": 1, "bottom": 2, "shoes": 3 }, "summary": "カフェでの清潔感と品格を出すためのカジュアルなきれいめなコーディネート。", "reason": "・ホワイトのトップスとシルバーの靴の組み合わせで、清潔感と品格を表現しました。…", "tips": "靴の色をアクセントにすることで、より洗練された印象に仕上げることができます。" },
    { "pattern_label": "bold", "pattern_ja": "攻め", "item_ids": { "top": 1, "bottom": 2, "shoes": 3 }, "summary": "カフェで軽やかに動きながら個性を表現するカジュアルなコーディネート。", "reason": "・カフェの雰囲気を楽しむための軽やかな動きを楽しめる素材を使用しています。…", "tips": "足元はシルバーの靴で、トレンド感をプラスしましょう。" }
  ]
}
※ ページ上は短縮表示。完全な JSON は download から見れます。

ペルソナ別の一括検証(dogfood)

想定ユーザー(仕事/カフェ/寒い日など)を切り替えて `recommend` をまとめて回し、結果を比較できます。
docs/assets/sample_dogfood.json
download
※ 上は短縮表示。完全な結果は download から見れます。