3 pontos por GN⁺ 2024-11-17 | 1 comentários | Compartilhar no WhatsApp
  • É uma ferramenta web que reduz o trabalho de transcrever imagens de documentos para texto e depois reorganizá-las, convertendo-as em Markdown estruturado
  • Atualmente, a entrada pela web é centrada em upload de imagens, e a página informa que o suporte a PDF será disponibilizado em breve
  • O serviço funciona com base no pacote npm llama-ocr e na Together AI
  • Em JavaScript, é possível passar filePath e TOGETHER_API_KEY para a função ocr e receber o resultado em Markdown
  • Com suporte tanto a upload pela web quanto a chamadas por código, permite testar a conversão de imagens de documentos conforme fluxos manuais ou de desenvolvimento

Converter documentos em imagem para Markdown

  • LlamaOCR.com é uma ferramenta que transforma documentos enviados em Markdown
  • A página web informa “Upload an image to turn it into structured markdown” e gera Markdown estruturado a partir do upload de imagens
  • O suporte a PDF aparece como “soon”, portanto o escopo atual é centrado em imagens

Como usar no código

  • Com o pacote npm llama-ocr, é possível executar OCR em código JavaScript
import { ocr } from 'llama-ocr';

const markdown = await ocr({
  filePath: './trader-receipt.jpg',
  apiKey: process.env.TOGETHER_API_KEY
});
  • O exemplo coloca o caminho do arquivo de imagem em filePath e passa a variável de ambiente TOGETHER_API_KEY em apiKey
  • O serviço é baseado em llama-ocr e Together AI

