remove-bg-api / app.py
habulaj's picture
Update app.py
eef708d verified
import os
os.environ["NUMBA_CACHE_DIR"] = "/tmp/numba_cache"
os.environ["U2NET_HOME"] = "/tmp/u2net"
from fastapi import FastAPI, HTTPException
from pydantic import BaseModel
from io import BytesIO
from PIL import Image, ImageFilter
import rembg
import onnxruntime as ort
from concurrent.futures import ThreadPoolExecutor
import asyncio
import gc
import base64
app = FastAPI()
# Configurações do onnxruntime para CPU
options = ort.SessionOptions()
options.intra_op_num_threads = 2 # Limita o número de threads para evitar sobrecarga
options.execution_mode = ort.ExecutionMode.ORT_SEQUENTIAL # Execução sequencial para melhor desempenho em CPU
# Pool de threads para executar tarefas bloqueantes
executor = ThreadPoolExecutor(max_workers=4)
def resize_image(image, max_size=512):
"""Redimensiona a imagem para uma largura máxima de 512px, mantendo a proporção."""
width, height = image.size
if width > max_size or height > max_size:
ratio = min(max_size / width, max_size / height)
new_size = (int(width * ratio), int(height * ratio))
image = image.resize(new_size, Image.Resampling.LANCZOS)
return image
def process_image(image_data):
# Decodifica a imagem base64
image = Image.open(BytesIO(base64.b64decode(image_data)))
# Pré-processamento: apenas redimensiona para 512px
image = resize_image(image, max_size=512)
# Remove o fundo da imagem usando rembg
output = rembg.remove(image, session_options=options)
# Pós-processamento: suaviza as bordas
output = output.filter(ImageFilter.SMOOTH_MORE)
# Converte a imagem de volta para bytes
img_byte_arr = BytesIO()
output.save(img_byte_arr, format='PNG')
img_byte_arr.seek(0)
# Codifica a imagem processada em base64
return base64.b64encode(img_byte_arr.getvalue()).decode('utf-8')
class ImageBase64(BaseModel):
image: str # A imagem em base64
@app.post("/remove-background")
async def remove_background(image_data: ImageBase64):
try:
# Executa o processamento da imagem em um thread separado
loop = asyncio.get_event_loop()
processed_image_base64 = await loop.run_in_executor(executor, process_image, image_data.image)
# Retorna a imagem processada em base64
return {"processed_image": processed_image_base64}
except Exception as e:
raise HTTPException(status_code=400, detail=str(e))
finally:
# Força a coleta de lixo após cada requisição
gc.collect()