Importante

Você está vendo a versão anterior da nova experiência da Alura que estamos preparando para você. Em breve, ela ganha uma identidade visual novinha totalmente pensada em potencializar seus estudos!

0
respostas

[Projeto] Faça como eu fiz: identificando objetos com MobileNetV2

Testado com algumas imagens de gato e cachorro, o clássico usando em exemplos didáticos.
para melhor entender o código faço alguns comentário:

  • o OpenCV não entende RGB diretamente ele entende BGR e por isso precisa converter a imagem para RGB
  • o mobilenetv2 precisa da imagems no format 224x224, por isso toda imagem precisa ser convertida neste tamanho
  • np.expand_dims(imagem_redimensionada, axis=0) serve para adicionar uma dimensão extra que seria o lote(batch) o mobilienetv2 processame lotes de imagens sem isso geraria um erro no tensofflow (largura, latura, cor) (224,224,3) adição do lote (1,224,224,3) o 1 indica o lote
  • o preprocess_input - serve para fornecer ao algoritmo mobilenetv2 os dados dos pixels de forma normalizada invés de valores de 0 a 225 coloca os valores entre [-1,1], isso deve ser feito para minimizar erros no gradiente durante os cálculos de perda da rede neural.
  • Especifiquei para obter o primeiro Rótulo identificado e seu percentual de probabilidade e depois a lista de top 5 das probabilidade identificadas para aquela foto.
  • as fotos de golden retrievers que apresentei forma identificadas corretamente 96% com duas fotos diferentes
  • as fotos de gato ele identificou coo um raça genérica com 71% de probabilidade em duas fotos diferentes
from tensorflow.keras.applications import MobileNetV2
from tensorflow.keras.applications.mobilenet_v2 import preprocess_input, decode_predictions
import numpy as np
import cv2
import matplotlib.pyplot as plt
from google.colab import files
from PIL import Image

# Fazer upload da imagem
uploaded = files.upload()
imagem_path = list(uploaded.keys())[0]  # Pega o nome do arquivo enviado
print(imagem_path)

# Carregar a imagem usando OpenCV
imagem = cv2.imread(imagem_path)
imagem_rgb = cv2.cvtColor(imagem, cv2.COLOR_BGR2RGB)

# Carregar o modelo MobileNetV2 pré-treinado
modelo = MobileNetV2(weights="imagenet")

# Pré-processar a imagem para o formato esperado pelo modelo
imagem_redimensionada = cv2.resize(imagem_rgb, (224, 224))
imagem_array = np.expand_dims(imagem_redimensionada, axis=0)
imagem_array = preprocess_input(imagem_array)

# Fazer a previsão
predicoes = modelo.predict(imagem_array)
label = decode_predictions(predicoes)
print(label)

#mostrar a probabilidade em porcentagem
print(f'{(label[0][0][2]*100):.2f}%')  #mostra percentual de probabilidade do Rótulo da base imagenet
print("Objeto identificado:", label[0][0][1])  # Exibe a classe identificada


print("\n--- Resultados da Classificação ---")
for i, (imagenet_id, label_nome, probabilidade) in enumerate(label[0]):
    porcentagem = probabilidade * 100
    # --- MELHORIA DIDÁTICA: Tradução ou formatação limpa do nome da classe (substituindo underscores) ---
    classe_formatada = label_nome.replace('_', ' ').title()
    print(f"Top {i+1}: {classe_formatada} -> {porcentagem:.2f}%")

#Plotar a imagem original com o rótulo Top-1 usando Matplotlib no Colab ---
plt.imshow(imagem_rgb)
plt.title(f"{label[0][0][1].replace('_', ' ').title()} ({label[0][0][2]*100:.2f}%)")
plt.axis('off')
plt.show()