Imported from macjoocan/game-dev-team_ver04 (
plugins/game-dev-team/skills/char-art-system/SKILL.md). Install upstream withnpx skills add macjoocan/game-dev-team_ver04 --skill char-art-system. Copyright stays with the author.
์บ๋ฆญํฐ๋ UI(ui-art-system)ยท์ดํํธ(fx-art-system)์ ๋ค๋ฅด๋ค. ์ ๋์ ๊ฒฐ๊ณผ๋ฌผ์ด ๊ท๊ฒฉ์ด๋ผ ์ฝ๋๋ก ๊ทธ๋ฆฌ๋ ๊ฒ ์ ํํ์ง๋ง, ์บ๋ฆญํฐ๋ ์ธ์์ด ๊ฒฐ๊ณผ๋ฌผ์ด๋ผ ์์ฑ ๋ชจ๋ธ์ด ํ์ํ๋ค.
์ ์ โ ๋ฐฑ์๋
๋ก์ปฌ ComfyUI ๊ฐ http://127.0.0.1:8188 ์ ๋ ์์ด์ผ ํ๋ค. ์ธํ
: references/comfyui-setup.md
(RTX 50 ์๋ฆฌ์ฆ๋ CUDA 12.8+ PyTorch ๊ฐ ์๋๋ฉด ์ปค๋ ์์ด ์ฃฝ๋๋ค โ ๊ฐ์ด๋์ ๊ฒฝ๊ณ ํญ๋ชฉ์ ๋จผ์ ๋ณธ๋ค.)
์ ๋ ์์ผ๋ฉด "์์ฑ ์คํจ"๊ฐ ์๋๋ผ ์ธก์ ๋ถ๊ฐ๋ก ๋ณด๊ณ ํ๋ค. ๋๋์๊ฐ ๊ณณ์ด ํ๋กฌํํธ๊ฐ ์๋๋ผ ํ๊ฒฝ์ด๋ค.
์ด ์ถ์ ๋ณธ์ง์ ์ ์ฒด์ฑ์ด๋ค
"์์ ์บ๋ฆญํฐ ํ ์ฅ"์ ์ฝ๋ค. ์ด๋ ค์ด ๊ฑด ๊ฐ์ ์บ๋ฆญํฐ๊ฐ ํฌ์ฆยท์ต๊ธยทํ์ ์ด ๋ฐ๋์ด๋ ๊ฐ์ ๋ณด์ด๋ ๊ฒ์ด๋ค. ๊ฐ๋ ์:
| ๋ฐฉ๋ฒ | ๊ฐ๋ | ์ธ์ |
|---|---|---|
| ์๋ ๊ณ ์ | ์ฝ | ๊ฐ์ ๊ตฌ๋ ๋ณ์ฃผ๋ง |
| IP-Adapter / reference-only | ์ค | ์์ ๋จ๊ณ, ์ธํ ์ฌ์ |
| ์บ๋ฆญํฐ LoRA ํ์ต (์์ 10~20์ฅ) | ๊ฐ | ์์ฐ ๋จ๊ณ. ์ฌ๊ธฐ๊น์ง ๊ฐ์ผ ์๋ํ๋ค โ ์๋ "์ ์ฒด์ฑ ๊ณ ์ " ์ |
์์ฑ ๊ฒฝ๋ก ๋ ๊ฐ์ง โ GPU๊ฐ ์์ด๋ ์์ํ ์ ์๋ค
| ๊ฒฝ๋ก | ์ ์ | ์ ์ฒด์ฑ ๊ณ ์ | ์ธ์ |
|---|---|---|---|
| ๋ก์ปฌ ComfyUI | GPU + ์ธํ 1~2์๊ฐ | LoRA ํ์ต๊น์ง ๊ฐ๋ค | ์์ฐ ๋จ๊ณ. ์ฅ๋น ๋น์ฉ 0, ์ฌ์ธ ๋ฐ์ถ ์์ |
Codex ๋ด์ฅ image_gen |
Codex ์ธ์ . GPUยทAPI ํค ๋ถํ์ | ํ๋กฌํํธยท๋ ํผ๋ฐ์ค๊น์ง | ์์ ๋จ๊ณ, GPU ์๋ ํ๊ฒฝ, ๋น ๋ฅธ ํ์ |
Codex ๊ฒฝ๋ก๊ฐ ์ค์ํ ์ด์ : ์ด ์คํฌ์ "์ํธ 3์ถ ์ค ์ ์ผํ๊ฒ ์ ์ฐจ์ ์์ฑ์ด ์ ๋๋ ์ถ"์ด๋ผ
๋ฐฑ์๋ ์ธํ
์ด ์ ํ๋๋ค. Codex์ ๋ด์ฅ image_gen์ ํฌ๋ช
๋ฐฐ๊ฒฝ์ ๋ค์ดํฐ๋ธ๋ก ์ง์ํ๊ณ
API ํค๊ฐ ํ์ ์์ด์, ๊ทธ ์ ํ ์กฐ๊ฑด ์์ด ์์์ ์์ํ ์ ์๋ค.
(์ค์ฌ์ฉ ํ์ธ: hex-danmaku ์ ํํํ ์บ์คํธ๊ฐ ์ด ๊ฒฝ๋ก ์ฐ์ถ๋ฌผ์ด๋ค โ 1254x1254 RGBA, ํฌ๋ช
54~60%.)
Codex ์ธ์
์์: $imagegen ์ผ๋ก ์์ ์์ฑ (ํฌ๋ช
๋ฐฐ๊ฒฝ ์์ฒญ)
โ ์์ฑ๋ฌผ์ด $CODEX_HOME/generated_images/ ์ ๋จ์ด์ง๋ค
โ **๋ฐ๋์ ํ๋ก์ ํธ ๊ฒฝ๋ก๋ก ์ฎ๊ธด๋ค** โ ๊ธฐ๋ณธ ๊ฒฝ๋ก์ ๋๋ฉด ๋ค๋ฅธ ์ธ์
์ด ๋ชป ์ฐพ๋๋ค
์๋ ๊ฒฐ์ ๋ก ์ ์ฒด์ธ์ ๋ ๊ฒฝ๋ก๊ฐ ๊ณต์ ํ๋ค:
cutout โ sprite-normalize โ rig-split/sheet-split โ atlas-pack โ style-score
Codex ์์ ๋ค์ ๋ ๊ฐ๋๊ฐ ์๋ค โ ์ํ๋ ๋ฐฐ์น๋ (์ค์ธก 2026-09-14)
๋ด์ฅ image_gen (Codex ์ธ์
/MCP) |
CLI ๋ํผ (codex-imagegen) |
|
|---|---|---|
| ํฌ๋ช ๋ฐฐ๊ฒฝ | ๋๋ค (์ค์ธก ํฌ๋ช 55%) | ๊ฑฐ๋ถํ๋ค |
| ์คํฌ๋ฆฝํธยท๋ฐฐ์น | ์ ๋๋ค (๋ํ๋ก ์์ผ์ผ ํ๋ค) | ๋๋ค (--n, JSONL batch) |
| ์ฅ๋น ์๊ฐ | ์ฝ 50์ด | ์ฝ 30์ด |
| ์ธ์ฆ | ChatGPT ๊ตฌ๋ | ChatGPT ๊ตฌ๋
(๊ฐ์ auth.json ์ฌ์ฌ์ฉ) |
CLI ๋ --background transparent ๋ฅผ ์ฃผ๋ฉด ์ด๋ ๊ฒ ๊ฑฐ์ ํ๋ค:
Transparent background is not supported for this model. (๊ธฐ๋ณธ ๋ชจ๋ธ gpt-5.6-sol)
๊ทธ๋๋ CLI ๊ฐ ์ธ๋ชจ์์ง ์๋ค. ํฐ ๋ฐฐ๊ฒฝ์ผ๋ก ๋ฝ๊ณ cutout ์ผ๋ก ์๋ฅด๋ฉด ๋๋ค โ
์ค์ธก์์ ์ ๋ฆฌ๋ณ ํ์ด๋ผ์ดํธยทํฐ ๋ฐ์ฌ๊ฐ ๊ทธ๋๋ก ์ด์๋จ์๋ค(์ ๊ฑฐ 64.8% ยท ๊ตฌ๋ฉ 0).
์ ์ญ ์ํค๋ฅผ ์ฐ๋ฉด ๊ทธ๊ฒ ๋ซ๋ฆฐ๋ค. cutout ์ ํ
๋๋ฆฌ์์๋ง ๋ฒ์ ธ ๋ค์ด๊ฐ๋ฏ๋ก ์์ ํ๋ค.
๊ณ ๋ฅด๋ ๊ธฐ์ค:
- ํ๋ ์ฅ, ์ํ๊ฐ ๋ฐ๋ก ํ์ โ ๋ด์ฅ
image_gen - ์ฌ๋ฌ ์ฅ์ ๊ฐ์ ์กฐ๊ฑด์ผ๋ก โ CLI ๋ํผ +
cutout. ํ๋กฌํํธ๋ฅผ JSONL ๋ก ์ ์ด ํ ๋ฒ์ ๋๋ฆฐ๋ค
์ฃผ์:
-
๊ณต์
scripts/image_gen.py(Codex ์คํฌ์ CLI fallback)๋OPENAI_API_KEY๊ฐ ํ์ํ๋ค. ๊ตฌ๋ ๋ง ์์ผ๋ฉด ๋ชป ์ด๋ค โ ์๋ํํฐ ๋ํผ๊ฐ ์กด์ฌํ๋ ์ด์ ๊ฐ ๊ทธ๊ฒ์ด๋ค -
๊ตฌ๋ ํ ๋น๋์ ์ด๋ค(5์๊ฐ ๋กค๋ง + ์ฃผ๊ฐ ์ํ). ๋ฐฐ์น ์ ์ ๊ท๋ชจ๋ฅผ ์ ํ๋ค
-
CLI ๋
--dry-run์ผ๋ก ์์ฒญ JSON ์ ๋จผ์ ๋ณผ ์ ์๋ค. ๋ฐฐ์น๋ฅผ ์ง๊ธฐ ์ ์ ํ ๋ฒ ์ฐ์ด๋ณธ๋ค -
๋ฐฐ๊ฒฝ์ ํฐ์์ผ๋ก ๋ฝ๋๋ค. ํ๋กฌํํธ ์๋ค์
plain white background, isolated on white, product photo style cutout์ ๋๊ณ , ๋ค๊ฑฐํฐ๋ธ์gradient background, vignette, colored background, scenery, floor, ground๋ฅผ ๋ฃ๋๋ค. ๊ทธ ๋คcutout(๊ธฐ๋ณธ ๋ชจ์๋ฆฌ ๊ฒ์ถ, tol 26)์ผ๋ก ์๋ฅธ๋ค. ํฐ ์ท์ ํ ๋๋ฆฌ flood fill ์ด๋ผ ์ ๋จนํ๋ค. -
๋ง์ ํ ํฌ๋ก๋งํค(
--chroma "#FF00FF")๋ฅผ SD ํ๋กฌํํธ๋ก ์ํค์ง ๋ง๋ผ โ ์ค์ธก์์ ๋ ๋ฒ ์คํจํ๋ค(2026-09-08, hex-danmaku): โ ๋ฐฐ๊ฒฝ ์ง์๋ฅผ ํ๋กฌํํธ ๋์ ๋๋ฉด 24/24 ์ฅ์ด ๋ฌด์ํ๊ณ ์ ๊ทธ๋ผ๋์ธํธ ๋ฐฐ๊ฒฝ์ด ๋์จ๋ค. โก ๋งจ ์์ผ๋ก ์ฌ๋ ค ๋ฐ๋ณตํ๋ฉด ๋ฐฐ๊ฒฝ์ ๋์ค๋๋ฐ ํผ์ฌ์ฒด๊น์ง ๊ทธ ์์ผ๋ก ๋ฌผ๋ ๋ค โ ์ฒญ๋ก ๋๋๊ณค์ด ๋ถํ์ด ๋๋ค. ํ์ฐ ๋ชจ๋ธ์์ ์ ๋จ์ด๋ ํ๋ฉด ์ ์ฒด์ ๊ฑธ๋ฆฌ๋ฏ๋ก ํฌ๋ก๋งํค์ ์ ์ (๋ฐฐ๊ฒฝ์ โ ํผ์ฌ์ฒด์)๊ฐ ๊นจ์ง๋ค.--chroma๋ ๋ฐฐ๊ฒฝ์ ํ์ฒ๋ฆฌ๋ก ๊น๊ฑฐ๋ 3D ๋ ๋์ฒ๋ผ ์ง์ ์ง์ ํ ๋๋ง ์ด๋ค. ๊ทธ๋๋--feather 8(์ค์ธก: ๊ธฐ๋ณธ 1.5์์ ๊ฒฝ๊ณ ๋ฒ์ง 112px, 8์์ 16px). -
์ ์ง ๊ทธ๋ฆผ์ยท์๊ด์ด ๊ตฌ์์ ธ ์์ผ๋ฉด ์ ๊ธฐ๋ฐ ์ปท์์์ผ๋ก๋ ๋ชป ์ง์ด๋ค โ
rembg(์๋ฏธ ๋ถํ )๋ฅผ ์ด๋ค. ์ค์ธก(2026-09-08, hex-danmaku): ํ๋กฌํํธ๋ก ๊ทธ๋ฆผ์๋ฅผ ๋นผ๋ ค๊ณ ๋ค๊ฑฐํฐ๋ธ ๊ฐํยท"๊ณต์ค์ ๋ฌ"ยทproduct photo๋ฌธ๊ตฌ ์ ๊ฑฐยท 2D ์คํ๋ผ์ดํธยทํํํ ์กฐ๋ช ๊น์ง ๋ค์ฏ ๊ฐ์ง๋ฅผ ์๋ํ๋๋ฐ ์ ๋ถ ๊ทธ๋ฆผ์๊ฐ ๋์๋ค(๊ฐ์ ์๋ ๋์กฐ ์คํ). "๊ณต์ค์ ๋ฌ" ํ๋กฌํํธ๋ ๊ทธ๋ฆผ์ ๋์ ๋ฐ์นจ๋๋ฅผ ๋ง๋ค์๋ค(6์ฅ ์ค 5์ฅ).cutout --deshadow๋ก ์ ๋ฐ์ ์ง์์ง์ง๋ง ์งํ ์ ์ง ํ์์ ํ์ฉ์น๋ฅผ ์ฌ๋ ค๋ ๋ค๋ฆฌ๊ฐ ๋จผ์ ์ฌ๋ผ์ง๋ค.pip install rembg # onnxruntime ํ์. u2net 176MB ๋ฅผ ์ฒ์ ํ ๋ฒ ๋ฐ๋๋ค python -c "from rembg import remove,new_session; from PIL import Image; im=remove(Image.open('in.png').convert('RGBA'),session=new_session('u2net')); im.crop(im.getbbox()).save('out.png')"์ฅ๋น 0.5์ด(CPU)์ ๊ทธ๋ฆผ์ยท์๊ด์ด ์์ ํ ์ฌ๋ผ์ง๋ค. ์์ด ์๋๋ผ ํผ์ฌ์ฒด๋ฅผ ์๋ฏธ๋ก ๋ถํ ํ๊ธฐ ๋๋ฌธ์ด๋ค. ์ ๊ธฐ๋ฐ
cutout์ ๋ฐฐ๊ฒฝ์ ํต์ ํ ์ ์์ ๋(ํฌ๋ก๋งํคยท๋จ์ ๋ ๋) ์ฌ์ ํ ๋ ์ ํํ๋ค โ ๋์ ์ํฉ์ ๋ฐ๋ผ ์ด๋ค. -
๊ทธ๋ผ๋์ธํธ ๋ฐฐ๊ฒฝ์
--tol๋ก ์ด๊ธฐ๋ ค ํ์ง ๋ง๋ผ. tol ์ 60ยท90 ์ผ๋ก ์ฌ๋ฆฌ๋ฉด ์ ๊ฑฐ์จ์ 9399% ๋ก ์ค๋ฅด์ง๋ง ํผ์ฌ์ฒด๊ฐ ํต์งธ๋ก ๋ฐํฌ๋ช ํด์ง๋ค(์ค์ธก: ๋ถํฌ๋ช 4864% โ 0.1~3.3%).cutout์ด ์ด์ ์ด๊ฑธ ๋ฏธ๋ฌ(exit 1) ๋ก ๋๋๋ค. -
์ ์ฒด์ฑ ๊ณ ์ ์ด ํ์ํด์ง๋ฉด ๋ก์ปฌ ๊ฒฝ๋ก๋ก ์ฎ๊ธด๋ค. LoRA ํ์ต์ CUDA ์ ์ ๋ค โ Codex ๊ฒฝ๋ก๋ก๋ ์บ๋ฆญํฐ 1์ข ์ ์๋ฐฑ ์ฅ ์์ฐํ ๋์ ์ ์ฒด์ฑ ๋๋ฆฌํํธ๋ฅผ ๋ชป ์ก๋๋ค.
-
๋ ๊ฒฝ๋ก ์ค ๋ฌด์์ผ๋ก ๋ฝ์๋์ง manifest ์ ๊ธฐ๋กํ๋ค(์ถ์ฒยท๋ผ์ด์ ์ค ์นธ). ๋์ค์ ์ฌํยท๊ต์ฒด ๊ทผ๊ฑฐ๋ค.
์ ํ ์ฌ๋ก: ์ด "์์ฑ์ ๋ชจ๋ธ์ด, ์ ๋ฆฌ๋ ๊ฒฐ์ ๋ก ์ ์คํฌ๋ฆฝํธ๊ฐ" ๊ตฌ์กฐ๋ ์ฐ๋ฆฌ๋ง์ ๊ฒ์ด ์๋๋ค.
agent-sprite-forge๋ ๋ ๋ฆฝ์ ์ผ๋ก ๊ฐ์ ๊ฒฐ๋ก ์ ๋๋ฌํ๋ค โ "์คํฌ๋ฆฝํธ๋ ์ฐฝ์ ๋๋๊ฐ ์๋๋ค. ์์ด์ ํธ๊ฐ ๋น์ฃผ์ผยทํ์ดํ๋ผ์ธ ๊ฒฐ์ ์ ํ๊ณ , ๋๊ตฌ๋ ๋ฐ๋ณต ๊ฐ๋ฅํ ํฝ์ ยท์ต์คํฌํธ ์์ ๋ง ํ๋ค." ๋ง์ ํ ํฌ๋ก๋งํค๋ ๊ฑฐ๊ธฐ์ ๋๋ฆฌ ์ฐ์ด๋ ์๋ฒ์ด๋ค.
์คํ (๋ก์ปฌ ComfyUI ๋ฐฑ์๋๊ฐ ๋ ์์ ๋)
node <ํ๋ฌ๊ทธ์ธ>/skills/char-art-system/scripts/comfy-run.mjs \
<ํ๋ฌ๊ทธ์ธ>/skills/char-art-system/references/workflows/sdxl-character.api.json \
--out art/char --batch 8 --seed 1000 \
--set 6.text="<ํ๋กฌํํธ>"
--batch N์ผ๋ก ์์์ ํ ๋ฒ์ N์ฅ. ์๋๋ ์๋์ผ๋ก ๊ธฐ๋ก๋๋ค(run-log.json)--set <๋ ธ๋id>.<์ ๋ ฅ>=<๊ฐ>์ผ๋ก ํ๋กฌํํธยทํด์๋ยท์คํ ์ ๋ฐ๊นฅ์์ ๋ฐ๊พผ๋ค. ์ํฌํ๋ก ํ์ผ์ ์ ๊ฑด๋๋ฆฐ๋ค- ์๋ฒ๊ฐ ์์ผ๋ฉด ์คํฌ๋ฆฝํธ๊ฐ
์ธก์ ๋ถ๊ฐ๋ก ๋๋๋ค โ ์คํจ๋ก ์ฒ๋ฆฌํ์ง ์๋๋ค - ๋ฐฐ์น๊ฐ ๋๋๋ฉด ๋ชจ๋ธ์ ์๋์ผ๋ก ๋ด๋ฆฐ๋ค. SDXL ํ๋๊ฐ ์ปค๋ฐ 10GB ๋ฅผ ์ก๋๋ค(์ค์ธก 14.6GB โ 4.4GB).
์ฐ์์ผ๋ก ๋๋ฆด ๋๋ง
--keep-loaded๋ฅผ ์ค๋ค โ ๊ทธ ๊ฒฝ์ฐ ๋ค์ ๋ฐฐ์น๊ฐ ๋ชจ๋ธ ์ฌ๋ก๋ฉ 90์ด๋ฅผ ์๋๋ค. - ์์ ์ด ๋ค ๋๋ฌ์ผ๋ฉด ์๋ฒ๋ ๋ด๋ฆฐ๋ค. ๋ชจ๋ธ์ ๋์คํฌ์ ๋จ์ผ๋ฏ๋ก ์ฌ๋ค์ด๋ก๋๋ ์๋ค.
์ํฌํ๋ก๋ references/workflows/ ์ API Format ์ผ๋ก ๋๋ค. ์นUI ์์ ์๋ก ๋ง๋ค์์ผ๋ฉด
"Save (API Format)" ์ผ๋ก ์ ์ฅํด์ผ ํ๋ค(์ผ๋ฐ Save ๋ /prompt ๊ฐ 400 ์ผ๋ก ๊ฑฐ๋ถ).
์ผ๊ตด์ด ๊นจ์ง ๋ โ ์์๋๋ก ๋ณธ๋ค
์ค์ธก(2026-08-21, SDXL Base ยท RTX 5060)์์ ์ป์ ์์๋ค. ์์์๋ถํฐ ํ๋ค.
| ์์ | ์กฐ์น | ๋น์ฉ | ์ค์ธก ํจ๊ณผ |
|---|---|---|---|
| 1 | ๊ตฌ๋ ๊ณ ์ โ ์ธ๋ก ํ๋ ์(832ร1216) + "ํ ๋ช ์ ํฌ๊ฒ" ํ๋กฌํํธ | 0์ | ํต๊ณผ์จ 1/6 โ 5/6 |
| 2 | hires 2ํจ์ค โ ์ ์ฌ 1.5๋ฐฐ ํ๋ ํ denoise 0.4 ์ฌ์์ฑ | 0์, ์๊ฐ 2๋ฐฐ | ์ผ๊ตด ๋ํ ์ผ ํฅ์ |
| 3 | ํนํ ์ฒดํฌํฌ์ธํธ | 6.6GB | ์๋ ์ฃผ์ ์ฐธ๊ณ |
1๋ฒ์ด ์๋์ ์ด๋ค. ์ผ๊ตด์ด ๊นจ์ง๋ ์ฃผ๋ ์ด์ ๋ ๋ชจ๋ธ์ด ๋๋น ์๊ฐ ์๋๋ผ ์บ๋ฆญํฐ๊ฐ ์๊ฒ ๊ทธ๋ ค์ ธ์๋ค.
1024 ์ ์ฌ๊ฐ์ 9๋ง๋ฆฌ๊ฐ ๊ฒฉ์๋ก ๋ค์ด๊ฐ๋ฉด ์ผ๊ตด์ ์ธ ํฝ์
์ด 20~30px ๋ฟ์ด๋ผ ๋์ ๊ทธ๋ฆด ์๊ฐ ์๋ค.
์ฆ ๋ค์ค ํผ์ฌ์ฒด ๋ฌธ์ ์ ์ผ๊ตด ๊นจ์ง์ ๊ฐ์ ๋ฌธ์ ์ด๊ณ , ๊ตฌ๋๋ฅผ ๊ณ ์น๋ฉด ๋ ๋ค ๋ซ๋๋ค.
sprite ๋ผ๋ ๋จ์ด ์์ฒด๊ฐ ์คํ๋ผ์ดํธ ์ํธ๋ฅผ ๋ถ๋ฅด๋ฏ๋ก full body portrait of one character, large in frame ์ชฝ์ผ๋ก ์ด๋ค.
์ฃผ์ โ ์ฒดํฌํฌ์ธํธ๋ฅผ ๋ฐ๊พธ๋ฉด ํ๋กฌํํธ๋ ๋ฐ๊ฟ์ผ ํ๋ค
Animagine XL 4.0 ์ ๊ฐ์ ํ๋กฌํํธ๋ก ๋ฃ์๋๋ ์บ๋ฆญํฐ๊ฐ ์๋๋ผ ์ถ์ ๋ฌด๋ฌ๊ฐ ๋์๋ค. ํ์ธํ ๊ฒ:
- ํ์ผ ์ ์(6.9GB ยท ํ ์ 2,514 ยท SDXL ๊ตฌ์กฐ) โ ์์ ์๋
- v-prediction ๊ฐ์ค๋ ํ๋ฆผ(๊ฐ์ ํ๋๋ ํ์ ๋จ์์ผ๋ก ๋ ๋๋น ์ง)
- ๋จ์ ์ ๋ ฅ ์์ธ: ํ๊ทธ ํ์ต ๋ชจ๋ธ์ ์์ฐ์ด ํ๋กฌํํธ๋ฅผ ๋ฃ์ ๊ฒ.
flat cel shadingยทclean readable silhouette๊ฐ์ ๋ฌธ๊ตฌ๋ฅผ ๋ฏธ๋๋ฉ ๋ฒกํฐ ์คํ์ผ ์ง์๋ก ํด์ํ ๊ฒ์ผ๋ก ๋ณด์ธ๋ค
๊ตํ: ์ฒดํฌํฌ์ธํธ๋ ํ๋กฌํํธ ๋ฌธ๋ฒ๊ณผ ํ ์ธํธ๋ค. ํ๊ทธ ๊ธฐ๋ฐ ๋ชจ๋ธ(Danbooru ๊ณ์ด)๋ก ๋ฐ๊พธ๋ ค๋ฉด
ํ๋กฌํํธ๋ ํ๊ทธ์(1girl, chibi, full body, simple background)์ผ๋ก ๋ค์ ์จ์ผ ํ๊ณ , ๊ทธ๊ฑด
๋ณ๋ ํ๋ ์์
์ด๋ค. ๋ชจ๋ธ๋ง ๊ฐ์๋ผ์ฐ๋ฉด ๊ฒฐ๊ณผ๊ฐ ๋ฌด๋์ง๋ค.
์ํฌํ๋ก JSON ์ฃผ์
API Format JSON ์ ์ฃผ์ ํค๋ฅผ ๋ฃ์ง ๋ง๋ผ. _comment ๋ฅผ ๋ฃ์๋๋ ComfyUI ๊ฐ ๋
ธ๋๋ก ํด์ํด
/prompt ๊ฐ 500 ์ ๋๋ค. ์ค๋ช
์ ์์ .notes.md ๋ก ๋๋ค.
์คํ๋ผ์ดํธ ํ์ดํ๋ผ์ธ โ ์์ฑ๋ถํฐ ์ํ๋ผ์ค๊น์ง
์ ๋ถ ์ปค์คํ ๋ ธ๋ ์์ด, ์์กด์ฑ 0์ผ๋ก ๋๋ค. ์์๋๋ก ์ด์ผ๋ฉด ์ ๋ํฐ์ ๋ฃ์ ๊ท๊ฒฉ ์์ ์ด ๋์จ๋ค.
# 1) ์ํธ ์์ฑ โ ์ฌ๋ฌ ํฌ์ฆ๋ฅผ ํ ์ฅ์ (์๋ "์ ์ํธ์ธ๊ฐ" ์ฐธ๊ณ )
node comfy-run.mjs <์ํฌํ๋ก>.api.json --style <profile.json> --out out --batch 2
# 2) ์
๋ถ๋ฆฌ + ์ํ
node sheet-split.mjs out/<์ํธ>.png --out cells --min 0.012
# 3) ๊ท๊ฒฉ ํต์ผ โ ์บ๋ฒ์คยทํฌ๊ธฐยท๋ฐ๋ฐ๋ฅ ์ ๋ ฌ
node sprite-normalize.mjs cells --out norm --canvas 512x768 --fit 0.86 --anchor bottom
# 4) ์ํ๋ผ์ค
node atlas-pack.mjs norm --out atlas.png --trim --pad 2 --pot
๋ฑ์ฅ ์บ๋ฆญํฐ๋ผ๋ฉด 2๋ฒ ๋์ cutout.mjs ๋ก ๋ฐฐ๊ฒฝ๋ง ์ง์ฐ๋ฉด ๋๋ค. ๋ฆฌ๊น
์ฉ์ผ๋ก ๋ถ์๋ฅผ ๋๋๋ ค๋ฉด
rig-split.mjs, ControlNet ์ฉ ํฌ์ฆ ์ค์ผ๋ ํค์ด ํ์ํ๋ฉด pose-skeleton.mjs.
์ "ํ ์ฅ์ ์ฌ๋ฌ ํฌ์ฆ"์ธ๊ฐ โ ์ ์ฒด์ฑ ๋๋ฌธ์ด๋ค
ํ ์ฅ ์์์๋ ์บ๋ฆญํฐ๊ฐ ์ ์ง๋๋ค. ๊ฐ์ ๋๋ ธ์ด์ง ๊ณผ์ ์ด๋ผ ๋ชจ๋ธ์ด ์ค์ค๋ก ์ผ๊ด์ฑ์ ์ก๋๋ค. ๋ณ๋๋ก 4๋ฒ ์์ฑํ๋ฉด ํ๋ ๋ชจ์์ด ๋ฐ๋๊ณ ์๋ ํ ๋ผ๊ท๊ฐ ์๊ธด๋ค(์ค์ธก). LoRA ์์ด ์ ์ฒด์ฑ ๋ฌธ์ ๋ฅผ ์๋น ๋ถ๋ถ ์ฐํํ๋ ๋ฐฉ๋ฒ์ด๋ผ, ์ง๊ธ ๊ตฌ์ฑ์์ ๊ฐ์ฅ ์ค์ฉ์ ์ธ ๊ฒฝ๋ก๋ค.
์ฃผ์:
- ์ ์ฌ๊ฐ ์บ๋ฒ์ค(1216ยฒ ๋ฑ)๋ฅผ ์จ๋ผ. ๊ฐ๋ก๋ก ๊ธด ์บ๋ฒ์ค๋ฅผ ์ฃผ๋ฉด 12~16๊ฐ ์ด์ํ ์ ์ด ๋์ ๋ชป ์ด๋ค
- ์
์๋ฅผ ์ง์ ํด๋ ์ ์งํจ๋ค. 2x2 ๋ฅผ ์์ฒญํด๋ 7๊ฐ๊ฐ ๋์จ๋ค. ๊ทธ๋์
sheet-split์ ๊ฒฉ์ ์ขํ๋ฅผ ๊ฐ์ ํ์ง ์๊ณ ์ฐ๊ฒฐ ์ฑ๋ถ์ผ๋ก ์ฐพ๋๋ค - ํฌ์ฆ๋ ์ง์ ํ ์ ์๋ค. ๋ชจ๋ธ์ด ๊ณ ๋ฅธ๋ค. ๊ฑท๊ธฐ 8ํ๋ ์ ๊ฐ์ ํน์ ์ํ์ค๋ ์ด ๋ฐฉ๋ฒ์ผ๋ก ์ ๋๋ค
๊ฐ ๋จ๊ณ์์ ์ค์ ๋ก ๋ฐ์ ํจ์
| ๋จ๊ณ | ํจ์ |
|---|---|
| ๋ฐฐ๊ฒฝ ์ ๊ฑฐ | "ํฐ์์ ์ง์๋ผ"๋ก ํ๋ฉด ์บ๋ฆญํฐ์ ํฐ ์ท์ด ๋ซ๋ฆฐ๋ค. ํ ๋๋ฆฌ์์ ๋ฒ์ ธ ๋ค์ด๊ฐ๋ flood fill ์ ์ด๋ค |
| ๋ฐฐ๊ฒฝ ์ ๊ฑฐ | ์ ์ง ๊ทธ๋ฆผ์๋ ๋ฐฐ๊ฒฝ๋ ์ ๊ฒฝ๋ ์๋๋ค. ๋จ์ผ ์๊ณ๊ฐ์ผ๋ก ์ง์ฐ๋ ค ํ๋ฉด ์บ๋ฆญํฐ๊ฐ ๋ซ๋ฆฐ๋ค โ 2๋จ ์๊ณ๊ฐ(tol/soft)์ผ๋ก ๋ฐํฌ๋ช ์ฒ๋ฆฌ |
| ๊ท๊ฒฉ ํต์ผ | ์ต๊ทผ์ ์ถ์๋ ์ ์ ๋๋๋ค. ๋ฉด์ ํ๊ท ์ผ๋ก ๋ฆฌ์ํ |
| ๊ท๊ฒฉ ํต์ผ | ๋ฐ์ ์ปท์ด ์์ด๋ฉด ์๋ชป ํ๋๋๋ค โ ๋์ด ๋น์จ๋ก ์ด์์น ๊ฒฝ๊ณ |
| ์ํ๋ผ์ค | trim ์์ด ๋ด์ผ๋ฉด ๊ท๊ฒฉ ํต์ผ๋ก ์๊ธด ๋น ๊ณต๊ฐ์ด ์ํ๋ผ์ค๋ฅผ ์ ๋ฐ ๋๊ฒ ๋จน๋๋ค |
| ์ํ๋ผ์ค | JSON ์ ์ข์๋จ ์์ , ์ ๋ํฐ Sprite Editor ๋ ์ขํ๋จ์ด๋ค. ์ ๋ค์ง์ผ๋ฉด ์คํ๋ผ์ดํธ๊ฐ ์ด๊ธ๋ ์๋ฆฐ๋ค |
ํ๋ ์ ์ ๋๋ฉ์ด์ โ ์์ ๋ชจ๋ธ(WAN 2.2 5B)์ด ๋ต์ด๋ค (์ค์ธก 2026-09-08)
ํ์ฐ ์ด๋ฏธ์ง ๋ชจ๋ธ๋ก ํ๋ ์์ ๋ฐ๋ก ๋ฝ์ผ๋ฉด ํ๋ ์๋ง๋ค ์บ๋ฆญํฐ๊ฐ ๋ฌ๋ผ์ง๋ค. ์์ ๋ชจ๋ธ์ ์๊ฐ์ถ์ ๊ฐ์ด ๋ณด๋ฏ๋ก
๊ทธ ๋ฌธ์ ๊ฐ ๊ตฌ์กฐ์ ์ผ๋ก ์๋ค. references/workflows/wan22-5b-sprite-motion.api.json ยท ์ธํ
์ ๊ทธ ์ .notes.md.
8GB ์์ ๋๋ค โ ๋ชจ๋ธ 17GB, VRAM 7.6GB, ์์คํ
RAM 27GB, 33ํ๋ ์์ ์ฝ 25๋ถ. ์ปค์คํ
๋
ธ๋ ๋ถํ์
(ComfyUI 0.33+ ๊ฐ Wan22ImageToVideoLatent ๋ด์ฅ). 5B ๋ฅผ ์จ๋ผ โ 14B ๋ 24GB ๊ฐ ํ์ํ๋ค.
ํต์ฌ์ ModelSamplingSD3.shift โ ์์ง์๊ณผ ์ ์ฒด์ฑ์ ๋ง๋ฐ๊พธ๋ ์์ก์ด๋ค.
| ๋์ | shift | ๋ฌด๊ฒ์ค์ฌ ์ด๋ | ์ ์ฒด์ฑ ๋๋ฆฌํํธ | ํ์ |
|---|---|---|---|---|
| ๊ฑท๊ธฐ | 8.0(๊ธฐ๋ณธ) | 7.8px | 0.09 | ์์ง์ ๋ถ์กฑ โ ํธํก ์์ค |
| ๊ฑท๊ธฐ | 3.0 | 21.0px | 0.15 | ์ฑํ. sprite-qa ๊ธฐ์ค(0.18) ํต๊ณผ |
| ๊ณต๊ฒฉ | 3.0 | 77.8px | 0.30 | 2๋ฒ ํ๋ ์๋ถํฐ ๋ถ๊ดด |
| ๊ณต๊ฒฉ | 5.0 | 56.6px | 0.34 | 3๋ฒ๋ถํฐ ๋ถ๊ดด |
| ๊ณต๊ฒฉ | 6.5 | 55.0px | 0.34 | 3๋ฒ๋ถํฐ ๋ถ๊ดด |
์์ ๋์(๊ฑท๊ธฐยท๋๊ธฐยทํ๋ค๋ฆผ)์ ๋๊ณ , ํฐ ๋์(๊ณต๊ฒฉยท์ ํ)์ shift ๋ฅผ ์ด๋ป๊ฒ ์ค๋ ์ ๋๋ค. ๊ณต๊ฒฉ์ shift ๋ฅผ ์ฌ๋ ค๋ ๋๋ฆฌํํธ๊ฐ ์ ์ค์๋ค โ ์์ก์ด์ ํ๊ณ ๋ฐ์ด๋ค. ํฐ ๋์์ ํคํ๋ ์์ ๋ฐ๋ก ์์ฑํด (LoRA + ControlNet) ์๊ฑฐ๋ ์ฝ๋ ํธ๋์คํผ์ผ๋ก ์ค๋ค.
ํ๋กฌํํธ์์ ์ ์ผ ์ค์ํ ๊ฑด ๋ฐฐ๊ฒฝ์ด ์๋๋ผ ์นด๋ฉ๋ผ๋ค. ์์ ๋ชจ๋ธ์ ๊ธฐ๋ณธ์ ์ผ๋ก ์นด๋ฉ๋ผ๋ฅผ ์์ง์ธ๋ค.
in place, camera locked, no zoom, no pan ์ ๊ธ์ ์, camera motion, zoom, pan, static, frozen ์ ๋ถ์ ์ ๋ฃ๋๋ค.
in place ๋ฅผ ๋นผ๋ฉด ์บ๋ฆญํฐ๊ฐ ํ๋ฉด ๋ฐ์ผ๋ก ๊ฑธ์ด ๋๊ฐ๋ค. ์ค์ธก์์ ์ด ์กฐํฉ์ผ๋ก ๋ฉด์ ๋น 1.00~1.03 ์ ์ ์งํ๋ค.
์ ์ฒด ํ์ดํ๋ผ์ธ โ ์ ์ง ์คํ๋ผ์ดํธ 1์ฅ โ ๊ฒ์ ์ํธ:
# 1) ํฐ ๋ฐฐ๊ฒฝ์ ํฉ์ฑํด ์
๋ ฅ (์์ ๋ชจ๋ธ์ ์ํ๋ฅผ ๋ชจ๋ฅธ๋ค)
# 2) 33ํ๋ ์ ์์ฑ โ shift 3.0, 640x640
node comfy-run.mjs wan22-5b-sprite-motion.api.json --out wan/walk --set 4.image=sprite.png --set 8.shift=3.0 --set 9.cfg=6.5 --set "5.text=<๋์>, in place, camera locked"
# 3) ์์ชฝ์์ 6์ฅ ์ ๋ณ โ rembg ๋ก ์ํ โ ๊ท๊ฒฉ ํต์ผ โ ๊ฐ๋ก ์คํธ๋ฆฝ
# ๋ค๋ก ๊ฐ์๋ก ๋๋ฆฌํํธ๊ฐ ์ปค์ง๋ค. 33์ฅ์ ๋ค ์ฐ์ง ์๋๋ค
node sprite-qa.mjs walknorm # ์ ์ฒด์ฑ ๋๋ฆฌํํธ๊ฐ ๊ธฐ์ค ์์ธ์ง ์ฌ๊ธฐ์ ํ์ ํ๋ค
์ค์ธก ๊ฒฐ๊ณผ: 6ํ๋ ์ ์ํธ๊ฐ sprite-qa ์ถฉ์กฑ(๋๋ฆฌํํธ ๋ฏธ๋ฌ 0๊ฑด), ๊ฒ์ 41px ์์ ๋์์ด ์ฝํ๋ค.
img2imgยทControlNet ๋จ๋ ์ ์ ๋๋ค (์์ ์ค์ธก)
์ค์ธก์ผ๋ก ํ์ธํ ๊ฒ:
| ๋ฐฉ๋ฒ | ์ ์ฒด์ฑ(์ค๋ฃจ์ฃ IoU) | ํฌ์ฆ ์ ์ด |
|---|---|---|
| img2img (denoise 0.35~0.5) | 0.87~0.90 | โ denoise 0.92 ๊น์ง ์ฌ๋ ค๋ ์์ธ๊ฐ ์ ๋ฐ๋๋ค |
| ControlNet OpenPose | 0.50~0.67 | โณ ์น๋น ์ง์๊ฐ ์ธ์ฒด ๋น์จ์ ์ด๊ธด๋ค. ์น๋น๋ฅผ ๋นผ์ผ ํฌ์ฆ๊ฐ ๋จน๋๋ค |
| ์ํธ ์์ฑ + ๋ถ๋ฆฌ | ๋์(ํ ์ฅ ์) | โ ๋ชจ๋ธ์ด ๊ณ ๋ฅธ๋ค |
๋ ํผ๋ฐ์ค ๊ฒ์๋ค(Royal MatchยทRoyal KingdomยทZen Match)์ ํ๋ ์ ์คํ๋ผ์ดํธ๊ฐ ์๋๋ผ Spine
์ค์ผ๋ ํ ์ ๋๋ฉ์ด์
์ ์ด๋ค โ assets zip ์์ .skel/.atlas ๊ฐ 73~134๊ฑด ๋์๋ค. ์์ฑ์ผ๋ก
ํ๋ ์์ ๋ฝ๋ ๋์ ํ ์ฅ์ ์ ๋ง๋ค์ด ๋ผ๋์ ๋ฌผ๋ฆฌ๋ ์ชฝ์ด ํ์ค์ ์ด๋ค(rig-split.mjs ๊ฐ ๊ทธ ์๋จ).
๋ํธ(ํฝ์ ์ํธ)๋ ๊ฒฉ์๋ฅผ ๋ชจ๋ธ ๋ฐ๊นฅ์์ ๊ฐ์ ํ๋ค (์ค์ธก 2026-09-09)
ํ์ฐ ๋ชจ๋ธ์ ๋ํธ๋ฅผ ๋ชป ๋ง๋ ๋ค. ํ์ง์ด ๋ชจ์๋ ๊ฒ ์๋๋ผ ์ข ๋ฅ๊ฐ ๋ค๋ฅด๋ค โ VAE ๊ฐ ์ฐ์ RGB ๋ฅผ ๋ฑ์ผ๋ฏ๋ก ์์ฑ๋ฌผ์ ์์ด 10๋ง ๊ฐ ๋๊ณ ๊ฒฝ๊ณ๊ฐ ์ ๋ถ ๋ถ๋๋ฝ๋ค. ๊ทธ๊ฑธ 48px ๋ก ์ค์ด๋ฉด ๋ํธ๊ฐ ๋๋ ๊ฒ ์๋๋ผ ํ๋ฆฟํ ์ธ๋ค์ผ์ด ๋๋ค. ๊ฑท๊ธฐ ์ ๋๋ฉ์ด์ ๊ณผ ๊ฐ์ ๋ชจ์์ ๋ฌธ์ ๋ค: ์์ก์ด๋ฅผ ๋ ๋๋ ค์ ๋๋ ๊ฒ ์๋๋ผ ๊ฒฉ์ยทํ๋ ํธยท์ํ๋ฅผ ๋ชจ๋ธ ๋ฐ๊นฅ์์ ๊ฐ์ ํด์ผ ํ๋ค.
๋ํธ ๊ณ์ฝ โ ์์ฉ ํฝ์ ์ํธ 300์ฅ ์ค์ธก ๊ธฐ์ค์
| ํญ๋ชฉ | ์ค์๊ฐ | ์ฌ๋ถ์ |
|---|---|---|
| ๋ถํฌ๋ช ์ ์ | 22 | 16~32 ์ด 52% |
| ๋ฐํฌ๋ช ํฝ์ | 0% | 91% ๊ฐ 0% โ ์ํ๋ ์ด์ง์ด๋ค |
| ์ธํจ์ด ํฝ์ | 9.1% | 6.3~10.8% |
| ํํํ ํฝ์ | 14.3% | 11.1~18.4% |
| ์ด๋์ด ์ธ๊ณฝ์ | ์ ์ด๋ค | ๊ฐ์ฅ์๋ฆฌ๊ฐ ๋ ์ด๋์ด ๊ฑด 27%๋ฟ |
"์ธํจ์ด ํฝ์ "์ด ์ถ์ํ ์ผ๋ฌ์คํธ์ ์์ผ๋ก ์ฐ์ ๋ํธ๋ฅผ ๊ฐ๋ฅด๋ ์ง๋ฌธ์ด๋ค. ์ด์ 4์นธ์ ์๊ธฐ ์์ด ํ๋๋ ์๋ ํฝ์ ์ ๋น์จ์ด๋ค. ํฐ ์ผ๋ฌ์คํธ๋ฅผ ๊ทธ๋ฅ ์ค์ด๋ฉด 36% ๊ฐ ๋์ค๊ณ , ๋์ผ๋ก ๋ณด๋ฉด ๋ ธ์ด์ฆ ๋ฉ์ด๋ฆฌ๋ค.
๋จ, 0 ์ด ๋ชฉํ๊ฐ ์๋๋ค. 1ํฝ์ ํ์ด๋ผ์ดํธ๋ ์ ๋นํ ๋ํธ ๊ธฐ๋ฒ์ด๋ผ ๋ ํผ๋ฐ์ค๋ 9.1% ๋ค. ๋๋ฌด ๋ฎ์ผ๋ฉด(2%๋) ๊ณผํ๊ฒ ๋ญ๊ฐ ๊ฒ์ด๋ค โ ๊ทธ๋์ ๋์ญ์ผ๋ก ํ์ ํ๋ค.
node skills/char-art-system/scripts/pixel-quantize.mjs <์ผ๋ฌ์คํธ.png> --out dot.png [--size 48] [--colors 24] [--clean 2]
node skills/char-art-system/scripts/pixel-contract.mjs <dot.png|ํด๋> [--cell 48]
pixel-quantize ์ ์ฒ๋ฆฌ ์์๊ฐ ์ค์ํ๋ค. ๋ฐ๊พธ๋ฉด ๊ฒฐ๊ณผ๊ฐ ํํด์ง๋ค.
- ์ํ๋ฅผ ๋จผ์ ์ด์งํํ ๋ค ์ถ์ํ๋ค(์์๋ฅผ ๋ฐ๊พธ๋ฉด ๋ฐํฌ๋ช ํ ๋๋ฆฌ ์์ด ๋ณธ์ฒด์ ์์ธ๋ค)
- ๋ฉด์ ํ๊ท ์ถ์๋ ์ํ ๊ฐ์ค์ผ๋ก(ํฌ๋ช ๋ถ์ ๊ฒ์ ์ด ์์ด๋ฉด ํ ๋๋ฆฌ๊ฐ ์ด๋์์ง๋ค)
- ์ ์์ํ๋ Lab ์์ k-means(RGB ๋ก ํ๋ฉด ๋์ ๋ค๋ฅธ ์์ ํ ๋ฉ์ด๋ฆฌ๋ก ํฉ์น๋ค)
- ์ธํจ์ด ํฝ์
์ ๋ฆฌ โ
--clean 2๊ฐ ๋ ํผ๋ฐ์ค ๋์ญ์ด๋ค(36.5% โ 6.6%).4๋ ๊ณผํ๊ฒ ๋ฐ๋ฆฐ๋ค(2.6%)
pixel-contract ๋ ์ข
๋ฃ ์ฝ๋ 0/1/3 ์ ๋ธ๋ค. ์ ์๋ง ์ธ๋ฉด ์ ๋๋ค โ ์ถ์ํ ์ผ๋ฌ์คํธ๋
์ ์๋ ๋ง์ถ ์ ์๋ค. ์ค์ธก์์ ์ยท์ํ๋ ํต๊ณผํ๋๋ฐ ์ธํจ์ด 36.5% ์ธ ๊ฒฐ๊ณผ๊ฐ ๋์๋ค.
๊ทธ๋ ๋ค๊ณ ์ธํจ์ด๋ฅผ ํ์ง ๊ฒ์ดํธ๋ก ์ฐ์ง ๋ง๋ผ โ ํ ๋ฒ ํ๋ ธ๋ค. ์ํ์ 15% ๋ก ๋ฐ์๋๋ ๋ํธ ์ ์ฉ ๋ชจ๋ธ์ ๋ฉ์ฉกํ ์ถ๋ ฅ(์ธํจ์ด 21~26%)์ 15/16 ํ๋ ์ ๋ฐ๋ คํ๋ค. ๊ฒ์ ํฌ๊ธฐ๋ก ์ค์ฌ ๋ณด๋ ๋ฌธ์ ๊ฐ ์์๋ค. ์ถ์ ๋ ธ์ด์ฆ(35.8%)์ ์ ์ ์ถ๋ ฅ(26%)์ด ์ข ์ด ํ ์ฅ ์ฐจ์ด๋ผ ์ด ์งํ ํ๋๋ก๋ ๋ชป ๊ฐ๋ฅธ๋ค. ๊ทธ๋์ ํ๋ ๊ฒ์ดํธ๋ ํ๋ ํธ ์ ์์ ๋ฐํฌ๋ช ๋น์จ๋ง ์ก๊ณ , ์ธํจ์ดยทํํ์ ์์น๋ฅผ ๋ณด์ฌ์ฃผ๊ณ ์ฌ๋์ด ๋ณธ๋ค.
ํ๋ ํธ๋ ํ๋ ์์ด ์๋๋ผ ์ํธ ์์ฑ์ด๋ค. ํ๋ ์๋ง๋ค ํํ์ ๊ฑธ๋ฉด ํ๋ฉด์ฒ๋ผ ๋จ์ํ ์ปท(๋งํ +๋จธ๋ฆฌ๋ฟ, 14์)์ ๋ฐ๋ คํ๋ค. ํ์ผ ์ ์ฒด ํฉ์งํฉ์ผ๋ก ๋ณธ๋ค.
์ํธ๊ฐ ๊ฒฉ์๋ฉด ํ๋ ์ธ์ผ ํ๋ค. ๊ฐ๋ก ์คํธ๋ฆฝ๋ง ๊ฐ์ ํ๋ค๊ฐ 192x192 4x4 ์ํธ์ ์ 4์นธ๋ง ์ฌ๊ณ ๋๋จธ์ง 12์นธ์ ํต๊ณผ์ํจ ์ ์ด ์๋ค.
๋ํธ ์์ ์์ (์ ๋ณธ)
์์์ ์ด ๋ญ๋๋ก ๊ฐ๋ฆฐ๋ค.
์ด๋ฏธ ์ผ๋ฌ์คํธ๊ฐ ์์ผ๋ฉด โ ๋ณํ์ด ๋จผ์ ๋ค. ์ ์ฒด์ฑ์ด ๊ทธ๋๋ก ๋จ๋๋ค.
node skills/char-art-system/scripts/pixel-quantize.mjs <์ผ๋ฌ์คํธ.png> --out dot.png --size 48 --colors 24 --clean 2
node skills/char-art-system/scripts/pixel-contract.mjs dot.png
์ ๋๋ฉ์ด์ ์ด ํ์ํ๋ฉด โ ์ ๊ฒฐ๊ณผ๋ฅผ ์์ ํ๋ ์์ผ๋ก ๋ํธ ์ ์ฉ ๋ชจ๋ธ์ ๋ฃ๋๋ค. ๋ ๊ฒฝ๋ก๋ ๊ฒฝ์์ด ์๋๋ผ ์ง๋ ฌ์ด๋ค. ํ๋กฌํํธ๋ง์ผ๋ก ๋๋ฆฌ๋ฉด ๋ฌด๊ธฐ๊ฐ ํ๋ ์๋ง๋ค ์ฌ๋ผ์ง๋ค.
# 1) RGB ๋ก ๋ณํ (ํฌ๋ช
์ด ์์ผ๋ฉด API ๊ฐ ๊ฑฐ๋ถํ๋ค)
python <RD์คํฌ>/scripts/prepare_reference_image.py --input dot.png --output ref.png --matte-color "#FFFFFF" --target-size 48 --fit contain --trim-alpha
# 2) ๋จ๊ฐ ๋จผ์ (--check-cost ๋ ๋ฌด๋ฃ๋ค)
python <RD์คํฌ>/scripts/retro_inference_run.py --preset <ํ๋ฆฌ์
> --check-cost ...
# 3) ์์ฑ -> ํฐ ๋ฐฐ๊ฒฝ์ด ๋ถํฌ๋ช
ํ๊ฒ ์จ๋ค -> ํ
๋๋ฆฌ flood fill + ์ํ ์ด์งํ
node skills/char-art-system/scripts/cutout.mjs <์ถ๋ ฅ.png> --out cut --feather 0 --binary-alpha
node skills/char-art-system/scripts/pixel-contract.mjs cut --cell 48
--binary-alpha ๋ฅผ ๋นผ์ง ๋ง๋ผ. --feather 0 ๋ง์ผ๋ก๋ ํจ๋ฌ๋ฐ์ค ๊ฒฝ๊ณ์ ๋ฐํฌ๋ช
์ด 1.1% ๋จ์
๋ํธ ๊ณ์ฝ(0.5%)์ ์ด๊ธด๋ค.
๋ง์ง๋ง์ ์ฌ๋์ด๋ค. ์ผ๊ตด(48px ์์ 6x6), ์ํ ์ ๋ฆฌ, ๋ฉด ๋จ์ํ๋ Aseprite ๋ก ์๋ณธ๋ค. ํ์ ๋๊ตฌ๋ "๋ํธ์ธ๊ฐ"๋ง ๋ณธ๋ค โ "์ข์๊ฐ"๋ ์ ๋ณธ๋ค.
์์ฑ์ผ๋ก ๋ํธ๋ฅผ ๋ฝ์ ๊ฑฐ๋ฉด ๋ํธ ์ ์ฉ ๋ชจ๋ธ์ ์ด๋ค
SDXL LoRA ๋ก ๋ํธ๋ฅผ ๋ฐฐ์ฐ๊ฒ ํ๋ ๊ฑด ์๋ณธ์ด 18~48px ์ด๋ผ 30๋ฐฐ ํ๋ ํ์ต์ด ๋๊ณ , ๋ชจ๋ธ์ด "๋ํธ ํํ"์ด ์๋๋ผ "ํฐ ๋ค๋ชจ"๋ฅผ ๋ฐฐ์ธ ์ํ์ด ํฌ๋ค. ๋ํธ ์ ์ฉ ์๋น์ค(Retro Diffusion ๋ฑ)๊ฐ ๊ฒฉ์ ์ค๋ ยท์์ํ๋ฅผ ํ์ดํ๋ผ์ธ์ ํฌํจํ๋ฏ๋ก ๊ทธ์ชฝ์ด ๋ง๋ค.
๋จ ๋ฌด๊ธฐยท์ํ์ ํ๋ ์๋ง๋ค ์ฌ๋ผ์ง๋ค. ์ค์ธก: 4๋ฐฉํฅ ๊ฑท๊ธฐ ํ๋ฆฌ์
(animation__walking_and_idle)์
๋ฌด๊ธฐ๋ฅผ ํ๋กฌํํธ๋ก ๊ฐํ๊ฒ ๋ฐ์๋ 16ํ๋ ์ ์ค 3๊ฐ์๋ง ๊ฒ์ด ๋์๋ค(๋๋จธ์ง 13๊ฐ๋ 0px).
ํ๋ ์๋ง๋ค ๋
๋ฆฝ ์์ฑ์ด๋ผ ๊ฑท๊ธฐ ์ ๋๋ฉ์ด์
์์ ๊ฒช์ ๊ฒ๊ณผ ๊ฐ์ ํ๊ณ๋ค.
์์ ํ๋ ์์ ๋ฐ๋ ํ๋ฆฌ์
์ ์จ๋ผ. rd_advanced_animation__walking ์ ์ ๋ฆฌ๋ ๋ํธ ํ ์ฅ์
input_image ๋ก ๋ฃ์ผ๋ 8/8 ํ๋ ์์ ๊ฒ์ด ๋จ์๊ณ 8ํ๋ ์์ด 23์์ ๊ณต์ ํ๋ค.
๋จ, 4๋ฐฉํฅ ํ๋ฆฌ์
๋ ๋ฒ๋ฆฌ์ง ๋ง๋ผ. ๋ฌด๊ธฐ๋ง ์ง์ฐ๋ฉด(์์ด ๋๋ ทํ๋ฉด ํฝ์
๋จ์๋ก ์ง์์ง๋ค) 4๋ฐฉํฅ x 4ํ๋ ์
์ธํธ๊ฐ ๋จ๋๋ค โ ์์ ํ๋ ์ ํ๋ฆฌ์
์๋ ์๋ ๊ฒ์ด๋ค. ์ค์ธก์์ ๊ฒ 141px ๋ฅผ ์ง์ฐ๊ณ ๋ถ์ ํฝ์
10๊ฐ๋ฅผ
์ ๋ฆฌํ๋ 16ํ๋ ์์ด 24์์ ๊ณต์ ํ๋ค. ๋ฐฉํจ์ฒ๋ผ ์์ด ์ ๋งคํ ์ํ์ ์๊ณ๊ฐ์ผ๋ก ๋ชป ๋๋ ค๋ธ๋ค โ
๋ฐ์ ์ฝ์ด๋ง ์ง์์ง๊ณ ํ
๋๋ฆฌ๊ฐ ๋จ์ ๊ตฌ๋ฉ์ด ๋ซ๋ ธ๋ค. ๊ทธ๊ฑด Aseprite ๋ก ์๋ด์ผ ํ๋ค.
input_image ๋ RGB(ํฌ๋ช
์์)์ฌ์ผ ํ๊ณ , ๋ฐฐ๊ฒฝ์ด ๋ถํฌ๋ช
ํฐ์์ผ๋ก ๋์์ค๋ฏ๋ก
ํ
๋๋ฆฌ flood fill ๋ก ์๋ผ๋ธ๋ค โ ์ ์ญ ์ํค๋ฅผ ์ฐ๋ฉด ์บ๋ฆญํฐ์ ํฐ ํ์ด๋ผ์ดํธ์ ๊ตฌ๋ฉ์ด ๋ซ๋ฆฐ๋ค
(์ค์ธก 52px).
๊ฑท๊ธฐ ํ๋ ์์ ์ฝ๋๋ก ๋ง๋ ๋ค โ walk-composite.mjs (์ค์ธก 2026-09-08, ๊ฒฐ๋ก )
์์ฑ ๋ชจ๋ธ๋ก ๊ฑท๊ธฐ ํ๋ ์์ ๋ฝ๋ ๊ธธ์ ์ธ ๊ฐ๋ ๋ชจ๋ ๋งํ๋ค. hex-danmaku ์ ์ฐฝ ๋ ๊ณ ๋ธ๋ฆฐ์ผ๋ก ๊ฐ์ ์บ๋ฆญํฐ์ ๋ค ๋ฐฉ๋ฒ์ ๋ค ๋๋ ค ๊ฒ์ ๋ ๋ ํฌ๊ธฐ(41x44)์์ ์ธ์ ํ๋ ์ ํฝ์ ์ฐจ๋ฅผ ์๋ค. ์์ ์ฐจ์ด๋ ๊น๋นก์์ด๊ณ ๋ค๋ฆฌ ์ฐจ์ด๊ฐ ๊ฑท๊ธฐ๋ค โ ์ด ๋์ ๋๋ ์ฌ์ผ ํ์ ์ด ๋๋ค.
| ๋ฐฉ๋ฒ | ์์ ์ฐจ์ด | ๋ค๋ฆฌ ์ฐจ์ด | ๊ฒฐ๊ณผ |
|---|---|---|---|
| WAN 2.2 5B (img2video) | - | ์์ ๋๋ ํํ ๋ถ๊ดด | ์ธ ๊ตฌ๊ฐ ์์(8ํ) |
| LoRA + ControlNet txt2img | 11~16 | 8~12 | ๊น๋นก์์ด ๊ฑท๊ธฐ๋ณด๋ค ํฌ๋ค |
| LoRA + ControlNet img2img | 0.9 | 0.6 | ์์์ ์กํ๋๋ฐ ๋ค๋ฆฌ๋ ๋ฉ์ท๋ค |
walk-composite.mjs |
0.0 | 11 | ๊ฑท๊ธฐ๋ก ๋ณด์ธ๋ค |
์์ธ์ ์์ก์ด๊ฐ ์๋๋ผ ๊ตฌ์กฐ๋ค. ํ์ฐ ๋ชจ๋ธ์ ํ๋ ์๋ง๋ค ๋ ๋ฆฝ ํ๋ณธ์ด๋ผ "์์์ ๊ทธ๋๋ก, ๋ค๋ฆฌ๋ง" ์ ์งํฌ ์๋จ์ด ์๋ค. denoise ๋ฅผ ๋ฎ์ถ๋ฉด ๋ค๋ฆฌ๊น์ง ๊ตณ๊ณ , ์ฌ๋ฆฌ๋ฉด ์์๊น์ง ํ๋ค๋ฆฐ๋ค. 0.40/0.55/0.70/0.75/0.85/0.95 ๋ฅผ ๋ค ์ฌ๋ ๋ค์งํ๋ ์ง์ ์ด ์์๋ค.
# ์์์ด ๊ณ ์ ๋ ํ ์ฅ์ ๋ง๋ค๊ณ (img2img ๊ฐ ์ฌ๊ธฐ์ ๋ฑ ๋ง๋๋ค), ๋ค๋ฆฌ๋ ์ฝ๋๋ก ์์ง์ธ๋ค
node skills/char-art-system/scripts/walk-composite.mjs <์บ๋ฆญํฐ.png> --out frames --frames 8 [--lift 0.30] [--box lx,rx] [--mid x] --strip walk.png
๋ค๋ฆฌ ์์ญ์ ์ข/์ฐ๋ก ๋๋ ์๋ฅผ ๊ณ ์ ํ๊ณ ์ธ๋ก๋ก ์์ถํ๋ค. ํํ์ด๋ํ๋ฉด ๋ถ์ธ ์์ ํ์ด ์๊ธฐ์ง๋ง ์์ถ์ ํ์ด ์๋ค. ์ฌ๊ธฐ์ ๋ชธํต ์ํ(์ฌ์ดํด๋น 2ํ)๋ฅผ ์น๋๋ค โ ์์ ํ๋ฉด์์ ๊ฑท๊ธฐ๋ฅผ ํ๋ ๊ฑด ๋ค๋ฆฌ๋ณด๋ค ๋ชธํต ์ํ๋ค.
- ์ฌ์ดํด์ด ๋ฃจํ๊ฐ ๋ง๋๋ค. ์์ฑ ์ํ์ค์ ๋ฌ๋ฆฌ ์๋ณต(pingPong)์ด ํ์ ์๋ค
- ๋ค๋ฆฌ ์์ ์๋ ๊ฒ์ถ์ ์ด์์ด๋ค. ์ฐฝยท๋งํ ๊ฐ ์๋๊น์ง ์ค๋ฉด ๋ธ๋ ค์จ๋ค โ
์ค์ธก์์ ์ฐฝ ๋ ์บ๋ฆญํฐ๋ ์๋์ผ๋ก ๋ง์๊ณ , ๋ฐ์ด ๋ฒ์ด์ง ์บ๋ฆญํฐ๋ ๋งจ ์๋ซ์ค์ ํ ๋ฐ๋ง ๋ฟ์
๋๋จธ์ง ๋ฐ์ ๋์ณค๋ค.
--box๋ก ์ง์ ์ค๋ค. ๋์ผ๋ก ํ ๋ฒ ๋ด๋ผ - ์๋ชจ์ต ์คํธ๋ผ์ด๋๋ ๋ชป ๋ง๋ ๋ค(์๋ ํฝ์ ์ด ํ์ํ๋ค). ์ ๋ฉดยท์ ๋ฉด3/4 ์ ์๋ฆฌ ๊ฑท๊ธฐ์ฉ์ด๋ค
- ๋ฌด๋ฆ์ด ์ ์ ํ๋ค. ๊ด์ ์ด ํ์ํ๋ฉด
rig-split.mjs+ ์ค์ผ๋ ํ๋ก ๊ฐ๋ค
์์ง์์ ๋๋ถ๋ถ์ ๋ค๋ฆฌ๊ฐ ์๋๋ผ ๋ชธํต ์ํ๋ค (์ค์ธก 2026-09-08)
๊ฐ์ ์คํฌ๋ฆฝํธ๋ฅผ ๋ณด์ค 4์ข
(๋ ๋ 5356px)์ ๋๋ ค 0.7** ์ด์๋ค โ ์ฌ์ค์ ์ ๋ณด์ธ๋ค. ์ํ๋ฅผ ๋ฃ์ผ๋ฉด 21--bob 0 ์ผ๋ก ๋ค๋ฆฌ๋ง ์์ง์ฌ ๋ดค๋ค.
ํ๋ ์์ฐจ๊ฐ **0.227 ๋ก ๋ด๋ค.
๋ค๋ฆฌ ์์ญ์ด ์คํ๋ผ์ดํธ์ 714% ๋ฐ์ ์ ๋๊ธฐ ๋๋ฌธ์ด๋ค.
๊ฑท๋ ์ (lunger)์ 11 ๋ ๋๋ถ๋ถ ๋ค๋ฆฌ๊ฐ ์๋๋ผ ์ํ๊ฐ ๋ง๋ ๊ฐ์ด์๋ค.
๊ทธ๋์ --lift ๋ณด๋ค --bob ์ ๋จผ์ ๋ง์ถ๋ค. ์งํญ์ ๋ ๋ ํฌ๊ธฐ ๊ธฐ์ค์ผ๋ก ํ์ฐํด์ ์ก์๋ผ โ
--bob ์ ํผ์ฌ์ฒด ๋์ด ๋น์จ์ด๋ผ ์บ๋ฒ์ค๊ฐ ๊ฐ์๋ ๋ ๋ ํฌ๊ธฐ๊ฐ ๋ค๋ฅด๋ฉด ์ฒด๊ฐ์ด ๋ฌ๋ผ์ง๋ค.
์ค์ธก ๊ธฐ์ค์ : ๋ ๋ 0.62~0.64px ์ด๋ฉด ํ๋ ์์ฐจ 11 ์ด๊ณ ๊ทธ๊ฒ "๊ฑท๋๋ค"๋ก ์ฝํ๋ ์ง์ ์ด์๋ค.
๊ทธ๋ณด๋ค ํค์ฐ๋ฉด(๋ ๋ 2.9px โ ํ๋ ์์ฐจ 27) ๊ฑท๊ธฐ๊ฐ ์๋๋ผ ๋จ๋ฆผ์ผ๋ก ๋ณด์ธ๋ค.
์ด๋ฏธ CSS ๋ฑ์ผ๋ก ํ๋ค๊ณ ์๋ ๋์์ด๋ฉด --bob 0 ์ผ๋ก ๋์ง ๋ง๊ณ , ์งํญ๋น๋ฅผ ๋ฒ๋ ค์ ์น์ด๋ผ.
๋ณด์ค๋ CSS ๋ถ์ (2.6์ด 3px) ์์ 0.62px ๋ฅผ ์น์๋ค โ 5:1 ์ด๋ผ ๋ ์ง๋์ด ์ ์ธ์ด๋ค.
๊ฐ์ ์งํญ์ผ๋ก ์ฃผ๊ธฐ๋ง ๋ค๋ฅด๋ฉด ๊ทธ๋ ์ธ์ด๋ค.
์ ์๋ ์บ๋ฆญํฐ๋ ๊ฑท๊ธฐ๊ฐ ์๋๋ผ ๋ฌด๊ฒ์ค์ฌ ์ด๋์ด๋ค
์ ์๋ฆฌ์ ์๋ ๋ณด์ค์ ๊ฑท๋ ์ ๊ณผ ๊ฐ์ ๋ฐ์(150ms)๋ฅผ ์ฃผ๋ฉด ๋ฌด๊ฒ๊ฐ ์ ์ค๋ฆฐ๋ค. ํ๋ ์ ๊ฐ๊ฒฉ์
์บ๋ฆญํฐ๋ง๋ค ์ค ์ ์์ด์ผ ํ๋ค(hex-danmaku ์์๋ ์ํธ ์ค์ ์ ms ๋ฅผ ๋ํ๋ค. ๋ณด์ค 260ms).
๋ค๋ฆฌ ์์๋ ์บ๋ฆญํฐ๋ง๋ค ์์ผ๋ก ์ก๋๋ค
--hip ์ ๋ฎ์ถ๋ฉด ์น๋งยท๋งํ ๊น์ง ์์ถ๋ผ ์ฒ์ ์ธ๋ก ์ด์๋งค๊ฐ ์๊ธด๋ค. ๊ฐ ์บ๋ฆญํฐ๋ง๋ค ํ์ ์ฐ์ด
๋ค๋ฆฌ ๋ฉ์ด๋ฆฌ ๋๋ก๋ง ๊ฐ๋ฆฌ๋ ์ค์ ์ฐพ์์ผ ํ๋ค. ์๋ ๊ฒ์ถ์ ๊ฑฐ๊ธฐ๊น์ง ๋ชป ํ๋ค.
๋ค๋ฐ ์ง์น์ ์ข/์ฐ๊ฐ ์๋๋ผ ์/๋ค๋ก ๊ฐ๋ผ ๋ฐ๋ ์์์ ์ฃผ๋ฉด ์๋ณด๊ฐ ๋๋ค(์ค์ ๋ก ํตํ๋ค).
ControlNet ์ค์ผ๋ ํค์ ์ฒดํ์ด ๋ง์์ผ ํ๋ค
OpenPose ์๋ "๋จธ๋ฆฌ ํฌ๊ธฐ" ์
๋ ฅ์ด ์๋ค. ์ฝยท๋ยท๊ท ํคํฌ์ธํธ๊ฐ ๋ชฉ์์ ์ผ๋ง๋ ๋ฉ๋ฆฌ, ์ผ๋ง๋ ๋๊ฒ
๋จ์ด์ ธ ์๋์ง๊ฐ ๊ณง ๋จธ๋ฆฌ ํฌ๊ธฐ๋ค. ๊ทธ๋์ ๋น์จ์ด ํ๋ฆฌ๋ฉด ControlNet ์ด ์บ๋ฆญํฐ๋ฅผ ๊ทธ ๋น์จ๋ก ๋๋ฆฐ๋ค โ
2.5๋ฑ์ ๊ณ ๋ธ๋ฆฐ์ 7๋ฑ์ ์ค์ผ๋ ํค์ ๋ฌผ๋ ธ๋๋ ํ๋ค๋ฆฌ๊ฐ ๋ง๋์ฒ๋ผ ๋์ด๋๊ณ ๊ฐ์ทยท์ฐฝ์ด ํต์งธ๋ก ์ฌ๋ผ์ก๋ค.
pose-skeleton.mjs --proportion chibi|hero ๋ก ๊ณ ๋ฅธ๋ค.
์ ๋ฉด ๊ฑท๊ธฐ ์ค์ผ๋ ํค์์ ์๋ค ์ค์์ x ๋ก ์ฎ๊ธฐ๋ฉด ๋ค๋ฆฌ๊ฐ ์ข์ฐ๋ก ๊ต์ฐจํ๋ค โ ๊ฑท๊ธฐ๊ฐ ์๋๋ผ
๊ฐ์์ง๋ก ๋ณด์ธ๋ค. ์ ๋ฉด์์๋ ์ค์์ y(๋ค๋ฆผ)๋ก ์ฎ๊ธฐ๊ณ ๋ฐ๋ชฉ์ด ์ค์ฌ์ ์ ๋์ง ์๊ฒ ๋ฌถ๋๋ค.
--view side ๋ x ์ค์์ด ๋ง๋ค.
ํญ์ ๊ฐ์ ํน์ง์ ํ๋กฌํํธ์ ์ด๋ค โ ํ ํฐ ํ๋์ ๊ธฐ๋์ง ๋ง๋ผ
๊ฐ์ LoRAยท๊ฐ์ ์ค์ผ๋ ํค์ผ๋ก ํ๋กฌํํธ๋ง ๋ฐ๊ฟ ์ค์ธกํ๋ค. ํ ํฐ๋ง ์ค ์ชฝ์ ๊ฐ์ท๋ ํฌ๊ตฌ๋ ์ฐฝ๋ ์๋
๋งจ๋ชธ ๊ณ ๋ธ๋ฆฐ์ด ๋์๊ณ , ๋ด์ฉ ํ๊ทธ(helmet with red plume, red scarf, gold armor, holding a spear)๋ฅผ
๊ฐ์ด ์ค ์ชฝ์ ์๋ณธ๊ณผ ๊ฐ์ ์บ๋ฆญํฐ๊ฐ ๋์๋ค. 15์ฅ์ง๋ฆฌ ์๊ท๋ชจ ๋ฐ์ดํฐ์
์์ ํ ํฐ์ ๊ทธ๋งํผ ์ฝํ๋ค.
์บก์
๊ท์น์ ๋ท๋ฉด์ด๋ค.
์ ์ฒด์ฑ ๊ณ ์ โ ์บ๋ฆญํฐ LoRA ํ์ต
์ํธ ์์ฑ์ ์ฐํ๋ค. ์บ๋ฆญํฐ 1์ข ์ ์คํจยทํ์ ยทํฌ์ฆ๋ก ๊ณ์ ์์ฐํด์ผ ํ๋ฉด LoRA ๋ฅผ ํ์ตํ๋ค. ์์ธ(์ค์นยท๋ฐ์ดํฐ์ ๊ท์นยท8GB ํ๋ฆฌ์ ๊ทผ๊ฑฐยท๊ณ ๋ฅด๋ ๋ฒ): references/lora-training.md
# 1) ๋ฐ์ดํฐ์
โ ์ฑํ๋ณธ(์ํ PNG) 10~20์ฅ โ ๋ฐฐ๊ฒฝ ํฉ์ฑยท์ถ์ยท์ค๋ณต ์ ๊ฑฐยท์บก์
โ dataset.toml
node lora-dataset.mjs art/char/approved --out art/char/lora-ds --token gdt_hero --captions captions.json
# 2) ํ์ต โ 8GB ํ๋ฆฌ์
(batch 1 ยท grad ckpt ยท TE ์บ์ ยท fp8 ยท bf16). ์ํญ๋ง๋ค ์ ์ฅ
node lora-train.mjs art/char/lora-ds --name hero_v1 --base sdxl # --dry-run ์ผ๋ก ์ค์ ๋ง ๋จผ์
# 3) ๊ณ ๋ฅด๊ธฐ โ ์ํญ ร ๊ฐ๋(0/0.6/0.8/1) ร ํฌ์ฆ ํ๋กฌํํธ 4์ข
๊ฒฉ์ ํ ์ฅ. ์ฌ๋์ ์ด๊ฒ๋ง ๋ณธ๋ค
node lora-eval.mjs --lora art/char/lora-ds/train --token gdt_hero --out art/char/lora-eval
# 4) ์์ฑ โ LoraLoader ์ํฌํ๋ก. ํ๋กฌํํธ๋ ํ ํฐ์ผ๋ก ์์
node comfy-run.mjs references/workflows/sdxl-character-lora.api.json --set 10.lora_name=hero_v1-000007.safetensors \
--set 10.strength_model=0.7 --set 10.strength_clip=0.7 --set 6.text="gdt_hero, winter coat, front view, ..."
์ง์ผ์ผ ํ๋ ๊ฒ ์ธ ๊ฐ์ง:
- ์บก์ ์๋ ๊ทธ ์ฅ์์ ๋ณํ๋ ๊ฒ๋ง(ํฌ์ฆยท์ต๊ธยทํ์ ). ๋จธ๋ฆฌ์ยท์ท์ ์ฐ๋ฉด ๊ทธ ๋จ์ด์ ํ์ต๋ผ ํ ํฐ๋ง์ผ๋ก ์ ๋์จ๋ค
- ํธ๋ฆฌ๊ฑฐ ํ ํฐ์ ์ฌ์ ์ ์๋ ๋จ์ด(
gdt_hero).hero๋ ๋ชจ๋ธ์ด ์๋ ๊ฐ๋ ๊ณผ ์์ธ๋ค - ๊ฒฐ๊ณผ๋ ํ์ผ์ด ์๋๋ผ (์ํญ, ๊ฐ๋)๋ค. ๋ง์ง๋ง ์ํญ์ด ์ต์ ์ธ ๊ฒฝ์ฐ๋ ๋๋ฌผ๋ค. ๊ฒฉ์์์ ์ ์ฒด์ฑ์ด ๋ถ๋ ๊ฐ์ฅ ์ด๋ฅธ ์ํญยท๋ฎ์ ๊ฐ๋๋ฅผ ๊ณ ๋ฅด๊ณ , ๊ทธ๊ฑธ manifest ์ ์ ๋๋ค
ํ์ต๊ธฐ(sd-scripts venv)๊ฐ ์์ผ๋ฉด lora-train.mjs ๋ ์ธก์ ๋ถ๊ฐ๋ก ๋๋๋ค. ComfyUI ์ ๋ณ๋ ์ค์น๋ค.
ํ์ต ์ค์ ComfyUI ๋ชจ๋ธ์ ๋ด๋ ค์ผ ํ๋ค(SDXL ํ๋๊ฐ ์ปค๋ฐ 10GB โ ๋์ด ๊ฐ์ด ๋ชป ์ฐ๋ค).
์ค์ธก(2026-09-03, RTX 5060 8GB): ๊ฐ์ ์บ๋ฆญํฐ 13์ฅ ร 12๋ฐ๋ณต ร 10์ํญ = 1,560์คํ , SDXL Base 1024px, 8GB ํ๋ฆฌ์ ๊ทธ๋๋ก โ 31๋ถ ์์ฃผ, 1.0์ด/์คํ , OOM ์์. ๊ฒฉ์์์ LoRA ์๋ ํ์ ๋งค๋ฒ ๋ค๋ฅธ ์บ๋ฆญํฐ, LoRA ํ 10๊ฐ๋ ์ ๋ถ ๊ฐ์ ์บ๋ฆญํฐ(๋จธ๋ฆฌยท๋ยท์์ยท๋น์จ)์ ํฌ์ฆ ํ๋กฌํํธ 4์ข ์ด ๋ค ๋จน์๋ค. ์ฑํ: ์ํญ 8 @ 0.9 + ํ๋กฌํํธ์ ํ๋ ๋ช ์. ๋น ์ง ์์(ํ๋)๋ ๊ฐ๋๋ฅผ ์ฌ๋ ค ์ต์ง๋ก ๋ถ์ด์ง ๋ง๊ณ ํ๋กฌํํธ๋ก ๋งํ๋ค โ ๊ฐ๋ 1.0 ์ ๋ฐฐ๊ฒฝ์ด ์๊ธฐ ์์ํ๋ค.
๋ชจ์ ์คํ๋ผ์ดํธ โ LoRA + ControlNet ์ค์ธก
๊ฐ์ ๋ ์ฑํ LoRA ์ OpenPose(sdxl-character-lora-openpose.api.json) ๋ฅผ ์น์ด ์ค์ผ๋ ํค 4์ข
์ ๋ฝ์๋ค.
| LoRA ์์ด ControlNet (8/21) | LoRA + ControlNet (9/3) | |
|---|---|---|
| ์ ์ฒด์ฑ | ํ๋ ๋ชจ์ยท๊ทยท๋น์จ์ด ํฌ์ฆ๋ง๋ค ๋ฐ๋ | 4ํฌ์ฆ ๋ชจ๋ ๊ฐ์ ์บ๋ฆญํฐ |
| ํฌ์ฆ ์ ์ค | 4/4 | 3/4 (ํ ์ฌ๋ฆฌ๋ cheer ๊ฐ idle ๋ก ๋ญ๊ฐ์ง) |
| ๋ฐฐ๊ฒฝ | ํฐ์ ์ ์ง | "hooded cape" ํ๋กฌํํธ๊ฐ ๋๋ฐญยท๋ง์์ ๋์ด์ด โ ๋ค๊ฑฐํฐ๋ธยท๊ฐ๋ 0.8 ๋ก ๋๋ฌ์ผ ํ๋ค |
๊ฒฐ๋ก : ํคํ๋ ์ ํฌ์ฆ(idleยทwalkยทattack ๊ฐ์ ์ ์ง ํฌ์ฆ) ๋ ์ด ์กฐํฉ์ผ๋ก ๋๋ค. ๊ฑท๊ธฐ 8ํ๋ ์ ๊ฐ์ ์ฐ์ ๋์์
์ฌ์ ํ ์์ฑ์ผ๋ก๋ ์ ๋๊ณ , ํ ์ฅ์ ์ ๋ง๋ค์ด Spine ๋ผ๋์ ๋ฌผ๋ฆฌ๋ rig-split ๊ฒฝ๋ก๊ฐ ๋ต์ด๋ค.
์คํ์ผ LoRA โ ๋ ํผ๋ฐ์ค ํํ๋ง ๋น๋ฆฌ๊ธฐ (์ค์ธก 2026-09-03)
๋ ํผ๋ฐ์ค ๊ฒ์ ์ด์ํ 70์ฅ(์บ๋ฆญํฐ 70์ข
ร 1์ฅ์ฉ, WD14 ์๋ ์บก์
)์ผ๋ก ์คํ์ผ LoRA ๋ฅผ ํ์ตํด ์ฐ๋ฆฌ ์บ๋ฆญํฐ LoRA ์
์ฒด์ธ(sdxl-character-lora-style.api.json)์ผ๋ก ์ผ๋ค. ์์ธ ๊ท์น์ lora-training.md ์ ์คํ์ผ LoRA ์ .
| ์กฐํฉ | ๊ฒฐ๊ณผ |
|---|---|
| ์คํ์ผ ๋จ๋ , ์ํญ 5 @ 0.7 | ๊ตต์ ์ธ๊ณฝ์ ยท์คํฐ์ปค ํ ๋๋ฆฌยท๊ดํยท์ฅ์ ํจํด โ ํํ์ด ์ฎ๊ฒจ์ก๋ค. ์ฌ๋ ํผ๋ถ ์ ์ง |
| ์คํ์ผ ๋จ๋ , ์ํญ 10~15 @ 1.0 | ํผ๋ถ๊ฐ ๋น์คํท ์, ํฐ ์์ด์ฑ โ ๋ ํผ๋ฐ์ค์ "์บ๋ฆญํฐ๊ฐ ์ฟ ํค๋ค"๊น์ง ํ์ต๋จ. ์ด๊ฑด IP ๋์ถ์ด๋ผ ์ฐ๋ฉด ์ ๋๋ค |
| ์บ๋ฆญํฐ 0.9 + ์คํ์ผ 0.5 | ์ ์ฒด์ฑ ์ ์ง + ํํ ์ ์ด + ๋ฐฐ๊ฒฝ์ด ํฐ์์ผ๋ก ๋์์ด(์คํ์ผ ๋ฐ์ดํฐ๊ฐ ์ ๋ถ ํฐ ๋ฐฐ๊ฒฝ) |
| ์บ๋ฆญํฐ 0.9 + ์คํ์ผ 0.8 | ์คํ์ผ์ด ์บ๋ฆญํฐ๋ฅผ ๋ฐ์ด๋. ์ผ๊ตด์ด ๋ ํผ๋ฐ์ค ํ๊ท ์ผ๋ก |
๋์ถ์ ์์ธ์ ์บก์
์ด์๋ค. ํ๊ฑฐ ๊ฒฐ๊ณผ์์ cookie ๊ณ์ด ํ๊ทธ๋ฅผ ์ ๋ถ ์ง์ ๋๋, "์ฟ ํค๋ค"๋ผ๋ ๋ด์ฉ์ด ์บก์
๋์
์คํ์ผ ํ ํฐ์ ๋ถ์๋ค. ๋ด์ฉ ํ๊ทธ(foodยทcookieยทgingerbread)๋ ๋จ๊ธฐ๊ณ IP ์ด๋ฆ(์ํ๋ช
)๋ง ์ง์ด๋ค. ๊ทธ๋์ผ ๋น์คํท ํผ๋ถ๋
cookie ๋จ์ด์, ๊ทธ๋ฆฌ๋ ๋ฒ๋ง ํ ํฐ์ ๋จ๋๋ค. ์ ํ ๊ธฐ์ค: ์ด๋ฅธ ์ํญ(57) ยท ๊ฐ๋ 0.50.7 ยท ์บ๋ฆญํฐ LoRA ์ ํฉ 1.5 ์ดํ.
v2(๋ชจ๋ ์บก์ ์ "gingerbread cookie character, biscuit-colored skin, food" ๋ช ์, 1,400์คํ , 30๋ถ)๋ก ์ฌํ์ตํ ๊ฒฐ๊ณผ: ๊ฐ๋ 0.7 ์์๋ ์ํญ 5ยท10 ๋ชจ๋ ์ฌ๋ ํผ๋ถ ์ ์ง, ์คํฐ์ปค ํ ๋๋ฆฌยท๊ดํ๋ง ์ฎ๊ฒจ์ด. 1.0 ์์๋ ์ฌ์ ํ ์ผ๊ตด์ด ๋ ธ๋๊ฒ ๊ธฐ์ด๋ค. ์บก์ ์ด ๋๋ถ๋ถ์ ๊ณ ์น๊ณ , ๋๋จธ์ง๋ "0.7 ์ดํ" ๊ท์น์ด ๋ง๋๋ค.
๊ทธ๋ฆผ์ด ๊ตฌ๋ฆฐ ์ง์ง ์ด์ ๋ ๋ฒ ์ด์ค ๋ชจ๋ธ์ด์๋ค (์ค์ธก 2026-09-03)
๊ฐ์ ์๋ยท๊ฐ์ LoRAยท๊ฐ์ 4ํฌ์ฆ๋ก ์ธ ์กฐํฉ์ ๋น๊ตํ๋ค(sdxl-character-lora-style-hires.api.json).
| ์กฐํฉ | ๊ฒฐ๊ณผ |
|---|---|
| SDXL Base + hires + ์บ๋ฆญํฐ 0.9 + ์คํ์ผ 0.5 | ์ ์ฒด์ฑ OK, ๋ฐฐ๊ฒฝ ํฐ์ OK. ์ผ๊ตด ํ๋ฉด์ , ์๊ธฐ ํฌ์ฆ ๋ญ๊ฐ์ง |
| Animagine XL 4 + hires + ์บ๋ฆญํฐ 0.8 (ํ๊ทธ ํ๋กฌํํธ) | ์ ยท์ผ๊ตดยท์ ์ ๋ถ ์ ๋ฆฌ, ํฌ์ฆ 4/4, ํฐ ๋ฐฐ๊ฒฝ. ๋ค๋ฅธ ๊ธ์ ๊ทธ๋ฆผ |
| Animagine XL 4 + hires + ์บ๋ฆญํฐ 0.8 + ์คํ์ผ 0.5 | ์์ ๊ฐ์ผ๋ฉด์ ์ธ๊ณฝ์ ยท์์์ด ์กฐ๊ธ ๋ ๋๋ ท |
- SDXL Base ๋ก ํ์ตํ LoRA ๋ Animagine ์ ์ฌํ์ต ์์ด ์นํ๋ค. ๊ตฌ์กฐ๊ฐ ๊ฐ์์๋ค. ๊ฐ๋๋ 0.1 ๋ฎ์ท๋ค(0.9 โ 0.8)
- ์ฒดํฌํฌ์ธํธ๋ฅผ ๋ฐ๊พธ๋ฉด ํ๋กฌํํธ ๋ฌธ๋ฒ๋ ๋ฐ๊พผ๋ค. Animagine ์ ํ๊ทธ์(
masterpiece, best quality, 1girl, solo, chibi, white hair, red eyes, ...). ์์ฐ์ด๋ฅผ ๋ฃ์ผ๋ฉด ์ถ์ ๋ฌด๋ฌ๊ฐ ๋์จ๋ค(8/21 ์ค์ธก). ์ ์ฒด์ฑ ํ๊ทธ(white hair, red eyes)๋ฅผ ํ๋กฌํํธ์ ๊ฐ์ด ์จ๋ ๋๋ค โ LoRA ์ ์ธ์ฐ์ง ์๋๋ค - ํ์ต ๋ฐ์ดํฐ(13์ฅ)๊ฐ SDXL Base ์ฐ์ถ๋ฌผ์ด๋ผ๋ ํ๊ณ๋ ๋จ์ ์๋ค. ๋ค์ ์บ๋ฆญํฐ LoRA ๋ Animagine ์ผ๋ก ๋ฝ์ ์์์ผ๋ก ํ์ตํ๋ค
์บ๋ฆญํฐ LoRA v2 โ ์ข์ ๋ชจ๋ธ๋ก ๋ฝ์ ๋ฐ์ดํฐ๋ก ๋ค์ ํ์ต (์ค์ธก 2026-09-03)
์ ๊ธฐ์ค ์กฐํฉ์ผ๋ก ํฌ์ฆยท์ต๊ธยทํ์ ยท์ํ์ ๋ฐ๊ฟ 24์ฅ์ ๋ฝ๊ณ , ๋ฐฐ๊ฒฝ์ด ๋ค์ด๊ฐ 4์ฅ๊ณผ ๋น์จ์ด ๊นจ์ง 1์ฅ์ ๋นผ์ 19์ฅ์ผ๋ก Animagine XL 4 ๋ฅผ ๋ฒ ์ด์ค๋ก ํ์ตํ๋ค(ร 8๋ฐ๋ณต ร 10์ํญ = 1,520์คํ , 32๋ถ, 1.1์ด/์คํ ).
| v1 (SDXL Base ๋ฐ์ดํฐยทSDXL Base ํ์ต) | v2 (Animagine ๋ฐ์ดํฐยทAnimagine ํ์ต) | |
|---|---|---|
| ์ค์ ํ๋กฌํํธ(์ ์ฒด์ฑ ํ๊ทธ ํฌํจ)๋ก 4ํฌ์ฆ | ์์ ์ . ์ ํ์์ ํ๋ ๋ชจ์์ด ํ๋ค๋ฆผ | ํ๋ ๋ชจ์ยท๋ค์ด์๋ชฌ๋ ๋ฌธ์์ด ํฌ์ฆ๋ง๋ค ์ผ์ . ์ ์ด ๋ ๋๋ ท |
| ํ ํฐ๋ง์ผ๋ก(์ ์ฒด์ฑ ํ๊ทธ ์์ด) ๊ฒฉ์ | 4ํฌ์ฆ ๋ชจ๋ ๊ฐ์ ์บ๋ฆญํฐ | ํฐ ๋จธ๋ฆฌยท๋ถ์ ๋ยท๋งํ ๋ ์ค์ง๋ง ํ๋๊ฐ ์์ฃผ ๋ฒ๊ฒจ์ง, ์ธก๋ฉด์์ Animagine ๊ธฐ๋ณธ ์ทจํฅ์ด ์์ |
ํ ํฐ๋ง์ผ๋ก ์ฝํด์ง ์ด์ ๋ ์บก์
์ด๋ค. 19์ฅ ์ ๋ถ์ hood up ์ ๋ฃ์๋๋ฐ, ์ ์ฅ์ ๊ณตํต์ธ ๋จ์ด๋ ์ ์ฒด์ฑ์ธ๋ฐ๋ ์บก์
์ ์ฐ๋ฉด
ํ ํฐ์ด ์๋๋ผ ๊ทธ ๋จ์ด์ ๋ถ๋๋ค. ์ค์ ์์ฑ ํ๋กฌํํธ์๋ hood up ์ด ๋ค์ด๊ฐ๋ฏ๋ก ์ค์ฌ์ฉ์ ๋ฌธ์ ๊ฐ ์์ง๋ง, v3 ๋ ์บก์
์์
๊ณตํต ํน์ง์ ๋บ๋ค(lora-training.md "์ ์ฅ์ ๊ณตํต์ธ ํน์ง" ์ ).
ํ์ฌ ๊ธฐ์ค ์กฐํฉ: animagine-xl-4.0 ยท ํ๊ทธ ํ๋กฌํํธ(์ ์ฒด์ฑ ํ๊ทธ + hood up ํฌํจ) ยท hires 1.5ร denoise 0.42 ยท
์บ๋ฆญํฐ LoRA redhood_v2 ์ํญ 8 @ 0.8 ยท ์คํ์ผ LoRA(ckstyle_v2 ์ํญ 5) 0.5.
์ ์ฐจ
- ๊ธฐ์ค ํ์ธ โ
VISUAL_DESIGN.md์ ํ๋ ํธยทํ๋กํฌ์ ยท๊ธ์ง ์คํ์ผ์ ํ๋กฌํํธ์ ๋ฃ๋๋ค. ์์ผ๋ฉดart-direction๋ถํฐ. - ์์ ๋ฐฐ์น ์์ฑ โ ํ ์บ๋ฆญํฐ๋น 8~16์ฅ. ์๋๋ฅผ ์ ๋ถ ๊ธฐ๋กํ๋ค.
- ์๋ ์ค์ฝ์ด๋ง โ ๊ท๊ฒฉ(์บ๋ฒ์คยท๋ฐฐ๊ฒฝ ์๋ยท์ํ ์ฌ๋ฐฑ) + ํ๋ ํธ ์ ํฉ + ์ค๋ฃจ์ฃ ํ๋ ์ฑ. ํ์๋ ์๋ ํ๋ฝ.
- ์ฌ๋ ์ฑํ โ ์์ 3์ฅ์์ 1์ฅ. ์ด ํ ๋จ๊ณ๋ ๋จ๊ธด๋ค (์ทจํฅยทIPยทํค์ ์ฌ๋ ํ๋จ).
- ์ ์ฒด์ฑ ๊ณ ์ โ ์ฑํ๋ณธ์ผ๋ก LoRA ํ์ต(
lora-datasetโlora-trainโlora-eval)ํ๊ฑฐ๋ IP-Adapter ๋ ํผ๋ฐ์ค๋ก ๋ฑ๋ก. - ๋ณํ ์์ฐ โ ํ์ ยทํฌ์ฆยท์์ ๋ณํ. ํ๋ ์ ์ํธ๊ฐ ํ์ํ๋ฉด
sprite-pipeline์ผ๋ก ๋๊ธด๋ค. - ๋ฑ๋ก โ
asset-pipelinemanifest ์ ๋ชจ๋ธยท์๋ยทํ๋กฌํํธยทLoRA ๋ฒ์ ๊น์ง ์ ๋๋ค.
์ฌํ์ฑ (์ด ์ถ์์ ์ ์ผ ์์ฃผ ๊นจ์ง๋ ๊ฒ)
์์ฑ๋ฌผ์ ๋ชจ๋ธ + ์๋ + ํ๋กฌํํธ + LoRA ๋ฒ์ ์ด ์์ผ๋ฉด ๋ค์ ๋ง๋ค ์ ์๋ค. 6๊ฐ์ ๋ค ์คํจ ํ๋ ์ถ๊ฐํ๋ ค๋๋ฐ ์๋ณธ ์บ๋ฆญํฐ๋ฅผ ์ฌํ ๋ชป ํ๋ฉด ์ฒ์๋ถํฐ ๋ค์ ๊ทธ๋ฆฌ๊ฒ ๋๋ค.
manifest ์ ๋ฐ๋์ ๋จ๊ธด๋ค:
checkpoint / lora(+๊ฐ์ค์น) / seed / samplerยทstepsยทcfg / ํ๋กฌํํธ ์๋ฌธ / ๋ ํผ๋ฐ์ค ์ด๋ฏธ์ง ๊ฒฝ๋ก
๋ณด๊ณ (๊ฒ์ฆ ๋ฆฌํฌํธ 5์น์ )
- ์ฆ๊ฑฐ: ์คํํ ์ํฌํ๋ก์
prompt_id, ์๋ยท์์ฑ ์ฅ์ยท์ฑํ ๊ธฐ์ค, ๊ฒฐ๊ณผ ๊ฒฝ๋ก - ๊ธฐ์ค:
VISUAL_DESIGN.md์ ์ด๋ ํญ๋ชฉ๊ณผ ๋์กฐํ๋์ง - ๊ณต๋ฐฑ: ์ ๋ง๋ ๋ณํ(ํ์ ยท์ต๊ธ), ์ค์ฝ์ด๋ง ๋ชป ํ ํญ๋ชฉ
- ์์ฌ ์ํ: ์ ์ฒด์ฑ์ด ํ๋ค๋ฆด ์ ์๋ ๋ณํ ๋ฒ์
ํ์ง ์๋ ๊ฒ
- ํคยทํ๋ ํธ ๊ฒฐ์ (
art-direction์๊ด) - ํ๋ ์ ์ํธ ์ ๊ทํยท์ํ๋ผ์ค (
sprite-pipeline์๊ด) - ์ค์กด IPยทํ ๊ฒ์ ์บ๋ฆญํฐ๋ฅผ ๋ชจ๋ฐฉํ ์์ฑ โ ๋ ํผ๋ฐ์ค๋ ์คํ์ผ ๊ธฐ์ค์ด์ง ๋ณต์ ๋์์ด ์๋๋ค
- ๋ฐฑ์๋๊ฐ ์๋๋ฐ "๋์ถฉ ๋น์ทํ ๊ฒฐ๊ณผ"๋ก ๋์ด๊ฐ๊ธฐ โ ๊ทธ๊ฑด
์ธก์ ๋ถ๊ฐ๋ค