Spaces:
Sleeping
Sleeping
| title: ROEM-AI | |
| emoji: ๐ธ | |
| colorFrom: blue | |
| colorTo: indigo | |
| sdk: docker | |
| app_port: 7860 | |
| pinned: false | |
| short_description: AI fashion model cut generator | |
| # AI ModelCut Studio | |
| ## Hugging Face Dataset Save | |
| Generated images are saved to a Hugging Face Dataset when these Space secrets are set: | |
| ```text | |
| HF_DATASET_REPO=sunyoung00/ROEM_TEST | |
| HF_TOKEN=hf_... | |
| ``` | |
| `HF_TOKEN` must have write permission for the dataset repo. If `HF_DATASET_REPO` is not set, the app defaults to `sunyoung00/ROEM_TEST`. Upload failures are logged but do not block image generation. | |
| Saved files are uploaded under: | |
| ```text | |
| generated/YYYYMMDDTHHMMSSZ_requestid/ | |
| 01_label.png | |
| metadata.json | |
| ``` | |
| ์ ํ ์ด๋ฏธ์ง, AI ๋ชจ๋ธ ์ผ๊ตด, ์ฒดํ ๋ ํผ๋ฐ์ค, ์ ํ ๊ธฐ์ฅ, ์ท๋ณ ํฌ์ฆ ๋ ํผ๋ฐ์ค๋ฅผ ์กฐํฉํด ์ผํ๋ชฐ์ฉ AI ๋ชจ๋ธ์ปท์ ์์ฑํ๋ Hugging Face Spaces์ฉ ์ฑ ๊ตฌ์กฐ์ ๋๋ค. (์ผ๊ตด/์ฒดํ/ํฌ์ฆ ๋ ํผ๋ฐ์ค ๋ฐฐ์น๋ `assets/README.md` ์ฐธ๊ณ ) | |
| ## Hugging Face Spaces ์คํ ๊ตฌ์กฐ | |
| ์ด ์ ์ฅ์๋ Docker Space๋ก ๋ฐ๋ก ์คํํ ์ ์์ต๋๋ค. | |
| ํ์ ํ์ผ: | |
| - `Dockerfile`: Hugging Face Spaces Docker SDK๊ฐ ๋น๋ํ๋ ์ปจํ ์ด๋ ์ ์ | |
| - `app.py`: FastAPI ๊ธฐ๋ฐ ์น ์๋ฒ์ ์์ฑ API | |
| - `requirements.txt`: Python ๋ฐํ์ ์์กด์ฑ | |
| - `index.html`, `styles.css`, `script.js`: ๋ณ๋ ํ๋ก ํธ์๋ ์์ | |
| Hugging Face์์ ์ Space๋ฅผ ๋ง๋ค ๋ SDK๋ `Docker`๋ก ์ ํํ๋ฉด ๋ฉ๋๋ค. | |
| ```text | |
| Space SDK: Docker | |
| Port: 7860 | |
| Start command: Dockerfile CMD ์ฌ์ฉ | |
| ``` | |
| ํ์ฌ `app.py`๋ OpenAI/Gemini ์ด๋ฏธ์ง ์์ฑ API๋ฅผ ์ฐ์ ํธ์ถํฉ๋๋ค. API ํค๊ฐ ์๊ฑฐ๋ `DEMO_FALLBACK=true`๋ก ์ค์ ํ ๊ฒฝ์ฐ์๋ ์ ๋ก๋ํ ์ ํ ์ด๋ฏธ์ง๋ฅผ ํฉ์ฑํ๋ ๋ฐ๋ชจ worker๋ฅผ ์ฌ์ฉํ ์ ์์ต๋๋ค. | |
| ## ์ค์ ์ด๋ฏธ์ง ์์ฑ API | |
| ํ์ฌ ์ฑ์ Docker ์ปจํ ์ด๋์์ OpenAI ๋๋ Gemini ์ด๋ฏธ์ง ์์ฑ API๋ฅผ ํธ์ถํ ์ ์์ต๋๋ค. | |
| ํ๊ฒฝ๋ณ์: | |
| ```text | |
| OPENAI_API_KEY=... | |
| GEMINI_API_KEY=... | |
| OPENAI_IMAGE_MODEL=gpt-image-2 | |
| GEMINI_IMAGE_MODEL=gemini-3.1-flash-image-preview | |
| DEMO_FALLBACK=false | |
| # ๋ฐ์ดํฐ์ ์ ์ฅ | |
| HF_DATASET_REPO=sunyoung00/ROEM_TEST | |
| HF_TOKEN=hf_... | |
| # ์์ฑ ๋์ ํ๋ (์ ํ) | |
| GEN_MAX_WORKERS=4 # ์ผ๊ด ์ท / Gemini ํ๋ณด ๋์ ์์ฑ ์ | |
| API_INPUT_MAX_SIDE=2048 # ๋ ํผ๋ฐ์ค ์ด๋ฏธ์ง ์ ์ก ์ ๊ธด ๋ณ ์ํ | |
| MATCH_REFERENCE_FRAMING=true # ์ท ๋ ํผ๋ฐ์ค ํ๋ ์ด๋ฐ์ ๋ง์ถฐ ์๋ ํฌ๋กญ | |
| SUBJECT_BG_TOLERANCE=32 # ๋ฐฐ๊ฒฝ ๋๋น ํผ์ฌ์ฒด ๊ฒ์ถ ๋ฏผ๊ฐ๋(ํฌ๋กญ์ฉ) | |
| IDEALIZE_PROPORTIONS=false # ์ฒดํ ๋ ํผ๋ฐ์ค ์์ ๋ 8.2~8.5๋ฑ์ ๊ฐ์ ์ฌ๋ถ | |
| FRAMING_TOP_MARGIN= # (์ ํ) ์๋ ํฌ๋กญ ์๋จ ์ฌ๋ฐฑ ๋น์จ, ์: 0.10 | |
| FRAMING_BOTTOM_MARGIN= # (์ ํ) ์๋ ํฌ๋กญ ํ๋จ ์ฌ๋ฐฑ ๋น์จ, ์: 0.08 | |
| ``` | |
| ํ๋ฉด์ `์ด๋ฏธ์ง ์์ฑ ๋ชจ๋ธ`์์ ์๋ provider๋ฅผ ์ ํํฉ๋๋ค. | |
| - `openai:gpt-image-2` | |
| - `openai:gpt-image-1.5` | |
| - `openai:gpt-image-1` | |
| - `gemini:gemini-3.1-flash-image-preview` | |
| - `gemini:gemini-3-pro-image-preview` | |
| - `gemini:gemini-2.5-flash-image` | |
| `1K`๋ 1024px๊ธ ์ธ๋ก ๊ฒฐ๊ณผ, `2K`๋ 2048px๊ธ ์ธ๋ก ๊ฒฐ๊ณผ๋ฅผ ์์ฒญํฉ๋๋ค. GPT Image 2์ Gemini 3.1/3 Pro ์ด๋ฏธ์ง ๋ชจ๋ธ์ฒ๋ผ 2K ์์ฒญ์ ์ง์ํ๋ ๋ชจ๋ธ์ API ์์ฒญ ๋จ๊ณ์์ 2K๋ฅผ ์ง์ ํ๊ณ , ๋ฐํ ์ด๋ฏธ์ง ํฌ๊ธฐ๊ฐ ๋ค๋ฅด๋ฉด ์ต์ข ์บ๋ฒ์ค์ ๋ง์ถฐ ์ ๊ทํํฉ๋๋ค. | |
| API ํค๊ฐ ์๊ฑฐ๋ ๋ชจ๋ธ๋ช ์ด ํด๋น ๊ณ์ ์์ ์ง์๋์ง ์์ผ๋ฉด ํ๋ฉด์ ์ค๋ฅ๊ฐ ํ์๋ฉ๋๋ค. `DEMO_FALLBACK=true`๋ฅผ ์ค์ ํ ๊ฒฝ์ฐ์๋ง ๊ธฐ์กด ๋ฐ๋ชจ ๋ ๋๋ฌ๋ก ๋์ฒด๋ฉ๋๋ค. | |
| ## ๋ชจ๋ธ ์ผ๊ตด ํ๋ฆฌ์ | |
| ์ฒจ๋ถํ ๋ชจ๋ธ ์ผ๊ตด ์ด๋ฏธ์ง๋ ์๋ ๊ฒฝ๋ก์ ์ ์ฅํด์ ํจ๊ป ์ ๋ก๋ํ๋ฉด ๊ธฐ๋ณธ ํ๋ฆฌ์ ์ผ๋ก ์ฌ์ฉ๋ฉ๋๋ค. | |
| ```text | |
| assets/model_face_preset.png | |
| ``` | |
| ์ฑ์์๋ `๋ชจ๋ธ ์ผ๊ตด ์์ค` ๊ธฐ๋ณธ๊ฐ์ด `์ฒจ๋ถ ์ผ๊ตด ํ๋ฆฌ์ `์ผ๋ก ์ค์ ๋์ด ์์ต๋๋ค. ๋ณ๋ ์ผ๊ตด ์ด๋ฏธ์ง๋ฅผ ํ ์คํธํ๊ณ ์ถ์ ๋๋ง `์ ๋ก๋ ์ผ๊ตด`์ ์ ํํ๋ฉด ๋ฉ๋๋ค. | |
| ํ๋ฉด์ `ํ๋ฅด์๋ ์ผ๊ตด ์ ๋ก๋`์ ์ผ๊ตด ์ด๋ฏธ์ง๋ฅผ ์ฌ๋ฆฌ๋ฉด ํด๋น ํ์ผ์ด `/api/generate`์ `model_face`๋ก ์ ๋ฌ๋ฉ๋๋ค. ์ค์ API ์์ฑ์์๋ ์ด ์ผ๊ตด ๋ ํผ๋ฐ์ค๋ฅผ ์ฒซ ๋ฒ์งธ ์ฐธ์กฐ ์ด๋ฏธ์ง๋ก ๋ฃ๊ณ , ํ๋ณด 3์ฅ๊ณผ ํ์ ์ท ๋ชจ๋ ๋์ผ ์ธ๋ฌผ๋ก ์ ์งํ๋๋ก ํ๋กฌํํธ์ identity lock ์ง์๋ฅผ ํฌํจํฉ๋๋ค. | |
| ## ํ๋ฉด ๊ตฌ์ฑ | |
| - ๋ก๊ทธ์ธ / ํ๋ก์ ํธ ์ ์ฅ | |
| - QR ๋๋ ๋ก์ปฌ ์ ํ ์ด๋ฏธ์ง ์ ๋ก๋: ์ ํ 1~4 ๊ฐ๊ฐ ์๋ฉด, ๋ท๋ฉด ์ต์ | |
| - ์นดํ ๊ณ ๋ฆฌ, ํ, ์ ํ ๊ธฐ์ฅ, ์คํ์ผ ์ ํ | |
| - ํ๋กฌํํธ ์ ๋ ฅ | |
| - ์นดํ ๊ณ ๋ฆฌ(์์/ํ์ ๋ฑ)์ ๋ฐ๋ผ ๋ฌ๋ผ์ง๋ ์ท ๋ฒํผ ์ ํ | |
| - ์ ์ (์๋ฉด) ํ๋ณด 3์ฅ ์ฐ์ ์์ฑ | |
| - ์ ํํ ํ๋ณด ์ปท ๊ธฐ์ค ์ท ๊ตฌ๋ ๋ณ๊ฒฝ ์์ฑ (๊ฐ ์ท์ assets/poses์ ๋ช ๋ช ๋ ํผ๋ฐ์ค๋ฅผ ๋ฐ๋ผ๊ฐ) | |
| - 1K / 2K ํด์๋ ์ ํ | |
| - ์ ํ ์ปท ์ฌ์์ฑ | |
| - AI ํ๊ธฐ ์ฝ์ | |
| - ์ผ๊ด ๋ค์ด๋ก๋ | |
| - ์์ฑ ์๊ฐ ์๋ด | |
| ## ๊ถ์ฅ ์์ฑ ํ์ดํ๋ผ์ธ | |
| 1. ์ ๋ ฅ ๊ฒ์ฆ | |
| - ์ ํ ์๋ณธ ํด์๋, ๋ฐฐ๊ฒฝ ํฌ๋ช ๋, ๋ธ๋ฌ, ๋ก๊ณ ์์ญ, ๋ฉํ๋ฐ์ดํฐ ํ์ธ | |
| - ๊ธด ๋ณ ๊ธฐ์ค ์ต์ 1500px ์ด์ ๊ถ์ฅ | |
| 2. ์ ํ ์ ์ฒ๋ฆฌ | |
| - ์ ํ 1~4์ ์๋ฉด/๋ท๋ฉด ๋ ํผ๋ฐ์ค ์ ํ ์์ญ ์ธ๊ทธ๋ฉํ ์ด์ | |
| - ์ค๋ฃจ์ฃ, ๋ก๊ณ , ํจํด, ๋ฒํผ, ์์ฌ ํ ์ค์ฒ ๋ณด์กด์ฉ ๋ง์คํฌ ์์ฑ | |
| - ์นดํ ๊ณ ๋ฆฌ์ ๊ธฐ์ฅ ๊ฐ์ ํ๋กฌํํธ ์กฐ๊ฑด์ผ๋ก ๋ณํ | |
| 3. ๋ชจ๋ธ ์กฐ๊ฑด ์์ฑ | |
| - ์ ํํ AI ๋ชจ๋ธ ์ผ๊ตด ์๋ฒ ๋ฉ ๋๋ ๋ ํผ๋ฐ์ค ์ด๋ฏธ์ง ์ฐ๊ฒฐ | |
| - ํฌ์ฆ ๋ ํผ๋ฐ์ค์์ OpenPose / DensePose / depth ์กฐ๊ฑด ์ถ์ถ | |
| - ์ ์ 3์ปท์ ๋จผ์ ์์ฑํ๊ณ ์ดํ ์คํ์ผ ๋ณํ ์ปท ์์ฑ | |
| 4. 1์ฐจ ์ด๋ฏธ์ง ์์ฑ | |
| - ์ ์ (์ ๋ฉด) ํ๋ณด 3์ฅ์ ๋จผ์ ์์ฑ | |
| - ์ฌ์ฉ์๊ฐ ์ ํํ ๊ธฐ์ค ์ปท์ ์ผ๊ตด/์์ ์ ๋ณด๋ฅผ ํ์ ์ท ์์ฑ์ ๊ธฐ์ค์ผ๋ก ์ฌ์ฉ | |
| - ์ ํ ๋ง์คํฌ๋ฅผ ๊ฐํ๊ฒ ๊ณ ์ | |
| - ์ผ๊ตด, ์, ๋ค๋ฆฌ, ์ท ๊ฒฝ๊ณ๋ถ๋ฅผ ๋ณ๋ ๊ฒ์ ๋์์ผ๋ก ์ ์ฅ | |
| - ์ปท๋ณ seed, prompt, negative prompt, model version ๊ธฐ๋ก | |
| 5. ์ท ๊ตฌ๋ ํ์ฅ | |
| - ์ ํ ๊ธฐ์ค ์ปท์์ ์ผ๊ตด, ์์, ์์, ์์ฌ, ๋ก๊ณ ๋ฅผ ์ ์ง | |
| - ๊ฐ ์ท์ `assets/poses/`์ ๋์ผ ์ด๋ฆ ๋ ํผ๋ฐ์ค(์: `์ ์ _์๋ฉด_.*`)์์ ํฌ์ฆยท๊ฐ๋ยทํฌ๋กญ๋ง ๊ฐ์ ธ์ด | |
| - ์นดํ ๊ณ ๋ฆฌ์ ๋ฐ๋ผ ๋ ธ์ถ ์ท์ด ๋ฌ๋ผ์ง | |
| - ์์(์ํผ์คยท์์ฐํฐ ํฌํจ): ์ ์ (์๋ฉด), ์ ์ (์ธก๋ฉด), ์ ์ (ํ๋ฉด), ์๋ฐ์ (์๋ฉด), ์๋ฐ์ (์ธก๋ฉด), ์๋ฐ์ (ํ๋ฉด), ์๋ฐ์ (ํด๋ก์ฆ์ ), ๋ํ ์ผ(ํ๋ฉด) | |
| - ํ์(์ค์ปคํธ ํฌํจ): ์ ์ (์๋ฉด), ์ ์ (์ธก๋ฉด), ์ ์ (ํ๋ฉด), ์๋ฐ์ (์๋ฉด), ์๋ฐ์ (์ธก๋ฉด), ํ๋ฐ์ , ํ๋ฐ์ (ํด๋ก์ฆ์ ) | |
| - ์ ์ ยท์๋ฐ์ (์/์ธก/ํ)ยทํ๋ฐ์ ์ ๋ ํผ๋ฐ์ค ํ๋ ์ด๋ฐ์ ๋ง์ถฐ ์๋ ํฌ๋กญ, ํด๋ก์ฆ์ ยท๋ํ ์ผ์ ํฌ๋กญ ์๋ต | |
| 6. ํ์ง ๊ฒ์ | |
| - ์ ํ ํํ ๋ณํ๋ฅ | |
| - ๋ก๊ณ ์๊ณก | |
| - ์๊ฐ๋ฝ, ์ผ๊ตด, ๋ค๋ฆฌ ๋น์จ | |
| - ๋ฐฐ๊ฒฝ ๋๋ผ ํ์ง | |
| - AI ํ๊ธฐ ๋๋ฝ ์ฌ๋ถ | |
| 7. ๊ณ ํด์๋ ํ์ฒ๋ฆฌ | |
| - 1K ์์ฑ ํ 2K ์ ์ค์ผ์ผ | |
| - ์ผ๊ตด/์ ํ ๋ํ ์ผ ์์ญ ์ ํ ์คํ | |
| - ์์ ํธ์ฐจ ๋ณด์ | |
| - JPG/PNG/WebP ๋ฐ ZIP ์ผ๊ด ๋ค์ด๋ก๋ | |
| ## ์ถ์ฒ ๋ฐฑ์๋ ๊ตฌ์กฐ | |
| ```text | |
| client | |
| upload panel | |
| option builder | |
| result gallery | |
| api | |
| POST /projects | |
| POST /assets/product | |
| POST /assets/model-face | |
| POST /jobs/generate | |
| POST /jobs/:id/regenerate | |
| GET /jobs/:id | |
| GET /projects/:id/results.zip | |
| worker | |
| preprocess product | |
| extract pose | |
| generate first-pass images | |
| run quality checks | |
| upscale and sharpen | |
| export final assets | |
| storage | |
| original assets | |
| masks | |
| intermediate renders | |
| final images | |
| job metadata | |
| ``` | |
| ## ๋ก์ปฌ ์คํ | |
| Docker ์ฑ: | |
| ```bash | |
| docker build -t modelcut-studio . | |
| docker run --rm -p 7860:7860 -e OPENAI_API_KEY=... -e GEMINI_API_KEY=... modelcut-studio | |
| ``` | |
| Python ์ง์ ์คํ: | |
| ```bash | |
| pip install -r requirements.txt | |
| python app.py | |
| ``` | |
| ์ ์ UI ์์: | |
| `index.html`์ ๋ธ๋ผ์ฐ์ ๋ก ์ด๋ฉด ๋ฐ๋ก ํ์ธํ ์ ์์ต๋๋ค. | |