【Python – 自作OCR開発中】日本語手書き文字(横書き・縦書き対応):プログラミング学習用

【Python - 自作OCR開発中】日本語手書き文字(横書き・縦書き対応):プログラミング学習用

 

動画:【自作OCR開発中…】日本語手書き文字(横書き・縦書き対応)
Python機械学習プログラミング・Keras・CNN・OpenCV

 

 


視聴時間:1分50秒

 




 

【開発中のOCRプログラミング学習用の自作OCRの機能】

・直線検出と除去(Straight line detection & cut)
・ノイズ除去(Denoising・Noise reduction)
・角度補正(Rotation correction)
・ブロック検出(文章のかたまりの検出 – 膨張処理による検出)
・行と列の検出(膨張処理による検出)
・個別文字検出(膨張処理による検出)
・文字認識(CNNによる画像認識 – オリジナルデータセットで学習)

上記の機能を組み合わせることで、OCRとして機能するようにしています。
動画を視聴いただくとわかるのではないかと思いますが、ようやく、自分で書いた手書きの日本語の文字(文章)をOCRすることができました。

プログラムは、

・Python
・Keras(CNN:畳み込みニューラルネットワーク・ディープラーニング)
・OpenCV(文字検出など)

で開発しています。
また、以下のプログラム

 

【自作OCR開発 – デジタル数字編】

【Python機械学習入門】高精度の自作OCRを作ろう(7セグメントデジタル連続数字画像認識AI:1桁〜4桁 – 静止画トリミング編)- 7 Segment Digits Training(YouTube動画 by RehabC – デジタルで遊ぶ。)

【Python機械学習入門】文字検出機能付き:高精度の自作OCRを作ろう(7セグメントデジタル連続数字画像認識AI:1桁〜4桁以上 – 物体検出・抽出編)7 Segment Digits OCR(YouTube動画 by RehabC – デジタルで遊ぶ。)

 

を応用して作成しています。
今後作成予定のチュートリアルでは、

・オリジナルデータセットで学習済みモデル作成〜OCR開発(Google Colaboratoryを利用)

までを簡単に解説予定(使い方の解説予定)です。
記事(OCRプログラムのコード公開)・チュートリアル動画作成などは今後、少しずつ実施予定です。
お楽しみに♪

【進捗状況】

以下の記事に投稿中です。

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

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

 

2021年10月4日に完成しました。

 

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

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

【動画の内容】
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 おわりに

 

 

各ステップの記事。

【ステップ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)

 

 

日本語手書き対応のOCR開発の経緯

 

 

まさか自分で、日本語の手書き文字対応のOCRを作り始めることになるとは、プログラミングを学び始めた当初は考えもしませんでした。
今回、なぜ、日本語対応OCRを開発しようと考えたかについて、まとめておきます。

これまでに、いくつかの画像認識系のPythonプログラミングのチュートリアルを公開してきたこともあり、コメントを頂くことがあります。
その中で、

OCRについて取り上げて欲しい

というコメントを頂いたことがありました。
コメントを頂いた当初は、

OCRって何?

というレベルでしたが、調べてみると

・Optical Character Recognition/Reader(オーシーアール – 光学的文字認識)

ということで、文章などを文字認識することのようでした。

 

でも、OCRって、自分でプログラミングできるの?

と思いましたが、調べてみると、オープンソースで

・Tesseract OCR(テッセラクトOCR)
・SSOCR(Seven Segment Optical Character Recognition:7セグメントディスプレイ数字用OCR)

などが公開されているようでした。現在(2021年時点)は、上記の文字認識エンジンなどを使うことで、先人の叡智を、ちょっとしたプログラムを書くだけで活用できる時代のようです。
その後、自分自身の学習も兼ねてTesseract OCR系のプログラミング入門チュートリアルをいくつか作成することにしました。

 

【Tesseract OCR系のプログラミング入門チュートリアル】

【簡単】PythonでOCRプログラミング入門 – 機械学習・AIの恩恵(YouTube動画 by RehabC – デジタルで遊ぶ。)

【Windows編】OCRアプリプログラミング入門 – 機械学習・AIの恩恵(YouTube動画 by RehabC – デジタルで遊ぶ。)

【Mac編】OCRアプリプログラミング入門 – 機械学習・AIの恩恵(YouTube動画 by RehabC – デジタルで遊ぶ。)

 

OCRには、少し興味が湧いてきましたが、個人開発で無料でできる範囲では、7セグメントのデジタル数字認識を始め、まだまだ課題も多そうでした。

 

頂いたコメントの中に、

デジタル数字のOCRが上手くできない・・・

というものがあったので、しばらく、無料で使える

・Tesseract OCR(テッセラクトOCR)
・SSOCR(Seven Segment Optical Character Recognition:7セグメントディスプレイ数字用OCR)

