Reconhecimento de imagem com TensorFlow

 

Para quem não conhece, TensorFlow é uma biblioteca open source mantida pela Google que serve para criação e treinamento de redes neurais.

Segue algumas empresas que usam TesorFlow

Imagem

Vamos mostrar com reconhecer padrões em imagens utilizando TensorFlow. O conceito é muito simples: Vamos baixar várias fotos e separar em duas pastas. em uma pasta vamos colocar várias fotos do Darth Vader e na outra várias fotos do mestre Yoda. Para esse teste, aproximadamente 35 fotos para cada pasta é suficiente. Quanto mais melhor. 

Logo em seguida vamos rodar um comando para o algorítimo ler as duas pastas e aprender os padrões de cada uma.

Quando o processo terminar, vai ser gerado um arquivo com esse "aprendizado". Para ser mais didático vou chama-lo de arquivo de aprendizado mas na documentação oficial, esse arquivo é chamado de pre-trained model (modelo pré-treinado). Que faz todo sentido. É um modelo que foi previamente treinado e vai ser usado posteriormente para identificar as imagens a qual foi treinado para reconhecer. Depois vamos rodar outro script que vai carregar o arquivo de aprendizado e identificar se uma foto qualquer é do darth vader ou Yoda. Esse resultado vem em forma numérica de 0 a 1. 

 Exemplo: Ao ler uma foto, nosso algoritimo retorna ago parecido com isso:

dart 0.99887

yoda 0.0034 

Reconhecendo com alto grau de confiabilidade que trata-se de uma imagem do Darth vader.

O conceito é bem bacana e pode ser aplicado em várias situações possíveis. 

Chega de conversa! mãos à obra!

Antes de começar, vamos precisar do Docker instalado. Nesse post mostramos com mais detalhes a instalação do Docker no windows. E até mesmo conceitos importantes para entender melhor o que é e como funciona o Docker. 

Com o terminal do Docker aberto, execute esse comando:

docker run -it -v ~/projects/dump/tf_files/:/tf_files/ danjarvis/tensorflow-android:1.0.0

Para quem não conhece, o parametro -v indica o volume no container. Na prática é uma pasta compartilhada entre o container e a máquina física. 

O diretório da parte esquerda é da máquina física e o da direita é o diretório dentro do container. Não precisa se preocuar em criar a pasta na máquina física. Quando terminar de baixar a imagem, a pasta é criada automaticamente. ~/ significa que a pasta vai ser criada dentro da pasta do usuário que no meu caso ficou assim:

C:/Users/davi/projects/dump/tf_files

Essa pasta vai corresponder a pasta /tf_files quando estiver dentro do container. Quando terminar de baixar a imagem, se ocorreu tudo certo, você já vai está dentro do container como root:

Imagem

Esse hash depois do @ é o id do container. 

Agora vamos baixar as imagens do Darth Vader e mestre Yoda. Para isso vamos utilizar um plugim do chrome chamado Fatkun batch download:

Imagem

Agora vamos no google pesquisar imagens do Darth Vade e Yoda:

Imagem

Quando o plugin está instalado, aparece um ícone no canto superior direito para baixar as imagens da busca:

Imagem

Vamos escolher a opção Essa guia

Imagem

Repetir o mesmo para mestre Yoda sem esquecer de desmarcar as imagens que não queremos. Deixando somente as imagens do mestre Yoda e Darth vader.

Feito isso, vamos criar uma pasta chamada star_wars e colocar a pasta vader e yoda dentro de star_wars. A pasta star_wars deve ficar dentro de C:/Users/davi/projects/dump/tf_files 

Imagem

Vamos conferir se conseguimos ver essas pastas dentro do container:

Imagem

IMPORTANTE: Não adicione underline nas pastas vader e yoda. Se estiver darth_vader ao invés de vader pode dar problema. 

Agora já podemos rodar o script para ler as pastas de fotos e gerar o arquivo de "aprendizado". Apara isso execute cd .. até voltar para diretório raiz do do container, entre na pasta tensorflow:

cd tensorflow

E depois execute:

git pull

Imagem

No meu caso aparece Already up-to-date por que eu já tinha executado antes. Mas se executar pela primeira vez, vai baixar os arquivos que precisamos para rodar o script que vai gerar o aprendizado:

python tensorflow/examples/image_retraining/retrain.py \
--bottleneck_dir=/tf_files/bottlenecks \
--how_many_training_steps 500 \
--model_dir=/tf_files_inception  \
--output_graph=/tf_files/retrained_graph.pb \
--output_labels=/tf_files/retrained_labels.txt \
--image_dir /tf_files/star_wars

Para quem não entendeu, coloquei barra invertida para escapar a quebra de linha. Fiz isso para não escrever o comando em uma única linha pois dessa forma fica mais fácil de ler. A barra invertida serve para que as quebras de linhas sejam ignoradas no comando.

 retrained_graph.pb é o arquivo de "aprendizado" que tinha falado antes. Ele vai ser gerado no final do processo. Vai ser gerado também o arquivo retrained_labels.txt. 

/tf_files/star_wars é a pasta que criamos. E dentro dela, todas as pastas das imagens que queremos ensinar para o algorítimo. Dentro da pasta star_wars tem que ter no mímino duas pastas. 

Vamos rodar o script e ver o resultado:

Imagem

