Manual

do

Maker

.

com

Primeiros passos com TensorFlow e minhas anotações

Primeiros passos com TensorFlow e minhas anotações

Algumas pessoas das comunidades que participo sabem que tenho andado afastado dos artigos devido à minha nova empreitada, que envolve visão computacional e redes neurais. Em um outro artigo discorri introdutoriamente sobre o Openface, fazendo o treinamento de uma base para reconhecimento facial. Se não leu, acompanhe por esse link.

No título falo de "minhas anotações" porque apesar de parecerem coisas simples e óbvias, não são adotadas ou explicitadas em tutoriais e algumas dessas conclusões levaram semanas de experimentação, por isso inicio falando de minha experiência com o OpenFace e seguidamente introduzo meu primeiro pé em TensorFlow junto com você, caso pretenda iniciar nesse mundo fantástico da inteligência artificial.

O Openface utiliza a rede neural Torch, que por sua vez cria um cache do treinamento (falando a grosso modo) e a partir disso, continua seu aprendizado. Em minha primeira semana de contato com uma base treinada, fiquei realmente surpreso ao notar o auto aprendizado da base, em todos os aspectos. O índice de acerto aumenta gradativamente, mas com um bom treinamento inicial, a base pode se tornar extremamente robusta de imediato. Treinei diversas vezes a base de reconhecimento facial com mais e com menos imagens e diferentes condições e as exporei nesse artigo.

Que tipo de dado deve ser passado para o reconhecimento facial

Existem infinidades de aplicações para redes neurais e o modo de treinar cada um dos objetivos difere. Por exemplo, para treinar o reconhecimento facial é muito bom que se tenha imagens de qualidade (considerando ainda o Openface como referência) porque a extração das 128 dimensões aplicadas sobre os dados de entrada dependem da qualidade dessa informação. Quero dizer, se você treinar uma bolacha trakinas e comparar com um emoticon a confidência será relativamente boa. O rosto de uma pessoa é rico em detalhes e o Openface não considera apenas os pontos principais normalmente utilizados para reconhecer um padrão de face, mas considera muitas outras características como barba e expressão. Quando o índice de confidência for baixo e o rosto não casar com a predição, repare que sempre haverá muita similaridade entre as duas imagens, de modo que até mesmo uma pessoa poderia confundir o objeto alvo.

Para resumir, em diversos treinamentos que fiz, percebi que algumas vezes o resultado estava aquém do esperado e analisando a situação, os principais fatores de influência foram os descritos a seguir.

Luminosidade

Uma incidência exagerada de luz pode afetar negativamente o resultado, pois a luz em excesso não controlada pela câmera omitirá detalhes utilizados na análise. As melhores medidas a se tomar é primeiramente garantir o controle de incidência de luz, variação de luz e contraste. Se for ambiente externo, deve-se garantir ao entardecer que a luz artificial seja suficiente para manter clara a visão da câmera. O infra-vermelho da câmera também afeta negativamente, removendo detalhes importantes da expressão.

Ângulo da câmera

Fiz um bom treinamento com filmagem frontal feita pelo smartphone a 30fps durante 17 segundos em full hd com um Galaxy S6, o que me rendeu boas imagens após extrair os quadros do video. Pode parecer muito, mas é fundamental que se tenha imagens suficientes para extrair o maior número de informações possíveis e com essa base de treinamento, cheguei a 98% de confidência na maioria dos casos, porém quando testando com uma câmera que pegava a pessoa em um ângulo diferente, a qualidade da predição caia significativamente. Após confrontar as possibilidades (das quais incluía-se a contra-luz), parti para uma nova tentativa, fazendo um treinamento mais amplo, gravando 1 minuto de video com deslocamento vertical e horizontal da caebça, incluindo parte do topo e abaixo do queixo, além de solicitar ao alvo que fizesse expressões diversar durante a filmagem. Esse novo treinamento subiu significativamente a qualidade do reconhecimento, chegando aos 100% de confidência!

Imagem limpa

Tem alguns treinamentos (como por exemplo reconhecimento de escrita à mão) que necessitam da entrada de ruídos para uma melhor acuidade. Por exemplo, uma letra "R"(maiúscula mesmo) poderia ter a 'perna direita' iniciada na 'barriga' da letra, invés de colada à 'outra perna'. Isso poderia ser danoso ao reconhecimento (e o é, em muitos casos), então a introdução de ruídos pode ser auxiliadora para letras. Mas não para reconhecimento facial; no reconhecimento facial você está passando a informação precisa do seu objetivo e as distorções disso virão da câmera. O que dará a confiabilidade serão os dados extraídos das informações confidentes que você passou nas imagens de treinamento, portanto, não há mágica; o bom resultado depende do bom treinamento. Passe imagens claras, limpas e com boa resulação para a base de treinamento. Depois, baseado em informações extraídas dos dados reais, aí sim espere por uma boa predição.

Óculos ou sem óculos?

Isso foi uma dúvida que tive, então filmei algumas pessoas que usam óculos somente sem os óculos e filmei outras pessoas que usam óculos somente com óculos. Bem, foi aí que comecei a me espantar com a rede neural.

