Windows 10に搭載されているMicrosoft OCRを使って文字認識する

木曜日 , 11, 3月 2021 Leave a comment

文字認識が必要になりそうなお仕事で、実装方法と難しさ、文字認識の精度を調べるために作った簡易OCRツールです。
Windows 10に標準搭載されているOCR( Microsoft OCR / Windows.Media.Ocr )を使っただけなのですが、機能として面白かったのでプログラムとソースを公開します。

2021-03-11 (12)

※実行画面のサンプルとして、青空文庫で公開されている『吾輩は猫である』のスクリーンショットを使用しました。

このツールでできること

  • 画像ファイル(BMP/JPEG/PNG/GIF形式)からテキストを抽出します。

認識の精度はMicrosoft OCRに依存し、プログラムからカスタマイズを行うことはできません。
スキャナで取り込んだ文書、スクリーンショット、写真などからかなりの精度でテキストを抽出してきますが、縦書き・横書きが混在した画像において縦書きの認識は弱いようです。

使い方

  1. 圧縮ファイルを展開したフォルダに格納されているWINOCR.exeを起動します。
  2. 選択ボタンを押して認識させたい画像ファイルを指定します。
  3. 画像ファイルを読み込むと画像が表示され文字の認識処理が行われ結果がウインドウの右側に表示されます。
  4. マウスカーソルやショートカットキーでテキストを選択、コピーアンドペーストでテキストをコピーします。

コンパイルの仕方

圧縮ファイルを展開しVisual Studioで読み込みます。
エラーが表示された場合、C:\Windows\System32\WinMetadataからメタデータの参照を追加します。
追加する項目は以下の通りです。

  • Windows.Foundation
  • Windows.Globalization
  • Windows.Graphics
  • Windows.Media
  • Windows.Storage

Microsoft OCR( Windows.Media.Ocr )関連でエラーが発生している場合、NuGetでパッケージの再インストールや復元を試みてください。

Microsft OCRを使用するためにWindows Runtime(WinRT)関連のアセンブリを追加しようとしたのですが、参照設定がうまくいかず、この状態ではasync/awaitが正しく機能せずエラーコード: CS1061で下記のようなが発生します。(‘Task’の部分が変化します)

error CS1061: ‘Task’ に ‘GetAwaiter’ の定義が含まれておらず、型 ‘Task’ の最初の引数を受け付ける拡張メソッド ‘GetAwaiter’ が見つかりませんでした。using ディレクティブまたはアセンブリ参照が不足していないことを確認してください。

NuGetからUwpDesktopを使って状態を解決しようとすると、今度は循環参照が発生するなど別の問題が起きるようになります。
async/awaitが使えるようになればコンパイルが通り期待する挙動をすることがわかっているので、じんぐるさんのサイトにある記事『非同期メソッド入門 (10) – WinRTとの相互運用』( https://blog.xin9le.net/entry/2012/11/12/123231 )を参照させていただきました。

プログラムとして、OCRに関連する部分はたった2行で実現できてしまうのでなにひとつ難しいことをしていません。

var engine = OcrEngine.TryCreateFromUserProfileLanguages();
var result = await engine.RecognizeAsync(softwareBitmap);

しかし、OCRエンジンに読み込ませることができる画像形式がSoftwareBitmap( Windows.Graphics.Imaging.SoftwareBitmap )形式のみであること、SoftwareBitmapがWindows Runtime APIに含まれることから、デスクトップアプリでWindows Runtime APIを扱いImageコントロールに表示している内容をSoftwareBitmap形式に変換するための処理がいろいろと書かれています。


今回、フリーのOCR『Tesseract』も検証してみたのですが、Wordから印刷したものをスキャナで取り込んだような文書ではTesseractも善戦したのですが、実際の利用シーンを想定したテストでコピーやFaxなどにより文字が潰れている書類、工場の現場などを回覧した油汚れが付いている書類などで試してみるとMicrosoft OCRの方が圧倒的に認識精度が良く潰れている文字でもかなりの精度で文字を抽出してきました。
Terrasectは、Apache Licenseという使い勝手の良いライセンスのフリーウェアで、WindowsだけでなくmacOSやLinuxなどでも使用できること、各言語のラッパーが用意されていること、文字識別のためのデータを入れ替えることができるなどメリットも多数あることがわかりました。

今回、スタンドアロンや閉じたネットワークでの運用を想定しクラウド上のサービスを使わずに済むライブラリを使ってみましたが、GoogleのCloud VisionやMicrosoftのAzure Computer Vision、AmazonのTextractなどクラウドのサービスではより強力な認識が行えそうです。
利用する場面や用途にあわせて使い分けができそうです。

Please give us your valuable comment

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください