OCRが実際にしていること、できないこと
OCR(文字認識)は形を認識して文字を返すもので、文章を読んでいるわけではありません。その背後にある言葉の意味は理解していないので、「l」と間違えた「1」も、周りの正しい文字とまったく同じ確かさで返ってきます。これらのページが、きれいに見える結果を渡して誤りを探させるのではなく、読み取りエンジン自身の信頼度を文字の横に表示するのはそのためです。まっすぐ、ピントを合わせて撮影したはっきりした活字なら、誤りは1000文字に数文字です。反射、影、珍しい書体があると大幅に悪化することがあり、しかも出力の見た目は何も変わりません。
これらのページの裏には、2つの読み取りエンジンがあります。1つは、どの文字体系かを知らなくてもページ上のどこにある文字でも見つけ、1つの辞書で50ほどの言語を読み取ります。もう1つは言語ごとに個別に学習したもので、1つ目の後ろに控え、120以上の言語をカバーします。言語を自動のままにすると1つ目のエンジンが試みます。これが重要なのは、違う言語を指定するのが何も返ってこない典型的な原因だからです。ポーランド語のメニューがキリル文字と判定されてロシア語として読まれると、自信たっぷりに空のページが返ってきます。自分で言語を指定すると、その言語のエンジンに固定されます。手元にあるものが何か正確に分かっているなら、それが適しています。
重要なのはファイルサイズではなく解像度です。読み取りエンジンには適した文字の高さがあり、すべてはその高さになるように拡大・縮小されます。スキャンしたPDFのページは読み取り用に300 DPIでレンダリングされ、画像はサイズではなくインクそのものから測って、拡大または縮小されます。よく誤解されるのが画面上の文字です。通常のサイズでは1文字の高さが約10ピクセルと、エンジンが求める高さの約3分の1しかないため、スクリーンショットは拡大してから読み取ります。1文字あたり約8ピクセルを下回ると拡大できる細部が残っておらず、どんな処理でもそれを作り出すことはできません。逆に、4800万画素で撮ったメニューの写真が、小さくてもシャープな写真より正確になるわけではありません。ある程度を超えると、画素を増やしても時間がかかるだけで何も得られません。
傾きと明るさのむらは、見た目以上に結果を損ないます。撮影したページは1〜2度傾いていて片側から光が当たっているので、画像文字読み取りと書類スキャンはページ全体でその角度を測って補正し、インクの背後にある紙の明るさを部分ごとに推定して均一な白に引き上げます。これは見た目のためではありません。まっすぐな罫線があるからこそ表を格子として見つけられ、コントラストが均一だからこそ手の影がインクとして読まれずに済むのです。スクリーンショットにはどちらの処理もあえて行いません。もともとまっすぐで明るさも均一なので、写真のように補正すると誤りが増えるだけです。
表や段組みのレイアウトは本当に難しいケースで、その数字は知っておく価値があります。罫線のある書式をページ全体の文章として読むと、セルの文字が隣の列に流れ込み、ラベルの3分の1が抜け落ちて、15〜20%の文字が誤っていました。先に罫線を見つけて各セルを個別に読むと、それが約5%になりました。そのため、罫線が見える表は格子として認識され、スプレッドシートにそのまま貼り付けられるタブ区切りの行として返されます。段組みの文章は、ページを横にまたいでではなく読む順に読み取ります。スペースだけで配置された表には見つけるべき罫線がなく、貼り付けてうまくいくかは設計ではなく運次第です。
検索可能なPDFと、抽出したテキストは別物です。PDF OCRと書類スキャンは画像をそのまま残し、認識した文字を見えない形でその上に重ねます。ページの見た目は変わらず、Ctrl+Fで検索でき、選択してコピーもできます。ページに何かが描き込まれることは一切ありません。つまり、読み間違いが完璧に見える文書の中に隠れることにもなります。画像文字読み取りとスクリーンショットOCRはその逆で、得られるのは文字だけです。書体も、色も、太字も、画像もありません。見落としやすいので、テキストレイヤーについて1つ注意があります。テキストレイヤーには同梱のフォントで書ける文字しか入れられないため、中国語、日本語、韓国語の単語は、対応フォントが提供されるまでは書き込まれず、件数としてお知らせします。
ブラウザが本当に適さない場面
画像がお使いの端末から出ないことこそ、ここで読み取る最大の理由です。そしてその代償として、難しい文書では精度が下がります。このトレードオフは現実のもので、隠さずにはっきりお伝えしておきます。
続け字の手書きは認識できません。ここでも、一般的などのOCRツールでもです。これらは活字用の読み取りエンジンで、文字の形を認識しますが、筆記体には認識すべき個別の文字の形がありません。ただ、1文字ずつ書いた手書き文字(大文字のブロック体、手書きで記入した書式、丁寧に書いたメモなど)なら、打ち直さずに修正すれば済む程度にはよく読み取れることが多く、だからこそ手書き文字認識があり、文字の横に信頼度を表示しています。筆記体をきちんと読むには手書き専用に学習したエンジンが必要で、優れたものはタブの中ではなくサーバー上で動いています。
難しい文書では、クラウドOCRのほうが上です。Google、Amazon、Microsoftは、ブラウザのタブに収まるよりはるかに多くのデータで学習した認識エンジンを運用しており、質の悪い写真、密な段組みのページ、珍しい書体、記入済みの書式では目に見えて精度が高くなります。ABBYY FineReaderのような有料のデスクトップソフトも同様です。難しい文書で、文書を手元から出さないことよりも精度のほうが重要なら、それらを使ってください。それが正直な比較であり、判断はそのうえでご自身でしてください。
一括処理はコマンドラインの仕事です。これらのツールは、人がクリックしたときに1つの文書を読み取ります。2000件のスキャンを定期的に処理するなら、OCRmyPDFのようなデスクトップのOCRツールの出番です。1つのコマンドでフォルダー内のすべてのPDFにテキストレイヤーを追加できます。無料で、読み取りの仕組みは同じで、クリックの手間はありません。
そもそも行わないこともあります。遠近の歪みは補正しません。横から撮影したページは台形のまま残り、補正されるのは回転だけなので、真上から撮るひと手間をかける価値があります。深い折り目や、本の綴じ目付近の湾曲も曲がったままです。また、ここにはカメラ機能がありません。コードの読み取りツールがデコードするのは手元にある画像で、ライブ映像ではありません。
ローカルで動かすことの実際的なコストが1つあります。ある言語を初めて使うとき、読み取りエンジンと言語パックがこのサイトから取得されます。数MBあり、初回はその後よりも時間がかかります。ほかの誰かのCDNから取得されるものはなく、何かが送り返されることもありません。
似た名前のツールの選び方
画像文字読み取りとスクリーンショットOCR。同じ読み取りエンジンを、異なる前処理で使います。この違いは見た目の問題ではありません。写真は傾きを補正して明るさを均一にします。スクリーンショットは拡大するだけでほかには手を加えません。傾きも明るさのむらもないので、あるかのように扱うと結果が悪くなるからです。スクリーンショットOCRは貼り付けにも対応しています。Ctrl+V(MacならCmd+V)でクリップボードから直接、先にディスクに保存することなく読み込めます。
画像文字読み取りと書類スキャン。画像文字読み取りは文字だけを渡して画像は捨てます。書類スキャンは画像を残して傾きを補正し、インクの背後の紙を白くして、スキャンしたような見た目のPDFを作ります。オプションで、文字を見えない形で背後に重ねることもできます。文字をどこかに貼り付けたいなら前者を。誰かに文書を送りたいなら後者を選んでください。
書類スキャンとPDF OCR。書類スキャンは写真から始めてPDFを作ります。PDF OCRはすでにあるPDFから始めて、テキストレイヤーを追加します。どちらもページの見た目は変えません。契約書を撮影したなら前者を、スキャンがメールで届いたなら後者を使ってください。
手書き文字認識と画像文字読み取り。同じ読み取りエンジンですが、表の検出をオフにし、信頼度を目立つように表示しています。手書きの場合、その数値こそが結果の中で役に立つ部分だからです。続け字の場合はどちらのページも読み取れず、手書き文字認識のページはもっともらしいでたらめを返すのではなく、読めないとはっきり伝えます。
QRコード読み取りとバーコード読み取り。四角いコードか、縞模様のコードかの違いで、手元にあるのがどちらかを知っておく価値があります。QRコードのページは、QR、マイクロQR、Data Matrix、Aztec、PDF417を読み取ります。これで搭乗券や運転免許証もカバーできます。点のかたまりのように見えても、これらのコードは四角い形式です。バーコードのページは、小売や物流で使われる縞模様の形式(EAN、UPC、Code 128、Code 39、ITF)を読み取り、チェックデジットを検証します。チェックデジットはほかの桁から計算される最後の桁で、信頼できる番号と、正しそうに見えるだけの番号を分けるものです。どちらもOCRではありません。コードは形が決まった記号なので、デコードは文字の形を推測するのではなく計算です。失敗の仕方も違います。四角いコードは誤り訂正を持っているので、傷や中央に印刷されたロゴにも耐えます。縞模様のコードにはそれがまったくないので、バーに反射がかかると、間違った番号ではなく読み取り不能になります。