Spaces:
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:
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:
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 ๊ธฐ๋ฐ ์น ์๋ฒ์ ์์ฑ APIrequirements.txt: Python ๋ฐํ์ ์์กด์ฑindex.html,styles.css,script.js: ๋ณ๋ ํ๋ก ํธ์๋ ์์
Hugging Face์์ ์ Space๋ฅผ ๋ง๋ค ๋ SDK๋ Docker๋ก ์ ํํ๋ฉด ๋ฉ๋๋ค.
Space SDK: Docker
Port: 7860
Start command: Dockerfile CMD ์ฌ์ฉ
ํ์ฌ app.py๋ OpenAI/Gemini ์ด๋ฏธ์ง ์์ฑ API๋ฅผ ์ฐ์ ํธ์ถํฉ๋๋ค. API ํค๊ฐ ์๊ฑฐ๋ DEMO_FALLBACK=true๋ก ์ค์ ํ ๊ฒฝ์ฐ์๋ ์
๋ก๋ํ ์ ํ ์ด๋ฏธ์ง๋ฅผ ํฉ์ฑํ๋ ๋ฐ๋ชจ worker๋ฅผ ์ฌ์ฉํ ์ ์์ต๋๋ค.
์ค์ ์ด๋ฏธ์ง ์์ฑ API
ํ์ฌ ์ฑ์ Docker ์ปจํ ์ด๋์์ OpenAI ๋๋ Gemini ์ด๋ฏธ์ง ์์ฑ API๋ฅผ ํธ์ถํ ์ ์์ต๋๋ค.
ํ๊ฒฝ๋ณ์:
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-2openai:gpt-image-1.5openai:gpt-image-1gemini:gemini-3.1-flash-image-previewgemini:gemini-3-pro-image-previewgemini:gemini-2.5-flash-image
1K๋ 1024px๊ธ ์ธ๋ก ๊ฒฐ๊ณผ, 2K๋ 2048px๊ธ ์ธ๋ก ๊ฒฐ๊ณผ๋ฅผ ์์ฒญํฉ๋๋ค. GPT Image 2์ Gemini 3.1/3 Pro ์ด๋ฏธ์ง ๋ชจ๋ธ์ฒ๋ผ 2K ์์ฒญ์ ์ง์ํ๋ ๋ชจ๋ธ์ API ์์ฒญ ๋จ๊ณ์์ 2K๋ฅผ ์ง์ ํ๊ณ , ๋ฐํ ์ด๋ฏธ์ง ํฌ๊ธฐ๊ฐ ๋ค๋ฅด๋ฉด ์ต์ข
์บ๋ฒ์ค์ ๋ง์ถฐ ์ ๊ทํํฉ๋๋ค.
API ํค๊ฐ ์๊ฑฐ๋ ๋ชจ๋ธ๋ช
์ด ํด๋น ๊ณ์ ์์ ์ง์๋์ง ์์ผ๋ฉด ํ๋ฉด์ ์ค๋ฅ๊ฐ ํ์๋ฉ๋๋ค. DEMO_FALLBACK=true๋ฅผ ์ค์ ํ ๊ฒฝ์ฐ์๋ง ๊ธฐ์กด ๋ฐ๋ชจ ๋ ๋๋ฌ๋ก ๋์ฒด๋ฉ๋๋ค.
๋ชจ๋ธ ์ผ๊ตด ํ๋ฆฌ์
์ฒจ๋ถํ ๋ชจ๋ธ ์ผ๊ตด ์ด๋ฏธ์ง๋ ์๋ ๊ฒฝ๋ก์ ์ ์ฅํด์ ํจ๊ป ์ ๋ก๋ํ๋ฉด ๊ธฐ๋ณธ ํ๋ฆฌ์ ์ผ๋ก ์ฌ์ฉ๋ฉ๋๋ค.
assets/model_face_preset.png
์ฑ์์๋ ๋ชจ๋ธ ์ผ๊ตด ์์ค ๊ธฐ๋ณธ๊ฐ์ด ์ฒจ๋ถ ์ผ๊ตด ํ๋ฆฌ์
์ผ๋ก ์ค์ ๋์ด ์์ต๋๋ค. ๋ณ๋ ์ผ๊ตด ์ด๋ฏธ์ง๋ฅผ ํ
์คํธํ๊ณ ์ถ์ ๋๋ง ์
๋ก๋ ์ผ๊ตด์ ์ ํํ๋ฉด ๋ฉ๋๋ค.
ํ๋ฉด์ ํ๋ฅด์๋ ์ผ๊ตด ์
๋ก๋์ ์ผ๊ตด ์ด๋ฏธ์ง๋ฅผ ์ฌ๋ฆฌ๋ฉด ํด๋น ํ์ผ์ด /api/generate์ model_face๋ก ์ ๋ฌ๋ฉ๋๋ค. ์ค์ API ์์ฑ์์๋ ์ด ์ผ๊ตด ๋ ํผ๋ฐ์ค๋ฅผ ์ฒซ ๋ฒ์งธ ์ฐธ์กฐ ์ด๋ฏธ์ง๋ก ๋ฃ๊ณ , ํ๋ณด 3์ฅ๊ณผ ํ์ ์ท ๋ชจ๋ ๋์ผ ์ธ๋ฌผ๋ก ์ ์งํ๋๋ก ํ๋กฌํํธ์ identity lock ์ง์๋ฅผ ํฌํจํฉ๋๋ค.
ํ๋ฉด ๊ตฌ์ฑ
- ๋ก๊ทธ์ธ / ํ๋ก์ ํธ ์ ์ฅ
- QR ๋๋ ๋ก์ปฌ ์ ํ ์ด๋ฏธ์ง ์ ๋ก๋: ์ ํ 1~4 ๊ฐ๊ฐ ์๋ฉด, ๋ท๋ฉด ์ต์
- ์นดํ ๊ณ ๋ฆฌ, ํ, ์ ํ ๊ธฐ์ฅ, ์คํ์ผ ์ ํ
- ํ๋กฌํํธ ์ ๋ ฅ
- ์นดํ ๊ณ ๋ฆฌ(์์/ํ์ ๋ฑ)์ ๋ฐ๋ผ ๋ฌ๋ผ์ง๋ ์ท ๋ฒํผ ์ ํ
- ์ ์ (์๋ฉด) ํ๋ณด 3์ฅ ์ฐ์ ์์ฑ
- ์ ํํ ํ๋ณด ์ปท ๊ธฐ์ค ์ท ๊ตฌ๋ ๋ณ๊ฒฝ ์์ฑ (๊ฐ ์ท์ assets/poses์ ๋ช ๋ช ๋ ํผ๋ฐ์ค๋ฅผ ๋ฐ๋ผ๊ฐ)
- 1K / 2K ํด์๋ ์ ํ
- ์ ํ ์ปท ์ฌ์์ฑ
- AI ํ๊ธฐ ์ฝ์
- ์ผ๊ด ๋ค์ด๋ก๋
- ์์ฑ ์๊ฐ ์๋ด
๊ถ์ฅ ์์ฑ ํ์ดํ๋ผ์ธ
์ ๋ ฅ ๊ฒ์ฆ
- ์ ํ ์๋ณธ ํด์๋, ๋ฐฐ๊ฒฝ ํฌ๋ช ๋, ๋ธ๋ฌ, ๋ก๊ณ ์์ญ, ๋ฉํ๋ฐ์ดํฐ ํ์ธ
- ๊ธด ๋ณ ๊ธฐ์ค ์ต์ 1500px ์ด์ ๊ถ์ฅ
์ ํ ์ ์ฒ๋ฆฌ
- ์ ํ 1~4์ ์๋ฉด/๋ท๋ฉด ๋ ํผ๋ฐ์ค ์ ํ ์์ญ ์ธ๊ทธ๋ฉํ ์ด์
- ์ค๋ฃจ์ฃ, ๋ก๊ณ , ํจํด, ๋ฒํผ, ์์ฌ ํ ์ค์ฒ ๋ณด์กด์ฉ ๋ง์คํฌ ์์ฑ
- ์นดํ ๊ณ ๋ฆฌ์ ๊ธฐ์ฅ ๊ฐ์ ํ๋กฌํํธ ์กฐ๊ฑด์ผ๋ก ๋ณํ
๋ชจ๋ธ ์กฐ๊ฑด ์์ฑ
- ์ ํํ AI ๋ชจ๋ธ ์ผ๊ตด ์๋ฒ ๋ฉ ๋๋ ๋ ํผ๋ฐ์ค ์ด๋ฏธ์ง ์ฐ๊ฒฐ
- ํฌ์ฆ ๋ ํผ๋ฐ์ค์์ OpenPose / DensePose / depth ์กฐ๊ฑด ์ถ์ถ
- ์ ์ 3์ปท์ ๋จผ์ ์์ฑํ๊ณ ์ดํ ์คํ์ผ ๋ณํ ์ปท ์์ฑ
1์ฐจ ์ด๋ฏธ์ง ์์ฑ
- ์ ์ (์ ๋ฉด) ํ๋ณด 3์ฅ์ ๋จผ์ ์์ฑ
- ์ฌ์ฉ์๊ฐ ์ ํํ ๊ธฐ์ค ์ปท์ ์ผ๊ตด/์์ ์ ๋ณด๋ฅผ ํ์ ์ท ์์ฑ์ ๊ธฐ์ค์ผ๋ก ์ฌ์ฉ
- ์ ํ ๋ง์คํฌ๋ฅผ ๊ฐํ๊ฒ ๊ณ ์
- ์ผ๊ตด, ์, ๋ค๋ฆฌ, ์ท ๊ฒฝ๊ณ๋ถ๋ฅผ ๋ณ๋ ๊ฒ์ ๋์์ผ๋ก ์ ์ฅ
- ์ปท๋ณ seed, prompt, negative prompt, model version ๊ธฐ๋ก
์ท ๊ตฌ๋ ํ์ฅ
- ์ ํ ๊ธฐ์ค ์ปท์์ ์ผ๊ตด, ์์, ์์, ์์ฌ, ๋ก๊ณ ๋ฅผ ์ ์ง
- ๊ฐ ์ท์
assets/poses/์ ๋์ผ ์ด๋ฆ ๋ ํผ๋ฐ์ค(์:์ ์ _์๋ฉด_.*)์์ ํฌ์ฆยท๊ฐ๋ยทํฌ๋กญ๋ง ๊ฐ์ ธ์ด - ์นดํ
๊ณ ๋ฆฌ์ ๋ฐ๋ผ ๋
ธ์ถ ์ท์ด ๋ฌ๋ผ์ง
- ์์(์ํผ์คยท์์ฐํฐ ํฌํจ): ์ ์ (์๋ฉด), ์ ์ (์ธก๋ฉด), ์ ์ (ํ๋ฉด), ์๋ฐ์ (์๋ฉด), ์๋ฐ์ (์ธก๋ฉด), ์๋ฐ์ (ํ๋ฉด), ์๋ฐ์ (ํด๋ก์ฆ์ ), ๋ํ ์ผ(ํ๋ฉด)
- ํ์(์ค์ปคํธ ํฌํจ): ์ ์ (์๋ฉด), ์ ์ (์ธก๋ฉด), ์ ์ (ํ๋ฉด), ์๋ฐ์ (์๋ฉด), ์๋ฐ์ (์ธก๋ฉด), ํ๋ฐ์ , ํ๋ฐ์ (ํด๋ก์ฆ์ )
- ์ ์ ยท์๋ฐ์ (์/์ธก/ํ)ยทํ๋ฐ์ ์ ๋ ํผ๋ฐ์ค ํ๋ ์ด๋ฐ์ ๋ง์ถฐ ์๋ ํฌ๋กญ, ํด๋ก์ฆ์ ยท๋ํ ์ผ์ ํฌ๋กญ ์๋ต
ํ์ง ๊ฒ์
- ์ ํ ํํ ๋ณํ๋ฅ
- ๋ก๊ณ ์๊ณก
- ์๊ฐ๋ฝ, ์ผ๊ตด, ๋ค๋ฆฌ ๋น์จ
- ๋ฐฐ๊ฒฝ ๋๋ผ ํ์ง
- AI ํ๊ธฐ ๋๋ฝ ์ฌ๋ถ
๊ณ ํด์๋ ํ์ฒ๋ฆฌ
- 1K ์์ฑ ํ 2K ์ ์ค์ผ์ผ
- ์ผ๊ตด/์ ํ ๋ํ ์ผ ์์ญ ์ ํ ์คํ
- ์์ ํธ์ฐจ ๋ณด์
- JPG/PNG/WebP ๋ฐ ZIP ์ผ๊ด ๋ค์ด๋ก๋
์ถ์ฒ ๋ฐฑ์๋ ๊ตฌ์กฐ
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 ์ฑ:
docker build -t modelcut-studio .
docker run --rm -p 7860:7860 -e OPENAI_API_KEY=... -e GEMINI_API_KEY=... modelcut-studio
Python ์ง์ ์คํ:
pip install -r requirements.txt
python app.py
์ ์ UI ์์:
index.html์ ๋ธ๋ผ์ฐ์ ๋ก ์ด๋ฉด ๋ฐ๋ก ํ์ธํ ์ ์์ต๋๋ค.