などの文字認識エンジンで試行錯誤をしていましたが、最終的には、それぞれの用途にあったデジタル数字認識用のOCRを作るには

自分で作った方が早い?

と思い始めました。
そこで作成してみたのが、上述のデジタル数字用のOCR開発のチュートリアルです。

 

【デジタル数字認識のOCRプログラミング入門チュートリアル】

 

【Python機械学習入門】高精度の自作OCRを作ろう(7セグメントデジタル連続数字画像認識AI:1桁〜4桁 - 静止画トリミング編)- 7 Segment Digits Training by RehabC - デジタルで、遊ぶ。(YouTube動画)

【Python機械学習入門】高精度の自作OCRを作ろう(7セグメントデジタル連続数字画像認識AI:1桁〜4桁 – 静止画トリミング編)- 7 Segment Digits Training(YouTube動画 by RehabC – デジタルで遊ぶ。)

 

【Python機械学習入門】文字検出機能付き:高精度の自作OCRを作ろう(7セグメントデジタル連続数字画像認識AI:1桁〜4桁以上 - 物体検出・抽出編)7 Segment Digits OCR

【Python機械学習入門】文字検出機能付き:高精度の自作OCRを作ろう(7セグメントデジタル連続数字画像認識AI:1桁〜4桁以上 – 物体検出・抽出編)7 Segment Digits OCR(YouTube動画 by RehabC – デジタルで遊ぶ。)

 

デジタル数字用のOCR開発のチュートリアルを作成する中で、

もしかして、このプログラムを応用すれば、日本語対応の自作OCRを作れる?

と思い始めました。
現在、有料で公開されている日本語対応のOCRソフトは、

・文字検出方法の工夫
・後処理(OCR結果から、おかしな文脈を処理)

などがされているのではないかと思いますが、今回は、

・膨張処理を工夫

することで、(力ずくで・・・)

・ブロック検出(文章のかたまりの検出 – 膨張処理による検出)
・行と列の検出(膨張処理による検出)
・個別文字検出(膨張処理による検出)

などの文字検出を試みました。

 

この方法では、

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

をうまく調整しないと、個別の文字検出に失敗しやすいようでしたが、2ヶ月程、悪戦苦闘する中で、ようやく、自分で書いた日本語の文章のOCRに成功しました。

 

横書き:日本語の手書き文字(文章)のOCRに成功
横書き:日本語の手書き文字(文章)のOCRに成功 - Python 自作OCR開発

 

縦書き:日本語の手書き文字(文章)のOCRに成功
縦書き:日本語の手書き文字(文章)のOCRに成功 - Python 自作OCR開発

 

今回は、開発するにあたって、実現したい機能を実装する方法を調べては試し、失敗し・・・
の繰り返しではありましたが、とりあえずの形になりそうな目処が立ってきました。

コードの公開や、チュートリアル記事や動画の公開までには、まだまだ、やることはたくさんありそうですが、今後、少しずつ作成していきたいと思います。

 

 

日本語対応の自作OCR開発で気になる情報について

 

 

文字認識エンジンを活用せずに、自分でOCR開発を試みた方は、ご存知かと思いますが、日本語対応のOCR開発をするための日本語の技術的な情報は、あまりありません。
(オープンソースで公開されている文字認識エンジンのコードを眺められますが・・・)

数少ないOCR開発の情報の中で、運営者が気になる情報を見つけましたので、まとめておきます。

 

【日本語OCR開発関連の記事・コード】

日本語OCRを作ったので解説してみる(@tanreinama – 2020年4月11日に作成)| Qiita

日本語OCRの公開コード
tanreinama/OCR_Japanease(MIT License)| GitHub

モデルのファインチューニングについて解説している書籍

PyTorchではじめるAI開発
著者:坂本 俊之(著)
出版社:シーアンドアール研究所
刊行予定日:2021年6月22日

PyTorchではじめるAI開発

Amazon.co.jpで詳しくみてみる:
PyTorchではじめるAI開発

楽天ブックスで詳しくみてみる:
PyTorchではじめるAI開発

 

文字検出の際に、行き詰まっている時に、日本語OCRの公開コードを参考にしようかとも思いましたが、その時点の自分の能力では、理解が及ばず・・・
結局は参考にできませんでしたが…

オープンソースの日本語OCRの公開コードを見つけてから、今か今かと待っていましたが、2021年6月に、いよいよ関連書籍が刊行されるようです。
著者の坂本 俊之さんの書籍では、Swiftプログラミングの書籍を購入して学ばせて頂いた経験があります。
PyTorchは、まだ苦手意識があるので刊行が楽しみです。

Qiitaの記事執筆から、約1年。
やはり、書籍化までには時間がかかるのですね…

 

 

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

 

【ステップ0】

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

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

 

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