5 ポイント 投稿者 GN⁺ 2024-01-04 | 1件のコメント | WhatsAppで共有
  • macOSのショートカットアプリを使えば、別途有料サービスを使わずにローカルOCRショートカットを作成し、ターミナル/CLI/Pythonから画像のテキスト抽出を実行できる
  • 中核となる構成は、Extract Text from ImageアクションにShortcut Inputを接続し、結果をクリップボードへコピーする流れ
  • ショートカット名はocr-textextract-textのように、スペースなしの小文字にしておくとCLIから呼び出しやすい。名前を入力した後はEnterを押して保存する必要がある
  • ターミナルではshortcuts run ocr-text -i で実行し、抽出結果はクリップボードにコピーされるのでCommand-Vで確認できる
  • Pythonではsubprocess.check_output()で同じshortcuts runコマンドを呼び出し、OCRショートカットを再利用できる

ショートカットでOCRショートカットを作成する

  • macOSのショートカットアプリを開き、+ボタンで新しいショートカットを作成する
  • 右側のサイドバーでextract textを検索し、Extract Text from Imageアクションを左側の作業エリアへドラッグする
  • Extract text from ...アクションの青いImage入力をクリックし、Shortcut Inputを選択する
    • 上部にReceiveアクションが表示されるので、そのままにしておけばよい
  • 右側のサイドバーでcopyを検索し、Copy to ClipboardアクションをExtract Text from Imageの下に配置する
    • 最後のアクションでCopyの後ろがText from Imageになっていることを確認する必要がある
    • Copy to Clipboardアクションを下へドラッグする作業は、やや不便に感じる場合がある
  • ショートカット名はextract-textまたはocr-textのように、シンプルでスペースのない小文字が適している
    • 名前を入力した後、Enterを押さないと名前が保存されない

CLIとPythonから実行する

  • ターミナルでショートカットを実行するコマンドは次のとおり
shortcuts run ocr-text -i
  • 実行後、Command-Vで貼り付けたときに抽出されたテキストが表示されれば、設定は正しくできている
  • Pythonでは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)
  • ショートカットの共有が期待どおりに動作しない場合があるため手動設定が必要で、ほとんどの作業は一度だけ行えばよい

