"""
CLASSIFICACAO DE OBJETOS COM MobileNetV2
Codigo pratico e otimizado para identificar objetos em imagens
"""
import numpy as np
import matplotlib.pyplot as plt
from PIL import Image
import tensorflow as tf
from tensorflow.keras.applications import MobileNetV2
from tensorflow.keras.applications.mobilenet_v2 import preprocess_input, decode_predictions
import urllib.request
1. CARREGAR MODELO
print("Carregando MobileNetV2...")
modelo = MobileNetV2(weights='imagenet')
print("Pronto!\n")
2. PROCESSAR IMAGEM
def processar_imagem(caminho, tamanho=(224, 224)):
"""Pre-processa imagem para o modelo"""
if caminho.startswith('http'):
img = Image.open(urllib.request.urlopen(caminho))
else:
img = Image.open(caminho)
if img.mode != 'RGB':
img = img.convert('RGB')
original = img.copy()
img = img.resize(tamanho)
arr = np.array(img)
arr = np.expand_dims(arr, axis=0)
arr = preprocess_input(arr)
return arr, original
3. CLASSIFICAR
def classificar(caminho):
"""Classifica objeto na imagem"""
arr, original = processar_imagem(caminho)
predicoes = modelo.predict(arr, verbose=0)
resultado = decode_predictions(predicoes, top=5)[0]
print("RESULTADOS:")
print("-" * 40)
for i, (id_classe, nome, conf) in enumerate(resultado, 1):
print(f"{i}. {nome.upper()}: {conf*100:.2f}%")
print("-" * 40)
# Visualizar
fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(12, 4))
ax1.imshow(original)
ax1.set_title("Imagem Original")
ax1.axis('off')
nomes = [r[1].replace('_', ' ').title() for r in resultado]
confs = [r[2]*100 for r in resultado]
cores = ['#2ecc71', '#3498db', '#9b59b6', '#e74c3c', '#f39c12']
barras = ax2.barh(nomes, confs, color=cores[:len(nomes)])
ax2.set_xlabel('Confianca (%)')
ax2.set_title('Top 5 Predicoes')
ax2.set_xlim(0, 100)
for barra, conf in zip(barras, confs):
ax2.text(conf+1, barra.get_y()+barra.get_height()/2,
f'{conf:.1f}%', va='center')
plt.tight_layout()
plt.show()
4. EXEMPLOS
if name == "main":
print("="*40)
print("CLASSIFICACAO COM MobileNetV2")
print("="*40 + "\n")
# Exemplo 1: Gato
print("Exemplo 1: Identificando um gato...")
url_gato = "https://upload.wikimedia.org/wikipedia/commons/thumb/3/3a/Cat03.jpg/1200px-Cat03.jpg"
classificar(url_gato)
# Exemplo 2: Cachorro
print("\nExemplo 2: Identificando um cachorro...")
url_dog = "https://upload.wikimedia.org/wikipedia/commons/thumb/2/26/YellowLabradorLooking_new.jpg/1200px-YellowLabradorLooking_new.jpg"
classificar(url_dog)
print("\n" + "="*40)
print("USAR COM SUAS IMAGENS:")
print("="*40)
print("""
# Arquivo local
classificar('caminho/imagem.jpg')
# URL da internet
classificar('https://exemplo.com/imagem.jpg')
""")
print("""
CLASSES RECONHECIDAS: 1000+ objetos
- Animais: gatos, caes, aves, etc
- Veiiculos: carros, bicicletas, etc
- Alimentos: pizzas, frutas, etc
- Objetos: moveis, eletronicos, etc
- Cenas: praia, montanha, etc
CARACTERISTICAS:
- Tamanho: 53 MB
- Velocidade: Muito rapido (~100ms)
- Precisao: 71% top-1, 90% top-5
- Ideal: Dispositivos moveis
""")
::