【日本語 – 手書き編】自作OCRプログラムの概略とOCRの難しさについて

【日本語 - 手書き編】自作OCRプログラムの概略とOCRの難しさについて

 

【動画で解説】日本語 – 手書き編:自作OCRプログラムの概略

 

 

【日本語 – 手書き編 #0】自作OCRプログラミングをはじめよう(概略)
Japanese handwritten character OCR : Outline


視聴時間:5分42秒

 




 

 

 

OCRの難しさについて

 

 

これまでにOCRを使ったことがある方の中には

本当にOCRしたい文書のOCR精度が低い・・・

と感じている方もいるのではないかと思います。

 

OCRの精度に影響を与える要因について調べてみると、

テキスト化精度に大きな影響を与えると考えられる要因

・文字のかすれ(文字がかすれている)
・文字のつぶれ(文字がつぶれている)

その他テキスト化精度に影響を与えると考えられる要因

・手書き(手書きで記載されている)
・傾き(紙面が傾いている)
・ノイズ(紙面にノイズがある)
・数式(文中に数式がある)
・化学式(文中に化学式がある)
・ルビ(文中にルビが振られている)
・表組(表で表示されている)
・ブロック囲み罫(紙面に囲み罫がひかれている)
・本文強調下線(文中に強調線が引かれている)
・手書書込み(紙面に手書きで追加書き込みがある)
・レイアウト(テキスト/図版混在:紙面にテキスト、図版、表組などが混在している)
・90°回転(紙面が 90°回転している)

出典:
特許庁 – 機械翻訳に関する調査報告書

令和元年度特許庁委託事業
令和元年度
最新のOCR技術による公開特許公報等のテキストデータ作成等を通じた機械翻訳サービスの充実化に向けた調査事業(PDF)
調査報告書
令和2年3月18日 凸版印刷株式会社
2021年5月22日利用

等と、様々な要因が考えられているようです。

 

今回、個人でOCR開発をする際に、

“テキスト化精度に影響を与えると考えられる要因”に対して、どこまで対処できるだろうか・・・

と(技術力不足のため)頭を悩ませていましたが、試行錯誤を繰り返す中で

・手書き
・傾き
・ノイズ
・線

の要因に対処できるOCRプログラムを作成することができました。
以下に、プログラムのフローや概略等をまとめておきます。

 

 

【日本語 – 手書き編】自作OCRプログラムのフロー・概略

 

 

【ステップ0】
日本語手書き文字用のOCRの仕組み等

 

① 前処理
:直線除去
:ノイズ除去
:傾き・角度補正(厳密には文字領域のレイアウト認識後に実施)

② 文字検出
:レイアウト認識(文字領域/行・列矩形の推定)
:個別文字矩形の推定

③ 文字認識
:行・列ごとの文字認識と結果の出力
:全文の文字認識と結果の出力(個別文字検出画像を利用)

 

【日本語 - 手書き編】自作OCRプログラムのフロー・概略

 

 

【簡単解説】① 前処理

 

 

文字検出をする前の「① 前処理」として、

・直線除去
・ノイズ除去
・傾き・角度補正

を行います。

 

具体的には、OCRしたい手書き日本語文字の画像

 

横書き(画像)
横書き - OCRしたい手書き日本語文字の画像

 

縦書き(画像)
縦書き - OCRしたい手書き日本語文字の画像

 

から、直線を検出・除去します。

 

直線検出部位(画像)
OCRの前処理:【直線検出部位の視覚化】赤色部分が検出できた直線

 

直線検出部位の削除結果 – 2値画像(画像)
OCRの前処理 - 2値画像【直線検出部位の削除結果:元の画像から削除】

 

ノイズ除去した画像(文字領域のレイアウト認識も実施済みの画像)

 

ノイズ除去した画像(画像)
OCRの前処理:ノイズ除去した画像(文字領域のレイアウト認識も実施済みの画像)

 

を使い、文章の傾き(回転角度)を補正します。

 

傾き・角度補正(画像)
OCRの前処理:文章の傾き(回転角度)補正

 

 

