# ==========================================================
# IDENTIFICAÇÃO DE OBJETOS UTILIZANDO O MODELO MOBILENETV2
# ==========================================================
# Importação das bibliotecas necessárias
import cv2
import numpy as np
from google.colab import files
from tensorflow.keras.applications import MobileNetV2
from tensorflow.keras.applications.mobilenet_v2 import (
preprocess_input,
decode_predictions
)
# ==========================================================
# 1. Selecionar uma imagem do computador
# ==========================================================
print("Selecione uma imagem para análise.")
arquivo = files.upload()
# Obtém o nome do primeiro arquivo enviado
nome_imagem = next(iter(arquivo))
# ==========================================================
# 2. Ler a imagem utilizando o OpenCV
# ==========================================================
imagem = cv2.imread(nome_imagem)
# O OpenCV trabalha em BGR.
# O MobileNetV2 utiliza imagens no padrão RGB.
imagem = cv2.cvtColor(imagem, cv2.COLOR_BGR2RGB)
# ==========================================================
# 3. Ajustar a imagem para o formato esperado pelo modelo
# ==========================================================
# O MobileNetV2 recebe imagens de 224x224 pixels.
imagem = cv2.resize(imagem, (224, 224))
# Adiciona uma dimensão para representar o lote de imagens.
imagem = np.expand_dims(imagem, axis=0)
# Normaliza os valores dos pixels.
imagem = preprocess_input(imagem)
# ==========================================================
# 4. Carregar o modelo pré-treinado
# ==========================================================
rede_neural = MobileNetV2(weights="imagenet")
# ==========================================================
# 5. Classificar a imagem
# ==========================================================
resultado = rede_neural.predict(imagem, verbose=0)
# Obtém as três previsões mais prováveis
previsoes = decode_predictions(resultado, top=3)[0]
# ==========================================================
# 6. Exibir os resultados
# ==========================================================
print("\nObjeto(s) identificado(s):\n")
for indice, (_, classe, confianca) in enumerate(previsoes, start=1):
print(f"{indice}º - {classe} ({confianca:.2%})")