O Tesseract é um mecanismo de mecanismo de reconhecimento óptico de caracteres (OCR) de código aberto que é a biblioteca de OCR mais popular e de alta qualidade.
O OCR usa redes neurais para pesquisar e reconhecer texto em imagens.
O Tesseract procura padrões em pixels, letras, palavras e frases e usa uma abordagem em duas etapas chamada reconhecimento adaptativo. É necessária uma passagem pelos dados para o reconhecimento de caracteres e, em seguida, uma segunda passagem para preencher as letras em que ele não tinha certeza das letras que provavelmente correspondem à palavra ou ao contexto da frase.
Um dos projetos era reconhecer cheques de fotografias.
A ferramenta de reconhecimento usada foi o Tesseract OCR . As vantagens desta biblioteca incluem modelos de idiomas treinados (> 192), diferentes tipos de reconhecimento (imagem como palavra, bloco de texto, texto vertical), configuração fácil. Como o Tesseract OCR é gravado em C ++, um wrapper de terceiros com o github foi usado.
As diferenças entre as versões são diferentes modelos treinados (a versão 4 tem maior precisão, então a usamos).
Precisamos de arquivos de dados para reconhecimento de texto, cada idioma tem seu próprio arquivo. Você pode baixar os dados aqui .
Quanto melhor a qualidade da imagem original (tamanho, contraste, material de iluminação), melhor o resultado do reconhecimento.
Um método de processamento de imagem também foi encontrado para seu reconhecimento adicional usando a biblioteca OpenCV. Como o OpenCV é gravado em C ++, e não há wrapper por escrito para a nossa solução, foi decidido escrever nosso próprio wrapper para esta biblioteca com as funções de processamento de imagem necessárias. A principal dificuldade é a seleção de valores para o filtro para o processamento correto da imagem. Também é possível encontrar os contornos dos cheques / texto, mas não totalmente compreendidos. O resultado foi melhor (5-10%).
Parâmetros:
idioma - o idioma do texto da imagem, você pode selecionar vários listando-os através de "+";
pageSegmentationMode - tipo de localização do texto na imagem;
charBlacklist - caracteres a serem ignorados ignorando caracteres.
O uso apenas do Tesseract proporcionou uma precisão de ~ 70% com uma imagem ideal; com baixa qualidade de iluminação / imagem, a precisão foi de ~ 30%.

Vision + Tesseract OCR
Como o resultado foi insatisfatório, decidiu-se usar a biblioteca da Apple - Vision. Usamos o Vision para encontrar blocos de texto, dividir ainda mais a imagem em blocos separados e reconhecê-los. O resultado foi melhor em ~ 5%, mas apareceram erros devido a blocos repetidos.
As desvantagens desta solução foram:
- Velocidade do trabalho. A velocidade da operação diminuiu> 4 vezes (talvez exista uma variante da propagação)
- Alguns blocos de texto foram reconhecidos mais de uma vez
- O texto é reconhecido da direita para a esquerda, e é por isso que o texto no lado direito da verificação foi reconhecido antes do texto à esquerda.

MLKit
Outro método para detectar texto é o MLKit do Google, implantado no Firebase. Esse método apresentou os melhores resultados (~ 90%), mas a principal desvantagem desse método é o suporte apenas a caracteres latinos e o difícil processamento de texto dividido em uma linha (nome - à esquerda, preço - à direita).

No final, podemos dizer que reconhecer texto em imagens é uma tarefa factível, mas existem algumas dificuldades. O principal problema é a qualidade (tamanho, iluminação, contraste) da imagem, que pode ser resolvida filtrando a imagem. Ao reconhecer texto usando o Vision ou o MLKit, houve problemas com a ordem incorreta do reconhecimento de texto, o processamento do texto dividido.
O texto reconhecido pode ser corrigido manualmente e adequado para uso; na maioria dos casos, ao reconhecer texto de cheques, o valor total é reconhecido bem e não precisa de ajustes.