# -*- coding: utf-8 -*- """app.ipynb Automatically generated by Colab. Original file is located at https://colab.research.google.com/drive/1F6FhGqNtRd7g_rwOjRXAqLN8x8hflsRb """ import tensorflow as tf import numpy as np from tensorflow.keras.models import load_model from PIL import Image import gradio as gr import os MODEL_PATH = "modelo_cats_vs_dogs_cnn.h5" IMG_SIZE = (128, 128) # Carrega o modelo model = load_model(MODEL_PATH) def predict_image(img: Image.Image): # Garante 3 canais img = img.convert("RGB") # Redimensiona img = img.resize(IMG_SIZE) # Para array, normaliza img_array = np.array(img).astype("float32") / 255.0 # Adiciona batch img_array = np.expand_dims(img_array, axis=0) # Predição pred = model.predict(img_array)[0][0] # valor entre 0 e 1 (sigmoid) prob_cachorro = float(pred) prob_gato = float(1 - pred) if pred >= 0.5: classe = "Cachorro 🐶" else: classe = "Gato 😺" texto = f"Classe prevista: {classe}\nProb. Gato: {prob_gato:.3f}\nProb. Cachorro: {prob_cachorro:.3f}" # Label do Gradio aceita um dict com probs probs_dict = { "Gato": prob_gato, "Cachorro": prob_cachorro } return texto, probs_dict titulo = "Classificador de Cães e Gatos (CNN - TensorFlow)" descricao = "Envie uma imagem de gato ou cachorro e o modelo vai prever a classe 🐶😺." demo = gr.Interface( fn=predict_image, inputs=gr.Image(type="pil", label="Envie uma imagem de gato ou cachorro"), outputs=[ gr.Textbox(label="Resultado"), gr.Label(label="Probabilidades") ], title=titulo, description=descricao ) if __name__ == "__main__": # Importante para funcionar dentro do container port = int(os.getenv("PORT", 7860)) demo.launch(server_name="0.0.0.0", server_port=port)