apiExample / app /main.py
rwheel's picture
Update app/main.py
9f1735d
from fastapi import FastAPI, UploadFile, Form
from fastapi.responses import StreamingResponse
#import torch
from PIL import Image
#from diffusers import StableDiffusionDepth2ImgPipeline
import numpy as np
from io import BytesIO
app = FastAPI()
"""
pipe = StableDiffusionDepth2ImgPipeline.from_pretrained(
"stabilityai/stable-diffusion-2-depth",
torch_dtype=torch.float16,
).to("cuda")
"""
def pad_image(input_image):
pad_w, pad_h = np.max(((2, 2), np.ceil(
np.array(input_image.size) / 64).astype(int)), axis=0) * 64 - input_image.size
im_padded = Image.fromarray(
np.pad(np.array(input_image), ((0, pad_h), (0, pad_w), (0, 0)), mode='edge'))
w, h = im_padded.size
if w == h:
return im_padded
elif w > h:
new_image = Image.new(im_padded.mode, (w, w), (0, 0, 0))
new_image.paste(im_padded, (0, (w - h) // 2))
return new_image
else:
new_image = Image.new(im_padded.mode, (h, h), (0, 0, 0))
new_image.paste(im_padded, ((h - w) // 2, 0))
return new_image
def predict(input_image, prompt, steps, scale, seed, strength, depth_image=None):
depth = None
if depth_image is not None:
depth_image = pad_image(depth_image)
depth_image = depth_image.resize((512, 512))
depth = np.array(depth_image.convert("L"))
depth = depth.astype(np.float32) / 255.0
depth = depth[None, None]
depth = torch.from_numpy(depth)
init_image = input_image.convert("RGB")
image = pad_image(init_image) # resize to integer multiple of 32
image = image.resize((512, 512))
result = pipe(prompt=prompt, image=image, strength=strength)
return result['images']
def grayscale(image,
prompt,
steps,
scale,
seed,
strength):
image = image.convert('L') #convert to grayscale
return image
@app.post("/convert_ifc_img/")
async def convert_ifc_img(file: UploadFile,
prompt: str = Form(default=""),
steps: int = Form(default=50),
scale: float = Form(default=9),
seed: int = Form(default=178106186),
strength: float = Form(default=0.9)
):
image = Image.open(file.file)
image_result = grayscale(image, prompt, steps, scale, seed, strength)
buffer = BytesIO()
image_result.save(buffer, format="PNG")
buffer.seek(0)
return StreamingResponse(buffer, media_type="image/png")