Spaces:
Sleeping
Sleeping
| import os | |
| import tempfile | |
| from fastapi import FastAPI, UploadFile, File, Form | |
| from fastapi.responses import Response | |
| from PIL import Image | |
| import io | |
| from super_image import MsrnModel, ImageLoader | |
| app = FastAPI() | |
| models = {} | |
| def get_model(scale: int): | |
| if scale not in models: | |
| model = MsrnModel.from_pretrained("eugenesiow/msrn", scale=scale) | |
| model = model.eval() | |
| models[scale] = model | |
| return models[scale] | |
| def _upscale_image(img: Image.Image, scale: int) -> Image.Image: | |
| model = get_model(scale) | |
| inputs = ImageLoader.load_image(img) | |
| pred = model(inputs) | |
| fd, path = tempfile.mkstemp(suffix=".png") | |
| try: | |
| ImageLoader.save_image(pred, path) | |
| os.close(fd) | |
| result = Image.open(path).convert("RGB") | |
| result.load() | |
| finally: | |
| os.unlink(path) | |
| return result | |
| async def upscale(image: UploadFile = File(...), scale: int = Form(2)): | |
| try: | |
| img = Image.open(io.BytesIO(await image.read())).convert("RGB") | |
| except Exception as e: | |
| return Response( | |
| f"Image load failed: {type(e).__name__}: {e}", | |
| status_code=500, | |
| media_type="text/plain", | |
| ) | |
| try: | |
| if scale == 8: | |
| # Chain: 4x → 2x | |
| img = _upscale_image(img, 4) | |
| img = _upscale_image(img, 2) | |
| else: | |
| img = _upscale_image(img, scale) | |
| except Exception as e: | |
| return Response( | |
| f"Upscale failed: {type(e).__name__}: {e}", | |
| status_code=500, | |
| media_type="text/plain", | |
| ) | |
| buf = io.BytesIO() | |
| img.save(buf, format="PNG") | |
| return Response(buf.getvalue(), media_type="image/png") |