Página 1 de 1

OCRobot - um robot controlado por cartões de texto

Enviado: 16 mai 2017, 07:37
por CyberX
A ideia para este robot surgiu há uns dias no trabalho, um consultor residente da área de Redes de vez em quando discute comigo ideias para na empresa dele poder utilizar Raspberry Pi e em poucos minutos de Google mostrei-lhe como fazer OCR em linha de comando, com um exemplo concreto e tudo. De repente fez-se luz: se consigo fazer isto da linha de comando consigo fazer também no EV3, só... um ... pouquinho... mais... lento.



Os primeiros ensaios foram com uma webcam moderna (uma Logitech c270) mas para os puristas troquei por uma LEGOcam, funciona quase tão bem. Só tive de mudar a disposição original porque o cabo gigantesco da LEGOcam fazia o OCRobot tombar.

Imagem

Fisicamente o OCRobot é apenas um Riley Rover com  uma LEGOcam e um sensor de toque. A LEGOcam está montada sobre uma estrutura que recebe "cartridges" com amostras de texto, que podem ser manuscritas desde que "em letra de imprensa".

O OCRobot corre ev3dev (linux) e de momento a programação limita-se a um script de bash que pode correr em qualquer linux, inclusive num Raspberry Pi (pelo que, se montarmos o OCRobot com um BrickPi em vez de um EV3, funciona MUITO MAIS RÁPIDO).

O script aguarda que se carregue no sensor, acende as luzes Power Functions, tira uma foto (fswebcam), processa a foto (ImageMagick e textclean, um script para ImagicMagick orientado para OCR) e depois converte para texto (tesseract-ocr). Pelo meio vai ainda dizendo em voz alta certas banalidades (espeak) para evitar adormecermos de tédio.

O tesseract-ocr é um projecto de Optical Character Recognition que recentemente recebeu atenção da Google - se costumam usar o OCR do Google Docs estão a usar o tesseract na cloud.

Re: OCRobot - um robot controlado por cartões de texto

Enviado: 16 mai 2017, 08:45
por Conchas
Ele é com cada ideia... :D

Re: OCRobot - um robot controlado por cartões de texto

Enviado: 16 mai 2017, 11:15
por CyberX
[member=68]Conchas[/member] ocorreu-me que posso usar a LEGOcam como sensor de cor, deve ser bem mais rápido que o OCR e se calhar tem melhor granularidade de cores que o sensor do EV3.
Se usar algoritmos de Computer Vision (OpenCV por exemplo) além de reconhecer a cor até consigo reconhecer a peça. Mesmo que todas as peças sejam, digamos, plates 2x2, consigo identificar a orientação da peça e assim reposicioná-la.

Foi só mais uma ideia...

Re: OCRobot - um robot controlado por cartões de texto

Enviado: 16 mai 2017, 22:35
por gads
[quote="CyberX"]
[member=68]Conchas[/member] ocorreu-me que posso usar a LEGOcam como sensor de cor, deve ser bem mais rápido que o OCR e se calhar tem melhor granularidade de cores que o sensor do EV3.
Se usar algoritmos de Computer Vision (OpenCV por exemplo) além de reconhecer a cor até consigo reconhecer a peça. Mesmo que todas as peças sejam, digamos, plates 2x2, consigo identificar a orientação da peça e assim reposicioná-la.

Foi só mais uma ideia...
[/quote]

Um hacatão para fazer um separador de peças de mosaico não me parece nada mal :D

Re: OCRobot - um robot controlado por cartões de texto

Enviado: 16 mai 2017, 22:43
por CyberX
[quote="gads"]
Um hacatão para fazer um separador de peças de mosaico não me parece nada mal :D
[/quote]