Acompanhando por alguns dias a base treinada (na qual eu não estava incluído), percebi que o comportamento era me colocar em baixa confidência sempre com a mesma pessoa (porque mesmo que você não for reconhecido, a predição indicaria alguém com similariedade nas expressões) e nem dei muita atenção a isso porque obviamente a confidência era baixa; em torno de 25%. Porém ao passar mais e mais vezes, a confidência foi subindo - essa pessoa nunca passava pela câmera, mas eu sempre passava, e além de a confidência aumentar gradativamente, eu já não era mais comparado a nenhuma outra pessoa da base e daí que percebi que o Torch continuara a aprender. E a grande jogada aconteceu quando meu chefe  (que havia sido treinado sem óculos) passou pela câmera com óculos e passou a ser comparado com outra pessoa que sempre usava óculos, mas também não passava o tempo inteiro diante da câmera. E o mais engraçado foi que algumas vezes após passar pela câmera com óculos, todas as vezes posteriores sem óculos também remetiam ao mesmo engano, com baixa confidência e crescendo gradativamente. Isso significa algumas coisas:

1 - A rede neural aprende constantemente, incluindo a evolução da idade.

2 -  Se a referência principal passa ocasionalmente pela rede neural e outra pessoa desconhecida passa com frequência, ela pode assumir a identidade após um determinado periodo.

3 - O reajuste da confidência pode ser feito deixando o objeto alvo por um periodo exposto à rede neural. Isto é, Deixar uma pessoa diante da câmera que faz a captura da imagem e repassa para a rede neural fará aguçar o aprendizado.

4 - Se a pessoa eventualmente ou constantemente utiliza óculos, faça a filmagem com e sem óculos, sempre!

5 - Mantenha uma base generosa de imagens. Algo em torno de 2.000 imagens da mesma pessoa certamente tornará a confidência alta o suficiente para iniciar "em produção" no primeiro momento.

CPU ou GPU?

Não há a menor sombra de dúvida que a GPU é a melhor opção, ainda que conjunto à gargalos como mtherboard e processadores ruins. O caso é que até mesmo um notebook que contenha NVidia onboard já é auxiliador, sem exageros. Agora, se quer realmente desempenho, comece a pensar em boas placas de video. Até esse artigo, estou utilizando somente CPU, mas semana que vem deve chegar em minhas mãos uma GTX 1080 Pascal, que possui muitos núcleos e 8GB de RAM. Qualidade infinita tem custo infinito e sem dúvidas essa placa já é uma ótima opção para treinamento.

GPU ou CPU no cliente?

Aqui temos uma consideração importante; o pesado é gerar o treinamento; isso pode levar até meses em um computador convencional, dependendo da carga. Mas vi um treinamento de 15 dias que levou 72 horas quando feito na GPU. Mas depois de ter os dados utilizados pela rede neural, uma placa de menor potência é suficiente em muitos dos casos, portanto minha recomendação é que você tenha excelentes placas de video para treinamento e placas de video suficiente para processamento no cliente. Conforme eu coletar novas informações a respeito, descrevo-as, incluindo tutoriais de uso.

Introdução ao TensorFlow

Esse artigo obviamente não é para pessoas experientes. É primeiramente para mim mesmo, de modo que eu recorra às minhas anotações sempre que necessário for. Se você é tão iniciante quanto eu, poderá também usufruir desses detalhes.

Essa introdução ao TensorFlow é realmente uma introdução, este é meu primeiro contato e estou descrevendo a instalação baseando-me na própria documentação, mas de maneira simplificada para que eu possa iniciar do 0 novamente de maneira rápida quando necessário.

Como você pode não saber o que é TensorFlow, começo explicando em breves linhas. Trata-se de um trabalho realizado por engenheiros e pesquisadores do Google para facilitar a pesquisa em máquinas de aprendizado. O TensorFlow é lindo e fantástico e só não coloquei a mão nele antes porque o OpenFace salvou meu pescoço literalmente. Eu não tenho dúvidas da qualidade do TensorFlow, mas não fiz nada que me desse confiança de por a mão no fogo por ele. Já no OpenFace, estou bastante tranquilo (lembrando que o OpenFace utiliza o Torch).

Instalando o TensorFlow

Você tem diversas formas de fazer a instalação de maneira descomplicada. Destas, duas me agradam bastante; virtualenv com Python e a segunda, a mesma que utilizo com o OpenFace, o Docker. Esse primeiro contato iniciei mesmo com o virtualenv para ter uma nova experiência enquanto ainda aprendendo o TensorFlow e esse será o modo de instalação explicado nesse artigo

Instalando os pacotes necessários

O primeiro passo é instalar os pacotes relacionados:

sudo apt-get install python-pip python-dev python-virtualenv virtualenv

virtualenv

E então criar o virtualenv para o TensorFlow:

mkdir ~/tensorflow && virtualenv --system-site-packages ~/tensorflow

Para utilizar o virtualenv, você o ativa ou o desativa:

source ~/tensorflow/bin/activate

Feito isso, sua PS1 mudará para:

