Manual
do
Maker
.
com
Modelos pré-treinados ajudam bastante, economizando tempo e recursos de hardware. No caso de classificação, montar um dataset não é uma das tarefas mais simples, como foi visto no artigo Como criar um dataset para deep learning. Outra vantagem é que existem models conceituados e com estruturas gigantescas; treiná-los ou criá-los poderia ser uma tarefa de dias em um GPU. Nesse artigo vamos ver como utilizar os diversos alguns dos models disponíveis no Keras.
Já citei em outros artigo, mas vale reforçar. Redes neurais e visão computacional não estão entre minhas especialidades, só estou abordando o assunto com o mínimo de conhecimento que tenho a respeito, somado a muitos estudos atuais, com o propósito de aplicar em IoT e alguns projetos que eventualmente virarão produtos. Não tome meus artigos de inteligência artificial como referência. Se seu inglês é satisfatório, vá ao learnopencv.com e ao pyimagesearch.com para pegar bons materiais com boas explicações. A partir do próximo artigo relacionado, aí sim será conhecimento aplicado. Até esse artigo, é apenas estudo.
Já escrevi 2 artigos sobre o MNIST (esse é um deles), agora vamos ver outros models disponíveis.
ImageNet é um projeto que oferece uma enorme base de imagens para o propósito de pesquisas, contendo mais de 14 milhões de imagens e mais de 20 mil classes (uau)! Possui mais de 1 milhão de imagens com caixas delimitadoras, utilizado em tarefas de localização.
ImageNet Large Scale Visual Recognition Challenge é uma competição anual organizada pela equipe da ImageNet desde 2010, onde grupos de pesquisa avaliam seus algorítimos de visão computacional e tarefas de reconhecimento como classificação e localização de objetos.
Esses são alguns dos models disponíveis, sendo os casos mais significativos.
Um model treinado tem duas partes, sendo a arquitetura e os pesos. Esses pesos são arquivos grandes que são baixados na primeira vez que o model é invocado.
Um artigo com informações mais detalhadas (em inglês) sobre o tema pode ser visto aqui. Estou praticamente reproduzindo para ter as anotações necessárias em um só local. Primeiro porque é mais fácil centralizar a busca, segundo porque servirá para quem interessar possa.
Podemos fazer o carregamento de múltiplos módulos de uma vez. No caso, vamos utilizar o VGGNet mais uma vez, só que agora importar o model invés de criar o dataset com uma estrutura simplificada, como feito no artigo Como criar um dataset para deep learning. Além dele, vamos utilizar o inception, resnet e mobilenet.
import keras
import numpy as np
from keras.applications import vgg16, inception_v3, resnet50, mobilenet
#Load the VGG model
vgg_model = vgg16.VGG16(weights='imagenet')
#Load the Inception_V3 model
inception_model = inception_v3.InceptionV3(weights='imagenet')
#Load the ResNet50 model
resnet_model = resnet50.ResNet50(weights='imagenet')
#Load the MobileNet model
mobilenet_model = mobilenet.MobileNet(weights='imagenet')
Acima temos alguns módulos Python contendo os respectivos models disponíveis no Keras. Seguidamente, carregamos a arquitetura e os pesos para as redes. Se não quisermos iniciar a rede com os pesos da ImageNet, basta repassar o valor do parâmetro weightscom None.
Em artigos anteriores já utilizei o OpenCV, PIL e NumPy para carregar imagens. O próprio Keras oferece um módulo de imagem com função de importação e pré-processamento, requerido antes de alimentar a rede para fazer predição. Os passos são:
Sabendo disso, fazemos os imports relacionados e aproveitamos para importar a biblioteca de gráficos, a matplotlib.
from keras.preprocessing.image import load_img
from keras.preprocessing.image import img_to_array
from keras.applications.imagenet_utils import decode_predictions
import matplotlib.pyplot as plt
#%matplotlib inline
Para receber uma imagem via parâmetro, podemos utilizar a biblioteca argparse ou, como não tem outro parâmetro, simplesmente a sys, pegando o primeiro parâmetro pelo argv.
import sys
if len(sys.argv) < 2:
print("Passe o nome da imagem como parâmetro. Saindo...")
sys.exit(0)
filename = sys.argv[1]
original = load_img(filename, target_size=(224, 224))
print('PIL image size',original.size)
plt.imshow(original)
plt.show()
numpy_image = img_to_array(original)
plt.imshow(np.uint8(numpy_image))
plt.show()
print('numpy array size',numpy_image.shape)
image_batch = np.expand_dims(numpy_image, axis=0)
print('image batch size', image_batch.shape)
plt.imshow(np.uint8(image_batch[0]))
Agora precisamos de algumas linhas de código para fazer a predição do alvo.
A função decode_predictionsdevolve o nome da classe, invés do número. Isso ajuda bastante na leitura humana e facilita na programação. Também podemos especificar quantos resultados quereremos e assim obter um resultado de cada um dos models disponíveis no Keras.
processed_image = vgg16.preprocess_input(image_batch.copy())
predictions = vgg_model.predict(processed_image)
label = decode_predictions(predictions)
print label
Infelizmente minha placa de vídeo não tem memória o suficiente para alocar os recursos necessário e essa foi a única predição que consegui fazer. Fiz alguns testes com outro model para colorização de imagens em grayscale (talvez eu escreva a respeito), daí passei a imagem colorida como parâmetro:
Para chamar o script, utilizei a linha de comando:
python kerasModels.py /home/djames/neuralNetworks/Colorization/baloes_colorized.png
E o resultado:
Como pode-se notar, a predição apontou para os balões com excelente acurácia.
Apenas para complementar, a imagem acima não foi colorida com essas redes, elas são apenas para predição. Se eu vier a escrever sobre colorização com inteligência artificial, falo a respeito do tipo de rede e do model. A imagem de referência utilizada para a colorização acima foi essa:
Nada mal, hum?
Enfim, voltando ao tema desse artigo, utilizar os models disponíveis no Keras é uma mão na roda e não deixam nada a desejar, a não ser uma placa de vídeo mais potente.
Espero que tenha gostado do artigo e não deixe de se inscrever em nosso canal do Youtube, DobitAoByteBrasil.
Inscreva-se no nosso canal Manual do Maker no YouTube.
Também estamos no Instagram.
Autor do blog "Do bit Ao Byte / Manual do Maker".
Viciado em embarcados desde 2006.
LinuxUser 158.760, desde 1997.