[機械学習]AIOCRの仕組みと実装

2021年6月17日木曜日

Artificial Intelligence

DX(デジタルフォーメーション)と共に、業務効率化と言えばAIOCRというほど、近年目に触れる機会が増えたAIOCR。本記事では、AIOCRを実現する技術要素を解説しながら、AIOCRの仕組みを紹介します。また実際に動かすことのできるソースコードを紹介します
アイキャッチ

AIOCRとOCRの違い

従来のOCRとは

従来のOCR技術は主にパターンマッチングによって実現されていました。

パターンマッチングにも様々な手法が存在しますが、大まかにはOCRモジュールがそれぞれの文字のパターンを保有しており、判別対象文字と保有するパターンを照らし合わせることによって文字を判別していました。

従来のOCR技術でも、文字の形状が比較的類似している活字の判別は高精度で判断できていました。
一方で、書き方が千差万別な手書き文字の判別の精度は高精度とは言えるものではありませんでした。 書き方が人によってバラバラな手書き文字のパターンを全て把握することは現実的に困難であったためです。

従来OCRの仕組み

AIOCRとは

一方でAIOCRは、機械学習(特にディープラーニング)によって実現されています。
AIOCRは、パターンではなく学習によって得られた文字毎の特徴を用いて文字を予測しています。 従来のAIOCRより、抽象的で高次元な判断を行います。

そして、大量の手書き文字を学習することによって、手書き文字のバラツキを加味しながらそれぞれの文字の特徴を理解するAIOCRは、 従来のOCRより高精度に判別することが可能になりました。

AIOCRの仕組み

ただし、AIは万能ではありません。文字を判別するためには事前に学習している必要があります。このため事前に学習していない文字は判別できません。

また活字文字だけを学習したAIOCRでは、手書き文字を高精度に判別することはできません。手書き文字を高精度に判別するためには手書き文字を大量に学習している必要があります。

このような背景から、AIOCRを提供しているベンダーごとに活字や記号を得意とするベンダーや、手書き文字の精度を特徴としているベンダーなど各社に特徴があります。AIOCRベンダーを選定する際には、料金と共に、得意とする文字もご確認ください。

AIOCRの技術要素

AIOCRは、主に「文字検出」「文字認識」の2つの技術要素によって実現されています。

文字検出

文字検出では、画像中の文字の場所を検出します。

文字検出には、2パターンの検出方法が存在します。
それは、単語ごとに検出する方法と、文字ごとに検出する方法です。

英語のように単語ごとに明確な空白が生じる言語は単語ごとに検出し、
日本語のように単語ごとに明確な空白がない場合は文字毎に検出する傾向にあります。
1文字ごとの検出例
1文字ごとに検出する文字検出


単語ごとの検出例
テキストごとに検出する文字検出

この日本語と英語の検出方法の違いは
言語構成の違いと、文字種の多さに起因しています。

文字検出を学習させる際の学習データは、選択するモデルによって細かなデータ形式は異なりますが、ほとんどが画像データと、文字の場所を示す座標を学習データとして与えます。

例えば先ほどの「This is a pen」の画像を学習させる場合は下記のような座標をモデルに学習させます
[
	[x1, y1, width1, height1], # this
	[x2, y2, width2, height2], # is
	[x3, y3, width3, height3], # a
	[x4, y4, width4, height4], # pen
]

この座標をデータとして作成する場合、英語の場合は単語ごとに明確に区切りが存在するため、容易に不特定多数の人が"単語ごとに区切る"というルールに基づいて学習データを作成できます。

一方で、日本語の場合、このような視覚的に見てわかる"単語ごとに区切る"といったルールが存在しません。このため、学習データの品質を一定に保つことを考えると、一文字ごとに区切らざるを得ないと言えます。

また、行ごとに検出するように学習させることも可能ですが、
この場合、後継の文字認識で行ごとに検出された画像の文字を認識する必要があります。
一般的に、一度に複数文字を認識しようとすればするほどその文字認識率は下がっていきます

英語であれば、文字種もアルファベットと数字、記号を含めても100文字以下であるため
単語ごとに認識する場合であってもその組み合わせの数は十分現実的な学習データ量で補うことが可能です。

一方で日本語は、常用漢字だけでも2000文字を超えます。
これらを組み合わせて作られる単語や、まして1行の文の組み合わせはほぼ無限に近い値となります。これを学習させていくこと効率的ではありません。