1件のコメント

 
GN⁺ 2024-01-04
Hacker Newsのコメント
  • OPの記事はよかった。AppleのVisionフレームワークはかなり印象的で、スプレッドシートのスクリーンショット数万枚をOCRで読み取ってPostgreSQLデータベースに入れる個人プロジェクトで使ってみた。
    macOSとNvidiaはまだ相性がよくないので、TesseractのようなCPUベースのOCRも試したが、結果があまりにも頻繁に間違っていた。Visionフレームワークは、自分が見た中で出力品質が最もよく、計算量も最も少なかった。
    かなり不安定ではあったが、自分の実装ミスだった可能性もある。実際の実装にはRHetTbullのvision.py https://gist.github.com/RhetTbull/1c34fc07c95733642cffcd1ac5...を、実験にはocrmac https://github.com/straussmaximilian/ocrmacを併用し、i7 6700kのHackintoshでも性能は意外によかった。
    自分をプログラマーとは呼ばないが、十分な時間があればたいてい問題は解決できた。ただ、その代わりかなり時間はかかった。

    • Tesseractより優れているなら本当に印象的だ。macOSマシンを複数台動かしてAPIサービスにし、収益化できるのか、法的に可能なのかも気になる。
    • Tesseract単体での利用は、今ではかなり広くそこそこ程度だと知られている。
      RAGフレームワークを見ても、複数の実装を使ったりサポートしたりする場合が多く、Tesseractはほぼ常にサポートされているが、たいてい理想的な選択肢ではない。Unstructured https://github.com/Unstructured-IO/unstructured-inferenceやDocTR https://github.com/mindee/doctrのようなプロジェクトのほうが好まれる。
      これらはおおむね最新レベルのビジョンモデル https://github.com/mindee/doctr#models-architectures https://github.com/Unstructured-IO/unstructured-inference#mo...を活用しており、Tesseractを圧倒している。
      Apple Visionフレームワークと直接比較したことはないが、Tesseractよりは確実に優れており、潜在的にはApple Visionより優れている可能性もある。複数の方式を組み合わせるアプローチもあるが、かなり複雑になる。
    • Apple Vision FrameworkでPDFや画像から表構造を抽出するチュートリアルがあるのか気になる。本文に出ていた2つのリンクを試してみたが、表構造は保持せず、テキストだけを抽出した。
      AWS Textractは表をCSVとして抽出するPythonサンプルコードを提供していて、それはうまく動作する。
  • Windowsで似たようなことを試しているうちに、すでにインストールしていたMicrosoftのプロジェクトであるPowerToysに、かなり優れたOCRツールが入っていることに気づいた。
    Win+Shift+Tを押してスキャンする領域を選ぶと、テキストがクリップボードにコピーされる。
    https://learn.microsoft.com/en-us/windows/powertoys/
    https://learn.microsoft.com/en-us/windows/powertoys/text-ext...

    • AutoHotkeyとPowerToysを一緒に使って、スクリーンショットのデータをCSVに追加しているが、独自のキーマッピングと組み合わせてうまく動いている。
  • CLIとそこそこ使いやすいUIの両方を提供するオープンソースツールを作った。無料だ。
    https://trex.ameba.co

    • Trexを毎日使っている。手書き文字やひどい画面キャプチャもきちんと処理してくれるので印象的だ。
  • Safari、Preview、Notesを含む多くのMacアプリが、画像に対してOCRを自動で実行していることに気づいた。画像内のテキストを簡単に選択して、別の場所にコピー&ペーストできるのでかなりよい。

    • 品質がちょっと信じられないほどよい。YouTube動画の再生中でも動画内のテキストを選択できるし、必要なら一時停止してもよい。
      URLやドメインのテキスト、QRコードであれば、ポスターの写真や動画の中でも、長押しや長クリックで画像から直接リンクを開ける。
    • Photosアプリも同じだ。カンファレンスで、あるいは長い文字列をデジタル化する必要があるときに本当に便利だ。たとえばデフォルトのルーターパスワードのようなもの。
      写真で選択してコピーし、Handoff機能を通じてスマートフォンやMacに貼り付けられる。
  • MacBookにbrewでインストールして使っている小さなOCRツールがとても気に入っている: https://github.com/schappim/macOCR

    • 自分も同じだ。自分の用途では、そのユーティリティをmacOS Shortcutでラップして、メニューバーからクリックしたりQuicksilverで起動したりできるようにしておけば十分だ。
  • WindowsではPowerToysのText Extractorをおすすめする。
    https://learn.microsoft.com/en-us/windows/powertoys/text-ext...

  • 私の解決策も一つ付け加えるならこれです: https://skaplanofficial.github.io/PyXA/tutorial/images.html#...
    PyXA は Vision フレームワークを使って、1つ以上の画像からテキストを抽出します。パッケージのごく一部なので一回限りの作業には大げさかもしれませんが、選択肢にはなります

    • ちなみに、より古く精度の低い API である VNRecognizeTextRequest を使っています
      ImageAnalyzer のほうが新しく、ずっと優れています。OP の shortcut も内部的には古い API を使っている可能性が高そうです
  • macOS Ventura 以降のバージョンでは、Image Capture の UI に標準の OCR 機能 が実際に統合されています
    AirPrint 対応スキャナーで PDF スキャンをすると、右側のパネルに「OCR」チェックボックスが表示されます

  • ファイルに内容を書き込むには、こうできます。最も効率的だと言いたいわけではありませんが、動きます
    OCRTHISFILE="ocr-test.jpg"
    shortcuts run ocr-text -i "${OCRTHISFILE}"
    pbpaste > ${OCRTHISFILE}.txt
    または、出力を見ながらファイルにも書き込むなら:
    OCRTHISFILE="ocr-test.jpg"
    shortcuts run ocr-text -i "${OCRTHISFILE}"
    pbpaste | tee ${OCRTHISFILE}.txt

    • macOS Shortcuts で OCR テキストをファイルに出力させてもよいです。アクションは「Append to Text File」を使えば動きます
  • Apple Vision の Copy Subject 機能にも似たような手法があるのか気になります。この機能にかなり頼るようになったのですが、アクセス方法があまりにも限定的に感じます

    • これを調べる必要がありましたが、モバイル版 Photos で写真内の対象を「切り抜いて」ステッカーにする機能のことかなと思います。Apple はこれを「lifting subjects」と呼んでいるようです https://support.apple.com/guide/iphone/lift-a-subject-from-t... https://developer.apple.com/videos/play/wwdc2023/10176/
      「Extract text」アクションを「Remove background」に変えてみればよさそうです。shortcut を実行するときに「-o」で出力画像ファイル名を指定すれば OK です
      shortcuts run remove-background -i ~/Downloads/portrait-beard.avif -o beard.jpg