O conselho que todos os dão sobre a digitalização de texto é usar a resolução mais alta possível e acertar a iluminação. Eu executei o motor que este site usa contra um conjunto de imagens deliberadamente danificadas para descobrir quais desses assuntos, e a resposta foi nenhuma. A mesma frase voltou perfeitamente de uma imagem um terço do tamanho original, perfeitamente de um texto cinza em um fundo cinza e perfeitamente de um JPEG salvo na qualidade 25. O que destruiu foi inclinar a página em cinco graus. Cada número abaixo saiu dessa corrida e eles apontam para uma lista de verificação diferente da habitual.
tl;dr: Tesseract lê texto renderizado de forma limpa até que duas coisas específicas dêem errado. A inclinação é a primeira: 0 a 3 graus de inclinação deram uma taxa de erro de 0% de caráter, 5 graus deram 2,9%, 12 graus deram 16,7% e 20 graus deram 32,4%. O tamanho é o segundo, e é um penhasco em vez de uma inclinação: o texto permaneceu perfeito até uma altura de capital de cerca de 7 pixels e depois caiu para 85,3% de erros em 5,8 pixels. Baixo contraste, desfoque e compressão pesada de JPEG mal registrados. Endireite a imagem antes de fazer qualquer outra coisa. o conversor de imagem para texto Executa o mecanismo do seu navegador, para que a imagem nunca seja carregada.
Como esses números foram produzidos?
Ao renderizar uma frase conhecida, danificando a imagem de uma maneira de cada vez, lendo-a de volta e contando as edições necessárias para reparar o resultado.
A métrica é a taxa de erro de personagem: a distância de Levenshtein entre o que a imagem dizia e o que o motor retornou, dividido pelo comprimento da verdade. Uma taxa de erro de 2% em uma linha de cinquenta caracteres é um personagem errado. O texto era de três linhas que misturavam prosa, número de fatura, data, valor da moeda, endereço de e-mail e telefone, porque os erros que importam na prática acontecem no segundo tipo de conteúdo e não no primeiro.
Uma ressalva pertence ao topo em vez de enterrada. São imagens renderizadas, não fotografias. Cada um isola uma única variável, que é a única maneira de atribuir uma falha a uma causa, mas uma foto real de uma página chega com várias de uma só vez: uma leve inclinação, uma iluminação irregular na dobra, um desfoque de movimento em uma borda e uma câmera que afiava tudo antes de salvar. Os limites abaixo são, portanto, os melhores casos. Uma fotografia que está no limite de dois eixos fará pior do que qualquer número sugere.
O mecanismo é o modelo LSTM do Tesseract 4 por meio do Tesseract.js, que é exatamente o que a ferramenta é executada, portanto, esses não são números de um sistema diferente.
Quanta inclinação é demais?
Entre três e cinco graus, o que é menos inclinado do que você notaria.
| rotação | Taxa de erro de personagem | Confiança relatada |
|---|---|---|
| 0 graus | 0,0% | 95 |
| 1 grau | 0,0% | 95 |
| 2 graus | 0,0% | 95 |
| 3 graus | 0,0% | 94 |
| 5 graus | 2,9% | 91 |
| 8 graus | 7,8% | 82 |
| 12 graus | 16,7% | 70 |
| 20 graus | 32,4% | 66 |
Nada acontece por três graus e depois cai de uma prateleira. A razão é como o mecanismo funciona: ele encontra linhas de texto e, em seguida, corta cada linha em caracteres. Uma linha inclinada cruza várias linhas de pixels, de modo que o corte corta o topo de algumas letras e o fundo de outras, e o modelo é solicitado a classificar fragmentos.
A 5 graus, os erros eram pequenos e caros. "Datado" voltou como "DateQ" e "Total" como "ToTg)". Ambos são uma única letra dentro de uma palavra que um humano leria diretamente, e ambos sentaram ao lado de um número de fatura e de um valor de moeda que uma pessoa copiaria sem verificar.
Um telefone segurado à mão sobre uma página é rotineiramente aberto em mais de cinco graus. Esta é a única coisa que vale a pena consertar antes de executar qualquer coisa, e a correção é grátis: gire a imagem até que as linhas estejam niveladas.
Quão pequeno pode ser o texto antes que o OCR falhe?
Menor do que você espera, até o ponto em que ele para de funcionar totalmente.
| Largura da imagem | altura da letra maiús | taxa de erro | Confiança |
|---|---|---|---|
| 1600 px | ~29 px | 0,0% | 95 |
| 800 px | ~14 px | 0,0% | 95 |
| 533 px | ~10 px | 0,0% | 92 |
| 400 px | ~7 px | 0,0% | 84 |
| 320 px | ~6 px | 85,3% | 41 |
| 240 px | ~4 px | 100,0% | 0 |
As mesmas três linhas são perfeitamente lidas em um quarto do tamanho original, onde cada letra maiúscula tem cerca de sete pixels de altura. Um passo para baixo e a saída inutilizável, então vazia.
Isso é um penhasco, não um gradiente, e muda o conselho. "Use a resolução mais alta que você possui" não está errada, mas descreve um problema que a maioria das fotos não possui. Uma captura de tela de uma página da web, uma foto de uma placa, uma foto do telefone de uma carta impressa: tudo isso tem mais de sete pixels de altura da letra. O que eles têm mais frequentemente é uma inclinação.
O lugar onde o penhasco morde é uma colheita à distância. Texto no fundo de uma foto de feriado, uma placa em uma rua, uma linha de letras pequenas dentro de uma digitalização de página inteira na resolução da tela. Se as letras forem difíceis de ler com 100% de zoom, o motor também está próximo ao piso.
O baixo contraste arruina a leitura?
Não, e esse foi o resultado que mais contradisse o que eu esperava.
Texto cinza em #8A8A8A em um fundo cinza em #BDBDBD Read Back com uma taxa de erro de 0,0% e uma confiança de 95, idênticas a preto no branco. Um desfoque gaussiano de três pixels em toda a imagem deu 0,6%. Um JPEG economizado na qualidade 25 e escalado para metade do tamanho deu 0,0%.
A razão é que o motor não lê seus cinzas. Ele binariza a imagem primeiro, transformando tudo em preto e branco com um limite escolhido na imagem, e o contraste uniforme e baixo sobrevive dessa etapa intacta. O que não sobrevive é o contraste que varia na página, que é o que produz uma sombra ou um flash de telefone: um limite não pode atender a duas metades da imagem.
Portanto, a versão útil dos conselhos de iluminação é mais estreita do que a habitual. Até a iluminação importa. A iluminação brilhante não. Uma foto fraca e uniformemente iluminada de uma página supera uma brilhante com uma sombra no meio.
Por que um layout de duas colunas sai embaralhado?
Porque a ordem de leitura é um julgamento de layout, e o mecanismo faz isso apenas com geometria.
Renderizei dois blocos de texto lado a lado, três linhas cada, em linhas de base compartilhadas. O resultado voltou intercalado:
LEFT ONE RIGHT ONE LEFT TWO RIGHT TWO LEFT THREE RIGHT THREE
Cada palavra está correta. A ordem é inútil. O motor encontrou seis linhas de texto em três posições verticais e leu cada linha, que é o comportamento correto de uma mesa e a errada para duas colunas de prosa.
Uma página de jornal ou um PDF acadêmico real geralmente sobrevive a isso, porque a sarjeta entre as colunas é ampla e consistente o suficiente para que a etapa de segmentação da página seja detectada. Uma captura de tela de um layout com dois blocos soltos um ao lado do outro, que é o caso comum desse tipo de ferramenta, muitas vezes não.
A solução confiável é cortar. Execute uma coluna, copie o resultado e execute a outra. Parece trabalhoso e leva cerca de quinze segundos, o que é menos do que reconstruir um parágrafo cujas frases foram embaralhadas.
Pode ler caligrafia?
Não de forma confiável, e o limite é sobre se as letras se tocam e não se parecem informais.
Eu não pude testar a caligrafia real sem fornecer uma fotografia, que teria variáveis mistas, então testei três fontes de regularidade decrescente como substituto:
| pia de cha | taxa de erro | Confiança |
|---|---|---|
| Comic sem ms | 0,0% | 95 |
| pincel mt script | 5,9% | 67 |
| Snell Roundhand | 20,6% | 55 |
Comic Sans é informal e perfeitamente legível ao motor, porque suas letras são formas separadas de largura consistente. Snell Roundhand é um script conectado e um quinto dos personagens voltou errado.
Essa é a verdadeira distinção. O modelo do Tesseract foi treinado em tipo impresso e espera cortar uma linha em glifos discretos. A escrita conectada não possui pontos de corte limpos; portanto, a segmentação falha antes que o reconhecimento tenha uma chance. A letra genuína é pior que o Snell Roundhand, não melhor, porque também varia de letra a letra.
Se você precisa de leitura à mão, esta é a ferramenta errada e todos os outros front-ends do Tesseract. Esse trabalho precisa de um modelo treinado em caligrafia.
Quais personagens erram?
Letras que parecem dígitos e a direção é consistente.
Renderi uma linha dos suspeitos do costume e li de volta:
truth: O0 l1I 5S 8B 2Z rn/m
read: 00 111 5S 8B 2Z rn/m
O capital O tornou-se um zero. L minúsculo e capital I ambos se tornaram o dígito 1. Os pares mais preocupados são os pares, 5 contra S e 8 contra B, voltou correto, assim como RN contra M.
O padrão é que uma letra isolada com um glifo em forma de dígito é lida como o dígito. Na prosa de corrida, isso raramente importa, porque o modelo de linguagem em torno dela puxa o resultado de volta à palavra. Em um código de referência, um número de série ou uma placa de licença, não há uma palavra em torno para ajudar, e é exatamente aí que esse tipo de ferramenta é usado.
Reveja qualquer string que misture letras e dígitos sem espaços. É a única classe de saída em que o motor está com segurança errada.
O que a pontuação de confiança lhe diz?
Aproximadamente como foi a página, e não se o número que você gosta está certo.
A ferramenta mostra a confiança média da palavra do motor como alta, média ou baixa, com alta em 85 e acima. Em relação às taxas de erro medidas, esse mapeamento é amplamente sensato e otimista na borda:
| caso | Confiança | Etiqueta | Taxa de erro real |
|---|---|---|---|
| Limpar | 95 | em alta | 0,0% |
| 5 graus de inclinação | 91 | em alta | 2,9% |
| 12 graus de inclinação | 70 | meio | 16,7% |
| 320 px de largura | 41 | mugir | 85,3% |
| script conectado | 55 | mugir | 20,6% |
Uma pontuação baixa é um aviso confiável: tudo o que teve menos de 60 anos foi genuinamente quebrado. Uma pontuação alta é uma evidência mais fraca do que parece. O caso de 5 graus obteve 91 pontos, que a interface chama de alta, enquanto discretamente uma palavra em uma linha de fatura.
Use-o como um alarme de fumaça em vez de uma garantia. Baixa significa não se preocupar em ler a saída. Alto significa que a página como um todo foi bem, o que não é o mesmo que todos os personagens estão certos.
Quanto custa cada idioma para baixar?
Entre 0,67 e 2,82 megabytes, uma vez, e depois ele é armazenado em cache.
O mecanismo precisa de um arquivo de dados treinado por idioma. Como a ferramenta executa apenas o modelo LSTM, ela extrai o conjunto de melhor qualidade, que é consideravelmente menor do que os arquivos que a maioria dos arquivos de OCR cita. Medido a partir do CDN, a biblioteca default do padrão:
| idioma | baixar | idioma | baixar |
|---|---|---|---|
| inglês | 2,82 MB | hindi | 1,32 MB |
| russo | 2,56 Mb | bengali | 1,31 Mb |
| espanhol | 2,00 Mb | coreano | 1,50 MB |
| japonês | 1,94 Mb | alemão | 1,27 Mb |
| Chinês (simplificado) | 1,64 MB | português | 1,33 MB |
| árabe | 1,58 Mb | italiano | 1,58 Mb |
| francês | 0,67 Mb |
Todos os treze juntos chegam a cerca de 21 MB, o que é menos do que uma fotografia de um telefone moderno. A suposição comum de que o chinês ou o japonês devem ser enormes não são válidos aqui: o chinês simplificado é de 1,64 MB, menor que o inglês, porque o arquivo armazena um modelo em vez de uma biblioteca de glifos.
Por que a primeira corrida é mais lenta que a segunda?
Porque o primeiro está baixando e iniciando um mecanismo, e o segundo está lendo.
A primeira execução de uma linguagem busca a compilação do WebAssembly do Tesseract, busca o arquivo de dados desse idioma e inicializa um trabalhador. Depois disso, o trabalhador permanece na página e o arquivo de dados é armazenado em cache pelo navegador, então uma segunda imagem no mesmo idioma começa imediatamente. A troca de idiomas reinicializa o trabalhador, mas não faz o download novamente de nada já buscado.
O reconhecimento em si é rápido. Nesta máquina, a leitura da imagem de teste de três linhas levou 186 milissegundos para a versão limpa e entre 70 e 125 milissegundos para as danificadas, tudo em um trabalhador já em execução. Para uma página inteira de texto, espere um ou dois segundos em vez de um décimo de um, mas a espera de primeira execução que você percebe é configurada, não lendo.
Uma vez que um idioma é armazenado em cache, a ferramenta funciona sem nenhuma rede, o que é um recurso offline genuíno e não uma linha de marketing.
O que você deve fazer com uma imagem antes de executar o OCR?
Três coisas, nesta ordem, e a primeira importa mais do que as outras combinadas.
- endireitá-lo. Gire até que as linhas do texto estejam niveladas. Três graus é grátis, cinco não.
- corte para o texto. Isso corrige o problema da coluna, remove o plano de fundo que o segmentador deve rejeitar e torna o texto uma parcela maior do quadro.
- Deixe tudo em paz. Não afie, não aumente o contraste, não converta para preto e branco manualmente. O motor binariza de qualquer maneira, e um filtro de afiação adiciona toques nas bordas das letras que não existiam antes.
A coisa que vale a pena adicionar em vez de remover é a resolução, mas apenas se você estiver perto do chão. Passar de uma altura de capital de 7 pixels para uma de 14 pixels, nada mudou nas medidas. Passar de 6 a 7 mudou tudo.
Quando o OCR é a ferramenta errada?
Quando a imagem não é de texto, quando o texto é escrito à mão e quando o que você deseja é um documento pesquisável em vez de um bloco de caracteres.
OCR fornece palavras sem estrutura: sem títulos, sem células da mesa, sem limites de parágrafo em que você pode confiar, sem ordem de leitura em um layout complexo. Para uma citação de uma captura de tela ou de um endereço de uma foto exatamente correta. Para converter um relatório digitalizado em algo editável, é a primeira de várias etapas.
Se o que você deseja é uma descrição de uma imagem em vez das palavras impressas nela, esse é um modelo totalmente diferente e uma ferramenta diferente. E se a origem for um PDF gerado em vez de digitalizado, o texto já está no arquivo: retirá-lo diretamente mantém o layout e não perde nada, o que nenhuma quantidade de reconhecimento de imagem pode igualar.
Por que isso funciona no navegador?
Porque as fotos que as pessoas colocam no OCR são as que menos gostariam de enviar.
Recibos, cartas bancárias, prescrições, passaportes, carteiras de identidade, uma foto de um contrato, uma captura de tela de uma conversa privada. A alternativa usual é um site que pega sua imagem, processa em um servidor sobre o qual você não sabe nada e mantém o que guarda.
Aqui o mecanismo é o webassembly rodando na página, em um trabalhador. A imagem é decodificada na memória da guia, leia aí e o texto aparece. Nada é carregado, não há fila nem cópia armazenada e, após a primeira execução, a coisa toda funciona offline. Os custos são o download de idioma único e que imagens muito grandes são limitadas pelo que a guia pode conter.
Duas coisas que este site ainda não faz e que pertencem ao mesmo pipeline: endireitar uma página fotografada e cortá-la para o texto. Ambos precisam acontecer em qualquer visualizador que você já tenha, que é a única costura no fluxo de trabalho acima. O que vem depois é abordado: se a fonte for uma foto de várias páginas, O guia sobre como combinar imagens Lida com a montagem dos resultados.



