Spaces:
Runtime error
Runtime error
| import os | |
| import tempfile | |
| from fastapi import FastAPI, UploadFile, File | |
| from fastapi.middleware.cors import CORSMiddleware | |
| from pydantic import BaseModel | |
| from typing import List | |
| app = FastAPI(title="Smart Farming AI", version="1.0") | |
| app.add_middleware(CORSMiddleware, | |
| allow_origins=["*"], | |
| allow_methods=["*"], | |
| allow_headers=["*"]) | |
| from api.inference import predict_disease | |
| from src.severity import estimate_severity | |
| from src.llm_agent import get_treatment, chat_with_bot | |
| class ChatRequest(BaseModel): | |
| message: str | |
| history: List[dict] = [] | |
| def root(): | |
| return {"status": "Smart Farming AI is running 🌿"} | |
| async def predict(file: UploadFile = File(...)): | |
| with tempfile.NamedTemporaryFile(delete=False, suffix=".jpg") as tmp: | |
| tmp.write(await file.read()) | |
| tmp_path = tmp.name | |
| disease, confidence, top3 = predict_disease(tmp_path) | |
| severity = estimate_severity(tmp_path) | |
| treatment = get_treatment(disease, severity["label"]) | |
| os.remove(tmp_path) | |
| return { | |
| "disease" : disease, | |
| "confidence" : confidence, | |
| "top3_predictions": top3, | |
| "severity" : severity, | |
| "treatment" : treatment | |
| } | |
| def chat(req: ChatRequest): | |
| response = chat_with_bot(req.message, req.history) | |
| return {"response": response} | |
| async def gradcam(file: UploadFile = File(...)): | |
| import json | |
| import torch | |
| import base64 | |
| import cv2 | |
| from src.gradcam import generate_gradcam | |
| from src.model import PlantDiseaseClassifier | |
| with tempfile.NamedTemporaryFile(delete=False, suffix=".jpg") as tmp: | |
| tmp.write(await file.read()) | |
| tmp_path = tmp.name | |
| # CPU works everywhere — Mac, Linux, HuggingFace | |
| device = torch.device('cpu') | |
| with open('models/class_names.json') as f: | |
| classes = json.load(f) | |
| model = PlantDiseaseClassifier(num_classes=38, pretrained=False).to(device) | |
| ckpt = torch.load('models/best_model.pth', map_location=device) | |
| model.load_state_dict(ckpt['model_state_dict']) | |
| model.eval() | |
| overlay, cam = generate_gradcam(model, tmp_path, 0, device) | |
| os.remove(tmp_path) | |
| _, buffer = cv2.imencode('.jpg', cv2.cvtColor(overlay, cv2.COLOR_RGB2BGR)) | |
| img_base64 = base64.b64encode(buffer).decode('utf-8') | |
| return {"heatmap": img_base64} |