5 pontos por GN⁺ 2024-01-04 | 1 comentários | Compartilhar no WhatsApp
  • Com o app Shortcuts do macOS, é possível criar um atalho de OCR local e executar a extração de texto de imagens no terminal/CLI/Python sem usar serviços pagos adicionais
  • A configuração principal consiste em conectar Shortcut Input à ação Extract Text from Image e copiar o resultado para a área de transferência
  • É melhor usar um nome de atalho simples, em minúsculas e sem espaços, como ocr-text ou extract-text, para facilitar a chamada via CLI, e é preciso pressionar Enter depois de digitar o nome para salvá-lo
  • No terminal, execute com shortcuts run ocr-text -i , e o resultado extraído será copiado para a área de transferência para ser conferido com Command-V
  • Em Python, é possível reutilizar o mesmo atalho de OCR chamando o mesmo comando shortcuts run com subprocess.check_output()

Criando um atalho de OCR no Shortcuts

  • Abra o app Shortcuts no macOS e crie um novo atalho com o botão +
  • Na barra lateral direita, pesquise por extract text e arraste a ação Extract Text from Image para a área de trabalho à esquerda
  • Clique na entrada azul Image da ação Extract text from ... e selecione Shortcut Input
    • A ação Receive aparecerá na parte superior; pode deixá-la como está
  • Na barra lateral direita, pesquise por copy e coloque a ação Copy to Clipboard abaixo de Extract Text from Image
    • Na ação final, confirme se após Copy aparece Text from Image
    • Arrastar a ação Copy to Clipboard para baixo pode ser um pouco incômodo
  • Um nome simples, em minúsculas e sem espaços, como extract-text ou ocr-text, é o mais adequado para o atalho
    • Depois de digitar o nome, pressione Enter para que ele seja salvo

Executando via CLI e Python

  • O comando para executar o atalho no terminal é o seguinte
shortcuts run ocr-text -i
  • Se, depois da execução, você colar com Command-V e o texto extraído aparecer, a configuração foi feita corretamente
  • Em Python, é possível executar o mesmo comando com subprocess.check_output()
import subprocess
file_path = '... some file path ...'
ocr_out = subprocess.check_output(
    f'shortcuts run ocr-text -i "{file_path}"', shell=True
)
print(ocr_out)
  • O compartilhamento do Shortcuts pode se comportar de forma estranha, então pode ser necessária uma configuração manual, mas na maioria dos casos todo o processo só precisa ser feito uma vez

