LINEのOCR技術の仕組み

Hwalsuk Lee氏:みなさま、こんにちは。Hwalsuk Leeと申します。NAVER Clova OCR Teamから参りました。今回の話の中では、日本語向けの深層学習を用いたOCR技術の開発についてお話ししたいと思います。

NAVER Clova OCRは「LINE BRAIN OCR」として日本でもサービスが展開されています。では、OCRとは何なのでしょうか? OCRはOptical Character Recognitionの略称です。

OCRは2つのステップからなっています。まず最初のステップはテキスト検出です。これによってテキストの領域を特定します。2つ目がテキストの認識です。これは、各テキスト領域の文字列を識別することです。

我々のチームは、テキスト検出の論文をCVPR 2019で発表しました。ICCV 2019ではテキスト認識の論文も発表しました。

我々のチームがOCRの研究を始めたときにたくさんの質問が寄せられました。「OCRはもう確立された技術じゃないんですか?」。みなさん、どう思いますか? いや、私はそうじゃないと言いたいと思います。

1つの例ですが、この画像の中で縦に書かれた日本語のテキストがありますね。それから回転したテキストや非常に小さいテキストもありますが、最も良い検出結果はどういうものなのでしょうか?

Tesseractというオープンソースのテストはこちらです。シンプルな水平のテキストを読み込みます。しかし、これはうまくいきませんでした。この画像にはシンプルな水平のテキストがないからですね。

同じ画像を入力したときの我々の結果はこちらになります。

最近、深層学習によって非常に小さいテキストまで検出できるようになりました。向きが変わったもの、垂直のテキスト、それから多言語のテキストも、偽陽性なく検出することができます。

さて、こちらが今日のアジェンダです。

まず、最近のOCRのアプローチを日本語に当てはめた場合にどうなるか。そして2つ目に、我々のテキスト検出器のご紹介。それから3つ目に、我々のテキスト認識器について。そして4つ目ですが、我々のLINE BRAIN OCR向けフルパイプラインのご説明をします。

日本語特有の問題点

OCRはかなり改良を重ねてきましたが、それを直接日本語に当てはめようとすると、まだ多くの問題があります。

ディープラーニングが2012年頃に使われるようになってから、OCRの分野で深層学習を使っていろいろなリサーチが行われてまいりました。

左側のグラフはテキスト検出の精度を表しております。深層学習ベースの検出器が継続的に改良しているのがわかります。右側のグラフはテキスト認識の結果です。やはり同じような傾向が見られます。

ところが、ほとんどの論文が対象にしているのは、日本語ではなくて英語です。OCRは言語に関連した技術ですので、日本語と英語の違いに十分注意を払う必要があります。

最初の違いというのは、日本語の場合には単語の間にスペースがないことです。

そして2つ目の違いは、多くの場合、縦書きのものが用いられていることです。

※新聞のイメージは2010年6月15日の毎日新聞号外より引用

この例であっても、新聞の場合でも、垂直に書いたもの、水平に書いたものが混在するような印刷になっております。

3番目の違いですが、文字の種類の多さが違います。

英語の場合には26文字しか用いません。しかしながら、日本語の場合には3,000以上の文字が用いられているわけです。

これだけの違いがありますので、これを頭に入れながら次の説明を聞いていただきたいと思います。

日本語のテキスト検出

これから日本語の場合のテキスト検出についてお話ししたいと思います。先ほども言いましたが、既存の論文は、1つの単語あるいは1つの行単位での検出に特化しています。つまり、既存の検出器はボックス内にスペースを許容しないわけです。

この長い日本語の文章を取り扱うためには、それぞれの文字をまとめる作業が必要になります。それが我々のアプローチです。

テキストを検出するのに何が困難かですが、一般的な物体検出に比べて極端なアスペクト比があることです。

テキストが紙や布の上に書かれていた場合、形が歪んでしまうという問題もあります。それから3つ目は、いろいろな文字サイズが存在することです。

こういった要素は、行や単語のレベルでの検出に問題をもたらします。

それでは、文字レベルでの検出はどうでしょうか? 極端なアスペクト比という難しさは、テキスト領域が1つの文字を含んでいるので、問題になりません。

それから、文字レベルの検出の場合には、形が歪むことも単語や行単位の検出に比べて少なくなります。それから、文字のサイズが違うというのも問題ではありません。つまり、文字はそれぞれ独立して処理されるので、問題にならなくなります。

それではアノテーションには何が必要なのでしょうか? こちらの例は文字レベルで我々がアノテーションを行ったものです。

これだけのことをやるとすごくコストも時間もかかるということはおわかりいただけるかと思います。ですので我々のチームでは、弱教師あり学習(Weakly Supervised Learning) を検討しました。

