EduFalcao commited on
Commit
4e94cd1
Β·
verified Β·
1 Parent(s): 3c2746b

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +33 -29
app.py CHANGED
@@ -1,45 +1,49 @@
1
- import gradio as gr
2
- import numpy as np
3
- from tensorflow.keras.preprocessing.image import img_to_array
4
- from tensorflow.keras.models import load_model
5
- from PIL import Image, ImageOps
6
  import json
 
 
 
 
 
7
 
8
- # Constantes (mantΓ©m IMG_SIZE, CLASS_ORDER, etc)
9
- IMG_SIZE = (224, 224)
10
- CLASS_ORDER = sorted(['Healthy','Leaf Blight','Black Rot','ESCA'])
11
- # β†’ ['Black Rot','ESCA','Healthy','Leaf Blight']
 
 
12
 
13
- model = load_model("cropvision_model.keras")
 
 
 
 
14
 
15
  def predict(image: Image.Image):
16
- # prΓ©-processamento robusto
17
  img = ImageOps.exif_transpose(image).convert("RGB")
18
  img = ImageOps.fit(img, IMG_SIZE, Image.Resampling.LANCZOS)
19
 
20
- # inferΓͺncia
21
- arr = img_to_array(img) / 255.0
22
  arr = np.expand_dims(arr, 0)
23
- probs = model.predict(arr)[0] # vetor de 4 probabilidades
24
 
25
- idx = int(np.argmax(probs))
26
- cls = CLASS_ORDER[idx]
27
- # mapeamento label β†’ probabilidade
28
- mapping = {label: float(probs[i]) for i,label in enumerate(CLASS_ORDER)}
29
-
30
- # devolve (rΓ³tulo, JSON-formatado das probabilidades)
31
- return cls, json.dumps(mapping, indent=2)
32
 
 
 
 
 
33
  demo = gr.Interface(
34
  fn=predict,
35
- inputs=gr.Image(type="pil", label="Carrega uma folha"),
36
- outputs=[
37
- gr.Textbox(label="Classe predita"),
38
- gr.Code(label="Probabilidades (label:valor)")
39
- ],
40
- title="CropVision – classificaΓ§Γ£o de folhas",
41
- description="Healthy / Leaf Blight / Black Rot / ESCA"
42
  )
43
 
44
- if __name__ == "__main__":
45
  demo.launch()
 
 
 
 
 
 
 
1
  import json
2
+ from tensorflow.keras.models import load_model
3
+ from tensorflow.keras.preprocessing.image import img_to_array
4
+ from PIL import ImageOps, Image
5
+ import numpy as np
6
+ import gradio as gr
7
 
8
+ # β€”β€”β€”β€”β€”β€”β€”β€”β€”β€”β€”β€”β€”β€”β€”β€”β€”β€”β€”β€”β€”β€”
9
+ # 1) CARREGA O MAPEAMENTO EXATO de classes
10
+ # no teu treino, geraste um label_map.json com:
11
+ # json.dump(enc.classes_.tolist(), open("label_map.json","w"))
12
+ # subiste esse label_map.json junto do modelo
13
+ CLASS_ORDER = json.load(open("label_map.json"))
14
 
15
+ # β€”β€”β€”β€”β€”β€”β€”β€”β€”β€”β€”β€”β€”β€”β€”β€”β€”β€”β€”β€”β€”β€”
16
+ # 2) PRÉ-PROCESSAMENTO robusto para fotos de telemóvel
17
+ IMG_SIZE = (224, 224)
18
+ MODEL_PATH= "cropvision_model.keras"
19
+ model = load_model(MODEL_PATH)
20
 
21
  def predict(image: Image.Image):
22
+ # corrige rotaΓ§Γ£o EXIF e faz um crop centrado
23
  img = ImageOps.exif_transpose(image).convert("RGB")
24
  img = ImageOps.fit(img, IMG_SIZE, Image.Resampling.LANCZOS)
25
 
26
+ # normaliza e infere
27
+ arr = img_to_array(img)/255.0
28
  arr = np.expand_dims(arr, 0)
29
+ probs = model.predict(arr)[0]
30
 
31
+ # escolhe a classe e devolve tambΓ©m todas as probabilidades
32
+ idx = int(np.argmax(probs))
33
+ label = CLASS_ORDER[idx]
34
+ mapping = {CLASS_ORDER[i]: float(probs[i]) for i in range(len(probs))}
 
 
 
35
 
36
+ return label, f"{mapping}"
37
+
38
+ # β€”β€”β€”β€”β€”β€”β€”β€”β€”β€”β€”β€”β€”β€”β€”β€”β€”β€”β€”β€”β€”β€”
39
+ # 3) Gradio UI
40
  demo = gr.Interface(
41
  fn=predict,
42
+ inputs=gr.Image(type="pil", label="Carrega folha"),
43
+ outputs=[gr.Textbox(label="Classe"), gr.Code(label="Probabilidades")],
44
+ title="CropVision"
 
 
 
 
45
  )
46
 
47
+ if __name__=="__main__":
48
  demo.launch()
49
+