quinta-feira, novembro 30, 2017

Comparar descritores e algoritmos de Machine Learning para classificar imagens

Comparar descritores HOG e Algoritmos de Aprendizado de Máquina


Vamos ver aqui como comparar diferentes parâmetros do descritor de HOG e abordagens ML para classificação de imagens com inteligência artificial.

O script python eval_train_classify.py (veja link open source no fim do artigo) executa as seguintes tarefas:


  • Ler todo o conjunto de dados, divida no treino e teste
  • Criar descritores HOG para todos os conjuntos de dados do trem para uma variação dos parâmetros HOG
  • Criar modelos para diferentes algoritmos de aprendizado de máquina como SVM, floresta aleatória
  • classifique imediatamente o conjunto de testes dividido e obtenha precisão do modelo
  • Criar uma tabela com todos os resultados


O objetivo é usar a tabela para decidir o melhor algoritmo e parâmetros HOG para usar para resolver o problema.
Aqui, o conjunto de dados de imagem é MNIST, o conjunto de dados de dígitos de escrita manual. Você pode usar qualquer conjunto de dados de imagem com poucas modificações.

Conjunto de dados MNIST


MNIST é um conjunto de dados amplamente utilizado para visão por computador. Tem décimos de milhares de dígitos marcados em imagens cinzas de tamanho de 28x28 pixels. Além disso, há um conjunto de testes, significa também um grande conjunto de imagens não gravadas (em Kaggle) para que se possa testar seu modelo. O conjunto de dados usado neste repositório é de https://www.kaggle.com/c/digit-recognizer/data. (baixe os arquivos train.csv e test.csv e coloque no diretório / dados)

Exemplo de dígito MNIST:


Classificação da imagem


Uma abordagem para executar a classificação MNIST é através de descritores HOG.

HOG significa Histograma de Gradientes Orientados. Ele gera um histograma de gradientes de imagens e bordas. Com este descritor de imagem, podemos comparar imagens e verificar se elas são semelhantes (mesmo dígito) ou não.

O algoritmo de aprendizagem de máquina leva muitos exemplos (conjunto de dados de trem) de imagens de dígitos, rótulo de dígitos (o nome de dígitos) e o descritor HOG de muitas amostras e aprende com ele.

Depois que o modelo de aprendizagem é criado, pode-se prever o novo rótulo de dígitos (valores) do conjunto de dados do teste.

Em seguida, comparamos os valores reais com os valores previstos. Com esses valores, calculamos a precisão. A tabela abaixo mostra a precisão de cada algoritmo de Aprendizagem em Máquina nesta lista:


  • SVM - Máquina de vetores de suporte
  • DTC - Classificador de árvore de decisão
  • Random Forest - um conjunto de árvores de decisão divididas para uma melhor previsão
  • (mais em breve)

E muitas configurações diferentes do descritor HOG com os seguintes parâmetros:


  • Orientações
  • Pixels por célula
  • Células por bloco

Como podemos ver, mudar esses parâmetros afeta completamente a precisão.

Com esta ferramenta, pode-se comparar as classificações baseadas na imagem com base em HOG e encontrar o melhor resultado para treinar um modelo real para o seu sistema e depois prever.

Stack técnico


  • Python
  • sklearn


Para acessar o código fonte deste projeto entre em:

https://github.com/dpetrini/mnist_compare


Saida do comando

Veja abaixo um exemplo de tabela gerada. Podemos facilmente obter os parâmetros e algoritmo de melhor performance e preparar nosso modelo otimizado!

Saida:


