docs(10_Wiki): 위키 전체 재구성 — Topic_* 폴더를 4개 카테고리로 통합 + 대규모 중복 제거
Topic_Agent/Topic_Blog/Topics/Topics_Biz/Topics_Meeting/Topics_Rag의 마크다운 지식 문서를 Topic_General/Topic_Programming/Topic_Graphic/Topic_Business 4개 카테고리로 재분류. - 중복 제거: frontmatter의 status:duplicate/merged + duplicate_of/redirect_to 필드로 자기 자신을 중복으로 선언한 리다이렉트 stub 1032개 제거, 완전 동일 내용 파일 472개 제거, 동일 파일명·다른 내용 충돌 시 더 큰(완전한) 버전만 유지(162개 제거) — 총 1639개 중복 제거. - 분류: 폴더 단위로 명확한 항목(AI_and_ML/Coding/Architecture 등 → Programming, Comfyui/Visual_Effects → Graphic, Topics_Biz/Topics_Meeting/사업 등 → Business, Poetic_Blog_Writing/창의성/Game_Design 등 → General)은 폴더 우선순위로, 나머지 혼재 폴더(Topic_Agent/Topic_Blog/Topics 루트/Thinking & Reasoning/Other/UI_UX_Assets)는 title/tags 키워드 스코어링으로 파일 단위 분류(불명확한 경우 General로 폴백). 원본 폴더명은 "From_*" 서브폴더로 보존해 추적 가능성 유지. - 최종 배치: Programming 2784 / General 1608 / Graphic 285 / Business 249 = 4926개 문서. - 에이전트 운영 상태(.astra/.agent/.obsidian/sessions/memory/_company/docs/lessons/_shared/src)는 지식 콘텐츠가 아니므로 재분류 대상에서 제외하고 원위치 유지. - Topics/Topic_email(상위 보호 폴더 Topic_email과 파일명 100% 중복) 삭제 — 보호 폴더 자체는 미변경. - 완전히 비게 된 Topic_Agent/Topic_Blog/Topics_Biz/Topics_Rag 폴더 제거.
This commit is contained in:
+324
@@ -0,0 +1,324 @@
|
||||
---
|
||||
id: wiki-2026-0508-ai-이미지-품질-최적화-및-디버깅-image-qualit
|
||||
title: AI Image Quality Optimization & Debugging
|
||||
category: 10_Wiki/Topics
|
||||
status: verified
|
||||
canonical_id: self
|
||||
aliases: [Image Quality Optimization, Debugging, defect fixing, negative prompt strategy]
|
||||
duplicate_of: none
|
||||
source_trust_level: B
|
||||
confidence_score: 0.85
|
||||
verification_status: conceptual
|
||||
tags: [image-generation, quality, debugging, negative-prompt, inpainting, upscale, defect-detection]
|
||||
raw_sources: []
|
||||
last_reinforced: 2026-05-09
|
||||
github_commit: pending
|
||||
inferred_by: Claude Opus 4.7 (manual cleanup 2026-05-09)
|
||||
---
|
||||
|
||||
# AI Image Quality Optimization & Debugging
|
||||
|
||||
## 📌 한 줄 통찰
|
||||
> **매 raw output 의 defect (extra finger, blur, watermark) → systematic fix**. **Detect → mask → inpaint → upscale**. 매 specific defect 의 specific negative prompt.
|
||||
|
||||
## 📖 핵심
|
||||
|
||||
### 매 common defect 의 catalog
|
||||
|
||||
#### Body / anatomy
|
||||
- Extra fingers / toes.
|
||||
- Wrong number of limbs.
|
||||
- Asymmetric eyes / face.
|
||||
- Twisted joints.
|
||||
- Missing teeth.
|
||||
|
||||
#### Quality
|
||||
- Blur / out of focus.
|
||||
- Low resolution.
|
||||
- Compression artifact.
|
||||
- Noise.
|
||||
|
||||
#### Composition
|
||||
- Subject 의 cropped.
|
||||
- Cluttered background.
|
||||
- Wrong aspect.
|
||||
|
||||
#### Style
|
||||
- Generic AI look (waxy skin).
|
||||
- Inconsistent lighting.
|
||||
- Wrong era / setting.
|
||||
|
||||
#### Text / artifact
|
||||
- Watermark.
|
||||
- Signature.
|
||||
- Garbled text.
|
||||
- Logo intrusion.
|
||||
|
||||
### 매 fix strategy
|
||||
|
||||
#### 1. Quality keyword (positive)
|
||||
- "8k, 4k, high resolution".
|
||||
- "ultra detailed, sharp focus".
|
||||
- "masterpiece, professional photography".
|
||||
|
||||
→ 매 model 의 quality bias.
|
||||
|
||||
#### 2. Negative prompt (Stable Diffusion)
|
||||
- Generic: "ugly, deformed, blurry, low quality".
|
||||
- **Specific** > generic. 매 observed defect 의 explicit:
|
||||
- "extra fingers, malformed hands".
|
||||
- "watermark, signature, text".
|
||||
- "asymmetric eyes, cross-eyed".
|
||||
- "compression artifact, jpeg artifact".
|
||||
|
||||
#### 3. Weighted negative
|
||||
```
|
||||
(extra fingers:1.5), (deformed hands:1.3), (blurry:1.2), watermark
|
||||
```
|
||||
|
||||
→ 매 defect 의 stronger suppression.
|
||||
|
||||
#### 4. Inpaint (region-specific)
|
||||
- 매 mask 의 defect.
|
||||
- 매 specific positive prompt.
|
||||
|
||||
#### 5. ControlNet (constraint)
|
||||
- OpenPose: pose 의 enforce.
|
||||
- Canny: edge.
|
||||
- Depth: 3D structure.
|
||||
|
||||
→ 매 anatomy fix 의 큰 도움.
|
||||
|
||||
#### 6. Face restoration
|
||||
- GFPGAN / CodeFormer.
|
||||
- 매 face-specific.
|
||||
|
||||
#### 7. Upscale + detail
|
||||
- Real-ESRGAN: 매 detail.
|
||||
- Tile-based: 큰 image.
|
||||
|
||||
### 매 platform 의 difference
|
||||
|
||||
| Defect | Stable Diffusion | Midjourney | DALL-E |
|
||||
|---|---|---|---|
|
||||
| Extra finger | Negative prompt + ControlNet | Vary Region | Manual edit |
|
||||
| Watermark | Negative prompt | --no | Inpaint |
|
||||
| Blur | Negative + steps↑ | --s ↑ | (limited) |
|
||||
| Bad face | GFPGAN + inpaint | Vary Region | Manual |
|
||||
|
||||
### 매 tuning parameter
|
||||
|
||||
#### Stable Diffusion
|
||||
- **Steps**: 20-50 (sweet 30).
|
||||
- **CFG (guidance)**: 7-12 (high = strict).
|
||||
- **Sampler**: DPM++ 2M Karras (default modern).
|
||||
- **Resolution**: SDXL = 1024x1024 native.
|
||||
|
||||
#### Midjourney
|
||||
- **--s** (stylize): 0-1000.
|
||||
- **--q** (quality): 0.25, 0.5, 1, 2.
|
||||
- **--c** (chaos): 0-100.
|
||||
- **--w** (weird): 0-3000.
|
||||
|
||||
### 매 photorealism
|
||||
|
||||
#### Lighting
|
||||
- "Golden hour, soft light".
|
||||
- "Volumetric lighting, rim light".
|
||||
- "Studio softbox, three-point lighting".
|
||||
|
||||
#### Camera
|
||||
- "85mm lens, shallow depth of field".
|
||||
- "f/1.4, bokeh".
|
||||
- "Wide angle 24mm" / "telephoto 200mm".
|
||||
|
||||
#### Realism keyword
|
||||
- "photorealistic, photo, raw" (SD).
|
||||
- (DALL-E 3 = "photo style, 85mm" — "photorealistic" 가 painting feel).
|
||||
|
||||
### 매 debugging workflow
|
||||
|
||||
#### Step 1: Generate base
|
||||
- 매 prompt 의 first try.
|
||||
|
||||
#### Step 2: Identify defect
|
||||
- 매 visual inspection.
|
||||
- 매 specific list.
|
||||
|
||||
#### Step 3: Iterate prompt
|
||||
- 매 negative prompt 추가.
|
||||
- 매 quality keyword 추가.
|
||||
|
||||
#### Step 4: Regenerate
|
||||
- 매 same seed (test).
|
||||
- 매 different seed (variety).
|
||||
|
||||
#### Step 5: Inpaint specific
|
||||
- 매 mask + targeted prompt.
|
||||
- 매 round 의 small fix.
|
||||
|
||||
#### Step 6: Upscale + face
|
||||
- 매 final detail.
|
||||
|
||||
→ 매 round 의 1-2 defect 의 fix. 매 다음 round.
|
||||
|
||||
## 💻 Code
|
||||
|
||||
### Negative prompt 의 weighted (SD)
|
||||
```python
|
||||
prompt = "portrait of a knight, fantasy, oil painting, masterpiece, 8k"
|
||||
negative = """
|
||||
(extra fingers:1.5), (malformed hands:1.4), (deformed:1.2),
|
||||
blurry, low quality, watermark, signature, text,
|
||||
(asymmetric eyes:1.3), bad anatomy, cropped
|
||||
"""
|
||||
|
||||
result = pipe(
|
||||
prompt=prompt,
|
||||
negative_prompt=negative,
|
||||
num_inference_steps=40,
|
||||
guidance_scale=8,
|
||||
).images[0]
|
||||
```
|
||||
|
||||
### Defect detection (manual / heuristic)
|
||||
```python
|
||||
import cv2
|
||||
import numpy as np
|
||||
|
||||
def detect_extra_finger(image):
|
||||
"""간단 heuristic: hand region 의 finger count."""
|
||||
# 매 OpenPose 의 hand keypoint detection.
|
||||
hand_kpts = openpose.detect_hand(image)
|
||||
if len(hand_kpts) > 5:
|
||||
return True
|
||||
return False
|
||||
|
||||
def detect_watermark(image):
|
||||
"""매 corner 의 unusual brightness pattern."""
|
||||
img = np.array(image)
|
||||
corners = [img[:50, :50], img[:50, -50:], img[-50:, :50], img[-50:, -50:]]
|
||||
return any(detect_text_in_region(c) for c in corners)
|
||||
```
|
||||
|
||||
### ControlNet OpenPose (anatomy fix)
|
||||
```python
|
||||
from diffusers import StableDiffusionControlNetPipeline, ControlNetModel
|
||||
from controlnet_aux import OpenposeDetector
|
||||
|
||||
openpose = OpenposeDetector.from_pretrained("lllyasviel/ControlNet")
|
||||
pose = openpose(reference_image)
|
||||
|
||||
controlnet = ControlNetModel.from_pretrained("lllyasviel/sd-controlnet-openpose")
|
||||
pipe = StableDiffusionControlNetPipeline.from_pretrained(
|
||||
"runwayml/stable-diffusion-v1-5",
|
||||
controlnet=controlnet,
|
||||
)
|
||||
|
||||
result = pipe(
|
||||
prompt="elegant pose, studio lighting",
|
||||
image=pose, # pose enforce
|
||||
num_inference_steps=30,
|
||||
).images[0]
|
||||
```
|
||||
|
||||
→ 매 anatomy correctness ↑.
|
||||
|
||||
### Face restoration (GFPGAN)
|
||||
```python
|
||||
from gfpgan import GFPGANer
|
||||
|
||||
restorer = GFPGANer(
|
||||
model_path='GFPGANv1.4.pth',
|
||||
upscale=2,
|
||||
arch='clean',
|
||||
)
|
||||
|
||||
cropped, restored, output = restorer.enhance(np.array(image))
|
||||
Image.fromarray(restored).save("face_fixed.png")
|
||||
```
|
||||
|
||||
### Iterative debug loop
|
||||
```python
|
||||
def debug_image(prompt, max_rounds=5):
|
||||
image = generate(prompt)
|
||||
|
||||
for round in range(max_rounds):
|
||||
defects = detect_defects(image)
|
||||
if not defects:
|
||||
return image
|
||||
|
||||
# Negative prompt 의 update
|
||||
negative = " ".join(f"({d}:1.3)" for d in defects)
|
||||
|
||||
# Inpaint specific region
|
||||
for d in defects:
|
||||
mask = create_mask_for_defect(image, d)
|
||||
image = inpaint(image, mask, prompt=f"perfect {d.target}", negative=negative)
|
||||
|
||||
return image
|
||||
```
|
||||
|
||||
### Quality scoring (CLIP)
|
||||
```python
|
||||
from transformers import CLIPProcessor, CLIPModel
|
||||
processor = CLIPProcessor.from_pretrained("openai/clip-vit-base-patch32")
|
||||
model = CLIPModel.from_pretrained("openai/clip-vit-base-patch32")
|
||||
|
||||
def quality_score(image, prompt):
|
||||
inputs = processor(text=[prompt], images=image, return_tensors="pt")
|
||||
outputs = model(**inputs)
|
||||
return outputs.logits_per_image.softmax(dim=1)[0][0].item()
|
||||
|
||||
# 매 candidate 의 score → best 선택
|
||||
```
|
||||
|
||||
### LLM-judge (for batch)
|
||||
```python
|
||||
def llm_judge(image_url, prompt):
|
||||
return llm.complete([
|
||||
{"type": "image", "image_url": image_url},
|
||||
{"type": "text", "text": f"Rate 1-10 how well this matches: '{prompt}'. List defects."}
|
||||
])
|
||||
```
|
||||
|
||||
## 🤔 결정 기준
|
||||
|
||||
| Defect | Tool |
|
||||
|---|---|
|
||||
| Extra finger | ControlNet OpenPose + inpaint |
|
||||
| Bad face | GFPGAN + inpaint |
|
||||
| Watermark | Negative prompt + inpaint |
|
||||
| Blur | Steps↑ + sampler change |
|
||||
| Bad anatomy | ControlNet + reference |
|
||||
| Style mismatch | LoRA / IP-Adapter |
|
||||
|
||||
**기본값**: Specific negative > generic. Inpaint > regenerate. ControlNet 의 anatomy. Detect → fix loop.
|
||||
|
||||
## 🔗 Graph
|
||||
- 부모: [[AI Image Generation]]
|
||||
- 변형: [[Negative Prompt]] · [[Inpainting]]
|
||||
- 응용: [[ControlNet]]
|
||||
- Adjacent: [[AI 모델 사후 편집 도구 (Post-editing Tools)|Post-editing-Tools]]
|
||||
|
||||
## 🤖 LLM 활용
|
||||
**언제**: 매 commercial output 의 quality 의 critical.
|
||||
**언제 X**: 매 throwaway / personal use.
|
||||
|
||||
## ❌ 안티패턴
|
||||
- **Generic negative ("ugly")**: 매 specific 의 더 강력.
|
||||
- **Single round**: 매 defect 의 multiple round 필요.
|
||||
- **Regenerate everything**: 매 seed / context 잃음. Inpaint local.
|
||||
- **No ControlNet**: 매 anatomy 의 random.
|
||||
- **Upscale 의 hallucination**: 매 detail invent.
|
||||
|
||||
## 🧪 검증 / 중복
|
||||
- Verified.
|
||||
- 신뢰도 B.
|
||||
- Overlap with [[AI 모델 사후 편집 도구 (Post-editing Tools)|Post-editing-Tools]] / [[AI Image Generation]].
|
||||
|
||||
## 🕓 Changelog
|
||||
| 날짜 | 변경 |
|
||||
|---|---|
|
||||
| 2026-05-08 | Phase 1 |
|
||||
| 2026-05-09 | Manual cleanup — defect catalog + negative strategy + ControlNet + code |
|
||||
Reference in New Issue
Block a user