Spaces:
Runtime error
Runtime error
| # app.py | |
| import os | |
| import io | |
| import base64 | |
| import numpy as np | |
| from PIL import Image | |
| import torch | |
| from realesrgan import RealESRGANer | |
| # FastAPI Libraries | |
| from fastapi import FastAPI, File, UploadFile | |
| from fastapi.responses import JSONResponse, StreamingResponse | |
| import uvicorn | |
| import gradio as gr | |
| # --- 1. Model Loading (Free Tier Optimized) --- | |
| DEVICE = torch.device('cuda' if torch.cuda.is_available() else 'cpu') | |
| print(f"Model will run on: {DEVICE}") | |
| try: | |
| # Real-ESRGAN ka lightweight, optimized model use kar rahe hain | |
| model_path = RealESRGANer.model_path_from_name('RealESRGAN_x4plus') | |
| # Model ko load karna (yeh memory mein rahega) | |
| UPSCALER = RealESRGANer( | |
| scale=4, | |
| model_path=model_path, | |
| dni_weight=None, | |
| model_name='RealESRGAN_x4plus', | |
| device=DEVICE | |
| ) | |
| print("Real-ESRGAN model loaded successfully.") | |
| except Exception as e: | |
| print(f"ERROR: Model load nahi ho paya. Error: {e}") | |
| UPSCALER = None | |
| def run_upscaler(img_np: np.ndarray): | |
| """Core upscaling logic.""" | |
| if UPSCALER is None: | |
| raise Exception("Model is not initialized.") | |
| # Upscaling (yahan time lagta hai) | |
| output_np, _ = UPSCALER.enhance(img_np, outscale=4) | |
| return output_np | |
| # --- 2. FastAPI Setup --- | |
| # FastAPI application ko initialize karein | |
| app = FastAPI(title="Real-ESRGAN Custom Upscaler API") | |
| # --- 3. Custom API Endpoint --- | |
| # Image file upload ke zariye upscaling | |
| async def upscale_image_api(image: UploadFile = File(...)): | |
| """ | |
| Image file ko upload karein aur 4x upscaled image wapas hasil karein. | |
| """ | |
| try: | |
| # File ko PIL Image mein padhna | |
| image_bytes = await image.read() | |
| input_image = Image.open(io.BytesIO(image_bytes)).convert("RGB") | |
| # PIL image ko numpy array mein convert karna | |
| img_np = np.array(input_image) | |
| # Upscaling | |
| output_np = run_upscaler(img_np) | |
| # NumPy array ko wapas PIL Image mein convert karna | |
| output_image = Image.fromarray(output_np) | |
| # Image ko BytesIO mein save karna | |
| img_io = io.BytesIO() | |
| output_image.save(img_io, format='PNG') | |
| img_io.seek(0) | |
| # StreamingResponse se image ko wapas bhejna | |
| return StreamingResponse(img_io, media_type="image/png") | |
| except Exception as e: | |
| return JSONResponse(status_code=500, content={"message": f"Processing error: {str(e)}"}) | |
| # --- 4. Gradio UI Integration --- | |
| def upscale_for_gradio(input_image: Image.Image): | |
| """Gradio UI ke liye wrapper function.""" | |
| try: | |
| img_np = np.array(input_image.convert("RGB")) | |
| output_np = run_upscaler(img_np) | |
| return Image.fromarray(output_np) | |
| except Exception as e: | |
| return f"Error: {str(e)}" | |
| # Gradio Interface define karna | |
| gr_interface = gr.Interface( | |
| fn=upscale_for_gradio, | |
| inputs=gr.Image(type="pil", label="Low-Resolution Image Upload Karein"), | |
| outputs=gr.Image(type="pil", label="4x Upscaled (High-Quality) Image"), | |
| title="⭐ Real-ESRGAN: AI Image Upscaler (UI & Custom API)", | |
| description="Apni images ko 4x size mein badhayein. Yeh app Custom REST API aur Gradio UI dono offer karta hai.", | |
| allow_flagging="never" | |
| ) | |
| # Gradio ko FastAPI app mein mount karna | |
| # '/gradio' path par UI available hoga | |
| app = gr.mount_gradio_app(app, gr_interface, path="/") | |
| # --- 5. Uvicorn Server Setup --- | |
| # Yeh tabhi run hoga jab aap file ko directly chalayenge (lekin Docker mein yeh entry point hoga) | |
| if __name__ == "__main__": | |
| # Hugging Face Spaces Docker mein port 7860 par chalne ki umeed rakhta hai. | |
| # Hamara server isi port par run hoga. | |
| uvicorn.run(app, host="0.0.0.0", port=7860) | |