iljung1106
Fixed readme
39ec415

A newer version of the Gradio SDK is available: 6.5.1

Upgrade
metadata
title: Three-View-Style-Embedder
emoji: 🎨
colorFrom: blue
colorTo: purple
sdk: gradio
sdk_version: 4.0.0
app_file: app.py
pinned: false

Three-View-Style-Embedder

17,000+ μž‘κ°€μ˜ 일러슀트 μŠ€νƒ€μΌμ„ μž„λ² λ”©ν•˜κ³  λΆ„λ₯˜ν•˜λŠ” Multi-branch Metric Learning λͺ¨λΈ

κ°œμš”

Three-View-Style-EmbedderλŠ” 일러슀트의 전체 이미지, μ–Όκ΅΄, 눈 μ„Έ κ°€μ§€ λ·°λ₯Ό κ²°ν•©ν•˜μ—¬ μž‘κ°€ 고유의 μŠ€νƒ€μΌμ„ 512차원 λ²‘ν„°λ‘œ μž„λ² λ”©ν•©λ‹ˆλ‹€.

μ•„ν‚€ν…μ²˜

β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚                      Input Images                            β”‚
β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€
β”‚    Full Image     β”‚    Face Crop      β”‚      Eye Crop       β”‚
β”‚      (ν•„μˆ˜)        β”‚     (선택)         β”‚       (선택)         β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
          β”‚                   β”‚                    β”‚
          β–Ό                   β–Ό                    β–Ό
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚            3Γ— EVA02-Large Encoders (각 304M params)          β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
          β”‚                   β”‚                    β”‚
          β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
                    β”‚                   β”‚
                    β–Ό                   β–Ό
          β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
          β”‚         Gated Fusion Module          β”‚
          β”‚   (각 브랜치 μ€‘μš”λ„ 동적 ν•™μŠ΅)         β”‚
          β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
                            β”‚
                            β–Ό
          β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
          β”‚     Style Embedding Head (512-d)     β”‚
          β”‚         L2 Normalized Output         β”‚
          β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
                            β”‚
               β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
               β–Ό                         β–Ό
        β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”            β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
        β”‚  ArcFace   β”‚            β”‚  Multi-    β”‚
        β”‚   Loss     β”‚            β”‚ Similarity β”‚
        β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜            β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

ν”„λ‘œμ νŠΈ ꡬ쑰

Three-View-Style-Embedder/
β”œβ”€β”€ config.py              # μ„€μ • 관리
β”œβ”€β”€ model.py               # λͺ¨λΈ μ•„ν‚€ν…μ²˜
β”œβ”€β”€ dataset.py             # 데이터셋 및 λ°μ΄ν„°λ‘œλ”
β”œβ”€β”€ losses.py              # Loss ν•¨μˆ˜ (ArcFace, Multi-Similarity, Center)
β”œβ”€β”€ trainer.py             # ν•™μŠ΅ 둜직
β”œβ”€β”€ train.py               # ν•™μŠ΅ μ‹€ν–‰ 슀크립트
β”œβ”€β”€ evaluate.py            # 평가 슀크립트
β”œβ”€β”€ extract_embeddings.py  # μž„λ² λ”© μΆ”μΆœ 슀크립트
β”œβ”€β”€ app.py                 # Hugging Face Spaces용 Web UI (μžλ™ λ‹€μš΄λ‘œλ“œ)
β”œβ”€β”€ local_app.py           # 둜컬 μ‹€ν–‰μš© Web UI
β”œβ”€β”€ inference_utils.py     # μΆ”λ‘  μœ ν‹Έλ¦¬ν‹° (곡톡)
β”œβ”€β”€ requirements.txt       # μ˜μ‘΄μ„±
└── README.md              # λ¬Έμ„œ

μ„€μΉ˜

pip install -r requirements.txt

