スキャンPDFを検索できる文書に:OCRの仕組みとスキャン設定

OCRがページを読む手順(レイアウト解析→行認識)、Tesseract 4のLSTM、300DPIという目安の意味、画像PDFと検索可能PDFの違い、日本語と手書き文字の認識の限界を解説します。

everytooleverywhereallatonce · 公開

複合機でスキャンした契約書を開き、Ctrl+Fで「敷金」を探しても何も見つからない。そのPDFに入っているのは文字ではなく文字を写した写真です。人の目には同じに見えても、コンピューターにとっては白地に黒い点が散らばった絵にすぎません。この写真から文字を取り戻す技術がOCR(光学文字認識)です。

画像PDFと検索可能なPDF

PDFのページは大きく3種類に分けられます。

種類 できる経緯 検索・コピー
テキストPDF WordやGoogleドキュメントからPDF保存 できる。文字がフォントと一緒に入っている
画像PDF スキャナー、スマホのスキャンアプリ できない。ページ全体が1枚の絵
検索可能なPDF 画像PDFにOCRの層を加えたもの できる。絵の上に見えない文字が重なっている

3つ目の仕組みは少し面白いものです。PDFの仕様には、文字を塗りも輪郭も描かない「テキスト描画モード3」があります。OCRの結果をこのモードで元の文字の位置に重ねると、画面にはスキャン画像だけが見え、ビューアはその下の見えない文字で検索・選択・コピー・読み上げを行います。スキャンページをドラッグしたとき、青い選択範囲が文字から少しずれて見えるのはこのためです。

この方式の利点は、元の画像に手を加えないことです。認識を誤っても見た目の文書は無傷で、間違うのは検索とコピーの結果だけです。裏返せば、検索可能なPDFからコピーした文章はもう一度確かめる必要があります。見えている文字とコピーされる文字が違うことがあるからです。

OCRはページをどの順で読むか

現代のOCRエンジンはおおむね2段階で動きます。

第1段階:レイアウト解析。 ページの中で文字のある領域を見つけ、段・段落・行に分けます。図、表の罫線、汚れはここで除かなければなりません。2段組を1段と誤解すると、左の段と右の段の行が交互につながった意味不明な文になります。

第2段階:行認識。 切り出した行の画像を文字列に変えます。大きく変わったのはこの部分です。

代表的なオープンソースOCRであるTesseractは、1985〜1994年にヒューレット・パッカードで開発され、2005年にHPがオープンソースとして公開し、2006年から2017年まではGoogleが開発を主導しました。2007年のレイ・スミス(Ray Smith)の論文が説明する初期のTesseractは、行を文字候補に切り分けてから、1文字ずつ輪郭の特徴で分類していました。この方式は、先に文字の境界を正しく切らないと判定できないのが弱点です。接触した「rn」を「m」と読んだり、偏と旁を別々の文字に分けてしまったりする誤りはここから生まれます。

Tesseract 4.0からはLSTM(長短期記憶)ニューラルネットワークが既定の認識器になりました。公式ドキュメントの言葉では「行認識に焦点を当てた」エンジンで、行の画像を左から少しずつなぞりながら前後の文脈を覚え、文字列を一度に出力します。文字の境界を先に決めないので、接触した文字や崩れた印字にずっと強くなりました。その代わり計算量は従来の約10倍だとドキュメントに書かれています。

PaddleOCRのような最新の深層学習OCRも骨組みは同じです。検出モデルが「その画素が文字である確率」の地図を作って行の枠を見つけ、認識モデルが各行を文字列に変えます。認識でよく使われるCTCデコードは、行を細い縦の断片の並びとみなし、断片ごとに最もありそうな文字(または「空白」)を選んで、連続する重複をまとめて文字列にします。当サイトのPDF OCRツールはPaddleOCRのモデルを既定で使い、日本語はCJK用の認識モデルで読みます。

300DPIという目安の正体

Tesseractの公式ドキュメントは「少なくとも300DPIの画像で最もよく動作する」と書いています。この数字は絶対の規則ではなく、文字1つに十分な画素が割り当てられるかを測る代わりの指標です。

計算してみます。1インチは72ポイントなので、10ポイントの文字の高さは300DPIで10×300÷72≈42ピクセル、200DPIで約28ピクセル、150DPIで約21ピクセルです。英字なら21ピクセルでも形はおおむね残りますが、漢字は1マスに十数画が詰まることもあり、画と画の隙間が1〜2ピクセルまで縮みます。「績/積」「候/侯」「未/末」のように1画や線の長さだけが違う字を見分けるには、その1〜2ピクセルが残っていなければなりません。濁点と半濁点(「バ/パ」)も低解像度で真っ先に崩れる部分です。

実務の目安は次のとおりです。

  • 通常の本文(10〜12pt):300DPI
  • 脚注、約款、レシートなど8pt以下:400DPI以上
  • 大きな文字のポスターや見出しだけの文書:200DPIでも十分

注意したいのは、低解像度で保存済みのスキャンは後から解像度を上げても改善しないことです。150DPIでスキャンしたPDFを400DPIで描画しても画素が大きくなるだけで、失われた画の隙間は戻りません。解像度はスキャンの時点で決めるものです。