Train data shape (29399, 28, 28) T
arget shape (29399,) 
Unique elements in targets: [0 1 2 3 4 5 6 7 8 9] Feature: HOG
ML AlgoorientationspixelsPerCellcellsPerBlockScoreTime
SVM2(2, 2)(1, 1)0.5677447.74
DTC2(2, 2)(1, 1)0.8107402.42
Random Forest2(2, 2)(1, 1)0.9475413.58
SVM2(2, 2)(2, 2)0.7965496.72
DTC2(2, 2)(2, 2)0.8193480.40
Random Forest2(2, 2)(2, 2)0.9521417.86
SVM2(2, 2)(3, 3)0.8219404.21
DTC2(2, 2)(3, 3)0.8193416.96
Random Forest2(2, 2)(3, 3)0.9556376.84
SVM2(2, 2)(4, 4)0.8322407.08
DTC2(2, 2)(4, 4)0.8180416.41
Random Forest2(2, 2)(4, 4)0.9520340.62
... (llinhas omitidas)
Random Forest6(4, 4)(3, 3)0.968395.93
SVM6(4, 4)(4, 4)0.898663.41
DTC6(4, 4)(4, 4)0.857399.39
... best result:
Random Forest6(4, 4)(4, 4)0.970179.80
SVM6(4, 4)(5, 5)0.877247.23
DTC6(4, 4)(5, 5)0.854872.41
Random Forest6(4, 4)(5, 5)0.969560.55
SVM18(2, 2)(1, 1)0.8022415.57
...
Random Forest24(4, 4)(1, 1)0.9541118.87
SVM24(4, 4)(2, 2)0.9225308.32
DTC24(4, 4)(2, 2)0.8289158.07
Random Forest24(4, 4)(2, 2)0.9607124.95
SVM24(4, 4)(3, 3)0.9333227.19
DTC24(4, 4)(3, 3)0.8346196.75
Random Forest24(4, 4)(3, 3)0.9588117.16
SVM24(4, 4)(4, 4)0.911481.49
DTC24(4, 4)(4, 4)0.8286200.64
Random Forest24(4, 4)(4, 4)0.960099.57
SVM24(4, 4)(5, 5)0.891863.80
DTC24(4, 4)(5, 5)0.8283163.17
Random Forest24(4, 4)(5, 5)0.961880.01

Summary totalPass each: 90 (many lines ommited in above table for brevity, see file: eval_output.txt for complete result)
AVG Score
SVM0.85
DTC0.82
Random Forest0.95
AVG Time
SVM281.85
DTC332.58
Random Forest219.89
Max Score
SVM0.9333
DTC0.8752
Random Forest0.9707

sexta-feira, abril 14, 2017

Sonoff, o ESP8266 pronto para Automação Residencial

Conforme já comentamos, um mundo novo se abriu com o processador ESP8266, especialmente com o suporte da IDE Arduino. Um dos produtos surgidos é o Sonoff, dispositivo para automação residencial baseado no ESP8266.

Sonoff


O Sonoff é produzido pela empresa chinesa Itead (www.itead.cc) e na verdade é o membro mais simples de uma família de produtos voltados para automação que vão desde um simples relê controlado via WiFi até medidores de energia e coletores de dados de temperatura, humidade, etc.
Ele é um produto fechado que vem pronto para uso e junto com uma app de controle que funciona em Android e iOS. A aplicação funciona em inglês e encontra automaticamente os Sonoffs que já estiverem ligados na energia elétrica.
Com a aplicação é possível configurar o relê para controle via celular da própria rede wifi ou mesmo remotamente.
Tudo isso porque essa app e o sistema são baseados em nuvem, ou seja, temos aqui um legítimo cidadão do mundo IOT (Internet das Coisas).

Customização completa


As novidades não param por ai. Não basta que o sistema é completo para o usuário instalar em casa, e a preços bem atrativos, o sistema permite customização total! Sim, o fabricante Itead, é um dos principais criadores de placas para hobbystas e makers, então não poderia deixa-los na mão com seu novo produto. O Sonoff (todos da família) permitem regravação do firmware via IDE Arduino.
Ele vem com espaços para inserção de conectores (ou ligação direta mesmo) com os sinais de VCC, GND, RX e TX pelo menos. Isso permite que se conecte num conversor USB-Serial como o FTDI e reprograme totalmente seu módulo.
Vamos aqui mostrar como entender o hardware do Sonoff para realizar sua própria programação via IDE Arduino.

Veja na figura abaixo um Sonoff Relay com conector já soldado para ligar os cabos do conversor.

Sonoff (ESP8266) aberto e conectado ao conversor FTDI
Sonoff conectado no USB Serial FTDI
Veja na imagem acima, do dispositivo Sonoff aberto (é muito fácil abrir) e os conectores para rede elétrica abaixo (entrada) e acima (saída para a carga).

