74 lines
2.7 KiB
Python
74 lines
2.7 KiB
Python
import os
|
|
from typing import List, Optional
|
|
|
|
import httpx
|
|
|
|
AI_SERVICE_URL = os.environ.get("AI_SERVICE_URL", "http://ai-service:8070")
|
|
|
|
# Mapping complet class_name YOLO → Infos détaillées
|
|
_DIAGNOSTICS = {
|
|
"Tomato___healthy": {
|
|
"label": "Tomate (saine)",
|
|
"conseil": "Votre plant est en pleine forme. Pensez au paillage pour garder l'humidité.",
|
|
"actions": ["Pailler le pied", "Vérifier les gourmands"]
|
|
},
|
|
"Tomato___Early_blight": {
|
|
"label": "Tomate (Alternariose)",
|
|
"conseil": "Champignon fréquent. Retirez les feuilles basses touchées et évitez de mouiller le feuillage.",
|
|
"actions": ["Retirer feuilles infectées", "Traitement bouillie bordelaise"]
|
|
},
|
|
"Tomato___Late_blight": {
|
|
"label": "Tomate (Mildiou)",
|
|
"conseil": "Urgent : Le mildiou se propage vite avec l'humidité. Coupez les parties atteintes immédiatement.",
|
|
"actions": ["Couper parties infectées", "Traitement purin de prêle", "Abriter de la pluie"]
|
|
},
|
|
"Pepper__bell___healthy": {
|
|
"label": "Poivron (sain)",
|
|
"conseil": "Le poivron aime la chaleur et un sol riche.",
|
|
"actions": ["Apport de compost", "Arrosage régulier"]
|
|
},
|
|
"Potato___healthy": {
|
|
"label": "Pomme de terre (saine)",
|
|
"conseil": "Pensez à butter les pieds pour favoriser la production de tubercules.",
|
|
"actions": ["Butter les pieds"]
|
|
},
|
|
"Grape___healthy": {
|
|
"label": "Vigne (saine)",
|
|
"conseil": "Surveillez l'apparition d'oïdium si le temps est chaud et humide.",
|
|
"actions": ["Taille en vert", "Vérifier sous les feuilles"]
|
|
},
|
|
}
|
|
|
|
|
|
async def identify(image_bytes: bytes) -> List[dict]:
|
|
"""Appelle l'ai-service interne et retourne les détections YOLO avec diagnostics."""
|
|
try:
|
|
async with httpx.AsyncClient(timeout=30.0) as client:
|
|
resp = await client.post(
|
|
f"{AI_SERVICE_URL}/detect",
|
|
files={"file": ("photo.jpg", image_bytes, "image/jpeg")},
|
|
)
|
|
resp.raise_for_status()
|
|
data = resp.json()
|
|
except Exception:
|
|
return []
|
|
|
|
results = []
|
|
for det in data[:3]:
|
|
cls = det.get("class_name", "")
|
|
diag = _DIAGNOSTICS.get(cls, {
|
|
"label": cls.replace("___", " — ").replace("_", " "),
|
|
"conseil": "Pas de diagnostic spécifique disponible pour cette espèce.",
|
|
"actions": []
|
|
})
|
|
|
|
results.append({
|
|
"species": cls,
|
|
"common_name": diag["label"],
|
|
"confidence": det.get("confidence", 0.0),
|
|
"conseil": diag["conseil"],
|
|
"actions": diag["actions"],
|
|
"image_url": "",
|
|
})
|
|
return results
|