ピクセルレベルのアノテーションは、Strong Supervisionであり、難しいセグメンテーションのタスクになります。一方、オブジェクトに対してのアノテーションは、Weak Supervisionです。これはボックス、点、もしくはテキスト単位で行います。

ということで、文字レベルのアノテーションなしで、テキストを文字レベルで検出したいわけです。

CRAFTとは何か?

さて、ここでCRAFTのモデルについてお話ししたいと思います。CRAFTというのはCharacter Region Awareness for Text Detectionの略です。

CRAFTには2つの出力があります。一番最初はRegion Scoreです。これはピクセルが文字の真ん中に来る確率です。2つ目の出力は、Affinity Scoreですね。これはピクセルが隣接する文字ボックス間のスペースの中心である確率です。

例を出します。

この画像が入力されたとします。そうするとRegion Scoreはこのようなヒートマップになります。これを使って、個別の文字領域を探します。Affinity Scoreというのは、このようなヒートマップになります。これを使って、行、もしくは単語レベルで探します。

CRAFTモデルの学習にはGround Truthが必要です。

Region ScoreとAffinity Scoreの両方のGround Truthを提示しなければいけません。文字レベルのアノテーションが提供されたとき、2次元の正規分布を作成します。それぞれの文字ボックスの長方形からRegion ScoreのGround Truthを生成します。

Affinity ScoreのGround Truthを作成するためには、このAffinity Boxを2つの隣接する文字ボックスから作られなければいけません。この対角線を文字ボックスに引くと、三角が上下にできますね。Affinity Boxというのが、隣接するボックスの上下三角の中心点を結んだ線からできます。

このように、このAffinity Boxが簡単に定義できます。それから、Affinity ScoreのGround Truthを作るときには、Affinity Boxと、それに対応するガウス分布から作られます。これはRegion ScoreのGround Truthの作り方と同じです。

先ほど言ったように、文字の境界になるボックスをアノテーションしたくない。単語もしくは行レベルのアノテーションを使いたい。それを弱教師あり学習(Weakly Supervised Learning)で提供したいということですね。

モデルの学習でやっていること

弱教師あり学習(Weakly Supervised Learning)には2つのステップがあります。

1つ目のステップは、モデルを合成画像で学習させるということ。文字レベルのアノテーションを合成画像に与えることができるので、モデルは直接その合成データで学習することができます。

2つ目のステップでは、モデルの学習を実際の画像で行います。

文字レベルのアノテーションを実画像で得るために、テキスト領域を切り取るわけです。単語もしくは行レベルのアノテーションで切り取ります。この切り取った画像をモデルに入力しますと、モデルがRegion Scoreを概算します。

そして、分割処理を行って、この各文字のBounding Boxを取得します。

そうすることで実画像の擬似的なGround Truthが得られます。そして、この擬似的なGround Truthでモデルを文字レベルのアノテーションで学習するわけです。

これが擬似的なGround Truthを作る概略になります。単語レベルのアノテーションが提供されているので、テキスト領域を切り取って、それをネットワークに入力してRegion Score Mapを獲得します。そして、Watershed LabelingとMinimum Bounding Boxのオペレーションをすることで文字ボックスのアノテーションが得られるというわけです。

これは、学習が進むにつれて、文字のRegion Scoreが変わるということを示しています。

学習が進むと予測がより正確になり、文字ボックスの概算もより正確になります。

では、post-processingについてお話ししましょう。

post-processingは非常に単純です。与えられた画像に対して、Region Score MapとAffinity Score Mapをバイナリ化します。そうすることで、Character regionと、Affinity regionを得ることができます。

今度は2つのバイナリマップを結合して、ラベリング処理をOpenCVの関数で行います。

最終的にMinimum Bounding Boxオペレーションを行って、単語レベルのテキスト領域が得られます。

Post-processingは非常にシンプルですが、効率がいいということがおわかりだと思います。我々は3つのOpenCVの関数しか使っておりません。

文字レベルの検出手法を用いて、様々なテキストが検出可能に

では、定性的な評価例をご紹介しましょう。

  CRAFTが概算するRegion ScoreとAffinity Scoreがあり、そしてPost-processingを行います。

多言語の場合でも、CRAFTの概算するのはRegion ScoreとAffinity Scoreで、そしてまたPost-processingも行います。

CRAFTはこの曲がったテキストエリアの位置がわかりますので、このカーブしたテキスト領域を直線のテキスト領域に修正することも可能です。

こちらは我々の手法をご紹介するビデオです。

(映像が流れる)

CRAFTは、より良い認識結果を得るために修正することができます。フレームごとの検出になっていて、左がRegion Score、右がAffinity Scoreです。

まとめです。文字レベルの検出手法を使うことによって、水平もしくは垂直の長い文字列も検出できます。長いカーブしたテキストでも検出をすることが可能です。