| # feed_pipeline |
| |
| ํ์คํธ ์๋ฃ ๋ฉ์์ง + ์บ๋ฆญํฐ ๋๋ผ ์ด๋ฏธ์ง โ ๋ชฝ๊ธ๋ง์ ํฝ์
์ํธ ํผ๋ ์ด๋ฏธ์ง ์์ฑ ํจํค์ง. |
| |
| --- |
| |
| ## ํด๋ ๊ตฌ์กฐ |
| |
| ``` |
| feed_pipeline/ |
| โโโ __init__.py โ ํต์ฌ ํจ์ export |
| โโโ pipeline.py โ ํต์ฌ ๋ก์ง (์บ๋ฆญํฐ ์์ฑ + ๋ฐฐ๊ฒฝ ์์ฑ + ํฉ์ฑ) |
| โโโ run.py โ CLI ์ง์
์ |
| โโโ README.md โ ์ด ํ์ผ |
| ``` |
| |
| ๊ฒฐ๊ณผ๋ `outputs/feed/{name}/` ์ ์ ์ฅ๋ฉ๋๋ค. |
| |
| --- |
| |
| ## ํ์ดํ๋ผ์ธ ํ๋ฆ |
| |
| ``` |
| result_nobg.png (image_pipeline ๊ฒฐ๊ณผ๋ฌผ) + ํ๊ตญ์ด ํ์คํธ ๋ฉ์์ง |
| โ |
| โผ |
| [STEP 0] Qwen2-VL โ ํ์คํธ ๋ฒ์ญ |
| โ action: ์บ๋ฆญํฐ ํฌ์ฆ ์ค๋ช
(์: "running with arms swinging") |
| โ scene: ๋ฐฐ๊ฒฝ ํ๊ฒฝ ์ค๋ช
(์: "fluffy cloud meadow path") |
| โ |
| โผ |
| [STEP 1] img2img (strength=0.75) |
| result_nobg.png โ ํฝ์
์ํธ ์บ๋ฆญํฐ (ํฐ ๋ฐฐ๊ฒฝ) |
| ์บ๋ฆญํฐ LoRA + action ํ๋กฌํํธ + appearance.json ์ธํ ์ ๋ณด |
| โ |
| โผ |
| [STEP 2] rembg โ ํฝ์
์ํธ ์บ๋ฆญํฐ ๋๋ผ |
| โ |
| โผ |
| [STEP 3] text2img โ ํ์คํธ ๋ฐฐ๊ฒฝ ์ฅ๋ฉด ์์ฑ |
| ๋ฐฐ๊ฒฝ LoRA + scene ํ๋กฌํํธ + ๋๋ค ์๋ (์ด๋ฏธ์ง๋ง๋ค ๋ค๋ฅธ ๋ฐฐ๊ฒฝ) |
| โ |
| โผ |
| [STEP 4] ํฉ์ฑ โ ์บ๋ฆญํฐ๋ฅผ ๋ฐฐ๊ฒฝ ์์ ๋ฐฐ์น (๊ทธ๋ฆผ์ ํฌํจ) |
| โ |
| โผ |
| [STEP 5] ์ธํ์ธํ
๋ธ๋ ๋ฉ โ ์บ๋ฆญํฐ ๊ฒฝ๊ณ ์์ฐ์ค๋ฝ๊ฒ ์ฒ๋ฆฌ |
| โ |
| โผ |
| {name}_feed.png โ
์ต์ข
๊ฒฐ๊ณผ |
| ``` |
| |
| --- |
|
|
| ## ์ฌ์ฉ ๋ชจ๋ธ |
|
|
| **HuggingFace ์๋ ๋ค์ด๋ก๋** (์ฒซ ์คํ ์ ์บ์์ ์ ์ฅ): |
|
|
| | ๋ชจ๋ธ | ์ฉ๋ | VRAM | |
| |------|------|------| |
| | `stabilityai/stable-diffusion-xl-base-1.0` | ๊ธฐ๋ฐ ์์ฑ ๋ชจ๋ธ | ~8GB | |
| | `latent-consistency/lcm-lora-sdxl` | 8์คํ
๋น ๋ฅธ ์์ฑ | (LoRA) | |
| | `Hadimeeee/mongle-character-lora` | ๋ชฝ๊ธ ํฝ์
์ํธ ์บ๋ฆญํฐ ์คํ์ผ LoRA | (LoRA) | |
| | `Hadimeeee/mongle-bg-lora` | ๋ชฝ๊ธ ํฝ์
์ํธ ๋ฐฐ๊ฒฝ ์คํ์ผ LoRA | (LoRA) | |
| | `Qwen/Qwen2-VL-7B-Instruct` | ํ์คํธ ํโ์ ๋ฒ์ญ | ~8GB (8bit) | |
|
|
| > ๋ก์ปฌ์ ๋ชจ๋ธ ํด๋๊ฐ ์์ด๋ ๋ฉ๋๋ค. ๋ชจ๋ HuggingFace์์ ์๋์ผ๋ก ๋ฐ์์ต๋๋ค. |
|
|
| --- |
|
|
| ## ํ๊ฒฝ ์๊ตฌ์ฌํญ |
|
|
| - Python 3.10+ |
| - CUDA GPU (VRAM 12GB ์ด์ ๊ถ์ฅ) |
|
|
| ```bash |
| pip install torch diffusers transformers accelerate |
| pip install rembg pillow numpy |
| pip install bitsandbytes qwen-vl-utils |
| pip install huggingface_hub |
| ``` |
|
|
| --- |
|
|
| ## ์คํ ๋ฐฉ๋ฒ |
|
|
| ### CLI |
|
|
| ```bash |
| # ๋ฐฐ์น โ ํด๋ ์ result_nobg.png ์ ์ฒด ์ฒ๋ฆฌ |
| python -m feed_pipeline.run --batch path/to/folder --quest "์ค๋ ๋์๊ด์์ ์ฑ
ํ ๊ถ์ ๋ค ์ฝ์์ด์" --name run_01 |
| |
| # ๋จ์ผ ์ด๋ฏธ์ง |
| python -m feed_pipeline.run --input path/to/result_nobg.png --quest "๊ณต์์์ 30๋ถ ๋ฌ๋ฆฌ๊ธฐ๋ฅผ ์๋ฃํ์ด์" |
| |
| # ์์ด ์ง์ ์
๋ ฅ (VLM ๋ฒ์ญ ์๋ต, ๋น ๋ฆ) |
| python -m feed_pipeline.run --batch path/to/folder --quest-en "running in the park" --name run_02 |
| |
| # ์ฒ์ n์ฅ๋ง ํ
์คํธ |
| python -m feed_pipeline.run --batch path/to/folder --quest "..." --limit 3 --name test_01 |
| ``` |
|
|
| > `python -m feed_pipeline.run` ์ **๋ ํฌ ๋ฃจํธ**์์ ์คํํฉ๋๋ค. |
| |
| ### ์
๋ ฅ ํด๋ ๊ตฌ์กฐ |
| |
| `--batch` ํด๋ ์์ ์๋์ฒ๋ผ `result_nobg.png` ๊ฐ ์์ผ๋ฉด ๋ฉ๋๋ค. |
| `appearance.json` ์ด ๊ฐ์ ํด๋์ ์์ผ๋ฉด ์บ๋ฆญํฐ ์ธํ ์ ๋ณด๋ก ์๋ ๋ฐ์๋ฉ๋๋ค. |
|
|
| ``` |
| batch_folder/ |
| โโโ 01/ |
| โ โโโ result_nobg.png โ ํ์ (image_pipeline ๊ฒฐ๊ณผ๋ฌผ) |
| โ โโโ appearance.json โ ์ ํ (์ธํ ์๋ ๋ฐ์) |
| โโโ 02/ |
| โ โโโ result_nobg.png |
| โ โโโ appearance.json |
| โโโ ... |
| ``` |
|
|
| --- |
|
|
| ## ๊ฒฐ๊ณผ ํ์ผ |
|
|
| ``` |
| outputs/feed/{name}/ |
| โโโ {ํด๋๋ช
}_char.png โ STEP 1 ํฝ์
์ํธ ์บ๋ฆญํฐ (ํฐ ๋ฐฐ๊ฒฝ) |
| โโโ {ํด๋๋ช
}_feed.png โ ์ต์ข
ํผ๋ ์ด๋ฏธ์ง โ
|
| โโโ {ํด๋๋ช
}_compare.png โ ์๋ณธ / ์บ๋ฆญํฐ / ๋ฐฐ๊ฒฝ / ๊ฒฐ๊ณผ 4๋จ ๋น๊ต |
| ``` |
|
|
| --- |
|
|
| ## ํ๋ผ๋ฏธํฐ ์์ธ |
|
|
| | ํ๋ผ๋ฏธํฐ | ๊ธฐ๋ณธ๊ฐ | ์ค๋ช
| |
| |----------|--------|------| |
| | `--strength` | `0.75` | ์บ๋ฆญํฐ img2img ๊ฐ๋. ๋์์๋ก ์๋ณธ์์ ๋ง์ด ๋ณํ๋จ | |
| | `--char-scale` | `1.0` | ์บ๋ฆญํฐ LoRA ๊ฐ๋ | |
| | `--bg-scale` | `1.0` | ๋ฐฐ๊ฒฝ LoRA ๊ฐ๋ | |
| | `--inpaint-str` | `0.35` | ๋ธ๋ ๋ฉ ๊ฐ๋. ๋ฎ์์๋ก ํฉ์ฑ ๊ฒฝ๊ณ๋ง ์ด์ง ์ฒ๋ฆฌ | |
| | `--blend-mode` | `inpaint` | `inpaint`=๊ฒฝ๊ณ๋ง / `img2img`=์ ์ฒด ์ด๋ฏธ์ง ๋ธ๋ ๋ฉ | |
| | `--steps` | `8` | ์ถ๋ก ์คํ
์ (LCM 8์คํ
๊ธฐ๋ณธ) | |
| | `--seed` | `42` | ์บ๋ฆญํฐ ์์ฑ ์๋ (๋ฐฐ๊ฒฝ์ ์ด๋ฏธ์ง๋ง๋ค ์๋ ๋๋ค) | |
| | `--limit` | `0` | ๋ฐฐ์น ์ฒ๋ฆฌ ์ต๋ ์ฅ์ (`0`=์ ์ฒด) | |
| | `--name` | `run_01` | ์ถ๋ ฅ ํด๋ ์ด๋ฆ | |
|
|
| --- |
|
|
| ## ์ฃผ์ ํ์ผ ์ค๋ช
|
|
|
| ### `pipeline.py` |
|
|
| ํต์ฌ ์์ฑ ํจ์๋ค์ด ์ ์๋ ํ์ผ์
๋๋ค. |
|
|
| - `load_pipelines()` โ SDXL txt2img + img2img + inpaint ํ์ดํ๋ผ์ธ ๋ก๋ (UNet ๊ณต์ ๋ก VRAM ์ ์ฝ) |
| - `generate_character()` โ img2img๋ก ํฝ์
์ํธ ์บ๋ฆญํฐ ์์ฑ |
| - `remove_bg()` โ rembg๋ก ์บ๋ฆญํฐ ๋๋ผ |
| - `generate_background()` โ text2img๋ก ๋ฐฐ๊ฒฝ ์ฅ๋ฉด ์์ฑ |
| - `composite()` โ ์บ๋ฆญํฐ๋ฅผ ๋ฐฐ๊ฒฝ ์์ ํฉ์ฑ (๊ทธ๋ฆผ์ ํฌํจ, ํฌ๊ธฐ ์๋ ์กฐ์ ) |
| - `inpaint_blend()` โ ์บ๋ฆญํฐ ๊ฒฝ๊ณ ์ธํ์ธํ
๋ธ๋ ๋ฉ |
| - `img2img_blend()` โ ์ ์ฒด ์ด๋ฏธ์ง img2img ๋ธ๋ ๋ฉ (๋์) |
|
|
| ### `run.py` |
|
|
| `python -m feed_pipeline.run` ์ผ๋ก ์คํํ๋ CLI ์ง์
์ ์
๋๋ค. |
|
|
| ### `__init__.py` |
|
|
| `pipeline.py` ์ ํต์ฌ ํจ์๋ค์ ํจํค์ง ๋ ๋ฒจ๋ก exportํฉ๋๋ค. |
|
|
| --- |
|
|
| ## ์ฃผ์์ฌํญ |
|
|
| - `result_nobg.png` ๋ `image_pipeline` ์ ์ถ๋ ฅ๋ฌผ์ ์ฌ์ฉํฉ๋๋ค. |
| - ๋ฐฐ๊ฒฝ์ ์ด๋ฏธ์ง๋ง๋ค ๋๋ค ์๋๊ฐ ์ ์ฉ๋์ด ํญ์ ๋ค๋ฅธ ๋ฐฐ๊ฒฝ์ด ์์ฑ๋ฉ๋๋ค. |
| - ์ฒซ ์คํ ์ ๋ชจ๋ธ ๋ค์ด๋ก๋๋ก ์๊ฐ์ด ๊ฑธ๋ฆฝ๋๋ค (ํฉ๊ณ ์ฝ 15~20GB). |
| - LCM ๋ชจ๋์์ `guidance_scale` ์ ์๋์ผ๋ก 1.5 ์ ์ฉ๋ฉ๋๋ค. |
|
|