Desde que não meta Java. Já tenho a minha conta de ódios de estimação para este ano :(

Re: OCRobot - um robot controlado por cartões de texto

Enviado: 16 mai 2017, 22:47
por gads
[quote="CyberX"]
[quote="gads"]
Um hacatão para fazer um separador de peças de mosaico não me parece nada mal :D
[/quote]

Desde que não meta Java. Já tenho a minha conta de ódios de estimação para este ano :(
[/quote]

Eu dou-me bem com Java, Javascript, Typescript, C/C++ e C#. Arranho bem Objective C e Swift  e oriento-me em Python e Ruby, entre outras.
Escolhe :P

Re: OCRobot - um robot controlado por cartões de texto

Enviado: 16 mai 2017, 22:49
por CyberX
[quote="gads"]
Eu dou-me bem com Java, Javascript, Typescript, C/C++ e C#. Arranho bem Objective C e Swift  e oriento-me em Python e Ruby, entre outras.
Escolhe :P
[/quote]

Estás a pedi-las :) Bash
OK, pode ser Python.
Só não pode ser Java nem Powershell.

Re: OCRobot - um robot controlado por cartões de texto

Enviado: 16 mai 2017, 22:52
por gads
Bash oriento-me... Faço umas coisas quando é necessário...

Para mim, agora as que estou com mais prática são Javascript/Typescript e C#. Mas conseguia bastante bem C e C++ :)

Re: OCRobot - um robot controlado por cartões de texto

Enviado: 16 mai 2017, 23:17
por AVCampos
Espectáculo, estou a imaginar numa exposição cada visitante escrever coisas e o robot ler... convém é ter um "curador" para não deixar passar as inevitáveis espertalhices... :police:

Por falar em OCR, podes querer ver este outro robot, que usa um NXT com um sensor de luz para ler números e resolver Sudoku:


[quote="CyberX"]
para os puristas troquei por uma LEGOcam[/quote]
ESSE HUB USB NÃO É LEGO!!! >:D

Re: OCRobot - um robot controlado por cartões de texto

Enviado: 16 mai 2017, 23:46
por CyberX
[quote="AVCampos"]
ESSE HUB USB NÃO É LEGO!!! >:D
[/quote]

Demoraste :D

O Hub não é essencial, só lá está porque me dá jeito - se não usar Wi-Fi (posso aceder por SSH over Bluetooth, descobri há dias) não preciso do hub e ligo a LEGOcam directamente ao EV3.

Ainda duvidei se o sensor de cor tinha precisão para distinguir algarismos mas fui ver o site do autor e tem, apesar de pelos vistos no limite. Entre o método dele e o meu, não sei qual será mais lento :)

A ideia que deste para o evento é gira mas tinha de ser muito preparada - a precisão do OCR depende um bocado da luz ambiente e eu não fiz nenhuma rotina de auto-calibração, ensaiei algumas vezes de manhã e de noite e funciona mas não é 100% garantido.
Além disso os participantes tinham de escrever em letra de imprensa (não necessariamente tipográfica mas não vai funcionar com caligrafia rococó) na horizontal, suficientemente espaçada... e naquela cartridge, escritas com um marcador grosso, cabem à justa apenas 5 letras.

Há maneiras de acelerar o OCR:
- com acesso à net podemos invocar a API da Google e usar o OCR do Google Docs
- com acesso a outro PC (ou um RPi decente) podemos transferir a imagem "raw", processá-la e fazer o OCR retornando apenas a string final

Talvez um dia tente alguma dessas maneiras, por enquanto estou mais tentado em fazer um segundo OCRobot com o BrickPi e mostrar os dois a fazer um reconhecimento em simultâneo para comparar tempos. Se for bastante mais rápido (como espero) então já poderia ser usado em evento, com uma cartridge maior.

Há libraries de python para todas as tools que usei, inclusive o OCR. Por isso também hei-de um dia destes converter o programa de bash para python, pode ser que ganhe alguma coisa (pelo menos evito o I/O associado às 4 imagens que uso para cada reconhecimento e pode ser que a library de OCR tenha mais opções que o executável).