# -*- coding: utf-8 -*- """ Created on Sun Nov 2 22:59:41 2025 @author: mathe """ import gradio as gr import numpy as np from PIL import Image import tensorflow as tf # === CONFIGURAÇÕES === IMG_SIZE = 224 CLASS_NAMES = ["gato", "cachorro"] # mesma ordem do treino (0=cat, 1=dog) # === CARREGAR MODELO === model = tf.keras.models.load_model("model.keras") # === FUNÇÃO DE PREVISÃO === def preprocess_pil(img: Image.Image): img = img.convert("RGB").resize((IMG_SIZE, IMG_SIZE)) arr = np.array(img, dtype=np.float32) # MobileNetV2 preprocess (como no treino) arr = tf.keras.applications.mobilenet_v2.preprocess_input(arr) arr = np.expand_dims(arr, axis=0) return arr def predict(img: Image.Image): x = preprocess_pil(img) probs = model.predict(x)[0] # [p_cat, p_dog] return { CLASS_NAMES[0]: float(probs[0]), CLASS_NAMES[1]: float(probs[1]) } # === INTERFACE GRADIO === demo = gr.Interface( fn=predict, inputs=gr.Image(type="pil", label="Envie uma imagem"), outputs=gr.Label(num_top_classes=2), title="Classificador de Gatos vs. Cães 🐱🐶", description="Modelo treinado com MobileNetV2 (Transfer Learning, TensorFlow)." ) # === EXECUÇÃO LOCAL OU NO SPACE === if __name__ == "__main__": demo.launch()