1 comentários

 
GN⁺ 2024-01-04
Opiniões no Hacker News
  • Gostei do post do OP. O framework Vision da Apple é bem impressionante, e usei em um projeto pessoal para ler via OCR dezenas de milhares de capturas de tela de planilhas e colocá-las em um banco de dados PostgreSQL
    Como macOS e Nvidia ainda não se dão muito bem, também tentei OCR baseado em CPU, como o Tesseract, mas os resultados erravam com frequência demais. O framework Vision teve a melhor qualidade de saída que já vi e também usou a menor quantidade de computação
    Era bem instável, mas é possível que fosse erro da minha implementação. Na implementação real usei o vision.py do RHetTbull https://gist.github.com/RhetTbull/1c34fc07c95733642cffcd1ac5..., e nos experimentos usei também o ocrmac https://github.com/straussmaximilian/ocrmac; o desempenho foi surpreendentemente bom até em um Hackintosh com i7 6700k
    Não me chamo de programador, mas, com tempo suficiente, em geral consegui resolver os problemas; em compensação, levou bastante tempo

    • Se for melhor que o Tesseract, é realmente impressionante. Também fico curioso se seria possível rodar várias máquinas macOS, transformar isso em um serviço de API e ganhar dinheiro, e se isso seria permitido legalmente
    • Usar apenas o Tesseract hoje já é amplamente conhecido como algo mediano
      Basta olhar para frameworks de RAG: muitos usam ou oferecem suporte a várias implementações, e o Tesseract quase sempre é suportado, mas geralmente não é a escolha ideal. Projetos como Unstructured https://github.com/Unstructured-IO/unstructured-inference ou DocTR https://github.com/mindee/doctr tendem a ser preferidos
      Em geral, eles aproveitam modelos de visão de ponta https://github.com/mindee/doctr#models-architectures https://github.com/Unstructured-IO/unstructured-inference#mo... e superam o Tesseract com folga
      Não comparei diretamente com o framework Apple Vision, mas com certeza são melhores que o Tesseract e potencialmente podem ser melhores até que o Apple Vision. Também existe a abordagem de combinar vários métodos, mas isso fica bem complexo
    • Fico curioso se existe algum tutorial para extrair estruturas de tabelas de PDFs ou imagens com o Apple Vision Framework. Tentei os dois links mencionados no texto, mas eles apenas extraíram o texto, sem preservar a estrutura da tabela
      O AWS Textract fornece código de exemplo em Python para extrair tabelas como CSV, e isso funciona bem
  • Ao tentar fazer algo parecido no Windows, descobri que o PowerToys, um projeto da Microsoft que eu já tinha instalado, inclui uma ferramenta de OCR bem boa
    Ao pressionar Win+Shift+T e selecionar a área a ser escaneada, o texto é copiado para a área de transferência
    https://learn.microsoft.com/en-us/windows/powertoys/
    https://learn.microsoft.com/en-us/windows/powertoys/text-ext...

    • Estou usando AutoHotkey junto com PowerToys para adicionar dados de capturas de tela a um CSV, e funciona bem com meus próprios mapeamentos de teclas
  • Criei uma ferramenta open source que oferece tanto CLI quanto uma UI decente, e ela é gratuita
    https://trex.ameba.co

    • Uso o Trex todos os dias. Ele lida bem com caligrafia e capturas de tela bagunçadas, o que é impressionante
  • Descobri que muitos apps do Mac, incluindo Safari, Preview e Notes, fazem OCR automaticamente em imagens. Dá para selecionar facilmente o texto dentro da imagem e copiar/colar em outro lugar, o que é muito bom

    • A qualidade é meio absurdamente boa. Mesmo quando um vídeo do YouTube está sendo reproduzido, dá para selecionar o texto dentro do vídeo, e você também pode pausar se precisar
      Se for texto de URL ou domínio, ou um QR code, dá para manter pressionado ou clicar e segurar mesmo em uma foto de pôster ou dentro de um vídeo para abrir o link diretamente a partir da imagem
    • O app Photos faz o mesmo. É ótimo em conferências ou quando é preciso digitalizar strings longas. Por exemplo, algo como a senha padrão de um roteador
      Você pode selecionar e copiar na foto e, via Handoff, colar no celular ou no Mac
  • Gosto muito de uma pequena ferramenta de OCR que instalo no MacBook via brew: https://github.com/schappim/macOCR

    • Eu também. Para meu uso, basta encapsular esse utilitário em um macOS Shortcut para poder clicar na barra de menus ou executá-lo pelo Quicksilver
  • No Windows, recomendo o Text Extractor do PowerToys
    https://learn.microsoft.com/en-us/windows/powertoys/text-ext...

  • Se eu for acrescentar a minha solução, é esta aqui: https://skaplanofficial.github.io/PyXA/tutorial/images.html#...
    O PyXA usa o framework Vision para extrair texto de uma ou mais imagens. Como é uma pequena parte do pacote, pode ser exagero para uma tarefa pontual, mas é uma opção

    • Para referência, ele usa a API VNRecognizeTextRequest, mais antiga e menos precisa
      O ImageAnalyzer é mais novo e muito melhor. O shortcut do OP também parece muito provavelmente usar a API antiga por baixo
  • Nas versões a partir do macOS Ventura, um recurso de OCR nativo está de fato integrado à interface do Image Capture
    Ao escanear um PDF com um scanner compatível com AirPrint, aparece uma caixa de seleção “OCR” no painel à direita

  • Para colocar o conteúdo em um arquivo, dá para fazer assim. Não estou dizendo que é o mais eficiente, mas funciona
    OCRTHISFILE="ocr-test.jpg"
    shortcuts run ocr-text -i "${OCRTHISFILE}"
    pbpaste > ${OCRTHISFILE}.txt
    Ou, para ver a saída e também gravá-la em um arquivo:
    OCRTHISFILE="ocr-test.jpg"
    shortcuts run ocr-text -i "${OCRTHISFILE}"
    pbpaste | tee ${OCRTHISFILE}.txt

    • Também dá para fazer o Shortcuts do macOS gravar o texto do OCR em um arquivo. Para isso, use a ação “Append to Text File
  • Fico curioso se existe alguma técnica parecida para o recurso Copy Subject do Apple Vision. Passei a depender bastante desse recurso, mas a forma de acesso parece limitada demais