Manufaturação industrial
Internet das coisas industrial | Materiais industriais | Manutenção e reparo de equipamentos | Programação industrial |
home  MfgRobots >> Manufaturação industrial >  >> Manufacturing Technology >> Processo de manufatura

Reconhecimento de dígitos AI com PiCamera

Reconhecer dígitos com Raspberry Pi, Pi Câmera, OpenCV e TensorFlow.

História

Neste projeto, vamos treinar uma rede neural convolucional profunda para transcrever dígitos. Em seguida, usaremos os dados do estágio de aprendizagem para permitir que a câmera Pi leia e reconheça os dígitos. O pipeline de AI será implementado usando Scikit e OpenCV 3.3 para manipulação de imagens e Keras que usa Tensorflow como back-end para a parte de aprendizado profundo.


Para facilitar, nenhum estágio de localização de recursos é feito. Você terá que empurrar a imagem na frente da lente da câmera para que seja o único recurso que ela vê.

O conjunto de dados MNIST será usado. É composto de 60.000 exemplos de treinamento e 10.000 exemplos de teste dos dígitos manuscritos de 0 a 9 formatados como imagens monocromáticas de 28 × 28 pixels. Basicamente, estamos transformando todas as imagens adquiridas da câmera em imagens que se parecem com isto:

A topologia de rede principal pode ser descrita por esta imagem abaixo:

A última camada é uma camada totalmente conectada que mapeia para 10 categorias que representam os 10 dígitos.

Faremos duas coisas. Primeiro, treinamos uma rede para reconhecer dígitos. Em seguida, usamos os pesos da rede que treinamos para reconhecer dígitos de alimentação da câmera ao vivo tirados da câmera Raspberry Pi.

Usei uma terceira mão para segurar a câmera Raspberry Pi, pois era tudo o que eu tinha. A configuração mecânica pode ser descrita por esta imagem abaixo:

Antes de começarmos tudo isso, vamos instalar tudo o que precisamos primeiro. Usei ambientes virtuais Python para configurar o programa. Então, supondo que você tenha todos os programas listados abaixo, você pode emitir:

 fonte ~ / .profile workon cvpython PiCameraApp.py --picamera 1 

Então, vamos aos detalhes. Primeiro, vamos instalar vários programas.

Instale o Tensorflow

 pip install tensorflow 

Instale Keras

 pip install keras 

Instale Open-CV 3.3

A instalação do OpenCV é um pouco complicada se você precisar de todas as otimizações. Isso significa que temos que compilá-lo do zero, pois o gerenciador de pacotes pip não tem todas as otimizações.

O melhor tutorial que encontrei é neste link:

 https://www.pyimagesearch.com/2017/09/04/raspbian-stretch-install-opencv-3-python-on-your-raspberry-pi/ 

Finalmente instale a picamera com otimizações Numpy.

 pip install "picamera [array]" 

Agora, depois de termos toda a pilha de software instalada no RPI, temos que fazer algum treinamento. A rede deve ser treinada em um laptop, de preferência com uma GPU, a menos que você seja um herói que se sinta confortável com o desempenho lento de uma geleira e decida fazer isso em um RPI.

Treinamento da rede

Para treinar a rede, execute o arquivo Python em um laptop emitindo:

 python Train_MNIST.py 

Isso pressupõe que você tenha Cuda (se estiver usando a versão gpu), Tensorflow, Keras e matplotlib instalados em seu laptop.

O programa neste arquivo usa Keras para definir um modelo de rede neural profunda, compilá-lo e após as fases de treinamento e validação, ele salva os pesos da rede.

No final, o programa salva os pesos da rede como um arquivo.h5. Este é o arquivo com os pesos da rede que vamos carregar no script de reconhecimento em execução no RPI para reconhecer imagens de dígitos ao vivo.

Copie o arquivo de peso para o seu RPI usando scp ou WinSCP.

Se você tiver uma GPU NVIDIA, o treinamento levará alguns minutos, dependendo da capacidade de computação de sua placa. Para aproveitar a GPU, no entanto, você terá que instalar a versão GPU do Tensorflow, bem como o executável CUDA do site da NVIDIA. Caso contrário, pode demorar um pouco mais se você estiver usando apenas a CPU.

Reconhecimento de imagens dinâmicas de dígitos

Acabei testando dígitos manuscritos e impressos. A precisão da previsão depende principalmente da iluminação e do ângulo da imagem e como sua escrita é ambígua (leia-se péssima). Depois de iniciar o aplicativo, pressione t para ler os dígitos e q para sair.