cina-01-300x103.webp

Agora a instalação do TensorFlow procede com a utilização do pip. Previamente, você deverá escolher um binário. Eu escolhi a primeira opção da lista que segue porque não tenho GPU em casa:

# Ubuntu/Linux 64-bit, CPU only, Python 2.7
(tensorflow)$ export TF_BINARY_URL=https://storage.googleapis.com/tensorflow/linux/cpu/tensorflow-0.11.0rc1-cp27-none-linux_x86_64.whl

# Ubuntu/Linux 64-bit, GPU enabled, Python 2.7
# Requires CUDA toolkit 8.0 and CuDNN v5. For other versions, see "Install from sources" below.
(tensorflow)$ export TF_BINARY_URL=https://storage.googleapis.com/tensorflow/linux/gpu/tensorflow-0.11.0rc1-cp27-none-linux_x86_64.whl

# Mac OS X, CPU only, Python 2.7:
(tensorflow)$ export TF_BINARY_URL=https://storage.googleapis.com/tensorflow/mac/cpu/tensorflow-0.11.0rc1-py2-none-any.whl

# Mac OS X, GPU enabled, Python 2.7:
(tensorflow)$ export TF_BINARY_URL=https://storage.googleapis.com/tensorflow/mac/gpu/tensorflow-0.11.0rc1-py2-none-any.whl

# Ubuntu/Linux 64-bit, CPU only, Python 3.4
(tensorflow)$ export TF_BINARY_URL=https://storage.googleapis.com/tensorflow/linux/cpu/tensorflow-0.11.0rc1-cp34-cp34m-linux_x86_64.whl

# Ubuntu/Linux 64-bit, GPU enabled, Python 3.4
# Requires CUDA toolkit 8.0 and CuDNN v5. For other versions, see "Install from sources" below.
(tensorflow)$ export TF_BINARY_URL=https://storage.googleapis.com/tensorflow/linux/gpu/tensorflow-0.11.0rc1-cp34-cp34m-linux_x86_64.whl

# Ubuntu/Linux 64-bit, CPU only, Python 3.5
(tensorflow)$ export TF_BINARY_URL=https://storage.googleapis.com/tensorflow/linux/cpu/tensorflow-0.11.0rc1-cp35-cp35m-linux_x86_64.whl

# Ubuntu/Linux 64-bit, GPU enabled, Python 3.5
# Requires CUDA toolkit 8.0 and CuDNN v5. For other versions, see "Install from sources" below.
(tensorflow)$ export TF_BINARY_URL=https://storage.googleapis.com/tensorflow/linux/gpu/tensorflow-0.11.0rc1-cp35-cp35m-linux_x86_64.whl

# Mac OS X, CPU only, Python 3.4 or 3.5:
(tensorflow)$ export TF_BINARY_URL=https://storage.googleapis.com/tensorflow/mac/cpu/tensorflow-0.11.0rc1-py3-none-any.whl

# Mac OS X, GPU enabled, Python 3.4 or 3.5:
(tensorflow)$ export TF_BINARY_URL=https://storage.googleapis.com/tensorflow/mac/gpu/tensorflow-0.11.0rc1-py3-none-any.whl
Finally install TensorFlow:

E então fiz o upgrade. As duas linhas de comando ficaram assim:

export TF_BINARY_URL=https://storage.googleapis.com/tensorflow/linux/cpu/tensorflow-0.11.0rc1-cp27-none-linux_x86_64.whl
pip install --upgrade $TF_BINARY_URL

Quando não estiver mais utilizando o TensorFlow, você pode encerrar o ambiente virtual simplesmente digitando 'deactivate' no console. Para reativá-lo, o mesmo processo descrito já anteriormente:

source ~/tensorflow/bin/activate

Primeiro uso

Agora você já pode testar sua instalação. Esse é o teste mais chato e sem graça que você pode fazer, mas é apenas para ver se está tudo funcionando a contento. Nesse momento você nem precisa entender o que é um tensor, apenas digite essas poucas linhas:

python
#depois dentro do interpretador:
import tensorflow as tf
hello = tf.constant('hello, moto')
sess = tf.Session()
print(sess.run(hello))

#mais um teste:
a = tf.constant(10)
b = tf.constant(32)
print(sess.run(a + b))

Classificador de escrita à mão

O mais simples teste que pode ser feito é a classificação de escrita à mão, contida já nos próprio exemplos. Obviamente deve-se executar esse teste, sem pestanejar.

python -m tensorflow.models.image.mnist.convolutional

Não preciso dizer que isso levará um belo tempinho, certo? Mas não se preocupe, não deve levar nem uma hora em um i3.

No próximo tutorial vamos ver mais detalhes do reconhecimento de escrita à mão e em breve, uma introdução a outra rede neural, da qual faremos reconhecimento de placas de carros, não perca.

Inscreva-se no nosso canal Manual do Maker no YouTube.

Também estamos no Instagram.

Nome do Autor

Djames Suhanko

Autor do blog "Do bit Ao Byte / Manual do Maker".

Viciado em embarcados desde 2006.
LinuxUser 158.760, desde 1997.