Windowsμ—μ„œλŠ” μž‘μ—… ν΄λ”μ˜ .venvλ₯Ό μ‚¬μš©ν•˜λ„λ‘ ꢌμž₯ν•©λ‹ˆλ‹€ (PATH에 μžˆλŠ” λ‹€λ₯Έ Python으둜 μ‹€ν–‰ν•˜λ©΄ Gradio/torch 버전 좩돌이 λ‚  수 μžˆμŠ΅λ‹ˆλ‹€).

데이터셋 ꡬ쑰

./dataset/              # 전체 이미지 (ν•„μˆ˜)
    β”œβ”€β”€ artist_name_1/
    β”‚   β”œβ”€β”€ image1.jpg
    β”‚   └── image2.png
    └── artist_name_2/
        └── ...

./dataset_face/         # μ–Όκ΅΄ 크둭 (선택)
    └── (동일 ꡬ쑰)

./dataset_eyes/         # 눈 크둭 (선택)
    └── (동일 ꡬ쑰)

μ‚¬μš©λ²•

1. ν•™μŠ΅

python train.py \
    --dataset_root ./dataset \
    --dataset_face_root ./dataset_face \
    --dataset_eyes_root ./dataset_eyes \
    --epochs 100 \
    --batch_size 256

2. μž„λ² λ”© μΆ”μΆœ

ν•™μŠ΅λœ λͺ¨λΈλ‘œ λͺ¨λ“  μž‘κ°€μ˜ μž„λ² λ”©μ„ μΆ”μΆœ:

python extract_embeddings.py \
    --checkpoint ./checkpoints/best_model.pt \
    --output ./embeddings/artist_embeddings.npz \
    --max_combinations 10 \
    --batch_size 256

3. Web UI μ‹€ν–‰

둜컬 μ‹€ν–‰

python local_app.py \
    --checkpoint ./checkpoints/best_model.pt \
    --embeddings ./embeddings/artist_embeddings.npz

λ˜λŠ” Windowsμ—μ„œ:

run.bat

λΈŒλΌμš°μ €μ—μ„œ http://localhost:7860 접속

Hugging Face Spaces μ‹€ν–‰

app.pyλŠ” Hugging Face Spacesμ—μ„œ μžλ™μœΌλ‘œ λͺ¨λΈμ„ λ‹€μš΄λ‘œλ“œν•˜μ—¬ μ‹€ν–‰λ©λ‹ˆλ‹€. Spaces에 μ—…λ‘œλ“œν•˜λ©΄ μžλ™μœΌλ‘œ μž‘λ™ν•©λ‹ˆλ‹€.

λͺ¨λΈ μŠ€νŽ™

ν•­λͺ© κ°’
Backbone EVA02-Large-14-CLIP Γ— 3
Total Parameters ~920M
Embedding Dimension 512
Input Size 224 Γ— 224
Loss ArcFace + Multi-Similarity + Center

μ„±λŠ₯

λ©”νŠΈλ¦­ κ°’
Top-1 Accuracy ~77%
Top-5 Accuracy ~92%
클래슀 수 17,000+

좜λ ₯ 파일

체크포인트 (./checkpoints/)

  • best_model.pt: 졜고 μ„±λŠ₯ λͺ¨λΈ
  • checkpoint_epoch_N.pt: 에포크별 체크포인트

μž„λ² λ”© (./embeddings/)

  • artist_embeddings.npz: μž‘κ°€λ³„ 평균 μž„λ² λ”©
  • artist_embeddings.json: 메타데이터

API μ‚¬μš© μ˜ˆμ‹œ

from extract_embeddings import load_embeddings, find_similar_artists
from app import get_image_embedding

# μž„λ² λ”© λ‘œλ“œ
artist_names, embeddings = load_embeddings('./embeddings/artist_embeddings.npz')

# μ΄λ―Έμ§€μ—μ„œ μž„λ² λ”© μΆ”μΆœ
query_emb = get_image_embedding(model, image, device)

# μœ μ‚¬ μž‘κ°€ 검색
similar = find_similar_artists(query_emb, artist_names, embeddings, top_k=10)
for name, score in similar:
    print(f"{name}: {score:.4f}")

λΌμ΄μ„ μŠ€

MIT License