ç»åãã3Dããªã³ãããŒã¿(STL / 3MF / GLB / OBJ)ãçæããããŒã«ã«Webã¢ããªã
Web UIã®äœ¿ãæ¹ã¯ docs/USAGE.mdãè©³çŽ°ä»æ§ã¯
docs/SPEC.mdãéçºæ¹éã¯
docs/DEVELOPMENT_POLICY.mdãå®è£
èšç»ã¯
docs/IMPLEMENTATION_PLAN.md ãåç
§ã
ãã°å ±åã»æ©èœèŠæã¯ Issuesã ã³ã³ããªãã¥ãŒã·ã§ã³ã¯ CONTRIBUTING.md ãåç §ããŠãã ããã
- Image-to-3D çæã¯ mockãžã§ãã¬ãŒã¿(決å®çãªãã©ã¡ããªãã¯ã¡ãã·ã¥)ã䜿çšã
- GPU / Hunyuan3D-2 ã¯æªå°å ¥ã§ããã¢ããããŒã â çæ â ã¡ãã·ã¥åŸåŠç â 3Dãã¥ãŒã¢è¡šç€º â STL/3MF/GLB/OBJ ããŠã³ããŒãã®å šãã€ãã©ã€ã³ãE2Eã§åäœããã
- Phase 2 ã§
IMAGE3D_GENERATOR=hunyuan3dã«ããå®ã¢ãã«ã«åãæ¿ãå¯èœ(äžèšåç §)ã - Phase 2.5 ã§4è²ã«ã©ãŒããªã³ã¿åãåºå(
color_mode=color4)ã«å¯Ÿå¿ (äžèšãPhase 2.5: 4è²ã«ã©ãŒããªã³ã察å¿ãåç §)ã - Phase 3a ã§ãã«ããã¥ãŒå ¥å(æ£é¢+èé¢/å·Š/å³)ãšãã£ã©ã¯ã¿ãŒã·ãŒãèªååå²ã«å¯Ÿå¿ (äžèšãPhase 3a: ãã«ããã¥ãŒå ¥å+ãã£ã©ã¯ã¿ãŒã·ãŒãèªååå²ãåç §)ã
- Phase 3b ã§ãã©ã¡ãŒã¿ããªã»ãã(FR-11)ãšãã¥ãŒã¢ã®ãªãŒããŒãã³ã°ããŒãããã (FR-12)ã«å¯Ÿå¿(äžèšãPhase 3b: ããªã»ãã+ãªãŒããŒãã³ã°ããŒãããããåç §ã ããã³ããšã³ãã®ã¿ã®å€æŽã§ãµãŒãAPIã¯äžå€)ã
- Phase 3c ã§ãã¯ã¹ãã£çæ(
texture_mode=paintãFR-10)ã«å¯Ÿå¿(äžèš ãPhase 3c: ãã¯ã¹ãã£çæ (texgen)ãåç §)ãcustom_rasterizer CUDAæ¡åŒµã® ãã«ããå¿ èŠã§ãæªå°å ¥ç°å¢ã§ã¯/api/healthã®texgen_available=falseã« å¿ããŠUIäžã§ç¡å¹è¡šç€ºããæ£é¢/èé¢æåœ±æ¹åŒ(FR-8)ã«ãã©ãŒã«ããã¯ããã - 3ã€ç®ã®ãžã§ãã¬ãŒã¿ãšã㊠Pixal3D(MITã©ã€ã»ã³ã¹ãPBRãã¯ã¹ãã£ä»ãåºå)ã
çµ±å(äžèšãPixal3Dãžã§ãã¬ãŒã¿ãåç
§)ãå°çšvenv
.venv-pixal3d+IMAGE3D_GENERATOR=pixal3dã®æç€ºæå®ã§äœ¿çšããã
- Python 3.12
- (Phase 2çš) NVIDIA GPU + CUDA 12.8 察å¿ãã©ã€ã
RTX PRO 6000 Blackwell 96GB ã§ã®å®æž¬ããŒã¯(æ¢å®ãã©ã¡ãŒã¿:
octree_resolution=384, max_faces=200000, ãã¯ã¹ãã£2048Ã2048)ã«åºã¥ãç®å®ã
| äœ¿çšæ©èœ | 宿ž¬ããŒã¯ | æå°èŠä»¶ | åè |
|---|---|---|---|
| mockãžã§ãã¬ãŒã¿ã®ã¿ | â | GPUäžèŠ | éçºã»UI確èªçš |
| 圢ç¶çæ(åäžãã¥ãŒ/ãã«ããã¥ãŒ) | çŽ12GB | 16GB | åäžãã¥ãŒã»mvã®äž¡ãã€ãã©ã€ã³åžžé§+çæäžããŒã¯ãå«ã |
+ãã¯ã¹ãã£çæ (texture_mode=paint) |
çŽ25GB | 32GB | shape+paint(delightã»multiview diffusion)åžžé§+çæäžããŒã¯ |
octree_resolution=512ãmax_faceså¢(é«ç²Ÿçްããªã»ãã)ã§ã¯ããŒã¯ãäžèšãã å¢å ãããVRAMãæå°èŠä»¶ä»è¿ã®GPUã§ã¯octree_resolution=256ãžã®åŒãäžããæšå¥šã- çæãžã§ãã¯çŽåå®è¡(NFR-2)ã®ãããåæå®è¡ã«ããVRAMå ç®ã¯çºçããªãã
åãžã§ãåŸã«
torch.cuda.empty_cache()ã§è§£æŸããã(NFR-3ã§éã¿ã¯åžžé§)ã - ä»ããã»ã¹ãšGPUãå ±æããå Žåã¯ãäžèšã«å ããŠãã®ããã»ã¹ã®äœ¿çšéã確ä¿ããããšã
Linux / macOS / WSL2:
python3 -m venv .venv
.venv/bin/pip install --upgrade pip
.venv/bin/pip install -r requirements.txtWindows PowerShell:
py -3.12 -m venv .venv
.\.venv\Scripts\python.exe -m pip install --upgrade pip
.\.venv\Scripts\pip.exe install -r requirements.txtWindowsãã€ãã£ãã§ã¯ Phase 1(mockãžã§ãã¬ãŒã¿ / CPU) ã®å©çšãæ³å®ããã Hunyuan3D-2 / CUDA / texgen ã®å®ã¢ãã«çæã¯ãäŸåé¢ä¿ãCUDAæ¡åŒµãã«ãã®éœåã§ WSL2 Ubuntu ãŸã㯠Linux ç°å¢ãæšå¥šããã
requirements.txt 㯠base äŸåã®ã¿(FastAPI / trimesh / fast-simplification ç)ã
rembgã»torchã»hy3dgen çã®éãäŸå㯠requirements-gpu.txt ã«åé¢ãããŠããã
Phase 1(mockãžã§ãã¬ãŒã¿)ã§ã¯äžèŠãæªå°å
¥ã§ãã¢ããªå
šäœãåäœãã
(rembg㯠server/preprocess.py ã§é
å»¶import + èªåã¹ããã)ã
Three.js ã¯ãã«ãå·¥çšãªãã§ web/vendor/ ã«ããŒã«ã«é
眮æžã¿
(three.module.js / OrbitControls.js / GLTFLoader.js / BufferGeometryUtils.js)ã
远å ã®npmã€ã³ã¹ããŒã«ã¯äžèŠã
Linux / macOS / WSL2:
./run.shWindows PowerShell:
.\run.ps1PowerShellã®å®è¡ããªã·ãŒã§ãããã¯ãããå Žåã¯ãã«ã¬ã³ãããã»ã¹ã®ã¿èš±å¯ããŠããèµ·åãã:
Set-ExecutionPolicy -Scope Process -ExecutionPolicy Bypass
.\run.ps1ããã©ã«ãã§ http://127.0.0.1:8000 ã§åŸ
ã¡åããããã©ãŠã¶ã§éããšUIã衚瀺ãããã
ç°å¢å€æ°ã§äžæžãå¯èœ:
IMAGE3D_GENERATOR=mock IMAGE3D_HOST=127.0.0.1 IMAGE3D_PORT=8000 ./run.shWindows PowerShellã§ã¯ $env: ã§æå®ãã:
$env:IMAGE3D_GENERATOR = "mock"
$env:IMAGE3D_HOST = "127.0.0.1"
$env:IMAGE3D_PORT = "8000"
.\run.ps1äž»ãªç°å¢å€æ°(server/config.py):
| 倿° | ããã©ã«ã | 説æ |
|---|---|---|
IMAGE3D_GENERATOR |
auto |
auto | mock | hunyuan3d | pixal3dãauto ã¯GPU+hy3dgenãå©çšå¯èœãªã hunyuan3dããªããã° mock ã«èªå解決(pixal3d ã¯å°çšvenvã§ã®æç€ºæå®ã®ã¿ããPixal3Dãžã§ãã¬ãŒã¿ãã®ç¯ãåç
§) |
IMAGE3D_HOST |
127.0.0.1 |
ãã€ã³ãã¢ãã¬ã¹ |
IMAGE3D_PORT |
8000 |
ããŒã |
IMAGE3D_MAX_UPLOAD_BYTES |
20971520(20MB) |
ã¢ããããŒãäžé |
IMAGE3D_DEFAULT_TARGET_HEIGHT_MM |
100 |
åŸåŠçã®ããã©ã«ãç®æšé«ã |
IMAGE3D_DEFAULT_MAX_FACES |
200000 |
åŸåŠçã®ããã©ã«ã颿°äžé |
mockãžã§ãã¬ãŒã¿ã§åäœããŠãã(ç»åãåæ ããªãéçºçšã®åºå®åœ¢ç¶ãè¿ã)ã
UIãããå³äžã®ãçæãšã³ãžã³ããããžããŸã㯠GET /api/health ã® generator ã§
確èªã§ãããmockæã¯UIäžéšã«èŠåãããŒã衚瀺ãããã察åŠ:
- GPUå°å
¥æé (åŸè¿°ã®Phase 2ç¯)ãå®äºãããã
IMAGE3D_GENERATORæªæå® (=auto)ãªããGPU+hy3dgenã䜿ããç°å¢ã§ã¯èªåçã«hunyuan3dãéžã°ããã - autoã§mockã«ãªã£ãŠããŸãå Žåã¯
IMAGE3D_GENERATOR=hunyuan3d ./run.shã§ æç€ºèµ·åããèµ·åãã°ã®ãšã©ãŒ(torch/hy3dgenæªå°å ¥ãCUDAäžå¯ç)ã確èªããã
# ãžã§ãäœæ
curl -s -X POST http://127.0.0.1:8000/api/jobs \
-F "image=@sample.png" \
-F 'params={"target_height_mm":100,"seed":42}'
# => {"job_id": "..."}
# ç¶æ
確èª(ããŒãªã³ã°)
curl -s http://127.0.0.1:8000/api/jobs/<job_id>
# ãã¥ãŒã¢çšGLBååŸ
curl -s http://127.0.0.1:8000/api/jobs/<job_id>/model.glb -o model.glb
# STLããŠã³ããŒã
curl -s "http://127.0.0.1:8000/api/jobs/<job_id>/download?format=stl" -o model.stl
# ãžã§ãäžèЧ / åé€ / ãã«ã¹ãã§ãã¯
curl -s http://127.0.0.1:8000/api/jobs
curl -s -X DELETE http://127.0.0.1:8000/api/jobs/<job_id>
curl -s http://127.0.0.1:8000/api/health
# ãã«ããã¥ãŒãžã§ãäœæ(Phase 3aãFR-9ãimage_back/left/rightã¯ä»»æ)
curl -s -X POST http://127.0.0.1:8000/api/jobs \
-F "image=@front.png" \
-F "image_back=@back.png" \
-F 'params={"seed":42}'
# ãã£ã©ã¯ã¿ãŒã·ãŒãåå²(Phase 3aããžã§ããäœããªãåæAPI)
curl -s -X POST http://127.0.0.1:8000/api/sheet/split -F "image=@sheet.png"å
šãšã³ããã€ã³ã㯠docs/SPEC.md §5 ãåç
§ã
.venv/bin/pytest tests/ -vtests/test_meshproc.py: æå³çã«ç©Žãéããã¡ãã·ã¥ã»æµ®éå°éšåãå«ãã¡ãã·ã¥ã«å¯Ÿãã watertightåã»ã¹ã±ãŒãªã³ã°ã»é¢æ°äžéã®æ€èšŒãtests/test_api.py: mockãžã§ãã¬ãŒã¿ã§ãžã§ãã®ã©ã€ããµã€ã¯ã«å šäœ (äœæâããŒãªã³ã°âcompletedâGLB/STL/3MF/OBJååŸâåé€)ãããã³äžæ£å ¥å(éç»åãã¡ã€ã«ã» 巚倧ãµã€ãºã»äžæ£JSONã»äžæ£ãã©ã¡ãŒã¿ã»äžæ£ãªcolor_mode/n_colors)ã®4xxå¿çãæ€èšŒã STLåºåã¯trimeshã§åèªèŸŒãwatertightã»é«ã(mm)ãæ©æ¢°æ€èšŒãããã«ã©ãŒã¢ãŒã (color_mode=color4)ã®E2Eãã¹ããå«ã(stats.paletteã»3MFãã«ããªããžã§ã¯ãã» GLBé ç¹ã«ã©ãŒã®æ€èšŒ)ãtests/test_colorproc.py: åæ4è²ãããã¯ç»å+åçŽã¡ãã·ã¥ã§ãé ç¹ã«ã©ãŒæåœ±ã» k-meanséåå(ãã¬ããæ°ãn_colors以äž)ã»è²ããšã®åå²(颿°åèšãå ã¡ãã·ã¥ãš äžèŽ)ã»ãã¬ããçµ±èš(face_ratioåèšâ1.0)ãæ€èšŒãtests/test_sheet.py: åæRGBAã·ãŒãç»å(éæèæ¯ã«é¢ããè²ä»ãã·ã«ãšãã3ã€)ã§ ããã«èªåæ€åº(é¢ç©ãã£ã«ã¿ã»è¿æ¥ããŒãžã»å·Šâå³ãœãŒã)ãšsuggested_viewæšå®ã rembgã«äŸåããæ±ºå®çã«æ€èšŒãtests/test_api.py(Phase 3a远å å): mockã§image+image_backã®2ãã¥ãŒ ãžã§ããcompletedããviewsãã£ãŒã«ããæ£ããèšé²ãããããšãããã³POST /api/sheet/splitãåæã·ãŒãç»åãã3ããã«ãæ€åºããããšãæ€èšŒãtests/test_texture.py(Phase 3c远å ): GPUäžèŠã®çŽé¢æ°texture.sample_vertex_colors_from_textureããåæUVå¹³é¢ã¡ãã·ã¥+ æ¢ç¥ã®4è²ãããã¯ãã¯ã¹ãã£ã§UVâãã¯ã»ã«å¯Ÿå¿ãæ€èšŒãtexture.is_available()ãboolåãè¿ãããšãæ€èšŒãtests/test_api.py(Phase 3c远å å):texture_modeã®äžæ£å€ã400ã«ãªãããšã/api/healthã«texgen_availableãå«ãŸããããšãmockç°å¢ã§texture_mode=paint(åäœã»color_mode=color4䜵çš)ãæå®ããŠããžã§ãã æ£åžžcompletedããããš(paint倱æâãã©ãŒã«ããã¯çµè·¯ã_run_paintã® ã¢ã³ããŒãããã§æ€èšŒãå®éã®paintæåçµè·¯ã¯GPU宿©æ€èšŒã§ã«ããŒ)ã
RTX PRO 6000 Blackwell (sm_120) äžã§åäœç¢ºèªæžã¿ã®æé ã
-
CUDA 12.8察å¿ãã©ã€ãã®ãã·ã³ã§ãcu128ãã«ãã®torch/torchvisionãå°å ¥ (Blackwellã¯cu128以éãå¿ é ã宿©æ€èšŒæã®ããŒãžã§ã³: torch 2.11.0+cu128 / torchvision 0.26.0+cu128):
.venv/bin/pip install --index-url https://download.pytorch.org/whl/cu128 torch torchvision
確èª:
.venv/bin/python -c "import torch; print(torch.cuda.get_device_name(0), torch.cuda.is_available())" -
Hunyuan3D-2 (hy3dgen) ããœãŒã¹ããcloneãã
--no-depsã§editableã€ã³ã¹ããŒã« (setup.pyã®install_requiresã«ã¯texgen/ãã¢çšéã®éãäŸå(gradio, xatlas, pygltflib, ninja, pybind11ç)ãå«ãŸããshapeãã€ãã©ã€ã³ã®ã¿ã®å©çšã§ã¯ äžèŠãªãããäŸåã¯åå¥ã«å°å ¥ãã):git clone https://github.com/Tencent/Hunyuan3D-2 third_party/Hunyuan3D-2 .venv/bin/pip install -e third_party/Hunyuan3D-2 --no-deps .venv/bin/pip install -r requirements-gpu.txt
requirements-gpu.txtã«ã¯ diffusers / transformers / einops / omegaconf / accelerate / opencv-python-headless / scikit-image / pymeshlab (shapeãã€ã ã©ã€ã³ã®postprocessorsãäŸå) ãš rembg / onnxruntime(CPUç)ãå«ãŸãããæ³šæ: rembg/hy3dgenç³»ã®äŸå解決ã«ãã numpy ã 2.xç³»ã«äžãã (
requirements.txtã¯numpy<3.0ã«ç·©åæžã¿ãtrimesh / fast-simplification / meshproc 㯠numpy 2.x ã§ãåé¡ãªãåäœããããšãç¢ºèªæžã¿)ã -
ãžã§ãã¬ãŒã¿ãåãæ¿ããŠèµ·å:
IMAGE3D_GENERATOR=hunyuan3d ./run.sh
ååçæãªã¯ãšã¹ãæã«ã¢ãã«ãHuggingFaceã®
tencent/Hunyuan3D-2ãªããžã㪠(hunyuan3d-dit-v2-0ãµããã©ã«ããæšæºshapeã¢ãã«ãçŽ9.2GB)ãã~/.cache/huggingfaceã«ããŠã³ããŒãããã以éã¯ããã»ã¹ã«åžžé§ãã (server/generators/hunyuan3d.pyãNFR-3)ã -
å®ç»åã§ã®å®æž¬çµæ(ãã¹ãç»å: ã¬ãããã¿ã®ãã£ã®ã¥ã¢åçã640x960ã
IMAGE3D_GENERATOR=hunyuan3dãsteps=30, octree_resolution=384ãRTX PRO 6000 Blackwellãä»ããã»ã¹ãVRAMçŽ30GB䜿çšäžã®ç¶æ ã§èšæž¬):- ãã€ãã©ã€ã³ããŒãæé(åå): çŽ15ç§
- çææé(ããŒãåŸãdiffusion + volume decoding): çŽ13ç§
- ãžã§ãå šäœ(ååŠçãåŸåŠçãcompleted): çŽ31ç§(NFR-1ã®60ç§ä»¥å ãéæ)
- VRAMããŒã¯: çŽ36.6GB(ä»ããã»ã¹åå«ããHunyuan3D-2èªäœã®çŽå¢åã¯çŽ7GB)
- çæã¡ãã·ã¥(åŸåŠçå): 386,134é ç¹ / 772,232é¢ãnon-watertight
- åŸåŠçåŸ(meshprocãmax_faces=200,000ãtarget_height_mm=100): 99,998é ç¹ / 200,000é¢ãwatertightãé«ã 100.01mm
-
ç°å¢å€æ°(
server/config.pyãå¿ èŠãªå Žåã®ã¿äžæžã):倿° ããã©ã«ã 説æ IMAGE3D_HY3DGEN_MODEL_PATHtencent/Hunyuan3D-2HuggingFaceãªããžããªID IMAGE3D_HY3DGEN_SUBFOLDERhunyuan3d-dit-v2-0䜿çšããshapeã¢ãã«ã®ãµããã©ã«ã(miniçã«åæ¿å¯) IMAGE3D_HY3DGEN_MODELS_DIR(hy3dgenæ¢å®ã® ~/.cache/hy3dgen)hy3dgenã®ããŒã«ã«ã¢ãã«ãã£ãã·ã¥æ¢çŽ¢å
Bambu Lab AMSãPrusa MMUçã®ãã«ããã£ã©ã¡ã³ãæ¹åŒã«ã©ãŒ3Dããªã³ã¿(æå€§4è²)
åãã®åºåã«å¯Ÿå¿ããããã¯ã¹ãã£çæAIã¯äœ¿ãããå
¥åç»å(èæ¯é€å»åŸ)ã
ã¡ãã·ã¥æ£é¢ããçŽäº€æåœ±ããŠé ç¹ã«ã©ãŒãååŸããk-meansã§2ã4è²ã«éååãã
ç°¡ææ¹åŒ(server/colorproc.py)ãæ£é¢ç»åã¯æ£é¢åŽã®é ç¹ã«ã®ã¿æåœ±ãã远å ãã¥ãŒã«
èé¢ç»åãããå Žåã¯èé¢åŽãžèé¢ç»åãæåœ±ãããèé¢ç»åãç¡ãå Žåãèé¢åŽãš
åŽé¢/äžäžã®ææ§ãªé ç¹ã¯ããŒã¹è²ã«ãªãã
- ãã©ã¡ãŒã¿ãã©ãŒã ã®ãã«ã©ãŒã¢ãŒã(4è²ããªã³ã¿åã)ãã«ãã§ãã¯ãå ¥ããã
- ãè²æ° (n_colors)ãã§2ã4ãéžæ(ããã©ã«ã4)ã
- çæåŸãã¢ãã«æ å ±ããŒã«éååããããã¬ãã(è²ãããâ +颿°æ¯ç%)ã衚瀺ãããã
- ãã¥ãŒã¢ã«ã¯é ç¹ã«ã©ãŒä»ãã¢ãã«ã衚瀺ããã(GLBã«
COLOR_0屿§ãšããŠåºåã three.jsã®GLTFLoaderãèªåã§é ç¹ã«ã©ãŒè¡šç€ºãã)ã - ãšã¯ã¹ããŒãã®ã3MFããã¿ã³ã§ããŠã³ããŒããããšãéåžžã®åè²3MFã§ã¯ãªã
è²ããšã«åå²ãããæå€§4ãªããžã§ã¯ã(åå
color_1ãcolor_4ã 衚瀺è²ä»ã)ãå«ã3MFãåŸããããSTL/OBJ/éåžžæ³å®ã®åäž3MFã¯åŸæ¥éã 圢ç¶ã®ã¿(è²æ å ±ãªã)ã
APIãã©ã¡ãŒã¿: params JSONã« color_mode("none" | "color4")ãš
n_colors(2ã4ãããã©ã«ã4)ãæå®ããã
curl -s -X POST http://127.0.0.1:8000/api/jobs \
-F "image=@sample.png" \
-F 'params={"color_mode":"color4","n_colors":4,"seed":42}'
# 3MF(ã«ã©ãŒã¢ãŒãæã¯è²ããšã«åå²ããããã«ããªããžã§ã¯ãç)
curl -s "http://127.0.0.1:8000/api/jobs/<job_id>/download?format=3mf" -o model_color.3mfãžã§ãå®äºæã® stats.palette ã«HEXã«ã©ãŒãšé¢æ°æ¯çãå
¥ã:
"palette": [
{"hex": "#090512", "face_ratio": 0.356},
{"hex": "#f0e1cc", "face_ratio": 0.249},
{"hex": "#b17f7a", "face_ratio": 0.230},
{"hex": "#753444", "face_ratio": 0.166}
]- äžèš3MFãã¡ã€ã«(
model_color.3mfçžåœãããŠã³ããŒãæã®ãã¡ã€ã«åã¯<job_id>_color.3mf)ãBambu Studio / PrusaSlicerãªã©å¯Ÿå¿ã¹ã©ã€ãµãŒã§éãã - 3MFå
ã«ã¯æå€§4åã®ãªããžã§ã¯ã(
color_1ãcolor_4)ãå¥ã ã®ããŒããšã㊠èªã¿èŸŒãŸãããåãªããžã§ã¯ãã¯ã¢ãã«æ å ±ããŒã®ãã¬ãã衚瀺ã»stats.paletteã®HEXã«å¯Ÿå¿ããè²ã§ãšã¯ã¹ããŒããããŠããã - ã¹ã©ã€ãµãŒã®ãªããžã§ã¯ã/ããŒãäžèЧããå
color_Nãéžæãã 察å¿ããAMS/MMUã¹ãããã®ãã£ã©ã¡ã³ãè²ãå²ãåœãŠã (ãã¬ããã®HEXã«è¿ãè²ã®ãã£ã©ã¡ã³ããéžã¶ãšå ç»åã®é è²ã«è¿ããªã)ã - éåžžã®ãã«ãã«ã©ãŒå°å·èšå®(ããŒãžã¿ã¯ãŒã»ãŠã©ãã·ã³ã°ã¿ã¯ãŒç)ã§ ã¹ã©ã€ã¹ããã
IMAGE3D_GENERATOR=hunyuan3dãcolor_mode=color4, n_colors=4, seed=42ã
å
¥åç»å momo.png(640x960ãã¬ãããã¿åç)ã§æ€èšŒ:
- ãžã§ãå®äºæé: çŽ34ç§
stats.palette: 4è²(é»ç³»ã»çæãã®æ¯è²ã»èè²ç³»ã»èèè²ã®4ã¯ã©ã¹ã¿)ã face_ratioåèš â 1.0- 3MFããŠã³ããŒã â trimeshã§åèªèŸŒ â ãžãªã¡ããªæ°4(
color_1ãcolor_4ã 颿°åèš200,000 = åè²åºåæãšåäž) - GLBã«
COLOR_0é ç¹ã«ã©ãŒå±æ§ãå«ãŸããthree.jsãã¥ãŒã¢ã§è²è¡šç€ºãç¢ºèª - å·Šå³ãã©ãŒæ€èšŒ: å
¥åç»åã¯é察称ãªç¹åŸŽ(å³è³ã®é»ãå
åŽããã«)ãæã€ããã
çæã¡ãã·ã¥ã®é ç¹ã«ã©ãŒãã¡ãã·ã¥æ£é¢(-Yåã)ããçŽäº€æåœ±ããŠå¯èŠåãã
ç»åã®å³åŽã«ããé»ãããã«ãã¡ãã·ã¥ã®+XåŽ(ç»åãæ£é¢ããèŠãŠå³åŽ)ã«
æ£ããåçŸãããããšã確èªããã
server/colorproc.pyã®_U_TO_X_SIGN=+1(ç»åu=0ã-XåŽãu=1ã+XåŽ)ããã®å®æ©æ€èšŒã§ç¢ºå®ããå€ã§ããã
è€æ°ãã¥ãŒç»å(æ£é¢å¿
é +èé¢/å·ŠåŽé¢/å³åŽé¢ã®ä»»æçµåã)ãã3Dã¢ãã«ãçæã§ããã
è€æ°ãã¥ãŒæã¯ Hunyuan3D-2 ã®ãã«ããã¥ãŒã¢ãã« hunyuan3d-dit-v2-mv
(ãªããžã㪠tencent/Hunyuan3D-2mvãåäžãã¥ãŒçšã® tencent/Hunyuan3D-2 ãšã¯
å¥ãªããžããªã§ããç¹ã«æ³šæ)ã䜿çšãããåäžç»åæã¯åŸæ¥éã
hunyuan3d-dit-v2-0 ã䜿çšãããäž¡ãã€ãã©ã€ã³ã¯å¥ã€ã³ã¹ã¿ã³ã¹ãšããŠ
å
±ååžžé§ãã(server/generators/hunyuan3d.py)ã
ãŸãã1æã®ãã£ã©ã¯ã¿ãŒã·ãŒãç»å(è€æ°ãã¥ãŒã䞊ãã ç»å)ãã被åäœããã«ã
èªåæ€åºããåããã«ãUIäžã§æ£é¢/èé¢/å·Š/å³ã®ããããã«å²ãåœãŠãŠçæã«
䜿çšã§ãã(server/sheet.py)ã
- å·Šãã€ã³ã1. ç»åã¢ããããŒããã§æ£é¢ç»åãã¢ããããŒããã(å¿ é )ã
- ã远å ãã¥ãŒ(ä»»æ)ãã®èé¢/å·ŠåŽé¢/å³åŽé¢ã®æ ã«ã察å¿ããç»åã ãã©ãã°&ãããããŸãã¯ã¯ãªãã¯ããŠã¢ããããŒããã(ããããçç¥å¯ã åå¥ã«ãÃã¯ãªã¢ãã§è§£é€å¯èœ)ã
- 远å ãã¥ãŒã1æä»¥äžæå®ãããšã鲿æ¬ä»è¿ã«ãNãã¥ãŒ(front/back/...)ã§ çæããšãã衚瀺ãåºãã
- ã3Dã¢ãã«ãçæããæŒããšãè€æ°ãã¥ãŒæã¯èªåçã«ãã«ããã¥ãŒãã€ãã©ã€ã³
(
hunyuan3d-dit-v2-mv)ã§çæãããã
APIã§ã¯ POST /api/jobs ã® multipart ãã£ãŒã«ããšã㊠image(æ£é¢ãå¿
é )ã«
å ã image_back / image_left / image_right(ä»»æ)ãéä¿¡ãã:
curl -s -X POST http://127.0.0.1:8000/api/jobs \
-F "image=@front.png" \
-F "image_back=@back.png" \
-F 'params={"seed":42}'ãžã§ãå®äºåŸãGET /api/jobs/<job_id> ã®å¿çã« views(äŸ:
["front", "back"])ãå«ãŸããå®éã«ã©ã®ãã¥ãŒã䜿ããããã確èªã§ããã
å远å ãã¥ãŒã«ãèæ¯é€å»(remove_bgæå®æ)ãé©çšããããã«ã©ãŒæåœ±
(color_mode=color4æã®é ç¹ã«ã©ãŒãFR-8)ã¯æ£é¢(front)ç»åãæ£é¢åŽã«äœ¿ãã
èé¢(back)ç»åãããã°èé¢åŽã«ã䜿çšããã
- å·Šãã€ã³ããã£ã©ã¯ã¿ãŒã·ãŒãåå²(ä»»æ)ãã®ãã·ãŒãç»åãéžãã§åå²ãã æŒããè€æ°ãã¥ãŒã1æã«äžŠãã ã·ãŒãç»åãéžæããã
POST /api/sheet/splitãåŒã°ããæ€åºãããããã«ããµã ãã€ã«äžèЧãšã㊠衚瀺ããããåããã«ã«ã¯å²åœã»ã¬ã¯ã(æ£é¢/èé¢/å·Š/å³/䜿ããªã)ãä»ãã åæå€ã¯å·Šããã®äžŠã³é ãã¥ãŒãªã¹ãã£ã¯ã¹(æ£é¢âåŽé¢âèé¢ã®é ãä»®å®)ã§ èªåæšå®ãããã- å¿ èŠã«å¿ããŠå²åœãä¿®æ£ããããã®å²åœã䜿çšããæŒããšãåããã«ç»åã 察å¿ããã¢ããããŒãæ¬(æ£é¢ç»åã»è¿œå ãã¥ãŒæ¬)ã«åæ ãããã
- éåžžéãçæãã©ã¡ãŒã¿ãèšå®ããŠã3Dã¢ãã«ãçæããæŒãã
ããã«èªåæ€åºã®ããžãã¯(server/sheet.py):
- 忝ãã¹ã¯ååŸ: RGBAç»åã§ã¢ã«ãã¡ã«æ å ±ãããã°ããã䜿çšãç¡ããã° rembgã§ãã¹ã¯ãååŸããããäžå¯ãªãåé ã®èæ¯è²ãšã®è²å·®ã§2å€åããã
- ãã¹ã¯ã®é£çµæåè§£æ(
scipy.ndimage.label)ãç»åå šäœã®1%æªæºã®æå㯠é€å»ããééãç»åå¹ ã®2%æªæºã®ããŠã³ãã£ã³ã°ããã¯ã¹å士ã¯ããŒãžããã - æ®ã£ãããã¯ã¹ãå·Šâå³(ååãªãäžâäž)ã«ãœãŒãããããã£ã³ã°ä»ãã§ åãåºã(æå€§6ããã«)ã
/api/sheet/split ã¯ãžã§ããäœããªãåæAPIã§ãæ°ç§ã§çµæãè¿ã:
curl -s -X POST http://127.0.0.1:8000/api/sheet/split -F "image=@sheet.png"
# => {"panels": [{"index": 0, "image_b64": "...", "suggested_view": "front"}, ...]}IMAGE3D_GENERATOR=hunyuan3dãfront=momo.png(640x960)ã
back=momo.pngã®å·Šå³å転ç»åãseed=42ãcolor_mode=color4, n_colors=4
ã®2ãã¥ãŒãžã§ãã§æ€èšŒ(ããŒã8021ã8020ã®æ¢åããã»ã¹ãšã¯å¥ããã»ã¹):
- mvã¢ãã«ååDLãµã€ãº: çŽ9.2GB
(
tencent/Hunyuan3D-2mvãsubfolderhunyuan3d-dit-v2-mvã~/.cache/huggingfaceã«ä¿åãåäžãã¥ãŒçšã¢ãã«ãšã¯å¥ãªããžããªã®ãã éè€ããŠDLããã)ã - çææé:
- åå(ã¢ãã«DLå«ã): ãžã§ãäœæããå®äºãŸã§çŽ135ç§ (ãã¡DL+ããŒã+çæãçŽ120ç§)ã
- 2åç®ä»¥é(ã¢ãã«åžžé§åŸ): ãžã§ãäœæããå®äºãŸã§çŽ22ç§ (NFR-1ã®60ç§ä»¥å ãéæ)ã
- çæã¡ãã·ã¥çµ±èš(åŸåŠçåŸãmax_faces=200,000ãtarget_height_mm=100): 99,972é ç¹ / 200,000é¢ãnon-watertightãé«ã 100.00mmã bbox (68.9 x 46.3 x 100.0) mmã
- GLB: é ç¹ã«ã©ãŒ(
COLOR_0)ä»ãã§åºåã99,972é ç¹åã®ã«ã©ãŒãä¿æã - 3MF: è²ããšã«åå²ããã4ãªããžã§ã¯ãã颿°åèš200,000 (åè²åºåæãšäžèŽ)ã
- STL: é«ã100.00mmãtrimeshã§åèªèŸŒå¯èœã
- åäžãµãŒãããã»ã¹äžã§åäžãã¥ãŒçšãã€ãã©ã€ã³(
hunyuan3d-dit-v2-0)ãš ãã«ããã¥ãŒçšãã€ãã©ã€ã³(hunyuan3d-dit-v2-mv)ãå ±ååžžé§ãã ããããåäžãã¥ãŒãžã§ãã»è€æ°ãã¥ãŒãžã§ããåé¡ãªãåŠçã§ããããšã確èªãã (VRAM: äž¡ã¢ãã«åžžé§æã§åèšäœ¿çšé çŽ46GBãä»ããã»ã¹åçŽ35.7GBå«ã)ã
åæRGBAã·ãŒãç»å(éæèæ¯ã«é¢ããè²ä»ãã·ã«ãšãã3ã€)ãšå®éã®UIæäœ
(ãã©ãŠã¶çµç±ã§ã®canvasçæã·ãŒãç»å)ã®äž¡æ¹ã§ã3ããã«ã®æ€åºã»
å·Šâå³ã®é åºã»suggested_view(front/left/back)ã®åææšå®ã»ããã«ç»åãžã®
åæ (æ£é¢ç»åãã¬ãã¥ãŒã»è¿œå ãã¥ãŒæ¬ãžã®èªåèšå®)ãç¢ºèªæžã¿
(tests/test_sheet.pyãtests/test_api.py)ã
ããã³ããšã³ãã®ã¿ã®æ¡åŒµ(ãµãŒãAPI倿Žãªã)ãweb/index.html / web/app.js /
web/viewer.js / web/style.css ã倿Žã
ã2. çæãã©ã¡ãŒã¿ããã©ãŒã æäžéšã«ããªã»ããã»ã¬ã¯ã¿ã远å ãéžæãã㚠察å¿ãããã©ã¡ãŒã¿ããã©ãŒã ã«äžæ¬åæ ãããã
| ããªã»ãã | target_height_mm | octree_resolution | max_faces | ã«ã©ãŒã¢ãŒã |
|---|---|---|---|---|
| ãã£ã®ã¥ã¢ | 100 | 384 | 200,000 | 倿Žãªã |
| å°åãã£ã®ã¥ã¢ | 60 | 256 | 100,000 | 倿Žãªã |
| ãã³ãã³ã | 40 | 256 | 80,000 | OFFã«åŒ·å¶ |
| é«ç²Ÿçް | 150 | 512 | 400,000 | 倿Žãªã |
å
é ã®ãã«ã¹ã¿ã ãã¯äœãåæ ããªãåæå€ãããªã»ããåæ åŸã«ãŠãŒã¶ãŒã
target_height_mm / octree_resolution / max_faces / ã«ã©ãŒã¢ãŒãã®
ãããããåå¥ã«å€æŽãããšãã»ã¬ã¯ã¿è¡šç€ºã¯èªåçã«ãã«ã¹ã¿ã ãã«æ»ã
(å®è£
㯠web/app.js ã® PRESETS å®çŸ©ãš change ã€ãã³ããªã¹ããŒ)ã
3Dãã¥ãŒã¢äžéšã®è¡šç€ºåæ¿ã«ããªãŒããŒãã³ã°ããã¿ã³ã远å (æ¢åã®
ã·ã§ãŒãã£ã³ã°/ã¯ã€ã€ãŒãã¬ãŒã ãšæä»)ãã¯ãªãã¯ãããšã衚瀺äžã¡ãã·ã¥ã®
颿³ç·ããäžåãåŸæè§ãç®åºããé ç¹è²ãšããŠä»¥äžã®é
è²ã§ãã€ã¯ãã
MeshBasicMaterial(ç
§æã®åœ±é¿ãåããé ç¹è²ããã®ãŸãŸè¡šç€º)ã«åãæ¿ããã
- æ¥å°é¢ä»è¿(ã¢ãã«é«ãã®äžç«¯2%æªæº): èé(ãµããŒãäžèŠ)ã
- äžåãåŸæè§ãéŸå€(æ¢å®45°)ãè¶ ããé¢: èµ€(è¶ é床åãã«å¿ããŠçœâ赀㮠ã°ã©ããŒã·ã§ã³)ã
- éŸå€ä»¥äžã®é¢: çœãèã°ã¬ãŒ(åŸæãå°ããã»ã©çœã«è¿ã)ã
ãªãŒããŒãã³ã°ã¢ãŒãäžã®ã¿éŸå€ã¹ã©ã€ããŒ(30°ã70°ã1°å»ã¿)ã衚瀺ãã
倿Žãããšãã®å Žã§ããŒãããããåèšç®ãã(ãµãŒãéä¿¡ãªãã
Viewer.setOverhangThreshold())ã
åŸæè§ã¯ãGLBããŒãæã«ã¯ãŒã«ã座æšå€æãã颿³ç·ãšã¯ãŒã«ãäžæ¹å
((0, -1, 0)ããã¥ãŒã¢ã¯çæã¡ãã·ã¥(Z-up)ãã©ãããŒã°ã«ãŒãã§X軞-90床å転ã
Y-upãšããŠè¡šç€ºããŠãããããã·ãŒã³å
ã§ã¯åžžã«Y軞ãé 圢ã®é«ãæ¹åã«ãªã)ãšã®
ãªãè§ããæ±ããã
ã·ã§ãŒãã£ã³ã°/ã¯ã€ã€ãŒãã¬ãŒã ã«æ»ããšãéé¿ããŠãããå
ã®ãããªã¢ã«ãš
é ç¹ã«ã©ãŒå±æ§(4è²ããªã³ãæã® COLOR_0 ç)ã埩å
ãã
(Viewer._backupAndApplyOverhang() / _restoreOriginalMaterials())ã
æ°ããã¢ãã«ãããŒããããšãªãŒããŒãã³ã°ã¢ãŒãã¯èªåçã«è§£é€ããã
衚瀺ã¯ã·ã§ãŒãã£ã³ã°ã«æ»ãã
IMAGE3D_GENERATOR=mock ã®ãµãŒã(ããŒã8021ã8020ã®æ¢åããã»ã¹ãšã¯å¥)ã§ã
æ¢åã®å®äºæžã¿ãžã§ã(4è²ã«ã©ãŒã®ã¬ãããã¿åœ¢ç¶ã99,972é ç¹/200,000é¢)ã
ãã¥ãŒã¢ã«ããŒããããã©ãŠã¶JSçµç±ã§ä»¥äžã確èªãã(æ°èŠãžã§ãã¯äœæããã
æ¢åãžã§ãã®åç
§ã®ã¿ã§æ€èšŒãããããžã§ãåé€ã¯äžèŠã ã£ã)ã
- ããªã»ãã4çš®ããããã§
target_height_mm/octree_resolution/max_facesããã©ãŒã ã«åæ ãããããšããã³ãã³ãéžææã«ã«ã©ãŒã¢ãŒãã OFFã«ãªãããšãåæ åŸã«åå¥ãã£ãŒã«ãã倿Žãããšã»ã¬ã¯ã¿ããã«ã¹ã¿ã ãã« æ»ãããšã確èªã - ãªãŒããŒãã³ã°ãã¿ã³æŒäžã§é ç¹ã«ã©ãŒå±æ§ãæžãæãããéŸå€45°æã«
99,972é ç¹äž èµ€(ãªãŒããŒãã³ã°)7,883ã»èé(æ¥å°é¢)1,723ã»
çœãã°ã¬ãŒ(å®å
š)90,366(ãã®ä»0)ã«åé¡ãããããšã確èª(æ°å€ã¯
geometry.getAttribute("color")ãçŽæ¥èªã¿åºããŠéèš)ã - éŸå€ã¹ã©ã€ããŒã30°ã«äžãããšèµ€å€å®é ç¹ã16,745ã«å¢å ã70°ã«äžãããš ããäžéš(è¡äžãªã©æ¥åŸæé¢ã®ã¿)ã«æžãããšã確èª(éŸå€ãšèµ€é¢ç©ãå調㫠é£å)ã
- ã¹ã¯ãªãŒã³ã·ã§ããã§èµ€(ãªãŒããŒãã³ã°: è ã®äžåŽã»è©ã»è¡äžç)/ çœ(å®å š)/èé(æ¥å°é¢)ã®3é è²ãèŠèªã§ããããšã確èªã
- ã·ã§ãŒãã£ã³ã°ãã¿ã³ã«æ»ããšãé ç¹ã«ã©ãŒãå
ã®ãã¬ããå€
(
[0.553, 0.345, 0.2]ç)ã«å®å šåŸ©å ããããããªã¢ã«ãå ã®ã«ã©ãŒè¡šç€ºã« æ»ãããšã確èªã
Hunyuan3D-2 ã® paint ãã€ãã©ã€ã³(hunyuan3d-paint-v2-0 + hunyuan3d-delight-v2-0)
ãçšããŠãçæã¡ãã·ã¥ã«å
šåšãã¯ã¹ãã£(UVå±é + 2048x2048ãã¯ã¹ãã£ç»å)ã
çŒã蟌ããtexture_mode=paint ãæå®ããå Žåã®ã¿å®è¡ããã(ããã©ã«ã none)ã
texgenã®å
éšã¬ã³ãã©(hy3dgen/texgen/differentiable_renderer)ã¯
custom_rasterizer_kernel ãšããCUDAæ¡åŒµ(pybind11 + CUDA C++)ãèŠæ±ããã
ãã®æ¡åŒµã¯ Hunyuan3D-2 ãªããžããªã«å梱ãããŠããããã«ãæžã¿ãã€ããªã¯
é
åžãããªãããã察象ãã·ã³ã§ãœãŒã¹ãããã«ãããå¿
èŠãããã
éèŠãªæ¢ç¥ã®èœãšã穎: ã·ã¹ãã ã® nvcc(nvcc --version ã§ç¢ºèª)ãš
torchã®CUDAãã«ã(python -c "import torch; print(torch.version.cuda)")ã®
ã¡ãžã£ãŒããŒãžã§ã³ãäžèŽããªããšãã«ãã«å€±æãããæ¬ãããžã§ã¯ãã®å®æ©ã¯
ã·ã¹ãã CUDAã13.0ãtorchãcu128(CUDA 12.8)ãã«ããšããäžäžèŽç°å¢ã ã£ããã
/usr/local/cuda-12.8 ã«å¥éCUDA 12.8ããŒã«ãã§ãŒã³ãçšæãããŠããããã
CUDA_HOME/PATH ã§æç€ºçã«ãã¡ããæå®ããŠãã«ãããããšã§è§£æ±ºãã
(torchããŒãžã§ã³ãã§ãã¯ã®åé¿çã¯äžèŠã ã£ã)ã
# 1. 远å ã®PythonäŸåãå°å
¥(shapeãã€ãã©ã€ã³ã®ã¿ã® --no-deps å°å
¥ã§ã¯
# å«ãŸããŠããªããã®ãrequirements-gpu.txtåç
§)
.venv/bin/pip install xatlas pybind11 ninja pygltflib
# 2. torchã®CUDAãã«ããšåãã¡ãžã£ãŒããŒãžã§ã³ã®CUDAããŒã«ãã§ãŒã³ãçšæããã
# ç¡ããã° https://developer.nvidia.com/cuda-12-8-0-download-archive çãã
# 該åœããŒãžã§ã³ã®toolkitã®ã¿(ãã©ã€ãã¯äžèŠ)ã远å ã€ã³ã¹ããŒã«ããã
ls /usr/local/ | grep cuda # äŸ: cuda-12.8 ãæ¢ã«ããã確èª
# 3. custom_rasterizer ããã«ãã»ã€ã³ã¹ããŒã«
cd third_party/Hunyuan3D-2/hy3dgen/texgen/custom_rasterizer
CUDA_HOME=/usr/local/cuda-12.8 PATH="/usr/local/cuda-12.8/bin:$PATH" \
TORCH_CUDA_ARCH_LIST="12.0" \
../../../../../.venv/bin/pip install . --no-build-isolation --no-deps
# 4. åäœç¢ºèª(torchãå
ã«importããªããšlibc10.soçã解決ã§ããªãç¹ã«æ³šæ)
.venv/bin/python -c "
import torch
import custom_rasterizer as cr
print('OK:', cr.rasterize)
"TORCH_CUDA_ARCH_LIST ã¯å¯Ÿè±¡GPUã®Compute Capabilityã«åããã
(RTX PRO 6000 Blackwell / sm_120 ã®å Žå㯠"12.0")ã
differentiable_renderer/mesh_processor(pybind11æ¡åŒµãmesh_processor.cpp)ã¯
ãã«ãäžèŠ: mesh_render.py 㯠from .mesh_processor import meshVerticeInpaint
ãšããããã±ãŒãžå
çžå¯Ÿimportã§èªã¿èŸŒããããåãã£ã¬ã¯ããªã®çŽPythonå®è£
(mesh_processor.py)ãPythonã®import解決ã§åªå
ãããã³ã³ãã€ã«æžã¿æ¡åŒµã
ç¡ããŠãåäœããã
æ¢ç¥ã®è¿œå ä¿®æ£(vendored ã³ãŒãã®ããã): å°å
¥ããdiffusersã®ããŒãžã§ã³
(0.39.0)ã§ã¯ãããŒã«ã«ã® custom_pipeline(hy3dgen/texgen/hunyuanpaint/)ã
DiffusionPipeline.from_pretrained(..., custom_pipeline=...) ã§ããŒãããéã«
trust_remote_code=True ãæç€ºããªããš ValueError ã«ãªã仿§å€æŽãå
¥ã£ãŠããã
third_party/Hunyuan3D-2/hy3dgen/texgen/utils/multiview_utils.py ã®
DiffusionPipeline.from_pretrained(...) åŒã³åºãã« trust_remote_code=True ã
远å ããããããé©çšæžã¿(ãã®ãªããžããªã«å梱ãããæ¢ç¥ã®ã³ãŒããèªã¿èŸŒã
ã ããªã®ã§å®å
š)ãthird_party ãäœãçŽãå Žåã¯åæ§ã®ããããå¿
èŠã«ãªãã
server/texture.py ã® is_available() ããäŸåimport(custom_rasterizer_kernel,
hy3dgen.texgen.Hunyuan3DPaintPipeline)ãšGPUæç¡ãå®ããŒãããã«ç¢ºèªãã
GET /api/health ã® texgen_available ã«åæ ããããã«ãæªå®æœã»GPUç¡ãç°å¢
ã§ã¯ false ã«ãªããUIã®ããã¯ã¹ãã£çæ(å®éšç)ããã§ãã¯ããã¯ã¹ã
ç¡å¹åããããã®ç°å¢ã§ã¯å©çšã§ããŸããããšè¡šç€ºããã(ãµãŒãAPIèªäœã¯
texture_mode=paint ãåŒãç¶ãåãä»ããããå®è¡æã«paintã倱æããå Žåãš
åæ§ã«gracefulã«ãã©ãŒã«ããã¯ãã)ã
paintå®è¡ã倱æããå Žå(ã¢ãã«æªDLã»OOMã»ãã®ä»äŸå€)ããžã§ã㯠failed ã«
ãããmeta.json ã® warnings ã«æ¥æ¬èªã¡ãã»ãŒãžãèšé²ããäžã§ãåŸæ¥ã®
æ£é¢/èé¢æåœ±æ¹åŒ(FR-8ãcolorproc.project_multiview_colors)ã«ãã color_mode=color4
åŠçãç¶è¡ããããžã§ãJSONã® textured ãã£ãŒã«ãã§å®éã«paintãæåããã
ã©ãããå€å®ã§ãã(true=ãã¯ã¹ãã£ä»ãGLBãfalse=ãã©ãŒã«ããã¯)ã
/api/healthã§texgen_available: trueã§ããããšã確èª(UIã§ã¯ ãã§ãã¯ããã¯ã¹ãæå¹è¡šç€ºãããŠããã°å©çšå¯èœ)ã- ãã©ã¡ãŒã¿ãã©ãŒã ã®ããã¯ã¹ãã£çæ(å®éšç)ãã«ãã§ãã¯ãå ¥ããŠçæããã
- å®äºåŸããã¥ãŒã¢çšGLB(
GET /api/jobs/<job_id>/model.glb)ã«ãã¯ã¹ã㣠(2048x2048 PNGãbaseColorTexture)ä»ãã®PBRãããªã¢ã«ãçŒã蟌ãŸããã STL/OBJ/éåžž3MFã¯åŸæ¥éã圢ç¶ã®ã¿ã color_mode=color4ãšäœµçšããå Žåãé ç¹ã«ã©ãŒã®ååŸå ã ãå ¥åç»åã®æ£é¢æåœ±ããããçŒã蟌ãŸãããã¯ã¹ãã£ãUVçµç±ã§ãµã³ããªã³ã°ã (server/texture.py: sample_vertex_colors_from_texture)ã«åãæ¿ããã å šåšã®å®éã®é è²ã«åºã¥ãã4è²3MFãçæããã(åŽé¢ã»èé¢ã®è²ãåæ ããã ãããFR-8åäœéçšæããé è²ç²ŸåºŠãäžãã)ã
curl -s -X POST http://127.0.0.1:8000/api/jobs \
-F "image=@sample.png" \
-F 'params={"texture_mode":"paint","color_mode":"color4","n_colors":4,"seed":42}'IMAGE3D_GENERATOR=hunyuan3dãtexture_mode=paintãcolor_mode=color4ã
n_colors=4ãseed=42ãå
¥åç»å momo.png ã§æ€èšŒ(æ€èšŒåŸãžã§ãã¯å逿žã¿):
- custom_rasterizer ã®ãã«ã:
/usr/local/cuda-12.8ãæç€ºæå®ããŠ1åç®ã® 詊è¡ã§æå(torchããŒãžã§ã³ãã§ãã¯åé¿çã®ããã¯äžèŠ)ã - paintãã€ãã©ã€ã³ååå®è¡:
hunyuan3d-paint-v2-0+hunyuan3d-delight-v2-0ã®HuggingFaceããã®ååããŠã³ããŒããå«ããŠå®äº(ãžã§ãå šäœã§çŽ104ç§)ã - 2åç®ä»¥é(ã¢ãã«åžžé§åŸ): ãžã§ãå šäœã§çŽ80ã100ç§(shapeçæ + åŸåŠç + paint)ã
- çæGLBã®æ€èšŒ: glTF JSONãçŽæ¥ããŒã¹ãã
materials[0].pbrMetallicRoughness .baseColorTextureãååšãimages[0](PNG, 2048x2048) ãåç §ãmeshes[0].primitives[0].attributesã«TEXCOORD_0ãå«ãŸããããšã確èªã trimeshã§ã®åèªèŸŒã§ãvisual.kind == "texture"ãã€material.baseColorTexture.size == (2048, 2048)ã確èªããã - 3MFããŠã³ããŒãã®ãžãªã¡ããªæ°: 4(
color_1ãcolor_4)ã job["textured"]ãtrueãjob["warnings"]ã空ã§ããããšã確èªã- VRAMããŒã¯: çŽ54.4GB(shapeãã€ãã©ã€ã³ + paintãã€ãã©ã€ã³ + delightã¢ãã« ãã¹ãŠåžžé§ããç¶æ ãNFRäžã®96GB VRAMäºç®å )ã
texture_mode=paintãã€color_mode=noneã®çµåãã§ãåæ§ã«ãã¯ã¹ãã£ä»ã GLBãçæãããããšã確èªã- æ€èšŒçšãµãŒã(ããŒã8021)ã¯æ€èšŒåŸã«åæ¢ãããã¹ããžã§ãã¯å šãŠåé€ããã
- custom_rasterizer ã®ãã«ãã«ã¯ãtorchã®CUDAãã«ããšã¡ãžã£ãŒããŒãžã§ã³ã
äžèŽããCUDAããŒã«ãã§ãŒã³ãå¥éå¿
èŠ(ã·ã¹ãã ã®nvccãšäžäžèŽãªå Žå)ã
ãã«ãç°å¢ãçšæã§ããªãå Žåã¯
texgen_available=falseãšãªãèªåçã« ãã©ãŒã«ããã¯ãã(ã¢ããªèªäœã¯å£ããªã)ã - paintãã€ãã©ã€ã³ã¯CPUå®è¡ãæ³å®ããŠããªã(
Hunyuan3DTexGenConfigãdevice='cuda'åºå®)ãGPUç¡ãç°å¢ã§ã¯is_available()ãåžžã«falseã è¿ãã - paintåŠç㯠shapeçæçšãã€ãã©ã€ã³ãšã¯å¥ã«VRAMãæ¶è²»ãã(delight +
multiviewæ¡æ£ + å
éšã¬ã³ãã©)ãçŽåãã¥ãŒ(NFR-2)ã«ããåæå®è¡ã¯é²ããã
ãã
target_height_mm/max_facesã倧ããããé«è§£å床ã¡ãã·ã¥ã§ã¯VRAM 䜿çšéãå¢ããç¹ã«æ³šæã - paintåŸã®ãã¯ã¹ãã£ã¯å šåšã6èŠç¹(æ£é¢/èé¢/å·Šå³/äž/äžçžåœ)ããã® ãã«ããã¥ãŒæ¡æ£çµæããã€ã¯ããæ¹åŒã®ããã现éšã®äžè²«æ§ã¯å ¥åç»åã® å質ã»è¢«åäœã®è€éãã«äŸåããã
- ç®ãªã©å°ããé«ã³ã³ãã©ã¹ããªç¹åŸŽã®ãºã¬ã»ã·ãŒã ã¯æ¢ç¥ã®éç:
æ£é¢ç»åã¯åç
§ã«ã®ã¿äœ¿ãããä»ã®5ãã¥ãŒã¯
Hunyuan3DPaintPipeline(third_party/Hunyuan3D-2/hy3dgen/texgen/pipelines.py)ããã«ããã¥ãŒ æ¡æ£ã¢ãã«ã§æ°èŠçæãããçæãã¥ãŒéã§ç®ã®äœçœ®ãå®å šã«ã¯äžèŽããã ãããã¡ãã·ã¥ãžãã€ã¯ããéã«ãºã¬ã»äºéåãã»èŒªéã®ã·ãŒã ãšã㊠çŸããããšãããã圫ãã®æµ ã(å¹³åŠã«è¿ã)ãžãªã¡ããªã®ã¬ãããã¿ç³»è¢«åäœ ã§ç¹ã«ç®ç«ã¡ãããã__call__(self, mesh, image)ã«steps/è§£å床çã® å質調æŽãã©ã¡ãŒã¿ã¯å ¬éãããŠããããã¢ããªåŽããã®ãã¥ãŒãã³ã°äœå°ã¯ ç¡ããæ£é¢ã®è²ç²ŸåºŠãåªå ãããå Žåã¯texture_mode=noneã«ããŠ åŸæ¥ã®æ£é¢/èé¢æåœ±(colorproc.project_multiview_colors)ãäœ¿ãæ¹ã ãºã¬ã¯åºãªããã360°ã®è³ªæã¯å€±ããåŽé¢ãåè²å¯ãã«ãªããã¬ãŒããªããããã hy3dgen/texgen/utils/multiview_utils.pyã«trust_remote_code=Trueã 远å ããããããå¿ èŠ(äžèšã»ããã¢ããåç §)ãthird_party ãã£ã¬ã¯ããªã åååŸ(git clone)ããå Žåã¯åé©çšãå¿ èŠã
Pixal3D(TencentARCãSIGGRAPH 2026ã
TRELLIS.2åºç€)ã3ã€ç®ã®ãžã§ãã¬ãŒã¿ãšããŠçµ±åããŠãããåäžç»åãã
PBRãã¯ã¹ãã£ä»ãã®3Dã¡ãã·ã¥ãçæããæ¬ã¢ããªã§ã¯ãã¯ã¹ãã£ã®
baseColorãé ç¹ã«ã©ãŒãšããŠãµã³ããªã³ã°ããŠæŽ»çšãã(GLBã¯é ç¹ã«ã©ãŒä»ãã§
ä¿åãcolor_mode=color4 ã§ã¯ãã®ã«ã©ãŒããéååã»è²åå²3MFãåºå)ã
Hunyuan3D-2 ãç¬èªã®ã³ãã¥ããã£ã©ã€ã»ã³ã¹(å°åå¶éã»MAUå¶é)ãªã®ã«å¯Ÿãã Pixal3D ã¯ã³ãŒããã¢ãã«éã¿ãMITã©ã€ã»ã³ã¹ã§ãããã©ã€ã»ã³ã¹é¢ã§ã®å¶çŽã å€§å¹ ã«å°ãªãã
GLBåã®ãã¯ã¹ãã£ãã€ã¯(o_voxel.postprocess.to_glb)ã«ã¯ UV空éã§ã®å¹³é¢
ã©ã¹ã¿ã©ã€ãºãå¿
èŠã§ãupstreamå®è£
㯠nvdiffrast(NVIDIA Source Code Licenseã
éåçšéå®)ã«äŸåããŠãããæ¬ã¢ããªã¯ãã®äŸåãé€å»ããããã
server/generators/pixal3d_raster.py ã« drtk(Meta補ãMITã
https://github.com/facebookresearch/drtk) ã§åãåŒã³åºãèŠçŽ
(RasterizeCudaContext / rasterize / interpolate)ãåçŸããã·ã ãå®è£
ãã
to_glb åŒã³åºãåã« o_voxel.postprocess.dr ããã®ã·ã ãžå·®ãæ¿ãã
(IMAGE3D_PIXAL3D_RASTERIZERãæ¢å® autoãè©³çŽ°ã¯æ¬¡ç¯)ã
ããã«ããæ¢å®æ§æã§ã¯ nvdiffrast ãäžå䜿çšãããGLBåçµè·¯ãMITã©ã€ã»ã³ã¹
ã¯ãªãŒã³ã«ãªããnvdiffrast㯠drtk ãå©çšã§ããªãç°å¢åãã®æç€ºçãã©ãŒã«ããã¯
ãšããŠã®ã¿æ®ããŠããã
ãã ããç»åæ¡ä»¶ä»ãã«äœ¿ã DINOv3 ã®éã¿(camenduru/dinov3-vitl16-pretrain-lvd1689mã
Metaã® facebook/dinov3-vit7b16-pretrain-lvd1689m ããã®èžçã¢ãã«)ã¯
Metaç¬èªã® DINOv3 License ã§ãããå®å
šãªMITã§ã¯ãªãç¹ã«æ³šæ
(åçšå©çšèªäœã¯èš±å¯ãããŠããããattribution衚瀺çã®ä»åž¯çŸ©åãããã
詳现ã¯ãå©çšããŠããOSSãç¯ã®å¥è¡šãåç
§)ã以äžãããPixal3Dæ§æã¯
ãã³ãŒãå
šäœãMITãã§ã¯ããããDINOv3éã¿ãå«ããæ§æå
šäœãšããŠã¯
å®å
šMITãšã¯èšããªã(éã¿ã»ã©ã€ã»ã³ã¹é¢ã§ã®å®å
šã¯ãªãŒã³ã§ã¯ãªã)ã
Pixal3D 㯠Python 3.10 ãšç¬èªã®äŸåãã³(trimesh==4.10.1 ç)ãèŠæ±ããããã
æ¢åã® .venv(Python 3.12)ãšã¯å®å
šã«åé¢ããå°çšvenv .venv-pixal3d ã䜿ãã
æ¢åvenvã«ã¯1ããã±ãŒãžã远å ããªããæé ã®è©³çŽ°ã»æ³šæç¹ã¯
requirements-pixal3d.txt ã®ã³ã¡ã³ãã«éçŽããŠãããèŠçŽ:
# 1. venväœæ + torch (Blackwellå¯Ÿå¿ cu128)
uv venv .venv-pixal3d --python 3.10
uv pip install --python .venv-pixal3d/bin/python torch torchvision \
--index-url https://download.pytorch.org/whl/cu128
# 2. pipäŸå
uv pip install --python .venv-pixal3d/bin/python -r requirements-pixal3d.txt
# 3. ãªããžããªclone(pipã€ã³ã¹ããŒã«ããsys.pathçµç±ã§importãã)
git clone https://github.com/TencentARC/Pixal3D third_party/Pixal3D
git clone -b main --recursive https://github.com/microsoft/TRELLIS.2.git third_party/TRELLIS.2
# 4. CUDAæ¡åŒµãã«ã(CUDA 12.8ããŒã«ãã§ãŒã³ãæç€ºãCUDACXXã®æç€ºãéèŠ â
# cmakeãã·ã¹ãã æ¢å®ã® /usr/bin/nvcc (CUDA 13.0) ãæŸããšglibcãããéäºæã§å€±æãã)
export CUDA_HOME=/usr/local/cuda-12.8
export CUDACXX=/usr/local/cuda-12.8/bin/nvcc
export PATH="$CUDA_HOME/bin:$PATH"
export TORCH_CUDA_ARCH_LIST="12.0"
uv pip install --python .venv-pixal3d/bin/python --no-build-isolation third_party/TRELLIS.2/o-voxel
# ã©ã¹ã¿ã©ã€ã¶: drtk (MIT) ãåªå
å°å
¥ãããgitçµç±ã®ãœãŒã¹ãã«ã (宿ž¬: sm_120ã§çŽ3å40ç§)ã
uv pip install --python .venv-pixal3d/bin/python --no-build-isolation \
"git+https://github.com/facebookresearch/drtk.git"
# nvdiffrast ã¯drtkã䜿ããªãå Žåã®ãã©ãŒã«ããã¯ã®ã¿ (éåçšã©ã€ã»ã³ã¹ãäžèšåç
§)ã
# drtkã®ã¿å°å
¥ããŠããã°çç¥å¯ã
uv pip install --python .venv-pixal3d/bin/python --no-build-isolation \
"git+https://github.com/NVlabs/nvdiffrast.git@v0.4.0"
# 5. NATTEN(NAFç¹åŸŽã¢ãããµã³ãã©ã®å¿
é äŸåãsm_120ãœãŒã¹ãã«ãã宿ž¬9å匷)
NATTEN_CUDA_ARCH="12.0" NATTEN_N_WORKERS=8 uv pip install \
--python .venv-pixal3d/bin/python natten==0.21.0 --no-build-isolationflash_attn ã¯å°å
¥ãããSDPAããã¯ãšã³ã(ATTN_BACKEND=sdpa /
SPARSE_ATTN_BACKEND=sdpa)ã䜿ã(Blackwellã§flash_attnã®ããªãã«ãã
torch ABIäžäžèŽã®ãã)ãã¢ãã«éã¿ã¯ååçææã«HuggingFaceããèªåDLããã
(TencentARC/Pixal3D çŽ23GB + DINOv3 çŽ1.2GB + NAFéã¿çŽ2.5MB)ã
env IMAGE3D_GENERATOR=pixal3d ATTN_BACKEND=sdpa SPARSE_ATTN_BACKEND=sdpa \
CUDA_HOME=/usr/local/cuda-12.8 \
.venv-pixal3d/bin/uvicorn server.main:app --host 127.0.0.1 --port 8022.claude/launch.json ã® image3d-server-pixal3d(ããŒã8022)ã«ãåãæ§æã
å®çŸ©æžã¿ãIMAGE3D_GENERATOR=auto ã§ã¯è§£æ±ºãããªã(æç€ºæå®ã®ã¿)ã
äž»ãªç°å¢å€æ°(server/config.py):
| 倿° | ããã©ã«ã | 説æ |
|---|---|---|
IMAGE3D_PIXAL3D_LOW_VRAM |
true |
äœVRAMã¢ãŒã(ã¢ãã«CPUåžžé§ãã¹ããŒãžããšã«GPUãž) |
IMAGE3D_PIXAL3D_RESOLUTION |
1024 |
ãã€ãã©ã€ã³è§£å床(1024 / 1536) |
IMAGE3D_PIXAL3D_FOV |
0.6 |
ã«ã¡ã©æ°Žå¹³FOV(ã©ãžã¢ã³)ãMoGeèªåæšå®ã¯äžäœ¿çš |
IMAGE3D_PIXAL3D_TEXTURE_SIZE |
2048 |
GLBåæã®ãã¯ã¹ãã£ãã€ã¯ãµã€ãº |
IMAGE3D_PIXAL3D_MODEL_PATH |
TencentARC/Pixal3D |
HFãªããžããªID |
IMAGE3D_PIXAL3D_RASTERIZER |
auto |
auto | drtk | nvdiffrastãGLBåã®UVãã¯ã¹ãã£ãã€ã¯ã«äœ¿ãã©ã¹ã¿ã©ã€ã¶ãauto ã¯drtk (MIT) ãimportå¯èœãªãdrtkã䜿ããç¡ããã°nvdiffrast (éåçšã©ã€ã»ã³ã¹) ã«ãã©ãŒã«ããã¯ããŠãã°åºåãããdrtk/nvdiffrast ãæç€ºæå®ããå Žåããããå©çšäžå¯ã ãšãšã©ãŒã«ãªã |
o_voxel.postprocess.to_glb ã¯UVã¢ãã©ã¹ãžã®ãã¯ã¹ãã£ãã€ã¯ã«
RasterizeCudaContext / rasterize / interpolate ã®3 APIã䜿ããupstream
å®è£
ã¯ããã nvdiffrast (NVIDIA Source Code Licenseãéåçšéå®) ã§åŒãã§ãããã
æ¬ã¢ããªã¯ server/generators/pixal3d_raster.py ã« drtk (Meta補ãMIT) ã§
åãåŒã³åºãèŠçŽã»æ»ãå€èŠçŽãåçŸããã·ã ãå®è£
ããPixal3DGenerator ã
to_glb åŒã³åºãçŽåã« o_voxel.postprocess.dr ããã®ã·ã ã«å·®ãæ¿ãã
(select_rasterizer_module / _inject_rasterizerãserver/generators/pixal3d.py)ã
- 座æšç³»ã®å·®(nvdiffrastã¯OpenGLåŒã§row0=ç»åäžç«¯ãdrtkã¯ãã¯ã»ã«åº§æšã§ row0=ç»åäžç«¯)ã¯ã·ã å ã§Y軞å転ã«ããåžåããã·ã ã®å ¥åºåã¯nvdiffrast äºæã®ãŸãŸç¶æããŠããã
- éå¿åº§æšã®é ç¹å¯Ÿå¿(nvdiffrastã®
u/vãã©ã®é ç¹ã®éã¿ã«å¯Ÿå¿ããã)ã¯ å®æ©ã§ã®A/Bæ€èšŒ(one-hoté ç¹å±æ§ãinterpolateã«éããåºåãšã®çžé¢ã確èª) ã§ç¢ºå®ããã(u=é ç¹0ã®éã¿ãv=é ç¹1ã®éã¿)ã - 宿©A/Bæ€èšŒ(ã©ã³ãã ãªUVã¡ãã·ã¥ãæ°çŸé¢ãnvdiffrastãšdrtkã·ã ã®äž¡æ¹ã§ ã©ã¹ã¿ã©ã€ãºãæ¯èŒ): face IDãããã®äžèŽç99.9%以äž(äžäžèŽã¯äžè§åœ¢å¢çã® 1pxå·®ã®ã¿)ãäžèŽããç»çŽ ã§ã®ããªã»ã³ããªãã¯åº§æšã»interpolateçµæã¯ æµ®åå°æ°ç¹èª€å·®çšåºŠ(æå€§å·® ~1e-6)ã§äžèŽããããšãç¢ºèªæžã¿ã
- drtkã»nvdiffrastã®ã©ã¡ããæªå°å
¥ã®å Žåã¯
RuntimeError(æç€ºçãªãšã©ãŒ) ã«ãªãã
| é ç® | Hunyuan3D-2(圢ç¶ã®ã¿) | Hunyuan3D-2(+texgen) | Pixal3D(1024ã»äœVRAMã»steps=30) |
|---|---|---|---|
| çææé(ã¢ãã«åžžé§åŸ) | 22ã35ç§ | 60ã90ç§ | çŽ97ç§(çæ+GLBå)+åŸåŠç21ç§ |
| åå远å (ã¢ãã«ããŒã) | æ°åç§ | æ°åç§ | çŽ50ã60ç§(23GB) |
| ããã»ã¹VRAMããŒã¯ | çŽ12GB | çŽ25GB | çŽ18.7GB |
| ãã¯ã¹ãã£/è² | ãªã(æåœ±æ¹åŒã§è²ä»ã) | å šåšãã¯ã¹ã㣠| å šåšPBRãã¯ã¹ãã£âé ç¹ã«ã©ãŒ |
| watertight | true(äœç©èšç®å¯) | true | false(ãã¯ã»ã«ãªã¡ãã·ã¥ç±æ¥ãäœç©ã¯0衚瀺) |
| ã¡ãã·ã¥çµ±èš(momo.png) | çŽ109cm³ / watertight | åå·Š | 98,107é ç¹ / 200,000é¢ / bbox 67.4Ã48.3Ã100.0mm |
| ãã¬ãã(color4) | æåœ±ããŒã¹ | ãã¯ã¹ãã£ãµã³ãã« | ãã¯ã¹ãã£ãµã³ãã«(çœ70% / 玺21% / ç°5% / èµ€4%) |
| ã©ã€ã»ã³ã¹ | ç¬èª(å°åã»MAUå¶é) | åå·Š | MIT(éã¿ãŸã§) â»DINOv3éã¿ã¯å¥ã©ã€ã»ã³ã¹ãäžèšOSSäžèЧåç § |
- Pixal3D ã®çææéã¯ååãžã§ãã§ããã« +2ã4åãããããšããã (FlexGEMMã«ãŒãã«autotuneã»ã©ã¹ã¿ã©ã€ã¶ã®JITã³ã³ãã€ã«ãååã®ã¿èµ°ãããã 2åç®ä»¥éã¯ãã£ã¹ã¯ãã£ãã·ã¥ã§é«éå)ã
- äœVRAMã¢ãŒã(æ¢å®)ã¯ã¹ããŒãžããšã«ã¢ãã«ãGPUãžèŒãæ¿ããããé
ãã
ããŒã¯VRAMãæããã96GBç°å¢ã§ã¯
IMAGE3D_PIXAL3D_LOW_VRAM=false+IMAGE3D_PIXAL3D_RESOLUTION=1536ã§å質ã»é床ãäžãããã(æªèšæž¬)ã
drtkããã¯ãšã³ãã§ã®E2Eåæ€èšŒ(2026-07-09ãããŒã8022ã
IMAGE3D_PIXAL3D_RASTERIZER=drtkæç€ºæå®ãmomo.pngãseed=42ãcolor_mode=color4):
| é ç® | nvdiffrastããã¯ãšã³ã(ãžã§ã58d8e1d0) | drtkããã¯ãšã³ã(ãžã§ãb716c24aãæ¬æ€èšŒ) |
|---|---|---|
| ç·æèŠæé(ã¢ãã«ããŒã蟌ã¿) | â | 121ç§(ã¢ãã«ããŒãå«ãååå®è¡) |
| é ç¹æ° | 98,107 | 98,105 |
| 颿° | 200,000 | 200,000 |
| bbox (mm) | 67.37 Ã 48.30 Ã 100.02 | 67.38 Ã 48.35 Ã 100.03 |
| watertight | false | false |
| ãã¬ãã(color4) | çœ70% / 玺21% / ç°5% / èµ€4% | çœç³»44% / æ°Žè²ç³»28% / 玺系23% / ç°ç³»5%(æ§ææ¯) |
é ç¹æ°ã»é¢æ°ã»bboxã¯ã»ãŒå®å šã«äžèŽããŠãããdrtkããŒã¹ã®ã©ã¹ã¿ã©ã€ãºã nvdiffrastçãšå¹ŸäœåŠçã«ç䟡ãªçµæãçæããããšã確èªãã(GLBã®é ç¹ã«ã©ãŒã æ£åžžã«ãµã³ããªã³ã°ã»ä¿åãããŠããããšãç¢ºèªæžã¿)ããã¬ããã®æ£ç¢ºãªè²çžã» æ§ææ¯ã¯ãžã§ãéã§å·®ãããããããã¯æ¡æ£ãµã³ããªã³ã°ãã®ãã®ã®å®è¡ééæ±ºå®æ§ (torch/CUDAã®attentionã«ãŒãã«ç)ã«ãããã®ã§ãã©ã¹ã¿ã©ã€ã¶å·®ãšã¯ç¡é¢ä¿ (é ç¹/颿°/bboxã®ã¡ãã·ã¥åœ¢ç¶èªäœã¯åäžã·ãŒãã§åçŸããŠãããã)ã
- ãã«ããã¥ãŒå
¥å(FR-9)é察å¿:
image_backçãæå®ãããšãžã§ã㯠æç€ºçãªãšã©ãŒã§å€±æãããåäžç»åå°çšã - texture_mode=paint é察å¿: texgen 㯠hy3dgen äŸåã®ãã
.venv-pixal3dã§ã¯å©çšäžå¯(paintæå®æã¯èŠåãèšé²ããŠæåœ±æ¹åŒã«ãã©ãŒã«ããã¯)ã ãããã Pixal3D èªäœãå šåšãã¯ã¹ãã£ãçæããããäžèŠã - ãã©ã¡ãŒã¿ã¯ steps / seed ã®ã¿æ¥ç¶: guidance_scale / octree_resolution 㯠Pixal3D ã®ã¹ããŒãžããšã«èª¿æŽæžã¿ã®æ¢å®å€ãšäºææ§ãç¡ãããç¡èŠãããã steps ã¯ããã©ã«ã30ã ããPixal3D å ¬åŒããã©ã«ãã¯12(30ã§ãåäœããã ãµã³ããªã³ã°ãé ããªããé床åªå ãªã steps=12 ãæå®)ã
- èæ¯é€å»å¿
é : Pixal3D å
¬åŒã®èæ¯é€å»ã¢ãã«(briaai/RMBG-2.0)ã¯HFã®
ã²ãŒãä»ããªããžããªã®ããããŒããããæ¬ã¢ããªã®èæ¯é€å»(rembg CPU)ã®
çµæãæž¡ãã
remove_bg=falseã§ã¢ã«ãã¡ç¡ãç»åãéããšãšã©ãŒã«ãªãã - watertightã«ãªããªã: ãã¯ã»ã«ãªã¡ãã·ã¥åºåã¯éãããœãªããã§ã¯ãªãã äœç©ã¯0ãšè¡šç€ºããããã¹ã©ã€ãµãŒã§ã®å°å·ã¯éåžžåé¡ãªãããäœç©ããŒã¹ã® èŠç©ãã¯ã§ããªãã確å®ãªwatertightãå¿ èŠãªã hunyuan3d ã䜿ãã
- UVã·ãŒã ç±æ¥ã®é ç¹åæã¯èªå修埩:
o_voxelã®GLBåºåã¯UVã¢ãã©ã¹å¢çã§ é ç¹ãè€è£œããæ°äžåã®é£çµæåã«åæãããŠããããããžã§ãã¬ãŒã¿å ã§ é ç¹æº¶æ¥(merge_vertices)ããŠããåŸåŠçã«æž¡ã(ãããå€ããš æµ®éå°éšåé€å»ãæ¬äœè¡šé¢ãåé€ããŠããŸããserver/generators/pixal3d.pyåç §)ã - 座æšç³»: Pixal3D ã®GLBåºå㯠äž=-Z / æ£é¢=+Y(宿ž¬ç¢ºèª)ãX軞ãŸãã 180°åè»¢ã§æ¬ã¢ããªã® Z-up / æ£é¢=-Y ã«å€æããŠããã
- ã«ã¡ã©FOVã¯åºå®å€: å
¬åŒã® MoGe ã«ããèªåFOVæšå®ã¯å°å
¥ããŠããªã
(
IMAGE3D_PIXAL3D_FOVãæ¢å®0.6rad â 34°)ãå ¥åç»åã®é è¿æã匷ãå Žå㯠調æŽã®äœå°ãããã
image-3d/
âââ docs/ # 仿§æžã»éçºæ¹éã»å®è£
èšç»
âââ server/
â âââ main.py # FastAPIãšã³ããªãã€ã³ã
â âââ config.py # èšå®(ç°å¢å€æ°)
â âââ jobs.py # ãžã§ã管çã»çŽåå®è¡ãã¥ãŒã»æ°žç¶å
â âââ generators/
â â âââ base.py # Generatoræœè±¡åºåº
â â âââ mock.py # mockãžã§ãã¬ãŒã¿
â â âââ hunyuan3d.py # Hunyuan3D-2ã©ãã(Phase 2ãPhase 3aã§mvãã€ãã©ã€ã³è¿œå )
â â âââ pixal3d.py # Pixal3Dã©ãã(MITã©ã€ã»ã³ã¹ãå°çšvenv .venv-pixal3d ã§äœ¿çš)
â âââ preprocess.py # ç»åååŠç(èæ¯é€å»ã»ãªãµã€ãº)
â âââ meshproc.py # ã¡ãã·ã¥åŸåŠç
â âââ colorproc.py # 4è²ã«ã©ãŒããªã³ã察å¿(Phase 2.5ãé ç¹ã«ã©ãŒæåœ±ã»éååã»åå²)
â âââ sheet.py # ãã£ã©ã¯ã¿ãŒã·ãŒãèªååå²(Phase 3aãããã«æ€åº)
â âââ texture.py # ãã¯ã¹ãã£çæ texgen çµ±å(Phase 3cãpaintåžžé§ã©ããã»é ç¹ã«ã©ãŒãµã³ããªã³ã°)
âââ web/ # éçããã³ããšã³ã
âââ tests/ # pytest
âââ data/jobs/ # çæç©(gitignore察象)
âââ third_party/Hunyuan3D-2/ # hy3dgenæ¬äœ(git cloneãPhase 2ãgitignore察象)
âââ third_party/Pixal3D/ # Pixal3Dæ¬äœ(git cloneãgitignore察象)
âââ third_party/TRELLIS.2/ # o-voxelãã«ãçš(git cloneãgitignore察象)
âââ requirements.txt # baseäŸå
âââ requirements-gpu.txt # Phase 2çšè¿œå äŸå
âââ requirements-pixal3d.txt # Pixal3Dçšéé¢venv (.venv-pixal3d) ã®äŸå(ã»ããã¢ããæé 蟌ã¿)
âââ run.sh
âââ README.md
mockãžã§ãã¬ãŒã¿ã§åäœããŠããŸããUIãããå³äžã®ãçæãšã³ãžã³ããããžã
mock ã«ãªã£ãŠããªãã確èªããŠãã ãã(mockæã¯ç»é¢äžéšã«èŠåãããŒãåºãŸã)ã
察åŠã¯ãã¢ããããŒãç»åãšç¡é¢ä¿ãªãã¹ã圢ç¶ãçæããããšãããåç
§ã
æ§ããŒãžã§ã³ã®ã¢ããªã§ã¯ IMAGE3D_GENERATOR=hunyuan3d ãæç€ºæå®ããŠãã ãã
(auto ã¯æ°ããŒãžã§ã³ã®ã¿å¯Ÿå¿)ã
UIãAPIã®åäœç¢ºèªã¯mockãžã§ãã¬ãŒã¿ã§GPUäžèŠã§è¡ããŸãããã ãå®éã®ç»åãã 3Dãçæããã«ã¯NVIDIA GPUãå¿ é ã§ã(圢ç¶çæã®ã¿ VRAM 16GB以äžããã¯ã¹ã㣠çæäœµçšã¯ 32GB以äžã宿ž¬å€ã¯ãVRAMæå°èŠä»¶ãã®è¡šãåç §)ãCPUã®ã¿ã§ã®å®çæã¯ ãµããŒãããŠããŸããã
æ¬READMEèšèŒã®å®æž¬ç°å¢(RTX PRO 6000)ã§ã圢ç¶ã®ã¿çŽ20ã40ç§ããã¯ã¹ãã£çæ 䜵çšã§çŽ60ã90ç§ã§ããååã ãã¯ã¢ãã«ã®ããŠã³ããŒã(åäžãã¥ãŒçŽ9.2GBã ãã«ããã¥ãŒçŽ9.2GBããã¯ã¹ãã£çšã¢ãã«æ°GB)ãšããŒã(åæ°ç§ã)ãå ããããã æ°åãæ°ååãããããšããããŸãã2åç®ä»¥éã¯ã¢ãã«ãåžžé§ããããéããªããŸãã
HuggingFaceã®ãã£ãã·ã¥(æ¢å® ~/.cache/huggingface)ã«ä¿åãããŸãã
äžåºŠããŠã³ããŒãããã°ã以éã®çæã¯ã€ã³ã¿ãŒãããæ¥ç¶ãªãã§åäœããŸãã
å€ãã®å Žåãã®ãŸãŸå°å·ã§ããŸããåŸåŠçã§ç©Žåãã詊ã¿ãŠãéããããªãã£ã
ããšã瀺ã衚瀺ã§ãæè¿ã®ã¹ã©ã€ãµãŒ(Bambu Studio / PrusaSlicer ç)ã¯èªã¿èŸŒã¿æã«
èªå修埩ããŸããæ°ã«ãªãå Žå㯠octree_resolution ã1段äžãããseed ãå€ããŠ
åçæãããã¹ã©ã€ãµãŒã®ä¿®åŸ©æ©èœ(ãŸãã¯Windowsã®3D Builderç)ã䜿ããã®
ããããã§è§£æ¶ã§ããããšãå€ãã§ãã
ã«ã©ãŒã¢ãŒãã§åºåãã3MFã«ã¯ color_1ãcolor_4 ã®æå€§4ãªããžã§ã¯ãã
å
¥ã£ãŠããŸããBambu Studio / PrusaSlicer ã§éãããªããžã§ã¯ãããšã«
AMS / MMU ã®ãã£ã©ã¡ã³ã(ã¹ããã)ãå²ãåœãŠãŠã¹ã©ã€ã¹ããŠãã ããã
ã¢ããªã®ããã¬ããã衚瀺(è²ããã+æ¯ç)ãåãªããžã§ã¯ãã®è²ã®ç®å®ã§ãã
n_colors ãã©ã¡ãŒã¿ã§2ã4è²ãæå®ã§ããŸãã5è²ä»¥äžã¯å¯Ÿå¿ããŠããŸãã
(4ã¹ãããã®AMSãæ³å®ãã仿§ã§ã)ã
èªååå²ã¯ããã«å士ãé¢ããŠããŠèæ¯ãšã®ã³ã³ãã©ã¹ããããæ§å³ãåæãšãã ç°¡æè§£æã§ããæ€åºã«å€±æããå Žåã¯ãã·ãŒããç»åç·šéãœããã§åãåããŠã æ£é¢/èé¢/åŽé¢ã®åã¢ããããŒãæ¬ã«åå¥ã«ç»é²ããŠãã ãã(çæå質ã¯åãã§ã)ã
ãã®ç°å¢ã§texgen(CUDAæ¡åŒµ)ãå©çšã§ããªãããšã瀺ããŸã(/api/health ã®
texgen_available ã false)ããPhase 3cãç¯ã®ãã«ãæé (torchã®CUDAããŒãžã§ã³ãš
äžèŽããCUDAããŒã«ãã§ãŒã³ãå¿
èŠ)ã宿œããŠãã ããããã«ãããªããŠãã
æ£é¢æåœ±æ¹åŒã®4è²ã«ã©ãŒåºå(FR-8)ã¯å©çšã§ããŸãã
ãç®æšé«ã(mm)ãã§åºåãµã€ãºãæå®ã§ããŸã(æ¢å®100mmãZ軞é«ãåºæºã§ ã¹ã±ãŒãªã³ã°+æ¥å°æžã¿)ã颿°ã¯æ¢å®20äžé¢ã§äžè¬çãªFDMå°å·ã«ã¯ååã§ãã ããªã»ãã(ãã£ã®ã¥ã¢/å°åãã£ã®ã¥ã¢/ãã³ãã³ã/é«ç²Ÿçް)ã䜿ããšã é«ãã»è§£å床ã»é¢æ°ããŸãšããŠåãæ¿ããããŸãã
ã§ããŸãããæ¬ã¢ããªã¯ããªã³ãå¯èœãªã¡ãã·ã¥ããŒã¿(STL/3MF)ã®çæãŸã§ãæ åœãã ã¹ã©ã€ã¹ã¯ã¹ã©ã€ãµãŒ(Bambu Studio / PrusaSlicer / Cura ç)ã®åœ¹å²ã§ã(SPEC.md §7)ã ãã¥ãŒã¢ã®ããªãŒããŒãã³ã°ã衚瀺ã§ããµããŒããå¿ èŠã«ãªããããªç®æ(æ¢å®45Â°è¶ )ã äºåã«ç¢ºèªã§ããŸãã
æ¬ãããžã§ã¯ãã®ã³ãŒã㯠Polyform Small Business License(å°èŠæš¡äºæ¥è ãŸã§åçšå¯)ã§ãããçæã«äœ¿ãHunyuan3D-2ã¢ãã«ã¯Tencentã®ã³ãã¥ãã㣠ã©ã€ã»ã³ã¹ã«å¥éåŸãå¿ èŠããããŸã(å©çšå°åã»èŠæš¡ã®å¶éãã)ã 詳现ã¯ãã©ã€ã»ã³ã¹ãç¯ãåç §ããŠãã ããã
åcloneæã¯vendoredããã(hy3dgen/texgen/utils/multiview_utils.py ã®
trust_remote_code=True)ã®åé©çšãå¿
èŠã§ãããPhase 3cãç¯ã®æé ãåç
§ããŠãã ããã
- mockãžã§ãã¬ãŒã¿ã¯ç»åå
容ãåæ ããªã決å®çãªåœ¢ç¶(seedã§ããªãšãŒã·ã§ã³)ãè¿ãã
å®éã®ç»åã«åºã¥ãçæã«ã¯Phase 2ã§ã®Hunyuan3D-2å°å
¥ãå¿
èŠãmockãžã§ãã¬ãŒã¿ã¯
ãã«ããã¥ãŒå
¥å(
extra_views)ãç¡èŠãã(åäžãã¥ãŒçšã®æ±ºå®ç圢ç¶ãè¿ã)ã - ãã«ããã¥ãŒçæ(FR-9)ã¯
hunyuan3d-dit-v2-mvã¢ãã«(çŽ9.2GBãåäžãã¥ãŒçš ã¢ãã«ãšã¯å¥ãªããžããªtencent/Hunyuan3D-2mv)ã®è¿œå ããŠã³ããŒããå¿ èŠã å³å¯ãªãã«ããã¥ãŒå¹ŸäœæŽå(æ£é¢ã»èé¢ã»åŽé¢ã®å®å šãªåœ¢ç¶äžèŽ)ã¯ã¢ãã«èªäœã® æ§èœã«äŸåããæ¬ã¢ããªåŽã§ã®è£æ£ã¯è¡ããªã(SPEC.md §7ã®å¶çŽéã)ã - ãã£ã©ã¯ã¿ãŒã·ãŒãèªååå²(
server/sheet.py)ã¯ãããã«å士ãæç¢ºã«é¢ã㊠ããã»èæ¯ãšã®ã³ã³ãã©ã¹ããããæ§å³ãåæãšããç°¡æçãªé£çµæåè§£æã§ããã ããã«ãè€éã«éãªãã»èæ¯ãšè¢«åäœã®è²ãè¿ãã·ãŒãã§ã¯èª€æ€åºããå Žåããã (ãã®å Žåã¯UIäžã§æåä¿®æ£ãå¿ èŠ)ã - ãã¯ã¹ãã£çæAIã«ããã«ã©ãŒ3Dããªã³ã(Hunyuan3D-2 paint pipeline)ã¯
Phase 3cã§
texture_mode=paintãšããŠå¯Ÿå¿æžã¿(äžèšãPhase 3cãåç §)ã ãã«ãã»äŸåãå©çšã§ããªãç°å¢ã§ã¯èªåçã«ç¡å¹åãããPhase 2.5ã® å ¥åç»åã®æ£é¢/èé¢æåœ±+k-meanséååã«ããç°¡æ4è²å¯Ÿå¿(server/colorproc.py)ã« ãã©ãŒã«ããã¯ããã hy3dgenã¯PyPIæªé åžã®ãããthird_party/Hunyuan3D-2ãgit cloneããŠã® editableã€ã³ã¹ããŒã«(--no-deps)ãå¿ èŠã- Hunyuan3D-2ã®çæã¡ãã·ã¥ã¯éwatertightã§è¿ãå Žåãéåžžã§ããã
meshproc.process()ã®åŸåŠç(穎åãã»ç°¡ç¥å)ã«ããå®çšäžã®watertightåã è¡ãããŸãã«è€éãªåœ¢ç¶ã§åŸåŠçåŸãwatertightåã«å€±æããå Žåãããã ãã®éã¯stats.watertight=falseãšããŠUIã«æç€ºããã(SPEC.md FR-4)ã - ã«ã©ãŒã¢ãŒã(FR-8)ã¯èæ¯é€å»æžã¿ç»åã®æ£é¢/èé¢æåœ±ã§é ç¹ã«ã©ãŒã決ããã 远å ãã¥ãŒã«èé¢ç»åãç¡ãå Žåãèé¢åŽãšåŽé¢/äžäžã®ææ§ãªé ç¹ã¯ããŒã¹è²ã« ãªããããå®éã®åŽé¢ã»èé¢ã®é è²ãšã¯äžèŽããªãå Žåãããã
- 3MFã®è²ããšã®ãµãã¡ãã·ã¥(
color_1ãcolor_4)ã¯åäœã§ã¯watertightãš éããªã(ç©å±€æ¹åŒã®ãã«ãã«ã©ãŒå°å·ã§ã¯éåžžåé¡ã«ãªããªã)ã - ãã¬ããéååã¯RGBè²ç©ºéã§ã®åçŽãªk-means(scipy.cluster.vq.kmeans2)ã§ ãããç¥èŠè²å·®(CIE Labç)ã¯èæ ®ããŠããªãã
ãã®ãªããžããª(server/ã»web/ã»docs/ã»tests/ çãæ¬ãããžã§ã¯ãã®ãªãªãžãã«
ã³ãŒã)㯠Polyform Small Business License 1.0.0 ã®äžã§æäŸãããŸãã
èŠçŽ(æ³çææåãããã®ã¯LICENSEæ¬æã®ã¿ã§ã)ãHunyuan3D-2 /
Pixal3D(DINOv3)ãæå¹ã«ããå Žåã®æå®ã®è¬èŸã»Noticeæèšã¯
NOTICE ã«ãŸãšããŠãããŸã(UIã«ã IMAGE3D_GENERATOR=pixal3d æã«
"Built with DINOv3" ã衚瀺ããŸã):
-
éåçšå©çšã¯èª°ã§ãèªç±ã«å¯èœã
-
åçšå©çšããå©çšè ã®æå±çµç¹ã
- åŸæ¥å¡ã»æ¥åå§èšè ãåãããŠ100äººæªæºããã€
- çŽè¿ã®èª²çšå¹ŽåºŠã®ç·åçã100äžUSDæªæº(1982ã1984å¹Žåºæºã®CPIã§ç©äŸ¡èª¿æŽ)
ã®ãå°èŠæš¡äºæ¥è ãã«è©²åœããå Žåã¯èš±å¯ãããŸããäžèšæ¡ä»¶ãæºãããªãå€§äŒæ¥ ã«ããåçšå©çšã®ã¿ãå¶éãããŸãã
-
å人å©çšã»å°èŠæš¡å£äœã®åçšå©çšã¯äžèšã®éãèš±å¯ããããããæ¡ä»¶ãé€å€(èš±å¯) ããŠããŸãã
third_party/Hunyuan3D-2 ã¯å¯Ÿè±¡å€: ãã®ãªããžããªã«ã¯å«ãŸãã(.gitignore
察象)ãå©çšè
ãå¥é git clone ããŠå°å
¥ããŸããTencentã®
TENCENT HUNYUAN 3D 2.0 COMMUNITY LICENSE AGREEMENT
(third_party/Hunyuan3D-2/LICENSE)ãªã©ãããããã®é
åžå
ã®ã©ã€ã»ã³ã¹æ¡ä»¶ã«
åŸã£ãŠãã ãã(å©çšå°åå¶éã»å©çšè
æ°ã«å¿ãã远å 蚱諟èŠä»¶ãªã©ãå®ããããŠ
ããŸã)ã
third_party/Hunyuan3D-2/LICENSE(2026-07æç¹ã®åæ)ã«åºã¥ãèŠçŽã
æ³çææåãããã®ã¯åæã®ã¿ã§ãããæ¬ç¯ã¯æ³çå©èšã§ã¯ãããŸããã
å©çšæ¡ä»¶(䜿ãã ãã®å Žåãé©çš):
- å°å: EUã»è±åœã»éåœã§ã¯å©çšäžå¯(Territoryå€)ãçæç©(Output)ã Territoryå€ã§äœ¿çšã»è¡šç€ºããããšã蚱諟ãããªãã
- èŠæš¡: å šè£œåã»ãµãŒãã¹åèšã®æéã¢ã¯ãã£ããŠãŒã¶ãŒã100äžäººãè¶ ãã äºæ¥è ã¯ãTencentãžã®å¥éã©ã€ã»ã³ã¹ç³è«ãå¿ èŠã
æ¬ã¢ããª(Hunyuan3D-2æ§æ)ã第äžè ã«é åžããŸãã¯ãµãŒãã¹ãšããŠæäŸããå Žåã® ä»åž¯çŸ©å(åã©ã€ã»ã³ã¹ §3):
- åé è ã«Tencentã©ã€ã»ã³ã¹æ¬æã®åããæäŸããããš(§3(a))
- Hunyuan3D-2åŽã®ãã¡ã€ã«ã倿Žããå Žåã¯ã倿Žããæšã®åç¥ãç®ç«ã€åœ¢ã§ ä»ãããš(§3(b))
- ãã¹ããããµãŒãã¹ä»¥å€ã®é åžç©ã«ã¯ãæå®ã®æèšã®Noticeããã¹ããã¡ã€ã«ã 忢±ããããš(§3(d)ãæèšã¯ã©ã€ã»ã³ã¹åæåç §)
- ãµãŒãã¹ã»è£œåã®å®éã®æäŸè (æ³äººåç)ãæç€ºããTencentãææºã»åŸæŽã㊠ãããšèª€èªããã衚瀺ãããªãããš(§3(e))
- ãPowered by Tencent Hunyuanãè¡šç€ºãšæè¡ç޹ä»èšäºã®å ¬éã¯æšå¥š(encouraged)ã§ ãã矩åã§ã¯ãªã(§3(c))
ãªããPixal3Dæ§æã®å Žåã¯äžèšã®Tencentã©ã€ã»ã³ã¹ã¯é©çšãããŸããã æ¢å®ã®ã©ã¹ã¿ã©ã€ã¶æ§æ(drtkãMIT)ã§ã¯ nvdiffrast(éåçšã©ã€ã»ã³ã¹)ãžã® äŸåãç¡ããªããŸããããç»åæ¡ä»¶ä»ãã«äœ¿ã DINOv3 ã®éã¿ (Metaç¬èªã©ã€ã»ã³ã¹ãåçšå©çšå¯ã»attributionçã®ä»åž¯çŸ©åãã)ãå¥é å¶çŽã«ãªããŸã(ãPixal3Dãžã§ãã¬ãŒã¿ãç¯ã»OSSäžèЧåç §)ã
requirements*.txt ã«åæãããPythonäŸåããã±ãŒãžãããã³å梱ã®
ããã³ããšã³ãã©ã€ãã©ãªã¯ãããããç¬èªã®OSSã©ã€ã»ã³ã¹äžã«ãããŸã(æ¬ãããžã§ã¯ã
èªäœã®ã©ã€ã»ã³ã¹ãšã¯å¥)ãäž»èŠãªãã®ã¯ä»¥äžã®éãã§ã(ã©ã€ã»ã³ã¹è¡šèšã¯åé
åžå
ã®
æ
å ±ã«åºã¥ãåèæ
å ±ã§ãããæ£ç¢ºãªæ¡ä»¶ã¯åãããžã§ã¯ãã®é
åžç©ã»ããã±ãŒãžæ
å ±ã
å¿
ã確èªããŠãã ãã)ã
ããã¯ãšã³ã (requirements.txt)
| ããã±ãŒãž | ã©ã€ã»ã³ã¹ |
|---|---|
| FastAPI | MIT |
| Uvicorn | BSD-3-Clause |
| python-multipart | Apache-2.0 |
| trimesh | MIT |
| SciPy | BSD-3-Clause |
| NetworkX | BSD-3-Clause |
| lxml | BSD-3-Clause |
| NumPy | BSD-3-Clause |
| Pillow | MIT-CMU (HPNDç³») |
| fast-simplification | MIT |
| pytest | MIT |
| HTTPX | BSD-3-Clause |
GPU/Hunyuan3D-2飿º (requirements-gpu.txt)
| ããã±ãŒãž | ã©ã€ã»ã³ã¹ |
|---|---|
| rembg | MIT |
| onnxruntime | MIT |
| PyTorch / torchvision | BSD-3-Clause |
| huggingface_hub | Apache-2.0 |
| einops | MIT |
| OmegaConf | BSD-3-Clause |
| Transformers | Apache-2.0 |
| Diffusers | Apache-2.0 |
| Accelerate | Apache-2.0 |
| opencv-python-headless | MIT(忢±ã®OpenCVæ¬äœã¯Apache-2.0) |
| scikit-image | BSD-3-Clause |
| pymeshlab | GPL-3.0(ãã¥ã¢ã«ã©ã€ã»ã³ã¹ãåçšã©ã€ã»ã³ã¹ãå¥éæäŸ)ãæ¬ãããžã§ã¯ãèªèº«ã®ã³ãŒã(server/)ããã¯åŒã³åºããŠããããthird_party/Hunyuan3D-2(hy3dgen)åŽã®å
éšäŸåãšããŠäœ¿çšããããGPLã®æ¡ä»¶ã«æžå¿µãããå Žåã¯å°å
¥ãèŠéãããšãå¯èœ(ãã®å Žåhy3dgenåŽã®äžéšåŸåŠçæ©èœãå¶éãããå¯èœæ§ããããŸã)ã |
| xatlas | MIT |
| pybind11 | BSD-3-Clause |
| Ninja | Apache-2.0 |
| pygltflib | MIT |
ããã³ããšã³ã (web/vendor/)
| ã©ã€ãã©ãª | ã©ã€ã»ã³ã¹ |
|---|---|
Three.js (r160, web/vendor/three/) |
MIT |
å¥ãªããžããªã®ã¢ãã«(third_party/ãæ¬ãªããžããªã«ã¯å«ãŸããªã)
| 察象 | ã©ã€ã»ã³ã¹ |
|---|---|
| Tencent Hunyuan3D-2 (hy3dgen) | TENCENT HUNYUAN 3D 2.0 COMMUNITY LICENSE AGREEMENT(ç¬èªã©ã€ã»ã³ã¹ãå°åå¶éã»æéã¢ã¯ãã£ããŠãŒã¶ãŒæ°100äžäººè¶ ã§ã®å¥é蚱諟èŠä»¶ãã) |
| TencentARC Pixal3D(ã³ãŒã+ã¢ãã«éã¿) | MIT(ã³ãŒãã»éã¿ãšãã«MITããã ãç»åæ¡ä»¶ä»ãã«äœ¿ãDINOv3éã¿ã¯å¥ã©ã€ã»ã³ã¹ãäžèšåç §) |
| Microsoft TRELLIS.2 / o-voxel | MIT |
| JeffreyXiang CuMesh(o-voxelã®ãã«ãæäŸåãGitHubçŽæ¥ååŸ) | MIT |
| JeffreyXiang FlexGEMM(o-voxelã®ãã«ãæäŸåãGitHubçŽæ¥ååŸ) | MIT |
Meta drtk(æ¢å®ã®ã©ã¹ã¿ã©ã€ã¶ãserver/generators/pixal3d_raster.py çµç±ã§äœ¿çšã宿©æ€èšŒæžã¿) |
MIT |
| NVlabs nvdiffrast(drtkã䜿ããªãå Žåã®ã¿ã®ãã©ãŒã«ããã¯ãæ¢å®æ§æã§ã¯æªäœ¿çš) | NVIDIA Source Code License(éåçšç ç©¶çšéãåçšå©çšã¯NVIDIAã®èš±è«Ÿãå¿ èŠãªç¹ã«æ³šæ) |
| NATTEN | MIT |
| valeoai NAF(NAFã¢ãããµã³ãã©éã¿ãtorch.hubçµç±) | Apache-2.0 |
Meta DINOv3 éã¿(camenduru/dinov3-vitl16-pretrain-lvd1689mãMeta facebook/dinov3-vit7b16-pretrain-lvd1689m ããã®èžçã¢ãã«ãPixal3Dã®ç»åæ¡ä»¶ä»ãã«äœ¿çš) |
DINOv3 License(Metaç¬èªã©ã€ã»ã³ã¹ãMITã§ã¯ãªã)ãã©ã€ã»ã³ã¹åæã®èŠçŽ(æ³çææåã¯åæã®ã¿): åçšå©çšã¯èš±å¯ãããŠãããäŒæ¥èŠæš¡ã»å°åã»MAUçã«ããå¶éã¯ç¡ãããã ã (1) åé åžæã¯ã©ã€ã»ã³ã¹åæã®åãã忢±ããããšã(2) é¢é£ããWebãµã€ãã»UIã»è£œåããã¥ã¡ã³ãçã« "Built with DINOv3" ã®è¡šç€ºãè¡ãããšã(3) ç ç©¶ææãå ¬éããå Žåã¯DINO Materialsã®å©çšãè¬èŸã«èšèŒããããšã(4) ãªããŒã¹ãšã³ãžãã¢ãªã³ã°çŠæ¢ã(5) è»äºã»å µåšã»ITAR察象掻åãªã©ãžã®å©çšçŠæ¢ããä»åž¯çŸ©åãšããŠå®ããããŠãããutils3d(upstream inference.pyã®ã¬ã³ããªã³ã°/åŠç¿ç³»å°çšã©ã€ãã©ãª)ã¯æ¬ã¢ããªã®çæçµè·¯ã§ã¯äœ¿çšããªãããæªå°å ¥ã |
ãŸãšã: Pixal3Dæ§æã¯ãã³ãŒãå
šäœ(Pixal3Dæ¬äœã»TRELLIS.2/o-voxelã»CuMesh/
FlexGEMMã»drtkã»NATTEN)ã¯MITãã§ãããæ¢å®ã®ã©ã¹ã¿ã©ã€ã¶æ§æ
(IMAGE3D_PIXAL3D_RASTERIZER=auto ãã€drtkå°å
¥æžã¿)ã§ã¯ nvdiffrast
(éåçšã©ã€ã»ã³ã¹)ãäžå䜿çšããªãããããç»åæ¡ä»¶ä»ãã«äœ¿ãDINOv3ã®
éã¿ãMetaç¬èªã©ã€ã»ã³ã¹ã§ãããããæ§æå
šäœãšããŠã¯ãå®å
šMITããšã¯
èšããªã(åçšå©çšèªäœã¯èš±å¯ãããç·©ãããªã©ã€ã»ã³ã¹ã ããattributionçã®
ä»åž¯çŸ©åãããç¹ã«æ³šæ)ã