Tentando resolver problema de output
Browse files
main.py
CHANGED
|
@@ -7,6 +7,14 @@ from fastapi import FastAPI, File, UploadFile, Depends, HTTPException, status
|
|
| 7 |
from fastapi.security import HTTPBearer, HTTPAuthorizationCredentials
|
| 8 |
from feature_extractor_single import process_single_image
|
| 9 |
from datetime import datetime
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 10 |
|
| 11 |
#1. CONFIGURAÇÃO DA APLICAÇÃO E AUTENTICAÇÃO
|
| 12 |
app = FastAPI(title="SojaClassifierAPI")
|
|
@@ -47,11 +55,15 @@ except FileNotFoundError:
|
|
| 47 |
print("Carregando banco de dados de informações (doencas.json)...")
|
| 48 |
try:
|
| 49 |
with open('doencas.json', 'r', encoding='utf-8') as f:
|
| 50 |
-
|
| 51 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
| 52 |
except FileNotFoundError:
|
| 53 |
print("ERRO: 'doencas.json' não encontrado.")
|
| 54 |
-
DB_INFO = {}
|
| 55 |
|
| 56 |
|
| 57 |
#3. ENDPOINTS DA API
|
|
@@ -94,14 +106,19 @@ async def classify_image(file: UploadFile = File(...), token: str = Depends(veri
|
|
| 94 |
#Faz a predição
|
| 95 |
pred_numerica = SVM.predict(nova_feature_umap)
|
| 96 |
|
| 97 |
-
#Converte a predição numérica
|
| 98 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 99 |
|
| 100 |
-
#BUSCA AS INFORMAÇÕES
|
| 101 |
-
#Usa .get() para buscar a chave. Se não encontrar, retorna um
|
| 102 |
-
#dicionário vazio ou uma mensagem de erro, com segurança
|
| 103 |
info_adicional = DB_INFO.get(classe_predita, {
|
| 104 |
-
"nome": classe_predita,
|
| 105 |
"descricao": "Informações não disponíveis.",
|
| 106 |
"sintomas": [],
|
| 107 |
"tratamento": ""
|
|
|
|
| 7 |
from fastapi.security import HTTPBearer, HTTPAuthorizationCredentials
|
| 8 |
from feature_extractor_single import process_single_image
|
| 9 |
from datetime import datetime
|
| 10 |
+
import unicodedata
|
| 11 |
+
|
| 12 |
+
def normalize_string(s: str) -> str:
|
| 13 |
+
"""
|
| 14 |
+
Remove inconsistências de Unicode (NFC vs NFD) e espaços extras.
|
| 15 |
+
Transforma 'Vírus' (2 chars) em 'Vírus' (1 char) e remove espaços nas pontas.
|
| 16 |
+
"""
|
| 17 |
+
return unicodedata.normalize('NFC', s).strip()
|
| 18 |
|
| 19 |
#1. CONFIGURAÇÃO DA APLICAÇÃO E AUTENTICAÇÃO
|
| 20 |
app = FastAPI(title="SojaClassifierAPI")
|
|
|
|
| 55 |
print("Carregando banco de dados de informações (doencas.json)...")
|
| 56 |
try:
|
| 57 |
with open('doencas.json', 'r', encoding='utf-8') as f:
|
| 58 |
+
raw_db = json.load(f)
|
| 59 |
+
#Cria um novo dicionário com as chaves limpas
|
| 60 |
+
DB_INFO = {normalize_string(k): v for k, v in raw_db.items()}
|
| 61 |
+
print(f"Banco de dados carregado. {len(DB_INFO)} doenças indexadas.")
|
| 62 |
+
#DEBUG: Mostra como as chaves ficaram na memória do servidor
|
| 63 |
+
print(f"Chaves normalizadas: {list(DB_INFO.keys())}")
|
| 64 |
except FileNotFoundError:
|
| 65 |
print("ERRO: 'doencas.json' não encontrado.")
|
| 66 |
+
DB_INFO = {}
|
| 67 |
|
| 68 |
|
| 69 |
#3. ENDPOINTS DA API
|
|
|
|
| 106 |
#Faz a predição
|
| 107 |
pred_numerica = SVM.predict(nova_feature_umap)
|
| 108 |
|
| 109 |
+
#Converte a predição numérica de volta para o nome da classe
|
| 110 |
+
classe_predita_raw = ENCODER.inverse_transform(pred_numerica)[0]
|
| 111 |
+
|
| 112 |
+
#NORMALIZA A STRING DO MODELO TAMBÉM
|
| 113 |
+
classe_predita = normalize_string(str(classe_predita_raw))
|
| 114 |
+
|
| 115 |
+
#DEBUG: o que exatamente o modelo cuspiu vs o que tem no banco
|
| 116 |
+
#repr() para ver se tem caracteres escondidos como \n ou \r
|
| 117 |
+
print(f"DEBUG CHAVES: Modelo='{repr(classe_predita)}'")
|
| 118 |
|
| 119 |
+
#BUSCA AS INFORMAÇÕES
|
|
|
|
|
|
|
| 120 |
info_adicional = DB_INFO.get(classe_predita, {
|
| 121 |
+
"nome": classe_predita,
|
| 122 |
"descricao": "Informações não disponíveis.",
|
| 123 |
"sintomas": [],
|
| 124 |
"tratamento": ""
|