Julia-Amadio commited on
Commit
1a0355f
·
1 Parent(s): 3624eb9

Implementa resposta rica com JSON (info de doenças)

Browse files
Files changed (2) hide show
  1. doencas.json +97 -0
  2. main.py +26 -3
doencas.json ADDED
@@ -0,0 +1,97 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "Oidio": {
3
+ "descricao": "Descrição aqui.",
4
+ "sintomas": [
5
+ "Sintoma 1.",
6
+ "Sintoma 2!",
7
+ "Sintoma 3?"
8
+ ],
9
+ "tratamento": "Tratamento aqui."
10
+ },
11
+ "Mancha Parda": {
12
+ "descricao": "Descrição aqui.",
13
+ "sintomas": [
14
+ "Sintoma 1.",
15
+ "Sintoma 2!",
16
+ "Sintoma 3?"
17
+ ],
18
+ "tratamento": "Tratamento aqui."
19
+ },
20
+ "Ferrugem": {
21
+ "descricao": "Causada pelo fungo Phakopsora pachyrhizi, é uma das doenças mais severas da soja...",
22
+ "sintomas": [
23
+ "Pequenas pústulas (bolinhas) na parte de baixo da folha.",
24
+ "Cor amarelada que evolui para marrom-escuro.",
25
+ "Desfolha precoce."
26
+ ],
27
+ "tratamento": "Aplicação de fungicidas sistêmicos e de contato. Rotacionar culturas e usar variedades resistentes."
28
+ },
29
+ "Mosaico Amarelo": {
30
+ "descricao": "Descrição aqui.",
31
+ "sintomas": [
32
+ "Sintoma 1.",
33
+ "Sintoma 2!",
34
+ "Sintoma 3?"
35
+ ],
36
+ "tratamento": "Tratamento aqui."
37
+ },
38
+ "Virus do Mosaico": {
39
+ "descricao": "Causado pelo Soybean Mosaic Virus (SMV), transmitido por pulgões.",
40
+ "sintomas": [
41
+ "Folhas novas ficam enrugadas e com padrões de verde claro e escuro (mosaico).",
42
+ "Plantas podem ficar atrofiadas."
43
+ ],
44
+ "tratamento": "Não há cura. Use sementes sadias e controle os pulgões (vetores) com inseticidas."
45
+ },
46
+ "Mancha bacteriana": {
47
+ "descricao": "Descrição aqui.",
48
+ "sintomas": [
49
+ "Sintoma 1.",
50
+ "Sintoma 2!",
51
+ "Sintoma 3?"
52
+ ],
53
+ "tratamento": "Tratamento aqui."
54
+ },
55
+ "Podridão do Sul": {
56
+ "descricao": "Descrição aqui.",
57
+ "sintomas": [
58
+ "Sintoma 1.",
59
+ "Sintoma 2!",
60
+ "Sintoma 3?"
61
+ ],
62
+ "tratamento": "Tratamento aqui."
63
+ },
64
+ "Queima das folhas por cercosporea": {
65
+ "descricao": "Descrição aqui.",
66
+ "sintomas": [
67
+ "Sintoma 1.",
68
+ "Sintoma 2!",
69
+ "Sintoma 3?"
70
+ ],
71
+ "tratamento": "Tratamento aqui."
72
+ },
73
+ "Sindome da Morte Subita": {
74
+ "descricao": "Descrição aqui.",
75
+ "sintomas": [
76
+ "Sintoma 1.",
77
+ "Sintoma 2!",
78
+ "Sintoma 3?"
79
+ ],
80
+ "tratamento": "Tratamento aqui."
81
+ },
82
+ "Saudavel": {
83
+ "descricao": "A folha não apresenta sinais visíveis de patógenos.",
84
+ "sintomas": ["Nenhum."],
85
+ "tratamento": "Continuar monitoramento e boas práticas agrícolas."
86
+ },
87
+
88
+ "Lagarta": {
89
+ "descricao": "Diversas espécies de lagartas, como a lagarta-da-soja (Anticarsia gemmatalis) ou a falsa-medideira (Chrysodeixis includens), atacam as lavouras de soja, causando desfolha e redução da produtividade.",
90
+ "sintomas": [
91
+ "Folhas comidas ou roídas, muitas vezes começando pelas bordas.",
92
+ "Presença de fezes (pequenas bolinhas escuras) nas folhas ou no solo.",
93
+ "Em ataques severos, pode ocorrer desfolha completa, restando apenas os talos."
94
+ ],
95
+ "tratamento": "Monitoramento constante (batida de pano) para identificar o nível de infestação. O controle é feito com inseticidas biológicos (como o Bt - Bacillus thuringiensis) ou químicos, dependendo da espécie da lagarta e do estágio da cultura."
96
+ }
97
+ }
main.py CHANGED
@@ -1,6 +1,7 @@
1
  import os
