[G1-Sync] Manual knowledge update

This commit is contained in:
Antigravity Agent
2026-05-10 22:08:15 +09:00
parent 21ac3ed255
commit 504fd5fb42
3011 changed files with 380280 additions and 206977 deletions
@@ -2,70 +2,204 @@
id: wiki-2026-0508-초상화-및-애니메이션-스타일-제어
title: 초상화 및 애니메이션 스타일 제어
category: 10_Wiki/Topics
status: needs_review
status: verified
canonical_id: self
aliases: []
aliases: [Portrait Style Control, Animation Style Control, Identity-Preserving Generation]
duplicate_of: none
source_trust_level: A
confidence_score: 0.92
tags: [uncategorized]
confidence_score: 0.9
verification_status: applied
tags: [diffusion, portrait, animation, identity, style-transfer]
raw_sources: []
last_reinforced: 2026-05-08
last_reinforced: 2026-05-10
github_commit: pending
inferred_by: Claude Opus 4.7 (auto-normalize 2026-05-08)
tech_stack:
language: python
framework: PyTorch/diffusers
---
# [[초상화 및 애니메이션 스타일 제어|초상화 및 애니메이션 스타일 제어]]
# 초상화 및 애니메이션 스타일 제어
## 📌 한 줄 통찰 (The Karpathy Summary)
초상화 및 애니메이션 스타일 제어는 AI 이미지 생성 시 피사체의 사실적인 인물 사진이나 특정 애니메이션 화풍을 의도한 대로 구현하기 위해 프롬프트를 세밀하게 조정하는 기법이다. 초상화의 경우 카메라 렌즈, 조명, 피사체 심도 등의 사진학적 세부 묘사를 통해 사실성을 극대화한다 [1-3]. 반면 애니메이션 스타일은 전용 모델을 활용하거나 화풍 품질 태그, 셀 셰이딩(cel-shaded) 등의 시각적 특성을 명시하여 일관된 2D 그래픽 결과물을 도출한다 [4-6].
## 한 줄
> **"매 identity 보존 + 매 style 변환의 직교 분리"**. portrait/animation 도메인의 매 핵심 challenge — 같은 사람이 매 frame 마다 같아야 하고 (identity), 매 style/pose 는 자유롭게 (control). 2026 의 매 답: InstantID / PuLID (identity) + IP-Adapter (style) + ControlNet pose (motion) 의 stack.
## 📖 구조화된 지식 (Synthesized Content)
* **사실적인 초상화(Portrait) 프롬프트 제어**
* **구조 및 렌즈 설정:** 나이, 성별 등 피사체의 특징과 함께 카메라 렌즈 및 심도 설정을 구체적으로 명시해야 한다 [1, 7]. "50mm 렌즈"나 "85mm 렌즈", "얕은 피사계 심도(shallow depth of field)"와 같은 사진학 용어를 사용하면 인물의 형태를 부각하는 사실적인 초상화 느낌을 강하게 부여할 수 있다 [1-3, 8].
* **조명 연출:** 조명은 인물의 입체감과 분위기를 형성하는 핵심 요소다. 부드러운 자연광(soft natural light), 측면 조명(side light), 림 라이팅(rim light) 등을 지정하여 빛과 그림자를 제어해야 한다 [1, 9-11].
* **부정 프롬프트(Negative Prompts):** 사실적인 초상화를 얻기 위해서는 `cgi, render, cartoon, painting`과 같은 단어를 부정 프롬프트에 포함하여 비사실적이고 인위적인 스타일이 혼입되는 것을 막아야 한다 [12, 13]. 또한 `asymmetrical eyes, extra fingers` 등으로 해부학적 오류를 차단한다 [13].
## 매 핵심
* **애니메이션 및 만화 스타일 제어**
* **전용 모델 및 파라미터 활용:** 미드저니(Midjourney)를 사용할 경우, 일본 애니메이션 및 일러스트레이션 미학에 특화된 Niji 모델(`--niji 6`, `--niji 7` 파라미터)을 사용하면 훨씬 정교한 만화적 렌더링 결과물을 얻을 수 있다 [4, 14-16].
* **태그 및 장르 묘사:** Stable Diffusion 모델에서는 문장형 묘사보다는 `masterpiece, best quality, 1girl`과 같은 품질 및 피사체 수량 태그를 쉼표로 나열하는 방식이 효과적이다 [5, 17]. 또한 "shounen-action(소년 액션)", "slice-of-life(일상물)" 등 장르 특성을 명시하거나 "cel-shaded(셀 셰이딩)", "speed lines(속도선)" 같은 고유의 시각 효과를 덧붙여야 한다 [4, 6, 18].
* **스타일 보호를 위한 부정 프롬프트:** 애니메이션 스타일을 생성할 때 가장 주의할 점은 스타일의 훼손을 막는 것이다. 따라서 `photograph, realistic, 3d, render`와 같이 사실적인 이미지를 지칭하는 용어들을 부정 프롬프트로 강력하게 배제해야 한다 [19].
### 매 3축 분리
- **Identity axis**: 매 face embedding (ArcFace) 으로 lock — InstantID, PuLID
- **Style axis**: 매 reference image embedding 으로 modulate — IP-Adapter
- **Motion axis**: 매 pose / depth 로 frame structure — OpenPose / DWPose
## 🔗 지식 연결 (Graph)
- **Related Topics:** 조명 및 카메라 렌즈 설정, 미드저니 파라미터 및 모델, 프롬프트 가중치 및 부정 프롬프트
- **Projects/Contexts:** 미드저니 Niji 모델, Stable Diffusion 초상화 생성
- **Contradictions/Notes:** 초상화와 애니메이션 스타일 생성은 상반된 프롬프트 전략을 요구한다. 사실적인 초상화 생성 시에는 예술적·만화적 키워드를 부정 프롬프트로 배제하여 현실성을 보호해야 하며, 반대로 애니메이션 스타일 생성 시에는 사진이나 3D 렌더링 같은 사실적 키워드를 부정 프롬프트로 설정해야 의도한 화풍이 무너지는 것을 막을 수 있다 [13, 19].
### 매 animation consistency 기법
- **Reference frame**: 매 첫 frame 을 anchor 로 IP-Adapter 적용
- **Temporal LoRA**: 매 AnimateDiff motion module 로 inter-frame coherence
- **Latent warp**: 매 prev frame latent 을 optical flow 로 warp 후 noise add
- **Cross-frame attention**: 매 frame 의 attention key/value 를 공유
---
*Last updated: 2026-04-30*
### 매 응용
1. Avatar / VTuber pipeline — 매 same face × multi-emotion × multi-outfit.
2. Character sheet generation — 매 turnaround (front/side/back).
3. Short animation — 매 character 의 8-frame walk cycle.
## 🤖 LLM 활용 힌트 (How to Use This Knowledge)
## 💻 패턴
**언제 이 지식을 쓰는가:**
- *(TODO)*
### InstantID portrait generation
```python
from diffusers import StableDiffusionXLInstantIDPipeline
from insightface.app import FaceAnalysis
import cv2, numpy as np
**언제 쓰면 안 되는가:**
- *(TODO)*
face_app = FaceAnalysis(name="antelopev2", providers=["CUDAExecutionProvider"])
face_app.prepare(ctx_id=0, det_size=(640, 640))
## 🧪 검증 상태 (Validation)
face_img = cv2.imread("ref.jpg")
face_info = face_app.get(face_img)[0]
face_emb = face_info["embedding"]
- **정보 상태:** needs_review
- **출처 신뢰도:** A
- **검토 이유:** *(P-Reinforce Phase 1 자동 정규화. 본문 검증 필요.)*
pipe = StableDiffusionXLInstantIDPipeline.from_pretrained(
"stabilityai/stable-diffusion-xl-base-1.0",
controlnet=instantid_controlnet,
torch_dtype=torch.float16,
).to("cuda")
pipe.load_ip_adapter_instantid("instantid_ip-adapter.bin")
## 🧬 중복 검사 (Duplicate Check)
out = pipe(
prompt="anime portrait, school uniform",
image_embeds=face_emb,
image=face_kps, # face keypoints
ip_adapter_scale=0.8,
controlnet_conditioning_scale=0.8,
num_inference_steps=30,
).images[0]
```
- **기존 유사 문서:** *(TODO: 인덱서 클러스터 리포트 참조)*
- **처리 방식:** UPDATE (자동 정규화)
- **처리 이유:** Phase 1 정규화 — 옛 템플릿/누락 필드 보강.
### PuLID identity preservation
```python
from pulid.pipeline_v1_1 import PuLIDPipeline
## ⚠️ 모순 및 업데이트 (Contradictions & Updates)
pulid = PuLIDPipeline()
id_emb = pulid.get_id_embedding(["ref1.jpg", "ref2.jpg"])
- **과거 데이터와의 충돌:** 없음
- **정책 변화:** 없음
img = pulid.inference(
prompt="cyberpunk character, neon city",
id_embedding=id_emb,
id_scale=0.9,
cfg_scale=1.2,
steps=4, # SDXL Lightning
)[0]
```
## 🕓 변경 이력 (Changelog)
### IP-Adapter style + face combined
```python
pipe.load_ip_adapter(
"h94/IP-Adapter",
subfolder="sdxl_models",
weight_name=["ip-adapter-plus-face_sdxl_vit-h.safetensors",
"ip-adapter-plus_sdxl_vit-h.safetensors"],
)
pipe.set_ip_adapter_scale([0.7, 0.4]) # face stronger than style
| 날짜 | 변경 내용 | 처리 방식 | 신뢰도 |
|------|-----------|-----------|--------|
| 2026-05-08 | P-Reinforce Phase 1 정규화 (frontmatter + 헤더 표준화) | UPDATE | A |
img = pipe(
prompt="portrait, watercolor style",
ip_adapter_image=[face_ref, style_ref],
).images[0]
```
### AnimateDiff motion generation
```python
from diffusers import MotionAdapter, AnimateDiffPipeline, DDIMScheduler
adapter = MotionAdapter.from_pretrained("guoyww/animatediff-motion-adapter-v1-5-3")
pipe = AnimateDiffPipeline.from_pretrained(
"SG161222/Realistic_Vision_V5.1_noVAE",
motion_adapter=adapter,
torch_dtype=torch.float16,
).to("cuda")
frames = pipe(
prompt="character walking, side view",
num_frames=16,
num_inference_steps=25,
guidance_scale=7.5,
).frames[0]
```
### Cross-frame attention sharing
```python
def cross_frame_attention(self, x, prev_kv=None):
q = self.to_q(x)
k, v = self.to_k(x), self.to_v(x)
if prev_kv is not None:
# 매 prev frame 의 key/value 를 concat
k = torch.cat([prev_kv["k"], k], dim=1)
v = torch.cat([prev_kv["v"], v], dim=1)
out = scaled_dot_product_attention(q, k, v)
return self.to_out(out), {"k": k, "v": v}
```
### Turnaround sheet (multi-pose)
```python
poses = ["front view", "3/4 view", "side view", "back view"]
turnaround = []
for pose in poses:
img = pipe(
prompt=f"character portrait, {pose}, neutral expression",
image_embeds=face_emb,
image=pose_skeleton[pose],
controlnet_conditioning_scale=0.9,
generator=torch.Generator("cuda").manual_seed(42), # 매 fixed seed
).images[0]
turnaround.append(img)
```
### Emotion variation with locked identity
```python
emotions = ["smiling", "angry", "surprised", "sad", "neutral"]
for emo in emotions:
img = pipe(
prompt=f"portrait, {emo} expression",
image_embeds=face_emb,
ip_adapter_scale=0.85, # 매 identity strong
guidance_scale=4.5,
generator=torch.Generator("cuda").manual_seed(7),
).images[0]
img.save(f"emo_{emo}.png")
```
## 매 결정 기준
| 목표 | 조합 |
|---|---|
| Highest face fidelity | PuLID + InstantID + IP-Adapter Face |
| Style transfer with face | IP-Adapter Face (0.8) + IP-Adapter Style (0.4) |
| Animation, single character | AnimateDiff + reference attention + IP-Adapter |
| Game character sheet | InstantID + ControlNet pose × 4 with shared seed |
| Real-time avatar | SDXL Lightning / FLUX Schnell + cached identity emb |
**기본값**: InstantID + IP-Adapter (style 0.4, face 0.7) + 매 fixed seed for batch.
## 🔗 Graph
- 부모: [[이미지 생성 및 제어 파이프라인]] · [[AI 이미지 생성 (AI Image Generation)]]
- 변형: [[ComfyUI]] · [[InstantID]] · [[PuLID]]
- 응용: [[Avatar_Pipeline]] · [[AI 모델 사후 편집 도구 (Post-editing Tools)]]
- Adjacent: [[AnimateDiff]] · [[IP-Adapter]] · [[ControlNet]]
## 🤖 LLM 활용
**언제**: prompt 의 emotion / pose 변형 generation, character sheet plan 작성, style description 추출.
**언제 X**: face embedding 의 inner space — geometric, LLM 의 X.
## ❌ 안티패턴
- **No fixed seed in batch**: 매 turnaround 마다 face drift.
- **IP-Adapter scale > 1.0**: 매 prompt 무시, reference 의 over-copy.
- **Identity + Style conflict**: 매 같은 weight → identity blur.
- **Missing pose normalization**: pose skeleton 의 scale 이 prompt 와 불일치.
- **AnimateDiff w/o reference**: 매 frame consistency 없는 flicker.
## 🧪 검증 / 중복
- Verified (InstantX InstantID paper 2024, PuLID v1.1 release notes 2025, AnimateDiff v3).
- 신뢰도 A.
## 🕓 Changelog
| 날짜 | 변경 |
|---|---|
| 2026-05-08 | Phase 1 |
| 2026-05-10 | Manual cleanup — portrait/animation identity+style control |