add img_to_3d service
This commit is contained in:
parent
eae67dc538
commit
3035538356
|
Before Width: | Height: | Size: 16 KiB After Width: | Height: | Size: 16 KiB |
85
img_to_3d_service.py
Normal file
85
img_to_3d_service.py
Normal file
@ -0,0 +1,85 @@
|
||||
import os
|
||||
import sys
|
||||
import uvicorn
|
||||
from fastapi import FastAPI, HTTPException
|
||||
from pydantic import BaseModel, Field
|
||||
from typing import List, Optional
|
||||
|
||||
# Ensure the project root is in sys.path
|
||||
sys.path.append(os.path.dirname(os.path.abspath(__file__)))
|
||||
|
||||
try:
|
||||
# Attempt to import the entrypoint from the existing script
|
||||
# This assumes the environment is set up correctly with all dependencies
|
||||
from embodied_gen.scripts.imageto3d import entrypoint
|
||||
except ImportError as e:
|
||||
print(f"Error importing embodied_gen: {e}")
|
||||
print("Please ensure you are running this script from the project root and environment is configured.")
|
||||
sys.exit(1)
|
||||
|
||||
app = FastAPI(title="Image to 3D Service")
|
||||
|
||||
class ImageTo3DRequest(BaseModel):
|
||||
image_paths: List[str] = Field(..., description="Path to the input images (e.g. apps/assets/example_image/sample_00.jpg)")
|
||||
output_root: str = Field(..., description="Root directory for saving outputs (e.g. outputs/imageto3d)")
|
||||
n_retry: int = Field(2, description="Number of retries")
|
||||
|
||||
# Optional parameters mirroring the CLI arguments
|
||||
height_range: Optional[str] = None
|
||||
mass_range: Optional[str] = None
|
||||
asset_type: Optional[List[str]] = None
|
||||
skip_exists: bool = False
|
||||
version: Optional[str] = None
|
||||
keep_intermediate: bool = False
|
||||
seed: int = 0
|
||||
disable_decompose_convex: bool = False
|
||||
texture_size: int = 2048
|
||||
|
||||
@app.post("/process")
|
||||
async def process_images(request: ImageTo3DRequest):
|
||||
"""
|
||||
HTTP wrapper for img3d-cli.
|
||||
"""
|
||||
# 1. Validate inputs
|
||||
for path in request.image_paths:
|
||||
if not os.path.exists(path):
|
||||
raise HTTPException(status_code=400, detail=f"Image path does not exist: {path}")
|
||||
|
||||
# 2. Invoke the processing logic
|
||||
try:
|
||||
# entrypoint() in imageto3d.py accepts **kwargs to override parsed args
|
||||
entrypoint(
|
||||
image_path=request.image_paths,
|
||||
output_root=request.output_root,
|
||||
n_retry=request.n_retry,
|
||||
|
||||
# Optional args
|
||||
height_range=request.height_range,
|
||||
mass_range=request.mass_range,
|
||||
asset_type=request.asset_type,
|
||||
skip_exists=request.skip_exists,
|
||||
version=request.version,
|
||||
keep_intermediate=request.keep_intermediate,
|
||||
seed=request.seed,
|
||||
disable_decompose_convex=request.disable_decompose_convex,
|
||||
texture_size=request.texture_size
|
||||
)
|
||||
|
||||
return {
|
||||
"status": "success",
|
||||
"message": "Processing completed.",
|
||||
"output_root": request.output_root,
|
||||
"inputs": request.image_paths
|
||||
}
|
||||
|
||||
except Exception as e:
|
||||
# Catch errors from the processing pipeline
|
||||
raise HTTPException(status_code=500, detail=f"Processing failed: {str(e)}")
|
||||
|
||||
@app.get("/health")
|
||||
def health():
|
||||
return {"status": "ok"}
|
||||
|
||||
if __name__ == "__main__":
|
||||
# Run server on port 8000
|
||||
uvicorn.run(app, host="0.0.0.0", port=8000)
|
||||
4
scripts/run_service.sh
Normal file
4
scripts/run_service.sh
Normal file
@ -0,0 +1,4 @@
|
||||
CUDA_VISIBLE_DEVICES=0 python img_to_3d_service.py
|
||||
|
||||
|
||||
curl -X POST "http://localhost:8000/process" -H "Content-Type: application/json" -d '{"image_paths": ["apps/assets/example_image/sample_26.jpg"], "n_retry": 2, "output_root": "outputs/imageto3d"}'
|
||||
Loading…
x
Reference in New Issue
Block a user