【簡単解説】② 文字検出

 

 

まずは、レイアウト認識として、文字領域/行・列矩形の推定を行います。
文字検出は、日進月歩の分野ではないかと思いますが、今回は、単純に

・膨張処理

を工夫することで文字領域/行・列矩形の推定〜個別文字矩形の推定を行えるようにしています。
文字を全方向(縦・横)に大きく膨張させると文字領域を推定できます。

 

文字領域矩形の推定のための膨張処理(画像)
文字検出:膨張処理の工夫で文字領域矩形の推定

 

文字領域矩形の推定(画像)
文字検出:ノイズ除去した画像(文字領域のレイアウト認識も実施済みの画像)

 

横方向に膨張させると行を推定できます。

 

行矩形の推定のための膨張処理(画像)
文字検出:膨張処理の工夫で行矩形の推定

 

行矩形の推定(画像)
文字検出:行矩形の推定

 

縦方向に膨張させると列を推定できます。

 

列矩形の推定のための膨張処理(画像)
文字検出:列矩形の推定のための膨張処理

 

列矩形の推定(画像)
文字検出:列矩形の推定

 

個別の文字も膨張処理を工夫することで検出できます。

 

個別文字矩形の推定のための膨張処理(画像)
OCRの前処理:膨張処理の工夫で個別文字矩形の推定

 

個別文字矩形の推定(画像)
OCRの前処理:個別文字矩形の推定

 

その他の個別文字検出例(画像)
OCRの前処理:膨張処理の工夫と個別文字矩形の推定

 

膨張処理を工夫することで文字検出をする方法の難点としては

・1文字の中の線の間隔
・文字と文字の間の間隔

をうまく調整しないと、個別の文字検出に失敗しやすいようでした。
文字の検出精度を上げたい場合は、文字検出の方法を検討する必要がありそうです。
(まだまだ勉強不足です・・・)

 

 

【簡単解説】③ 文字認識

 

 

日本語の画像認識をするための学習済みモデルは、オリジナルデータセットを利用し、Kerasで実装したディープラーニングのCNN(Convolutional Neural Network:畳み込みニューラルネットワーク)を使い作成したものを使います。

 

学習済みモデル(画像)
日本語自作OCR開発:学習済みモデル

 

学習済みモデルの精度グラフ 例(画像)
日本語自作OCR開発:学習済みモデルの作成 精度グラフ

 

学習済みモデルの精度 例(画像)
日本語自作OCR開発:学習済みモデルの作成

 

文字認識の結果は、行・列ごとや、

 

行・列ごとのOCR出力結果(画像)
日本語自作OCR開発:行・列ごとのOCR出力結果

 

全文の文字認識結果(個別の文字検出画像を利用)

 

OCR結果 – 全文(画像)
日本語自作OCR開発:全文出力 横書き

 

を出力できます。

 

 

【日本語 – 手書き編】自作OCRプログラムのチュートリアルの各ステップ

 

 

Pythonではじめる日本語OCR開発 – 手書き文字認識編

視聴時間:1時間12分38秒

自作OCRプログラムの各ステップのチュートリアルを1つの動画にまとめておきました。日々の学習にお役立てください。

【動画の内容】

0:00 はじめに
1:01 ステップ0:概略
6:36 ステップ1:学習済みモデル作成
16:40 ステップ2:1文字判定
24:44 ステップ3-1:文字検出
34:38 ステップ3-2:直線の検出と除去
43:31 ステップ3-3:ノイズ除去
53:03 ステップ3-4:角度補正
59:55 ステッ プ4:OCRに挑戦と再学習
1:11:46 おわりに

 

今回のプログラミングチュートリアルでは、各ステップに分けて、日本語の手書き文字対応の学習機能付きのOCRを作成していきます。

 

【ステップ1】

【日本語 - 手書き編】OCR用のオリジナル学習済みモデルの作成方法(ひらがな・カタカナ・漢字・ローマ字・、点・。丸)

