from fastapi import FastAPI, UploadFile, File, Response, HTTPException from fastapi.middleware.cors import CORSMiddleware from rembg import remove, new_session from PIL import Image, UnidentifiedImageError import io import os import logging logging.basicConfig(level=logging.INFO) logger = logging.getLogger(__name__) app = FastAPI(title="NoBG API") model_name = "birefnet-general" session = new_session(model_name) origins = os.getenv("ALLOWED_ORIGINS", "*").split(",") app.add_middleware( CORSMiddleware, allow_origins=origins, allow_credentials=True, allow_methods=["*"], allow_headers=["*"], ) @app.post("/remove-bg") def remove_background(file: UploadFile = File(...)): if file.content_type and not file.content_type.startswith("image/"): raise HTTPException( status_code=400, detail=f"Invalid file type: {file.content_type}. Please upload an image.", ) try: input_image = Image.open(file.file) output_image = remove(input_image, session=session) img_byte_arr = io.BytesIO() output_image.save(img_byte_arr, format="PNG") img_byte_arr.seek(0) return Response(content=img_byte_arr.getvalue(), media_type="image/png") except UnidentifiedImageError: logger.warning(f"Failed to identify image format for file: {file.filename}") raise HTTPException( status_code=400, detail="Uploaded file is not a valid or supported image." ) except Exception as e: logger.error(f"Error processing image {file.filename}: {str(e)}") raise HTTPException( status_code=500, detail="An error occurred while processing the image." ) if __name__ == "__main__": import uvicorn port = int(os.getenv("PORT", 8000)) uvicorn.run(app, host="0.0.0.0", port=port)