こんにちは!テコンドーです。最近、OCR技術について興味がでてきて、色々自分で調べています。
その中でも気になっていたのが、「非定型帳票認識」という技術です。
一般的なOCRでは、まずどの位置にどの情報が書かれているのかを読み取り時に指定する必要があります。
よく利用されているのは、x=〇〇、y=〇〇といったように、座標を指定することで、どの場所にどの情報が書かれているのかを指定する方法です。
今回紹介する「非定型帳票認識」では、この事前の帳票定義が不要になっています。
OCRモデルが自動でどの場所に何が書かれているのかを判定することで、
事前の帳票定義が不要でも、会社名、支払期日、電話番号などを自動で読み取ることができます。
フォーマットの指定が不必要なので、OCRモデル利用者の手間がかからないことと、読み取る紙のフォーマットの指定が不要になることから、座標指定のモデルと比較して、非常に便利です。
「非定型帳票認識」は、
- アナログ情報をデジタル情報に変換する
- デジタル情報を、対応しているカラムの情報として読み込む
という2つの処理が必要です。
1つ目の処理は分かるのですが、2つ目の処理がどのように行われているのか気になり、調べてみました。
会社名であれば、どんな処理を行うことで文字列を会社名だと認識しているのでしょうか。
OCRの読み取りのプロセス
まず、OCRはどのようにして文字を認識しているのでしょうか?
そのプロセスを確認します。
https://mediadrive.jp/technology/techocr05
こちらの記事を元にして整理します。
1. 画像取り込み
読み取りたい原稿、資料をスキャン、撮影することで、画像としての形式に変更します。
アウトプット→〇〇.png, jpg
2. レイアウト解析
1で読み取った画像のレイアウトを解析します。どの箇所に文字があり、段落があるのかなどを判別し、読む順序を決定します。
アウトプット→文章全体の構造
3. 行の取り出し
2で判別したある塊の文章に対して、行毎に分解を行います。
アウトプット→それぞれ行の位置
4. 文字の切り出し
3で取得した行の位置を元に、一行を文字毎に分解します。
アウトプット→各文字の位置
5. 文字認識
一文字毎に、どの文字なのかを具体的に判定します。
文字の大きさ、フォントなどが文字毎に異なるため、その際を吸収するために、前処理を行います。
例としては、
- 正規化:文字を一定の大きさに変換
- 特徴抽出:CNNで言うところのフィルターマッチングを行い、各ベクトルの成分として文字の特徴量を抽出
- マッチング:事前登録された文字の特徴量を利用して、2で抽出した特徴量とのマッチングを行う
- 知識処理:文章の前後関係、辞書に登録された情報などを用いて、ご認識を修正(力(漢字)をカ(カタカナ)に変換など)
などになります。
アウトプット→各文字情報の文字
6. フォーマット出力
読み取った文字を出力します。PDF,HTML,xlsなど形式は様々です。
これらのステップを経ることで、画像を文字情報に変換しているようです。
ステップを分けることによって、問題を分離することが出来ますね。
DeepLearningなどを利用することで、それぞれの精度を上げるような研究も行われているようです。
非定形読み取りの仕組みの事例
いくつかの資料を読んでみて、どのように情報の意味付けが行われているのかを調査してみました。
東芝 項目サーチOCRの仕組み
東芝の研究員の方が投稿されていた、
OCRに関する論文を発見したので、例としてこの論文での読み取り方を調査します。
この論文の中で述べられているのは、「項目サーチOCR」というものです。
この技術によって、どのカラムに対応している情報なのかを判断できます。
本文を引用すると、
この技術は、読み取り対象の座標の代わりに、読み取り対象の規則や見出しの文字列を登録して、その情報に従って文書中から読み取るべき文字列の場所を探し出すことができるので、記入項目の座標を登録する必要がない。
と書かれています。
対象文字列の見つけ方に関する2つの方法
- 見出し文字列による記載項目の識別
- 字面による識別
1つ目は、見出し文字列を元に判定します。例えば郵便番号であれば、「〒」この記号が必ず見出しに記載されているので、その情報を元に判断することができるようになります。
2つ目は、字面による識別です。都道府県から始まる文字列は、高い可能性で住所であると判断できます。
この技術は固有表現抽出、Named Entity Recognition(NER)と呼ばれています。
詳細仕様も策定されているものがあり、人物の場合は<PERSON>,日付の場合は<DATE>といったようにラベル付けがされるようです。
https://ai-scholar.tech/articles/natural-language-processing/ner-weak-supervision
このように、文字列の中の情報を元にしてどのような情報なのかを判断しているようです。
DeepLearningでブラックボックスであるモデルを利用してよしなにやっていると思ったけど、
ヒューリスティックな知識も活用しているんですね。
より具体的な手法を紹介している事例
https://medium.com/analytics-vidhya/invoice-information-extraction-using-ocr-and-deep-learning-b79464f54d69
手を動かして、OCRのプロセスを経験できる事例、記事はないかと思い海外の記事を探していたところ、ピッタリのものがあったので共有します。
この例では、領域検出の際にDeepLearningが利用されているようです。
かなり詳細に技術的な説明を行っています。
先程のステップで言うところのレイアウト解析、行抽出のあたりでしょうか。
実際に訓練データを用意し、領域検出のためのモデルを作成しています。
文字検出にはTesseract-OCRが利用されてるみたいですね。
日本語版も利用することができます。
肝心のテキストカテゴライズに関しては、以下のように説明がされています。
We have taken the output of the OCR and trained a custom NER model in order to classify the following entities.
1. Invoice Number
2. Invoice Date
3. Currency
4. Total Amount
5. Purchase Order
Invoice Information extraction using OCR and Deep Learning
この記事では、NER技術を利用しているようです。
spaCyと呼ばれる、自然言語処理フレームワークを活用し、数百の訓練データを用いて、カスタムしたNERモデルを作成しています。
訓練データは、spaCy NER annotatorというツールを用いてラベル付が行われています。このツールを利用すると、作成したラベルに対して、自分でカスタムしたアノテーションを付けることが出来ます。
spaCyのモデルを、自前の訓練データでファインチューニングすることで、特定ラベルでの検出ができるようになるようです。精度的にはFscoreが94%ほどとなっており、判別自体は行えているようですね。
気になるのは、同様のフォーマットのカテゴリを用意した場合に、NERモデルで正しく分類が行われるのか?というところです。
今回の例でいうと、日付に関する情報はInvoice Dateのみであるため、日付の情報であれば、Invoice Dateと簡単に判断することが出来ますが、出荷日、発注日など、異なる日付の変数を判定しようとした場合に、モデルは高い精度で判定することができるのでしょうか?
領収書などは日付情報や金額情報が多くなることが予想されるため、データ形式が一致している情報での判別精度に関して、もっと詳しく知りたいなと感じています。
終わりに
OCRの「非定型帳票認識」技術の仕組みを見てみました。
画像としての情報から、意味付けを行うのではなく、一旦文字情報に置き換えてから、自然言語処理で意味付けを行っている点がこれまでになかった観点でした。
DeepLearningなどで帳票の場所の情報などもinputとして使い、意味付けを行っていると思っていたので。
タスクを細分化することで、DeepLearningなどでの認識技術も汎用的な技術を流用可能になるので、そんな意味合いもあるのでしょうか。
OCRも、基本的には、従来のコンピュータービジョンを活用した基礎的な仕組みが多く、そこから、ビッグデータを活用した機械学習、ディープラーニングなどを活用して、局所的なタスクの精度を高めているような印象でした。
いままでぼんやりと機械学習を使っているのかなくらいの解像度でしたが、今回の調査を経て、どのようなことが行われているのかを把握できたのはすごく良かったなと感じています。
これから、ツールとして利用することが多くなると思いますが、原理を知っておくことで、問題がでてきた際にも対処しやすくなるかなと思います!今後も継続的に学習していく予定です!また何か分かったら共有します!
それでは!