日本語手書き文字画像認識用オリジナル学習済みモデルの作成(ひらがな・カタカナ・漢字・、点・。丸)
【日本語 – 手書き編】OCR用のオリジナル学習済みモデルの作成方法
:チュートリアル用の日本語手書き文字のオリジナルデータセットを使いKerasで実装したディープラーニングのCNN(Convolutional Neural Network:畳み込みニューラルネットワーク)で、階層的データ形式(Hierarchical Data Format:HDF5)の学習済みモデルを作成します。

【ステップ2】

【日本語 - 手書き編】1文字判定(ひらがな・カタカナ・漢字・ローマ字・、点・。丸)機械学習

1文字判定(日本語手書き:ひらがな・カタカナ・漢字・ローマ字・点、・丸。)
【日本語 – 手書き編】1文字判定
:ステップ1で作成した学習済みモデルを使って、日本語や記号(。、)、ローマ字の画像認識をします。

【ステップ3】
ステップ3では「1〜4」に分けて、横書き・縦書きの日本語の文字検出を行います。

【ステップ3-1:水平・垂直の文章の日本語検出】

【日本語 - 手書き編】シンプルな横書き・縦書き文章の日本語手書き文字検出(ブロック→行と列→個別文字)

シンプルな横書き・縦書き文章の日本語手書き文字検出(ブロック→行と列→個別文字)
:真っ白な背景に、手書き文字が書かれた画像を使って、文字検出を行います。

【ステップ3-2:線が入った画像の日本語検出】

【日本語 - 手書き編】直線除去の機能を実装:横書き・縦書き文章の日本語手書き文字検出(ブロック→行と列→個別文字)

直線除去の機能を実装:横書き・縦書き文章の日本語手書き文字検出(ブロック→行と列→個別文字)
:ステップ3-1の画像に直線が追加された画像を使って、文字検出を行います。

【ステップ3-3:点々などのノイズの入った画像の日本語検出】

【日本語 - 手書き編】ノイズ除去の機能を実装:横書き・縦書き文章の日本語手書き文字検出(ブロック→行と列→個別文字)

ノイズ除去の機能を実装:横書き・縦書き文章の日本語手書き文字検出(ブロック→行と列→個別文字)
:ステップ3-2の画像に点々等の細かいノイズが追加された画像を使って、文字検出を行います。

【ステップ3-4:傾いた画像の日本語検出】

【日本語 - 手書き編】傾き・角度補正の機能を実装:横書き・縦書き文章の日本語手書き文字検出(ブロック→行と列→個別文字)

傾き・角度補正の機能を実装:横書き・縦書き文章の日本語手書き文字検出(ブロック→行と列→個別文字)
:ステップ3-3の画像を傾けた(回転させた)画像を使って、文字検出を行います。

【ステップ4】日本語手書きOCR:横書き・縦書き文字認識 +再学習

【日本語手書き編 - 自動文字検出・抽出OCR】連続文字判定:横書き・縦書き(ひらがな・カタカナ・漢字・ローマ字・、点・。丸)+再学習

【日本語手書き編 – 自動文字検出・抽出OCR】連続文字判定:横書き・縦書き(ひらがな・カタカナ・漢字・ローマ字・、点・。丸)+再学習
:ステップ1で作成した学習済みモデルを使って、OCRに挑戦。

 

OCRプログラムの処理の概要が把握できたら、次は

【ステップ1】

【日本語 - 手書き編】OCR用のオリジナル学習済みモデルの作成方法(ひらがな・カタカナ・漢字・ローマ字・、点・。丸)

日本語手書き文字画像認識用オリジナル学習済みモデルの作成(ひらがな・カタカナ・漢字・、点・。丸)
【日本語 – 手書き編】OCR用のオリジナル学習済みモデルの作成方法(ひらがな・カタカナ・漢字・ローマ字・、点・。丸)

で、日本語手書き文字画像認識用の学習済みモデルを作成してみましょう。

 

by 子供プログラマー | プログラミング入門ウェブ教室

 

【日本語手書きOCR編】連続文字画像認識プログラミング入門(Python・OpenCV・Keras・CNN)| 一覧ページ