2
  import shutil
3
  import joblib
 
4
  import numpy as np
5
  from fastapi import FastAPI, File, UploadFile, Depends, HTTPException, status
6
  from fastapi.security import HTTPBearer, HTTPAuthorizationCredentials
@@ -29,7 +30,7 @@ async def verify_token(credentials: HTTPAuthorizationCredentials = Depends(secur
29
  )
30
  return credentials.credentials
31
 
32
- #2. CARREGAMENTO DOS MODELOS DE CLASSIFICAÇÃO (ML)
33
  #Carrega os 4 arquivos .pkl UMA VEZ quando a API inicia.
34
  print("Carregando modelos de classificação (.pkl)...")
35
  try:
@@ -42,8 +43,17 @@ except FileNotFoundError:
42
  print("ERRO: Arquivos .pkl do modelo não encontrados. Certifique-se de que 'scaler.pkl', 'umap_reducer.pkl', 'svm_model.pkl', e 'encoder.pkl' estão no repositório.")
43
  #Em um cenário real, poderíamos impedir a API de iniciar aqui
44
 
45
- #3. ENDPOINTS DA API
 
 
 
 
 
 
 
46
 
 
 
47
  @app.post("/classify/")
48
  async def classify_image(file: UploadFile = File(...), token: str = Depends(verify_token)):
49
  """
@@ -80,7 +90,20 @@ async def classify_image(file: UploadFile = File(...), token: str = Depends(veri
80
  #Converte a predição numérica (ex: 2) de volta para o nome da classe (ex: "Ferrugem")
81
  classe_predita = ENCODER.inverse_transform(pred_numerica)[0]
82
 
83
- return {"diagnostico": classe_predita}
 
 
 
 
 
 
 
 
 
 
 
 
 
84
 
85
  except Exception as e:
86
  #Pega qualquer erro que acontecer durante a extração ou classificação
 
1
  import os
2
  import shutil
3
  import joblib
4
+ import json
5
  import numpy as np
6
  from fastapi import FastAPI, File, UploadFile, Depends, HTTPException, status
7
  from fastapi.security import HTTPBearer, HTTPAuthorizationCredentials
 
30
  )
31
  return credentials.credentials
32
 
33
+ #2. CARREGAMENTO DOS MODELOS E DADOS
34
  #Carrega os 4 arquivos .pkl UMA VEZ quando a API inicia.
35
  print("Carregando modelos de classificação (.pkl)...")
36
  try:
 
43
  print("ERRO: Arquivos .pkl do modelo não encontrados. Certifique-se de que 'scaler.pkl', 'umap_reducer.pkl', 'svm_model.pkl', e 'encoder.pkl' estão no repositório.")
44
  #Em um cenário real, poderíamos impedir a API de iniciar aqui
45
 
46
+ print("Carregando banco de dados de informações (doencas.json)...")
47
+ try:
48
+ with open('doencas.json', 'r', encoding='utf-8') as f:
49
+ DB_INFO = json.load(f) #Carrega o JSON para a memória
50
+ print("Banco de dados de informações carregado.")
51
+ except FileNotFoundError:
52
+ print("ERRO: 'doencas.json' não encontrado.")
53
+ DB_INFO = {} #Inicia vazio para a API não quebrar
54
 
55
+
56
+ #3. ENDPOINTS DA API
57
  @app.post("/classify/")
58
  async def classify_image(file: UploadFile = File(...), token: str = Depends(verify_token)):
59
  """
 
90
  #Converte a predição numérica (ex: 2) de volta para o nome da classe (ex: "Ferrugem")
91
  classe_predita = ENCODER.inverse_transform(pred_numerica)[0]
92
 
93
+ #BUSCA AS INFORMAÇÕES ADICIONAIS (json)
94
+ #Usa .get() para buscar a chave. Se não encontrar, retorna um
95
+ #dicionário vazio ou uma mensagem de erro, com segurança
96
+ info_adicional = DB_INFO.get(classe_predita, {
97
+ "descricao": "Informações não disponíveis.",
98
+ "sintomas": [],
99
+ "tratamento": ""
100
+ })
101
+
102
+ #Retorna a resposta "rica"
103
+ return {
104
+ "diagnostico": classe_predita,
105
+ "info": info_adicional
106
+ }
107
 
108
  except Exception as e:
109
  #Pega qualquer erro que acontecer durante a extração ou classificação