--- 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