| | from fastapi import FastAPI, UploadFile, File |
| | from fastapi.responses import Response |
| | from PIL import Image |
| | import torch |
| | import torchvision.transforms as transforms |
| | from io import BytesIO |
| | from transformers import AutoModelForImageSegmentation |
| | import uvicorn |
| | from fastapi.middleware.cors import CORSMiddleware |
| |
|
| | app = FastAPI() |
| |
|
| | app.add_middleware( |
| | CORSMiddleware, |
| | allow_origins=["*"], |
| | allow_credentials=True, |
| | allow_methods=["*"], |
| | allow_headers=["*"], |
| | ) |
| |
|
| | |
| | device = "cuda" if torch.cuda.is_available() else "cpu" |
| | model = AutoModelForImageSegmentation.from_pretrained('ZhengPeng7/BiRefNet', trust_remote_code=True) |
| | model.to(device) |
| | model.eval() |
| |
|
| | |
| | transform = transforms.Compose([ |
| | transforms.Resize((1024, 1024)), |
| | transforms.ToTensor(), |
| | transforms.Normalize([0.485, 0.456, 0.406], [0.229, 0.224, 0.225]), |
| | ]) |
| |
|
| | @app.post("/remove_bg") |
| | async def remove_bg(file: UploadFile = File(...)): |
| | |
| | image = Image.open(BytesIO(await file.read())).convert("RGB") |
| | original_size = image.size |
| | |
| | |
| | input_tensor = transform(image).unsqueeze(0).to(device) |
| | |
| | |
| | with torch.no_grad(): |
| | |
| | pred = model(input_tensor)[-1].sigmoid().cpu()[0].squeeze() |
| | |
| | |
| | mask = transforms.ToPILImage()(pred) |
| | mask = mask.resize(original_size) |
| | |
| | |
| | result_image = image.copy().convert("RGBA") |
| | result_image.putalpha(mask) |
| | |
| | |
| | img_io = BytesIO() |
| | result_image.save(img_io, format="PNG") |
| | img_io.seek(0) |
| | |
| | return Response(content=img_io.getvalue(), media_type="image/png") |
| |
|
| | |
| | @app.get("/") |
| | def read_root(): |
| | return {"status": "ok", "message": "Background removal API is running"} |
| |
|
| | |
| | if __name__ == "__main__": |
| | uvicorn.run(app, host="0.0.0.0", port=7860) |