iljung1106
Fixed readme
39ec415
---
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 # λ¬Έμ„œ
```
## μ„€μΉ˜
```bash
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. ν•™μŠ΅
```bash
python train.py \
--dataset_root ./dataset \
--dataset_face_root ./dataset_face \
--dataset_eyes_root ./dataset_eyes \
--epochs 100 \
--batch_size 256
```
### 2. μž„λ² λ”© μΆ”μΆœ
ν•™μŠ΅λœ λͺ¨λΈλ‘œ λͺ¨λ“  μž‘κ°€μ˜ μž„λ² λ”©μ„ μΆ”μΆœ:
```bash
python extract_embeddings.py \
--checkpoint ./checkpoints/best_model.pt \
--output ./embeddings/artist_embeddings.npz \
--max_combinations 10 \
--batch_size 256
```
### 3. Web UI μ‹€ν–‰
#### 둜컬 μ‹€ν–‰
```bash
python local_app.py \
--checkpoint ./checkpoints/best_model.pt \
--embeddings ./embeddings/artist_embeddings.npz
```
λ˜λŠ” Windowsμ—μ„œ:
```bat
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 μ‚¬μš© μ˜ˆμ‹œ
```python
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