Spaces:
Runtime error
Runtime error
| # main.py | |
| import shutil | |
| import os | |
| import uuid | |
| from fastapi import FastAPI, File, UploadFile, HTTPException | |
| from fastapi.responses import JSONResponse | |
| from fastapi.middleware.cors import CORSMiddleware | |
| from predict import predict_image | |
| app = FastAPI( | |
| title="Medical Image Classification API", | |
| description="AI-powered medical image classification service", | |
| version="1.0.0" | |
| ) | |
| # Add CORS middleware for Flutter integration | |
| app.add_middleware( | |
| CORSMiddleware, | |
| allow_origins=["*"], | |
| allow_credentials=True, | |
| allow_methods=["*"], | |
| allow_headers=["*"], | |
| ) | |
| # Create uploads directory in tmp (writable in containers) | |
| import tempfile | |
| UPLOAD_DIR = tempfile.mkdtemp() | |
| os.makedirs(UPLOAD_DIR, exist_ok=True) | |
| async def health_check(): | |
| return {"status": "healthy", "service": "gp-tea-skin-analysis"} | |
| async def analyze_image(file: UploadFile = File(...)): | |
| """Analyze skin image for medical conditions""" | |
| try: | |
| if not file.content_type or not file.content_type.startswith('image/'): | |
| raise HTTPException(status_code=400, detail="File must be an image") | |
| unique_filename = f"{uuid.uuid4().hex}_{file.filename}" | |
| file_path = os.path.join(UPLOAD_DIR, unique_filename) | |
| with open(file_path, "wb") as buffer: | |
| shutil.copyfileobj(file.file, buffer) | |
| label, confidence, all_predictions = predict_image(file_path) | |
| os.remove(file_path) | |
| formatted_predictions = [] | |
| for pred in all_predictions: | |
| formatted_predictions.append({ | |
| "label": pred["label"], | |
| "confidence": float(pred["confidence"]), | |
| "confidence_percent": f"{pred['confidence'] * 100:.2f}%" | |
| }) | |
| return JSONResponse( | |
| status_code=200, | |
| content={ | |
| "success": True, | |
| "prediction": { | |
| "top_prediction": { | |
| "label": label, | |
| "confidence": float(confidence), | |
| "confidence_percent": f"{confidence * 100:.2f}%" | |
| }, | |
| "all_predictions": formatted_predictions | |
| } | |
| } | |
| ) | |
| except Exception as e: | |
| if 'file_path' in locals() and os.path.exists(file_path): | |
| os.remove(file_path) | |
| raise HTTPException(status_code=500, detail=f"Classification failed: {str(e)}") | |