Programação do Sonoff ESP8266


Para programar o chip, basta ligar os cabos conforme indicado abaixo.

Sonoff (placa baseada no ESP8266) - pinagem
Sonoff (placa baseada no ESP8266) - pinagem
Para programar basta gravar seu último software que usou em outra placa ESP8266, como o ESP8266-01, ESP8266-12, etc, considerando as seguintes informações:


Item da Placa Pino ESP3212
Pino 1 Conector3V3
Pino 2 ConectorRX
Pino 3 ConectorTX
Pino 4 Conector GND
Pino 5 ConectorGPIO14
Relê Rede ElétricaGPIO12
Led VerdeGPIO13
BotãoGPIO0

Para gravar deve-se pressionar o botão enquanto liga o USB e dispara a gravação, ou em detalhes:

1. Desconecte o cabo USB da placa
2. Aperte o botão do Sonoff (GPIO0)
3. Ligue a placa no USB do PC com o botão apertado
4. Pronto, está no modo de programação
5. Dispare o Upload da IDE

Pronto, o Sonoff está reprogramado via IDE Arduino.

Nossos testes

Gravamos um programa simples para acionamento do relay. No teste inicial o relê não funcionou direto após a gravação apesar do led verde ter acendido.
Testamos desconectando do FTDI USB serial e depois conectando a entrada 127V na rede elétrica. 
Deu certo o teste com botão. O relê só funcionou ligando na rede em nosso ambiente de teste. A corrente do USB não foi suficiente para acioná-lo.

Impacto do Sonoff como produto

O Sonoff veio para engavetar os projetos de criação de placas com relê baseadas no ESP8266 para controle da automação residencial sem fio. Seus volumes de produção vão facilmente bater o custo de lotes pequenos. Então não perca tempo, procure em seu fornecedor e crie sua automação sem WiFi, com ou sem customização!

Observação: Cuidado ao lidar com a rede elétrica! Se tiver dúvidas chame alguém habilitado para as conexões à rede para usar todo o potencial desta placa.

Tem dúvidas, quer saber algo mais? Deixe um comentário abaixo.

sexta-feira, março 10, 2017

Módulos para programar no ESP3212

Módulos ESP3212


Para ter acesso a todas essas possibilidades precisamos de um módulo de hardware que contenha a CPU ESP3212 e que tenha os pinos do chip expostos para que possamos configurar, programar e criar!

ESP32s


Já existem várias plataformas sendo que a mais comum é a denominada ESP32s, que é uma réplica, ou é a própria plataforma criada pela Expressif, o módulo ESP-WROOM32. 

Módulo ESP-WROOM-32
Módulo ESP-WROOM-32

Abaixo a placa ESP32s, como podemos ver é praticamente uma réplica do reference design da Espressif, visão superior e inferior.
ESP32s - imagem superior da placa
ESP32s visão superior

Essa plataforma, por ser um módulo enxuto provavelmente será integrada em muitas outras. Tudo indica que terá custo baixo devido ao grande volume de produção. Em algum tempo deve se igualar (ou talvez um pouco acima) em utilização das irmãs mais velhas baseados no chip Esp8266 como os módulos ESP8266-01 ou Esp8266-12.
ESP32s - imagem superior da placa
ESP32s visão inferior

Esses módulos ESP3212 são mais difíceis de lidar por serem muito compactos e não terem encaixe em placas matriciais de circuito impresso ou protoboards, precisando sempre de uma placa auxiliar para poderem ser plugadas e utilizadas.

ESP32-DevKit


Outra placa feita pela própria Expressif, recebe o ESP32s soldado e expõe a quase totalidade dos pinos além de trazer reguladores de tensão e interface USB integrada, possibilitando utilização imediata em protoboards ou afins

ESP32-DevKit. Observe o conector USB para programação do módulo
ESP32-DevKit. Observe o conector USB para programação do módulo (aqui sem a blindagem)


AdaFruit


Como a fabricante Espressif deseja que o módulo seja amplamente utilizado nas comunidades de hobistas e profissionais, todos tanto o ESP32s quanto o DevKit possuem o hardware disponível como referência para terceiros criarem suas placas como base. A Adafruit, empresa americana especializada em placas de desenvolvimento para makers e hobistas já disponibiliza sua versão:

