画像やpdfの文字認識を行うtesseractを検証してみる
大量のpdf...しかも紙をスキャンしたもので完全なる画像...
に書かれた文字(注 手書きの文字ではなく、印刷文字です)をテキスト化する必要があったのですが、
全部読んで手入力するとか時間の無駄遣いすぎるので、
tesseractを使って自動で認識させてみました。
tesseractとは
オープンソースのOCRエンジン。
今回のネタは〜の使い方ではありませんので、インストール方法とかは省きます。
Linux, Mac, Windowsで使うことができます。
CUI(コマンドライン、ターミナル)で使うことができるので、
複数枚を一気にやりたい時なんかに便利です。
現在最新安定板は3.05ですが、4.00 alphaを使いましょう。
4.00は内部でLSTMが使われており、認識精度が大幅に向上しています。
ただしalpha版の為、3.xで使えていたホワイトワード/ブラックワードなどが使えない問題があります。
しかしその問題を吹き飛ばすくらい精度が上がっているのも確かです。
使い方は簡単で
tesseract <画像ファイル名> <出力ファイル名(.txtは自動付与される)>
とするだけです。
僕は今回(LSTMが得意と思われる)手紙のような文章、ではなく、
シリアル番号、日付日時(日本のフォーマット)を読んだのですが、
80%以上の精度が出ました。
これは「完全一致」の精度です(1文字間違っていたらアウト)
さて、ここからは本筋とは離れますが、実はtesseractはpdf入力には対応していません。
まずはpdfをpngに変換しないとなのですが、
この変換も自動化しないと意味がないので、今回はImageMagickを使って一括変換しました。
これもLinux, Mac, Windows他で使うことができます。
またpdfを扱うにはghostscriptも必要です。
これでpdfをpngに変換できるようになったのですが、
デフォルトで変換すると、pngの画像が荒すぎて、tesseractの認識精度が下がります。
(ここに気づくのが遅れて大変でした)
変換のコマンドには -density 200 オプションをつけましょう。
pdfを100%の大きさで表示した時より少し大きいくらいに出力できます。
とある掲示板では -density 400 と書いてありましたが、そんなにいらないかも...
-densityの数値が大きいと、imagemagickの変換時間も長くなりますし
使い方は
magick -density 200 <pdfファイル名> <出力ファイル名.png>
複数ページのpdfは複数枚のpngになり「出力ファイル名-0.png」のようにから順に番号が付けられます
さらに.pngに対して、回転とかトリミング(クロップともいう)をしたかったので、
Ralpha Image Resizerも使いました。
絵や表、文字が入っている画像の場合、読みたい文字をピンポイントでトリミングしてあげることで文字認識精度が90%以上まで上がりました。
しかし、紙をスキャンしたデータは位置ズレや歪みが大きいので、
一括トリミングするとズレが出てしまいます。
まさか、一枚一枚トリミングするとかは馬鹿げているので(200枚くらいはやりましたけどね...)
結局精度よりも作業全体の自動化を優先し、トリミングはやめました。
とまあこんな感じです。
これがQiitaであれば機械学習やニューラルネットで文字認識を作ってみる、
となるのかもしれませんが、
現存技術を組み合わせて使って効率化を図る方が確実です。
ということで、ひさびさにアプリとその精度を真面目に検証してみました
Comments