Reconhecendo o dígito 4. Tive que usar muita tinta para desenhar esse 4.

Às vezes, a rede imprime probabilidades infinitesimalmente baixas para os outros números. Portanto, há uma chance de 0,0001% de que seja um sete.
Ferramentas do comércio.

Explicação do programa

O programa tira um instantâneo da câmera ao pressionar a tecla 't' e aplica uma série de etapas de transformação à imagem antes de encaminhá-la para o DNN.

A primeira coisa que se deve ter em mente é que as imagens coloridas são adquiridas como uma grande variedade de números de ponto flutuante. Primeiro, a imagem é convertida de um formato RGB para uma imagem em escala de cinza para que possamos efetivamente jogando fora dois canais.

A próxima etapa é converter o formato de ponto flutuante da imagem em um número de 8 bits com um intervalo de 0-255.

Em seguida, usamos OpenCV, para fazer a limiarização. O método Otsu é usado para definir automaticamente o limiar da imagem para que as características do número sejam evidentes. A próxima etapa é redimensionar a imagem para um formato de 28 × 28 pixels. Este é o mesmo formato aceito pelo MNIST DNN.

Pode-se usar a imagem scikit, open-cv ou Keras para fazer o redimensionamento.

Depois que a imagem for redimensionada, a próxima etapa é inverter as cores, pois o MNIST espera que os números estejam em um fundo preto em oposição a linhas pretas em um fundo branco.

Após o pós-processamento, a imagem é enviada ao DNN que faz uma previsão do dígito observado.

A matriz de saída representa as probabilidades de que a imagem observada seja esse número. Portanto, um 1 na posição 2 mostra 100% de certeza, pois é um 1. Lembre-se de que a posição 1 está reservada para 0.

Etapas do algoritmo

1. Leia a imagem

O primeiro passo é obviamente colocar uma imagem antes da câmera. Isso será dimensionado posteriormente, pois a CNN (rede neural convolucional) espera imagens de um determinado tamanho.

2. Converter para escala de cinza

A imagem adquirida é então convertida em escala de cinza usando a chamada de função scipy. Coincidentemente, você só pode usar o opencv para as manipulações de imagem, mas deve se lembrar de todos os nomes das funções. Outro ponto:existem algumas diferenças muito sutis entre scipy e open-cv no que diz respeito a certas funções.

3. Dimensione o alcance da imagem

Aqui, a imagem é convertida de um formato de ponto flutuante para um intervalo uint8 [0, 255]

4. Limiar

Para obter uma bela imagem em preto e branco, o limiar é feito por meio do método Otsu. Este é o passo do molho mágico, já que fazer a limiarização manualmente fará com que os valores sejam inseridos um por um.

5. Redimensionar imagem

A imagem é redimensionada para uma matriz de 28 por 28 pixels. Isso é então achatado em uma matriz linear de tamanho (28 × 28)

6. Inverter imagem

MNIST DNN aceita imagens como 28 × 28 pixels, desenhadas como branco em fundo preto. Portanto, temos que inverter a imagem.

7. Alimente a rede neural treinada

Esta é a última etapa. Aqui estamos carregando os pesos da rede neural profunda e alimentando a imagem para a rede. Demora 2-3 segundos para chegar a uma previsão.

Finalmente, terminamos com uma matriz de saída com 10 classes mostrando todos os dígitos de 0-9. A posição da matriz representa a probabilidade de a inferência ser feita pela rede. Traduzir isso para a linguagem humana significa escolher a posição com a maior probabilidade.


A configuração principal parece um dispositivo médico.

Fin!

Isso é tudo. Isso mostrou como implementar uma rede neural que pode reconhecer dígitos.

Código carregado no GitHub como sempre.

Fonte: Reconhecimento de Dígito AI com PiCamera

Processo de manufatura

  1. Aceito:switch gigabit de 12 portas com 4 portas SFP
  2. AAEON colabora com a Intel para fornecer soluções de rede poderosas
  3. Lanner para atualizar dispositivos de rede com Intel Xeon de 2ª geração
  4. Ler a temperatura com DS18B20 | Raspberry Pi 2
  5. Medindo a temperatura com RASPBERRY PI
  6. Monitorando a temperatura com Raspberry Pi
  7. Postura Pal com Walabot
  8. Introdução ao TJBot
  9. Construindo um segway com Raspberry Pi
  10. GoPiGo v2 com Windows IoT