スキャン時に結果を左右する設定

解像度の次に大事なのは次の4つです。

カラーモード。 スキャナーの「白黒(1ビット)」はファイルが最も小さい反面、ページ全体を1つのしきい値で白黒に分けます。薄い鉛筆書きや影になった綴じ側の文字は、この時点で永久に消えます。グレースケールで取り込んでおけば、周囲の明るさから画素ごとにしきい値を決める適応的二値化(Sauvola法など)を後からかけられます。Tesseractのドキュメントも、内蔵の二値化(大津の方法)は「背景の明るさが不均一だと最適でない結果になりうる」と書いています。

圧縮。 JPEGの品質を下げすぎると文字の輪郭にモヤ(リンギング)が出て、OCRはそれを画と取り違えます。スキャナー設定では高画質、または圧縮率の低い側を選んでください。

傾き。 数度傾くだけで長い行の端が次の行にかかります。Tesseractのドキュメントの助言は単純で、「行が水平になるようページを回転せよ」です。ADF(自動原稿送り)で多数枚を取り込むとよく起きる問題なので、OCRの前にスキャン補正ツールの傾き補正で直しておくと認識が安定します。この補正はページを描き直さず座標だけを回すので、画質は落ちません。

縁と影。 本を伏せてスキャンすると、中央の綴じ部分に濃い影、端に黒い帯ができます。Tesseractのドキュメントは、こうした暗い縁が文字として誤認識されうると警告しています。パンチ穴も「o」や句点として読まれがちです。認識の前に消しておくのが確実です。

スマホで撮る場合は、台形のゆがみと照明のむらが加わります。スキャンアプリの書類モードで四隅を合わせ、自分の影が紙にかからない明るい場所で撮ってください。

日本語の認識が英語より難しい理由

英語は大文字・小文字・数字・記号を合わせても100字ほどです。日本語は常用漢字だけで2,136字あり、そこにひらがな・カタカナ、人名や地名の表外字が加わります。分類しなければならない文字の数が桁違いで、形の似た字の組もそれだけ多くなります。

日本語ならではの難しさもあります。

  • 似た字が多い。 「土/士」「己/已/巳」、カタカナの「ロ」と漢字の「口」、長音符「ー」と漢数字の「一」とダッシュ。形だけでは区別できず、前後の文脈に頼るしかない組が少なくありません。
  • 分かち書きがない。 日本語は語の間に空白を入れないので、OCRが字間から空白を推定すると、本来ない空白が挟まることがあります。
  • 縦書き。 Tesseract 4のドキュメントは中国語・日本語・韓国語の縦書きに対応し自動検出すると書いていますが、すべてのOCRツールがそうではありません。当サイトのPDF OCRも現状は横書きのみを前提にしています。書籍や公文書を扱うなら、使うツールが縦書きに対応しているかを最初に確認してください。
  • ルビと混在文字。 本文の上に小さく振られたルビは別の行として拾われ、本文に割り込むことがあります。

手書き文字がいまだに難しい理由

活字のOCRは「同じフォントの同じ字は毎回ほぼ同じ形」という前提に立っています。手書きではこれが崩れます。字形は人によって、同じ人でも行ごとに違い、文字はつながり、行は傾き、記入欄からはみ出します。手書きを読むには手書き専用に学習したモデルが必要で、それでも活字並みの精度は期待しにくいのが実情です。

PaddleOCRはPP-OCRv5で中国語・英語の手書き認識を改善したと説明していますが、日本語の手書きについて同等の公表データは見つけられませんでした。申込書のように活字と手書きが混ざる書類では、活字部分をOCRに任せ、手書き欄は人が書き写すほうが早いことが多いでしょう。

結果を信用してよいかの確かめ方

OCRエンジンは単語ごとに「信頼度」を出します。平均が90%でも、残りの10%が金額や口座番号かもしれません。確認の順番は次のとおりです。

  1. 信頼度が低いと表示された語から原本と照合します。
  2. 数字、日付、固有名詞を別に見直します。辞書による補正が効かない領域なので、誤りが残りやすいのです。
  3. 仕上がったPDFで重要な語を検索し、実際に見つかるか確かめます。

もともとテキスト層があるPDFなら、OCRが要らないこともあります。まずPDFテキスト抽出で取り出してみてください。結果が空なら画像PDFです。文字は出るのに無関係な漢字や記号に化けている場合は、PDFの中にグリフをUnicodeへ戻す表(ToUnicode)がないか誤っています。これは抽出では直せず、逆説的ですが、テキストPDFなのにOCRで読み直すのが解決策になります。

作業の流れ

  1. できれば300DPI(小さい文字は400DPI)、グレースケールでスキャンします。
  2. 向きと傾きを直し、縁・影・ゴミを取り除きます。
  3. 文書の言語を合わせてOCRをかけ、信頼度の低い語と数字を確認します。
  4. 検索できることを確かめ、元のスキャンと一緒に保管します。

元のスキャンを残すのは、OCRが年々良くなるからです。質のよい原本があれば、数年後により優れたエンジンで読み直せます。

出典