Quando o processo iniciar, o script vai começar a ler as fotos e gerar vários arquivo txt na pasta /tf_files/bottlenecks. A demora do processo é proporcional a quantidade de imagens nas pastas:

Imagem

Enquanto o processo está rodando já podemos criar o script que vai carregar o arquivo de "aprendizado" e identificar se a imagem é do Darth vader ou do mestre yoda. Vamos criar um arquivo com nome label_image.py dentro da pasta /projects/dump/tf_files com o seguinte código:

import tensorflow as tf, sys
        
image_path = sys.argv[1]
# Read in the image_data
image_data = tf.gfile.FastGFile(image_path, 'rb').read()
# Loads label file, strips off carriage return
label_lines = [line.rstrip() for line 
                  in tf.gfile.GFile("/tf_files/retrained_labels.txt")]
# Unpersists graph from file
with tf.gfile.FastGFile("/tf_files/retrained_graph.pb", 'rb') as f:
   graph_def = tf.GraphDef()
   graph_def.ParseFromString(f.read())
   _ = tf.import_graph_def(graph_def, name='')
with tf.Session() as sess:
   # Feed the image_data as input to the graph and get first prediction
   softmax_tensor = sess.graph.get_tensor_by_name('final_result:0')
   
   predictions = sess.run(softmax_tensor, 
           {'DecodeJpeg/contents:0': image_data})
   
   # Sort to show labels of first prediction in order of confidence
   top_k = predictions[0].argsort()[-len(predictions[0]):][::-1]
   
   for node_id in top_k:
       human_string = label_lines[node_id]
       score = predictions[0][node_id]
       print('%s (score = %.5f)' % (human_string, score))
         

 Quando o processo finalizar, a pasta tf_files deve ficar assim:

Imagem

A pasta bottenecks, o arquivo retrained_graph.pb e retrained_labels.txt foram gerados pelo script. label_image.py é o script que acabamos de criar e star_wars é a pasta das imagens. 

Agora vamos copiar uma imagem do darth vader e outra do yoda para tf_files e testar com o script recém-criado:

Imagem

Dentro do container, vamos voltar para a asta /tf_files e testar o arquivo vader.jpg

python label_image.py vader.jpg

Imagem

Beleza! score vader deu quase 100%. Agora vamos testar o arquivo yoda.jpg

python label_image.py yoda.jpg

Imagem

Referências:

https://www.tensorflow.org/

https://codelabs.developers.google.com/codelabs/tensorflow-for-poets/?utm_campaign=chrome_series_machinelearning_063016&utm_source=gdev&utm_medium=yt-desc#0

https://github.com/llSourcell/tensorflow_image_classifier

Comentários

 

 
(há 2 semanas) Davi Sousa:

Existem várias maneiras de salvar. no arquivo label_image.py na última linha, os valores vem nas variáveis 

human_string, score
Você pode salvar direto ou executar o comando 

python label_image.py yoda.jpg
por outra linguagem (java por exemplo) e capturar os valores pela saída do console.

 
(há 8 meses) Davi Sousa:

Otavio, 

Nesse artigo diz que ele suporta vários tipos de camandas pricipalmente em redes convolucionais, mas no mesmo artigo diz também que pode aceitar outros dipos de redes como RNN. Mas não deixa claro se o Tensorflow para reconhecimento de imagens só suporta camadas em redes convolucionais ou se RNN é somente para outros tipos de classificação.

Nesse tutorial mostra como fazer classificação de imagens usando Tensorflow com convolutional neural network.

Conclusão: Não achei nada sobre isso no site ofical tensorflow.org. Então não tenho como ter certeza.

 
(há 10 meses) Davi Sousa:

Amanda, 

O parâmetro -v

-v ~/projects/dump/tf_files/:/tf_files/

Representa uma ligação entre a pasta tf_files na sua máquina física (Windows) e a pasta tf_files do container. É como se fosse uma pasta compartilhada entre sua máquina física e o container. Sempre que quiser criar alguma pasta, crie a pasta no windows dentro da pasta tf_files. Dessa forma você vai conseguir ver a pasta criada no windows dentro do container.

 
(há 10 meses) Davi Sousa:

Amanda, 

Esse erro acontece por que essa imagem do docker não existe mais. Quando for iniciar a imagem do docker use o comando que docker run desse post que vai funcionar. Segue o comando 

docker run -it -v ~/projects/dump/tf_files/:/tf_files/ danjarvis/tensorflow-android:1.0.0
 
(há 1 ano) Davi Sousa:

Vai sim. Mas para isso é importante que na base de dados de imangens do treinamento tenha imagens do Darth Vader com outros persornagens, cenários e etc... Quanto mais imangens e quanto maior a variação de imangens melhor. Nesse code labs, essa demonstração é feita com imagens de flores para identificar flores de várias espécies. Se baixar esse banco de imagens, percebe-se se há uma variação nos tipos de imagens. Exemplo: na pasta de gira-sol, tem fotos de pessoas segurando gira-sol, fotos de gira-sol em vários ambientes diferentes, um gira-sol, vários... e assim por diante. 

Quem Sou

Graduado em ADS (Análise e desenvolvimento de sistemas).

Não sou "devoto" de nenhuma linguagem de programação. Procuro aproveitar o melhor de cada uma de acordo com a necessidade do projeto. Prezo por uma arquitetura bem feita, código limpo, puro e simples! 

anuncio atendente