davidvgilmore's picture
Upload api.py with huggingface_hub
5cf2896 verified
# Open Source Model Licensed under the Apache License Version 2.0
# and Other Licenses of the Third-Party Components therein:
# The below Model in this distribution may have been modified by THL A29 Limited
# ("Tencent Modifications"). All Tencent Modifications are Copyright (C) 2024 THL A29 Limited.
import os
import torch
from PIL import Image
from fastapi import FastAPI, File, UploadFile, HTTPException
from fastapi.responses import FileResponse
from pydantic import BaseModel
import io
import tempfile
from hy3dgen.rembg import BackgroundRemover
from hy3dgen.shapegen import Hunyuan3DDiTFlowMatchingPipeline, FaceReducer, FloaterRemover, DegenerateFaceRemover
from hy3dgen.text2image import HunyuanDiTPipeline
app = FastAPI(title="Hunyuan3D-2 API")
# Initialize models at startup
rembg = BackgroundRemover()
model_path = 'tencent/Hunyuan3D-2' # Use Hugging Face model path
t2i = HunyuanDiTPipeline('Tencent-Hunyuan--HunyuanDiT-v1.1-Diffusers-Distilled')
i23d = Hunyuan3DDiTFlowMatchingPipeline.from_pretrained(model_path)
class TextToImageRequest(BaseModel):
prompt: str
@app.post("/image-to-3d/")
async def image_to_3d(file: UploadFile = File(...)):
"""Convert an image to 3D model"""
try:
# Read and process image
content = await file.read()
image = Image.open(io.BytesIO(content))
image = image.resize((1024, 1024))
if image.mode == 'RGB':
image = rembg(image)
# Generate mesh
mesh = i23d(image=image, num_inference_steps=30, mc_algo='mc',
generator=torch.manual_seed(2025))[0]
mesh = FloaterRemover()(mesh)
mesh = DegenerateFaceRemover()(mesh)
mesh = FaceReducer()(mesh)
# Save mesh to temporary file
with tempfile.NamedTemporaryFile(suffix='.glb', delete=False) as tmp:
mesh.export(tmp.name)
return FileResponse(tmp.name, media_type='model/gltf-binary',
filename='model.glb')
except Exception as e:
raise HTTPException(status_code=500, detail=str(e))
@app.post("/text-to-3d/")
async def text_to_3d(request: TextToImageRequest):
"""Convert text prompt to 3D model"""
try:
# Generate image from text
image = t2i(request.prompt)
image = rembg(image)
# Generate mesh
mesh = i23d(image, num_inference_steps=30, mc_algo='mc')[0]
mesh = FloaterRemover()(mesh)
mesh = DegenerateFaceRemover()(mesh)
mesh = FaceReducer()(mesh)
# Save mesh to temporary file
with tempfile.NamedTemporaryFile(suffix='.glb', delete=False) as tmp:
mesh.export(tmp.name)
return FileResponse(tmp.name, media_type='model/gltf-binary',
filename='model.glb')
except Exception as e:
raise HTTPException(status_code=500, detail=str(e))
if __name__ == "__main__":
import uvicorn
uvicorn.run(app, host="0.0.0.0", port=8000)