1 comentários

 
GN⁺ 2024-11-17
Opiniões no Hacker News
  • Sou a pessoa que criou o llama-ocr. Obrigado por compartilharem e pela boa recepção. Eu precisava de uma API de OCR simples, então criei isso no começo desta semana; ela faz o parsing de imagens para Markdown estruturado usando o Llama 3.2 Vision hospedado na Together.ai.
    Também está disponível como pacote npm. Planejo adicionar recursos como parsing de PDF e respostas em JSON; se tiverem perguntas, vou tentar responder.

    • Coloquei uma fatura com 3 itens idênticos, e, em vez de exportar como os 3 bullets de sempre, ele criou uma tabela com uma coluna de quantidade que não existia no papel original.
      Fico me perguntando se uma transformação grande desse tipo é um comportamento esperado ou desejável. Às vezes a saída é uma lista com bullets, às vezes é uma tabela, o que torna o processamento automático posterior um pouco mais difícil.
    • Tive dificuldades para extrair conteúdo científico de PDFs de pôsteres; por exemplo, o Nougat frequentemente quebra quando o layout muda.
      Gostaria de saber se vocês também consideraram esse caso de uso.
    • “Need an example image? Try ours.” é uma boa ideia. Seria bom se mais serviços oferecessem um recurso parecido.
    • Fico curioso sobre qual é o nível de precisão.
      Gostaria de saber que tipos de erros ele comete em comparação com sistemas de OCR existentes.
    • Gostaria de saber se também seria possível ter uma opção usando um LLM local.
  • Isso é basicamente só enviar a imagem para o Llama 3.2 Vision e pedir que ele leia o texto.
    Como qualquer outra saída de LLM, é vulnerável a alucinações. Isso porque ele não está lendo formatos de letras a partir dos pixels, mas julgando o texto enquanto descreve a imagem com base em imagens e legendas que aprendeu. Em especial, se for difícil de ler, ele pode inventar palavras completamente.

    • Outros sistemas de OCR também eram assim; só que, nesse contexto, esses erros não eram chamados de alucinações.
  • Parece legal. Tenho feito bastante OCR recentemente, então fico feliz em ver uma nova ferramenta nessa área. O principal nome atual em PDF→Markdown provavelmente é o Nougat[1], do Facebook, e eu gostaria de conectá-lo ao DSPy para comparar qual dos dois se sai melhor com livros de filosofia.
    O projeto Zerox[2], da startup vinculada por este repositório, também parece bom e, no mínimo, tem uma divulgação muito mais polida que a do Nougat. Se algum especialista de verdade passar por aqui, gostaria de ouvir correções ou conselhos.
    Tenho duas dúvidas. 1) O que é a Together.ai e se esse modelo é open source. O site parece um serviço de hospedagem, e a página “Custom Models”[3] parece mais voltada a fine-tuning personalizado do que ao treinamento de modelos proprietários próprios. Parece haver um perfil no HuggingFace, mas não está claro se é realmente deles: https://huggingface.co/TogetherAI
    2) No GitHub está escrito “hosted demo”, mas a parte hospedada parece ser apenas uma WebGUI pequena e limpa. Isso significa que este recurso só pode ser usado, agora e no futuro, por chamadas de API?
    P.S.: no navegador desktop, o link do cabeçalho está quebrado e o onClick não é disparado.
    [1] https://facebookresearch.github.io/nougat/
    [2] https://github.com/getomni-ai/zerox
    [3] https://www.together.ai/products#custom-models

    • O autor do projeto é de DevRel da Together.ai. Ainda assim, é uma ótima forma de promover ferramentas para desenvolvedores.
    • Acho que a together.ai deve estar patrocinando pelo menos parte da demo.
    • Eu esperava algo que pudesse ser auto-hospedado, por privacidade e custo.
    • A together.ai oferece mais de 100 modelos open source, incluindo o Llama 3.2 multimodal, por meio de uma API compatível com a da OpenAI.
  • Houve algo curioso. Enviei um webcomic como exemplo; todas as falas estavam em maiúsculas, mas a saída misturou, de forma inconsistente entre os painéis, capitalização de frase e capitalização de título.
    Também testei um problema para o qual eu realmente gostaria de usar OCR. Tenho slides antigos que precisam ser digitalizados, a maioria com rótulos; ao enviar um deles, ele o descreveu como parecendo uma foto de slide ou quadro de filme, antigo e amarelado, com um recorte retangular escuro no centro, e disse que o texto era “Once Upon a Time” e o número era “1069”.
    A descrição desnecessariamente repetitiva do slide já é um problema, mas o texto real nem estava em cursiva: era “Once Uniquitous.”, e o número era 106g. Era bem claramente um ‘g’, não um ‘9’.
    O interessante é que isso pode ser um exemplo de viés do modelo. Ele viu o slide como algo tão antigo que alucinou um título totalmente clichê, e o retângulo preto era resultado de luz incidindo pela frente para que a parte transparente não aparecesse, mas ele deixou isso passar.
    Além disso, parece haver limites de tamanho de arquivo ou resolução não documentados na própria API.

  • Recentemente usei llama3.2-vision para processar folhas de lances em papel de um leilão beneficente, e ele foi bastante preciso mesmo com caligrafias bem ruins. Quero usá-lo também no evento do ano que vem.
    Porém, é bem irritante a dificuldade de fazê-lo gerar CSV de forma consistente. ChatGPT e Gemini parecem melhores nessa parte, mas não cheguei a automatizar.
    A escala é de cerca de 100 páginas de folhas de lances, então um certo volume de limpeza manual é aceitável. Com certeza é melhor do que gastar o tempo dos voluntários.
    https://github.com/philips/paper-bidsheets

    • Gostaria de saber como o Handwriting OCR(https://www.handwritingocr.com) se compara, de certo modo, para esse trabalho.
      Não é gratuito, mas a precisão em documentos manuscritos é de nível altíssimo. Tenho viés, já que sou o fundador, mas o nível de precisão atual realmente me anima. Para um projeto de 100 páginas, custaria só 12 dólares e poderia economizar tempo.
    • Talvez uma abordagem seja deixar a parte de OCR para o llama3.2-vision e passar a conversão para CSV para o ChatGPT.
  • Tenho feito bastante OCR recentemente, principalmente para digitalizar textos em fotos de família. Modelos comuns de OCR são péssimos, e LLMs se saíram muito melhor. Entre os modelos que testei, o Gemini Flash foi disparado o melhor, mas ainda assim houve falhas e alucinações em quantidade suficiente para que fosse mais rápido digitar à mão
    É irritante porque parece que está quase funcionando, mas não funciona. Esta ferramenta parece pior. Às vezes responde só com o texto; outras vezes devolve uma descrição geral como “The image is a scanned document with handwritten text...”. Eu esperava que houvesse algo como um fine-tuning que conseguisse superar o Gemini Flash; teria economizado muito tempo, então é uma pena

    • Fico curioso se você tentou fazer downscale das imagens. Comecei a obter resultados melhores com imagens em resolução mais baixa. Usei scans feitos com a câmera do celular
      convert -density 76 input.pdf output-%d.png
      https://github.com/philips/paper-bidsheets
    • Pelos padrões de modelos comuns, o estado do OCR open source é bem ruim. Infelizmente, opções fechadas como as da Microsoft e do Google são muito melhores. Fico curioso se você também testou essas
      O Flash é interessante; também gostaria de saber quais LLMs foram testados
    • Recentemente rodei OCR em um corpus de imagens com gpt-4o e obtive resultados bem bons. A principal coisa que percebi é que, mesmo usando um LLM sofisticado, a preparação comum dos dados ainda importa muito
      Cortar as imagens para deixar só a parte do texto, remover as bordas e aumentar o contraste ajudou enormemente. Escrevi este post em 2015, mas ele ainda se aplica muito bem ao GPT: https://www.danvk.org/2015/01/07/finding-blocks-of-text-in-a...
      Para o GPT, foi melhor fornecer no máximo alguns parágrafos de cada vez, em vez de uma página inteira. Quanto mais curto o texto, menor a chance de alucinação
    • Que pena, porque estou tentando fazer exatamente a mesma coisa agora. Estou digitalizando fotos de família, e algumas têm texto em alemão no verso
      O OCR que virou assunto recentemente era péssimo, e eu esperava que este fosse melhor. Ao colar imagens individuais no chat, o ChatGPT 4o foi bom, mas ainda não testei a API. Não sei quanto custaria processar 6.500 fotos; muitas delas não têm nada escrito, mas também não tenho uma forma fácil de filtrá-las
    • Fico curioso se você testou o Claude
      Ele ainda não é bom em retornar a posição do texto, mas, nos meus testes, o desempenho de OCR foi impressionante
  • Questiono se isto deveria ser um post “Show HN”. Parece apenas um frontend, e também não vejo nada que o conecte diretamente ao Llama do nome. Talvez a together.ai tenha fornecido o espaço em nuvem

  • Usei um algoritmo genético para posicionar 500 círculos e formar uma frase, depois inseri a frase desenhada com círculos físicos reais
    https://www.instagram.com/marekgibney/p/BiFNyYBhvGr/
    Curiosamente, ele reconhece bem os círculos, mas não vê a frase. Respondeu algo como “a imagem não contém texto ou elementos que possam ser representados em Markdown; é apenas uma composição visual de círculos, sem informação a ser traduzida para Markdown”

    • Partindo da ideia de que dá para ler ao semicerrar os olhos, apliquei desfoque gaussiano à imagem, e recebi uma resposta dizendo que o texto borrado lia “STOP THINKING IN CIRCLES.”
      Como a resposta não é determinística, também tentei várias vezes com a imagem original, mas ela nunca funcionou. Por outro lado, todos os efeitos de filtro passa-baixa que apliquei funcionaram com alta taxa de sucesso
      https://imgur.com/q7Zd7fa
    • Eu também não consigo ler isso
      De longe fica mais fácil de ler
    • Fico pensando se o LLM original teria sido treinado com esse tipo de material-fonte
      O jeito como o algoritmo genético foi usado é bem legal. Gostaria de ver o código, ou pelo menos a função de recompensa
    • Antes de ver a resposta, eu também não conseguia ler nada além de “stop”
    • Não entendo por que isso é interessante. A imagem não parece nada, e para enxergar as letras é preciso olhar de um ângulo inclinado e ainda assim com dificuldade
  • Foi engraçado. Coloquei 3 screenshots de um documento longo e ele processou relativamente bem, mas, ao revisar, percebi que a IA tinha criado um parágrafo que não existia no original
    Provavelmente, por causa das características dos screenshots, algumas frases ou parágrafos foram cortados no meio, e isso acionou a tendência do LLM de preencher lacunas. Ele não conseguiu deixar um parágrafo inacabado como estava e até adicionou um parágrafo curto de conclusão que não existia de forma alguma no documento original

    • Não entendo como uma tecnologia com qualquer possibilidade, ainda que pequena, de inventar coisas possa ser considerada para uso no mundo real
  • Testei com um scan antigo do esquema da placa-mãe Asus P3B-F de 1997
    Ele extraiu apenas parte do texto do bloco de título, como o nome do projeto e a data, e confundiu 8/B e 1/I em todos os casos, apesar de a fonte ser nítida
    As informações realmente úteis viraram algo como “Tables / Table 1: [Insert table 1 here] / Other Elements / [Insert other elements here]”