つまり、文字認識率の確保を考えると日本語は1文字ずつ検出した方が良いことが分かります。

文字認識

検出した文字領域から画像を抽出し、画像に含まれる文字を判別することを文字認識と言います。

単語ごとに文字検出している場合は、一単語が切り取られた画像に対して文字認識を実行します。
一方で、一文字ごとに検出している場合は、一文字のみが切り取られた画像に対して
文字認識を実行します。

文字認識とは、認識対象の文字を見て、AIが持ち合わせる文字の候補のどれかに分類しているだけなのです。
AIOCRの技術要素

AIOCRの構成

AIOCRを実現する構成には大別して2パターン存在します。

2 stage model

読んで字のごとく二つのモデルでAIOCRを実現する手法です
文字検出と文字認識をそれぞれ別のモデルを使って実現します

End to End model

一つのモデルでAIOCRを実現する手法です
文字検出と文字認識を一つのモデルを使って実現します
論文によってはText Spottingと表現される場合もあります。

最新動向

arXivに掲載されたOCR関連の論文を調査したところ、近年はEnd to End modelが増加傾向にあります

一般的にEnd to End modelは、「文字検出」と「文字認識」の2つのタスクを同時に学習、予測するため、CPU、GPUやメモリなど多くのハードウェアリソースを必要とします。


しかし、GPUの性能向上やハードウェアリソースの向上に伴い
膨大な特徴量を持つ学習が現実的な時間で実行可能になったためと考えられます。

また、これは2 stage modelの技術が成熟しつつあることも理由として考えられます。

2 stage model と End to End modelの比較

学習時間

2stage modelは文字検出と文字認識をそれぞれ別に学習します
このためEnd to Endと比較し学習する特徴量が少ない傾向にあります
結果として学習時間はEnd to End modelより短くなる傾向にあります

学習時メモリ使用量

学習時のバッチサイズに左右されますが、
End to End modelの方がメモリ使用量が多い傾向が強いです

特に、GEFORCE GTX 1080のようなGPUメモリが10GB以下のGPUではOut Of Memoryが発生する場合もあります

お手持ちの開発環境にもよりますがEnd to End modelの学習が厳しい場合もあります

論文およびソースコード

ここではソースコードが公開された論文を紹介します

下記に記載のソースコードは全てPythonでコーディングされています。
Pythonに不安がある方はこちらの書籍などがおすすめです。


2stage model - 文字検出

2017年7月

2019年4月


2019年12月

それぞれの手法の選択は下記ベンチマークが参考になります

文字検出精度のベンチマーク
出典: https://github.com/PaddlePaddle/PaddleOCR/blob/release/2.1/doc/doc_en/algorithm_overview_en.md

2stage model - 文字検出


2019年10月

それぞれの手法の選択は下記ベンチマークが参考になります


文字認識精度のベンチマーク
出典: https://github.com/clovaai/deep-text-recognition-benchmark

End to End model

2018年1月

2020年7月

2020年10月

End to Endは最新手法ほど学習済みモデルのサイズが大きくなっています。

AE TextSpotterは中国で開発されていることもあり、縦書き、横書きの判別のため自然言語処理も組み込まれています。

日本語への転用も可能ですが、学習時間、消費メモリ共に莫大であるため機械学習専用のハードウェアがないと学習は厳しくなります。

まとめ

AIOCRを構成する技術要素である「文字検出」と「文字認識」について解説し、
論文やソースコードを紹介させて頂きました。

AIOCRを動かしてみたい方がいらっしゃいましたら2 stage modelから試してみることをお勧めします。比較的ソースコードが簡潔であり、必要なハードウェアリソースも少ないため学習目的には最適です。

また本記事では、AIOCRにフォーカスしてご紹介しました。
もう少し学術的に体系立てて学びたいという方には以下の書籍などがお勧めです。ぜひご一読下さい。

また動かせるだけから理解して応用できるエンジニアの足掛かりに下記のUdemyなどもお勧めです。

AIで副業ならココから!

まずは無料会員登録

プロフィール

メーカーで研究開発を行う現役エンジニア
組み込み機器開発や機会学習モデル開発に従事しています

本ブログでは最新AI技術を中心にソースコード付きでご紹介します


Twitter

カテゴリ

このブログを検索

ブログ アーカイブ

TeDokology