Cognitive Services: OCR機能で印刷物の写真からテキストのデータ化をしてみる

LINEで送る
Pocket

今回は、Microsoft Cognitive ServicesのComputer Vision APIで利用できるOCR機能を使って印刷物に描かれた文字の読み取りをさせてみました。

Computer Vision APIについて

Computer Vision APIは画像からオブジェクトを認識し、内容を抽出できるサービスで、画像分析、タグ付け、著名人の認識、テキスト抽出、およびサムネイル生成など様々な機能が利用できます。
利用料金は月5000トランザクションまで利用出来る無料の「Free」と、従量課金型の「Standard」が設定されており、「Free」で利用検証をして、実運用時に「Standard」に変更するといったような運用ができます。

レベル 機能 単位 料金
Computer Vision API – Free   トランザクション 5,000 無料トランザクション / 月
Computer Vision API – Standard 最大 10 トランザクション/秒 トランザクション ¥153/1,000 トランザクション

※ 現在はプレビューのため価格には割引が適用されています。

OCR機能について

OCRはOptical Character Recognition (光学文字認識)の略で、画像データ内のテキストを認識し、文字列データとして読み取る機能です。
OCR自体は新しい技術ではなく、1950年代には商用システムとして利用されるほど歴史が深いもので、スキャナーなどのオプション機能としても一般的に提供されているものになります。
Cognitive Servicesでは、Computer Vision APIの1機能としてOCR用APIが提供されており、写真に撮った文書から文章の傾きや言語情報などを検知して文字列データに変換することができるようになっています。

Computer Vision APIのOCR機能

Computer Vision APIのリクエストはFace APIとほぼ同じで、Request headerにAPIキー、Request bodyに画像を取得するURLを設定し、Request parametersに判別する言語の設定をします。Computer Vision APIのOCR機能は現在21の言語に対応しており、言語設定を「’unk’」とすると、言語を自動判別して文字列に変換することができます。

・Python 2.7 サンプルコード

上記コードで、文字列を画像として保存したものをComputer Vision APIのOCRで分析すると、以下のようなJSONが返されます。分析結果は、文章のブロック、行、単語のレベルごとに、「region」、「lines」、「words」の階層を持った配列として出力されるため、ルールに沿って展開することで容易に文字列に変換することができます。

・入力画像

・レスポンス

各階層の「boundingBox」は行や単語の検出範囲(座標)を示しています。「boundingBox」の座標は、元画像の座標ではなく、「orientation」と「textAngle」を基に行が水平になるように回転させた後の座標を示しており、OpenCVで検出位置を可視化する場合などの処理を行う場合は、元画像の回転処理を行う必要があります。


OCR機能は日本語にも対応しており、試しに日本語の画像データを入力してみると書かれている、かな、漢字をテキストデータに変換することができました。

ただし、西欧言語とは異なり、1文字を単語として認識するため、欧米言語とは異なる方法でテキストデータ化する必要があるようです。

OCRによる自動言語判定

Computer Vision APIのOCR機能がどの程度まで正確にデータ化と言語判定できるか試してみます。
今回は、滝廉太郎の「荒城の月」(日本語)、ベートーヴェンの「交響曲第9番」(ドイツ語)および「Ave Maria」(ラテン語)の歌詞を印刷した紙を写真に撮ってOCRでテキストデータへの変換と言語判定をしてみました。


テキストデータへの変換には下記のコードを使用しました。上述のように欧米言語と日本語では単語の認識が異なるため、日本語の判定の場合には単語のスペース区切り処理を行わないように処理を分けています。

まず、日本語の「荒城の月」を認識させてみると、「language:ja」(日本語)と判定され、「荒城の月」の歌詞を表示することができました。比較的難しい漢字の多い歌詞ですが、認識の誤りは「鳴きゆく雁の数見せて」の「ゆ」が小書きになっているのみで、漢字含めほぼ正確に認識できていることがわかりました。


続いて、ドイツ語の「交響曲第9番」を認識させてみました。26行にわたる長い歌詞ですが、ウムラウトやエスツェットなど特殊な文字を含めても誤認識は0で、正確にテキストデータに変換できていました。言語も「language:de」(ドイツ語)と判定されており、言語の自動判定も正確にできていることがわかりました。

最後にラテン語の「Ave Maria」を認識させてみました。歌詞自体はそれほど長くなく、文字もアルファベット26文字のみのため、文字認識はドイツ語同様に誤認識0で、正確にテキストデータ化できていました。しかし、OCRの言語判定機能はラテン語に対応していないため、言語判定に関しては最も近いと思われる「language: en」(英語)と判定されてしまいました。

今回は、Computer Vision APIのOCR機能を使用して印刷物のテキストデータ化と言語判定を試してみましたが、
スマートフォンで撮った文書の写真でも精度良くテキストデータに変換することができており、実用性の高さを感じました。

また、言語判定に関しても対応言語であれば正確に判定できるようで、何語かわからない文書もスマートフォンで撮るだけで言語判定できるといった利用ができるのではないでしょうか。

一方、対応していない言語に関しては単語の傾向か類似の言語を判定してしまうようなので、正確な判定を行う場合には別の手段をとる必要があります。

そこで次回は、OCRに加え言語判定に特化したText Analytics APIを併用して、より正確な言語判定を行う検証をしていきます。

お楽しみに!

LINEで送る
Pocket