DevKit Esp3212 disponível pela Adafruit
DevKit disponível pela Adafruit


Software


Nos dias que não existia documentação adequada para o irmão mais velho ESP8266 e os usuários tinham que fazer grandes pesquisas ou até engenharia reversa acabaram!  Existiram muitas dúvidas de como implementar hardware e software, como consumo, níveis de tensão dos GPIOs, mas no novo chip, essas informações aparentam estar totalmente disponíveis.
A Expressif está encarando muito profissionalmente essas plataformas e o sucessor ESP3212 tem uma farta quantidade de documentação disponível mesmo antes de ser totalmente lançado.
Essa documentação versa sobre o funcionamento do hardware e suporte de software  para grande maioria dos periféricos disponíveis. Existe uma quantidade muito grande de código disponível para suportar todos os recursos de hardware listados acima e documentação correspondente:
O ponto de partida para essa documentação encontra-se no site:


La está explicado todo o processo de instalação do SDK e ferramentas para desenvolvimento.

Suporte IDE Arduino


O Arduino não é apenas o editor de texto dos programas e sim um sistema completo de Build (compilação e linkedição) dos programas, que integra toda inicialização do chip, suporte aos recursos básicos e integração com blibliotecas de uma maneira transparente ao usuário. Quando o suporte ao ESP8266 foi incluído, certamente foi um grande ganho, uma vez que com poucas linhas de código bem familiares poderia ser piscar o led (blink.c) e outras rotinas comuns. O processo ficou muito simples, sem precisar de passos específicos de instalação de toolchain, configuração de makefiles, etc.
Para o ESP3212 espera-se o mesmo, entretanto, ao tempo de escrita deste texto, o suporte não é ainda completo e oficial, tendo-se que realizar etapas manuais de instalação, diferentemente do suporte ao irmão mais velho.

O ponto de partida para instalação do suporte Arduino, chamado Arduino-Core é:


Conclusão

  

Com todas essas possibilidades e uma maturidade crescente dos seus criadores, essa nova plataforma vem com grande potencial de mudança para o desenvolvimento de hardware e software de hobistas e estudantes, devido a sua facilidade de uso. Mas porque não considerar também aplicações profissionais  e comerciais, que podem revolucionar seus custos ao utilizar esses novos módulos, desde que eles se comprovem robustos e confiáveis.

sexta-feira, fevereiro 10, 2017

ESP3212, o milagre chinês!


ESP3212

O ESP3212 é um sistema dual-core com dois microprocessadores Xtensa LX6, com arquitetura Harvard, para quem lembrar das aulas da graduação.
Como sabemos o ESP3212 é uma evolução do famoso ESP8266, que surpreendeu a comunidade trazendo Wi-Fi a baixíssimo custo. Antes era preciso placas como Raspbery Pi ou BeagleBone Black para termos rede Ethernet com fio, além claro, das placas arduino. Mas de um jeito ou de outro era sempre mais complicado ter um sistema com Wi-Fi.
Com o ESP8266 WiFi se tornou rotina, agora podemos configurar e controlar tudo com protocolos HTTP ou MQTT. Muito bom! Essa plataforma também gerou diversos módulos que são muito utilizados, como o ESP8266-01, o ESP8266-12E, para citar alguns. Além é claro dos mais comerciais, que também permitem customização ao estilo comunitário, como o SONOFF. Benvindo ao muito IOT.
Vamos tratar destas em outros artigos.

O tópico aqui é o novo (praticamente novo, uma vez que a sua distribuição nem está estabilizada ainda) ESP3212!

Podemos considerar esse chip como mais um fruto do "Milagre Chinês", país que fabrica tudo a custos muito reduzidos e tem cada vez mais melhorado a qualidade. A design house Expressif (empresa que faz criação de projetos de chips e manda fabricar em terceiros) lançou a variante inicial, o ESP8266, mais com pretensões de ser um modem WiFi, sendo conectado nas linhas de RX e TX e transmitir dados seriais de um projeto para outro sem fio. Mas tinha uma CPU inteira a disposição e não demorou muito para que se iniciasse a utilização maciça, dado o custo baixo. Logo depois a integração na IDE Arduino e ai a popularização foi inevitável.
Mas voltemos ao 3212...


Pinagem do ESP3212
Pinagem do ESP3212

Recursos do Chip

Para corrigir algumas deficiências do 8266 como compartilhamento de processamento do programa principal com as rotinas de WiFi, que causavam algum impacto uma na outra para casos mais críticos, e para aumentar os periféricos e pinos de saída, criou o ESP3212, uma CPU dual muito poderosa com os seguintes recursos:

Diagrama de Blocos do ESP3212

Diagrama de Blocos do ESP3212


Abaixo uma lista com os recursos principais:

Características Principais
Microcontrolador de 240 MHz com dual core Tensilica LX6  com performance de 600 DMIPS
Memória interna 520 KB SRAM
Wi-fi integrado 802.11BGN HT40, hardware e software (Stack IP)
Bluetooth Integrado (clássico e BLE (Bluetooth Low Energy)
Tensão de Operação: 2.2V a 3.6V
Temperatura de Operação: -40°C to +125°C

Antena PCB para WiFi /Bluetooth integrada na placa
Sensores
Amplificador Analógico de Baixo Ruído
Hall sensor
10x interface para sensor capacitivo
32 kHz crystal oscilador
32x GPIO
3 x UARTs, including hardware flow control
3 x SPI
2 x I2S
12 x ADC canais de conversão AD - Isso realmente é demais!
2 x DAC
2 x I2C
PWM/timer input/output available on every GPIO pin
OpenOCD debug interface with 32 kB TRAX buffer
SDIO master/slave 50 MHz
Suporte memória SPI flash até 16 MB
SD-card interface
Security Related
WEP, WPA/WPA2 PSK/Enterprise
Hardware accelerated encryption: AES / SHA2 / Elliptical Curve Cryptography / RSA-4096
Performance
Supports sniffer, station, softAP and Wi-Fi direct modes
Max data rate of 150 Mbps@11n HT40, 72 Mbps@11n HT20, 54 Mbps@11g, and 11 Mbps@11b
Maximum transmit power of 19.5 dBm@11b, 16.5 dBm@11g, 15.5 dBm@11n
Minimum receiver sensitivity of -98 dBm
135 Mbps UDP sustained throughput
2.5 μA deep sleep current


São recursos muito poderosos, sendo que os principais destaques em nossa opinião, são:

  • Suporte a Bluetooth, abrindo um mundo novo para uso desta interface a baixo custo,
  • Processamento em dual-core, mais rápido e sem interferências do protocolo de comunicação, WiFi ou BT
  • 12 canais de conversão AC (ADC) de 12 bits cada, que permite um mundo novo de entradas analógicas


Para criar programas é necessário uma placa de desenvolvimento com o microprocessador de modo que possamos carregar os programas e testar. O Esp3212 já conta com diversas placas disponíveis (lista aumentando) para permitir que se possa utiliza-lo como se faz com a familia Arduino.

Em breve vamos escrever mais sobre como programar com toda versatilidade deste chip!

segunda-feira, janeiro 30, 2017

Depois de um longo inverno...

Depois de um periodo de atividade deste Blogspot, e uma parada de anos, estamos de volta agora depois dessa revolução do hardware open e livre iniciado com as plataformas e IDE Arduino. Depois dela é possível ter acesso a plataformas de desenvolvimento para criação de projetos pessoais e profissionais.

sexta-feira, abril 27, 2007

Clockevents patch made its way to the kernel(2.6.21-rc1)

Last week (as of 27 Feb 2007) the Clockevents patch made
its way to the kernel(2.6.21-rc1) and took along a modified
version of the kernel timertop. Click in the link of this
post title.

That is great.
The former dyntick implementation (that one mantained by
Con Colivas) was deprecated and was superseded by this new
one which was derived from the real time patch from Red Hat
and Timesys. Surprinsingly timertop was the only part that
remained. Afterwards they ended up removing timertop.c but
have kept a good acknowledge and inspiration note in the new
code, timer_stats.c, as you can see in the link above.

Thanks Ingo Molnar and Thomas Gleixner