jpbernardo commited on
Commit
0a76d69
·
verified ·
1 Parent(s): f1e2fad

Upload 4 files

Browse files
Files changed (4) hide show
  1. app.py +71 -0
  2. dockerfile +21 -0
  3. modelo_cats_vs_dogs_cnn.h5 +3 -0
  4. requirements.txt +2 -0
app.py ADDED
@@ -0,0 +1,71 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # -*- coding: utf-8 -*-
2
+ """app.ipynb
3
+
4
+ Automatically generated by Colab.
5
+
6
+ Original file is located at
7
+ https://colab.research.google.com/drive/1F6FhGqNtRd7g_rwOjRXAqLN8x8hflsRb
8
+ """
9
+
10
+ import tensorflow as tf
11
+ import numpy as np
12
+ from tensorflow.keras.models import load_model
13
+ from PIL import Image
14
+ import gradio as gr
15
+ import os
16
+
17
+ MODEL_PATH = "modelo_cats_vs_dogs_cnn.h5"
18
+ IMG_SIZE = (128, 128)
19
+
20
+ # Carrega o modelo
21
+ model = load_model(MODEL_PATH)
22
+
23
+ def predict_image(img: Image.Image):
24
+ # Garante 3 canais
25
+ img = img.convert("RGB")
26
+ # Redimensiona
27
+ img = img.resize(IMG_SIZE)
28
+ # Para array, normaliza
29
+ img_array = np.array(img).astype("float32") / 255.0
30
+ # Adiciona batch
31
+ img_array = np.expand_dims(img_array, axis=0)
32
+
33
+ # Predição
34
+ pred = model.predict(img_array)[0][0] # valor entre 0 e 1 (sigmoid)
35
+
36
+ prob_cachorro = float(pred)
37
+ prob_gato = float(1 - pred)
38
+
39
+ if pred >= 0.5:
40
+ classe = "Cachorro 🐶"
41
+ else:
42
+ classe = "Gato 😺"
43
+
44
+ texto = f"Classe prevista: {classe}\nProb. Gato: {prob_gato:.3f}\nProb. Cachorro: {prob_cachorro:.3f}"
45
+
46
+ # Label do Gradio aceita um dict com probs
47
+ probs_dict = {
48
+ "Gato": prob_gato,
49
+ "Cachorro": prob_cachorro
50
+ }
51
+
52
+ return texto, probs_dict
53
+
54
+ titulo = "Classificador de Cães e Gatos (CNN - TensorFlow)"
55
+ descricao = "Envie uma imagem de gato ou cachorro e o modelo vai prever a classe 🐶😺."
56
+
57
+ demo = gr.Interface(
58
+ fn=predict_image,
59
+ inputs=gr.Image(type="pil", label="Envie uma imagem de gato ou cachorro"),
60
+ outputs=[
61
+ gr.Textbox(label="Resultado"),
62
+ gr.Label(label="Probabilidades")
63
+ ],
64
+ title=titulo,
65
+ description=descricao
66
+ )
67
+
68
+ if __name__ == "__main__":
69
+ # Importante para funcionar dentro do container
70
+ port = int(os.getenv("PORT", 7860))
71
+ demo.launch(server_name="0.0.0.0", server_port=port)
dockerfile ADDED
@@ -0,0 +1,21 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # Imagem base já com TensorFlow instalado (CPU)
2
+ FROM tensorflow/tensorflow:2.17.0
3
+
4
+ # Cria diretório de trabalho
5
+ WORKDIR /app
6
+
7
+ # Copia os arquivos de dependências
8
+ COPY requirements.txt .
9
+
10
+ # Instala dependências extras (gradio, pillow)
11
+ RUN pip install --no-cache-dir -r requirements.txt
12
+
13
+ # Copia o app e o modelo para dentro do container
14
+ COPY app.py .
15
+ COPY modelo_cats_vs_dogs_cnn.h5 .
16
+
17
+ # Porta usada pelo Gradio
18
+ EXPOSE 7860
19
+
20
+ # Comando para iniciar a aplicação
21
+ CMD ["python", "app.py"]
modelo_cats_vs_dogs_cnn.h5 ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:36b7b58122507834ef6fb38da5a7e1eda324494f377e1e3c0d13b29b7ed3d95b
3
+ size 39704352
requirements.txt ADDED
@@ -0,0 +1,2 @@
 
 
 
1
+ gradio
2
+ Pillow