今回はOCR(光学文字認識)プログラムの自作方法についてまとめました。ここでご紹介するのは、ニューラルネットを使った機械学習を使って手書きのアルファベット画像を文字として認識させるプログラムになります。この記事はpythonを使った機械学習を始めてみたい方におすすめです!ご自身の開発環境へコードをコピペして試してみてください。使用する言語:python3使用するライブラリ:neurolab,numpy,PIL※これらのライブラリは事前にインストールしておいてくださいneurolabがニューラルネットワークを使用するためのライブラリになります。今回の開発に欠かせないライブラリです。機械学習のプログラムを実行する上で適切な学習素材が必要となります。本来は自分で素材を準備して使用するのが良いですが、今回はネット上に公開されている機械学習向けの素材を使用させていただきます。Laboratoryという組織が公開している、小文字アルファベットの手書きデータ集を学習素材として使用します。素材は”.data”形式のファイルとなっていて、「letter.data」というファイルに全データが入っています。これをダウンロードして、作成するpythonプログラムと同じフォルダへ保存しておいてください。このファイルの中身を画像化してみると下図の様になっています。確かに手書き文字の素材になっていて、OCR向けの学習素材としては最適だと思われます。ちなみに上で画像化して示したアルファベットは「letter.data」のごくごく一部です。全部でアルファベットは52,152個もあり、とてつもないデータ量です。(これを集めてデータ化するのは大変だったことでしょう。)ニューラルネットの構成プログラムを書く前に、まずどのようなニューラルネット構成を組むかを決める必要があります。三層からなる構成でプログラムを組んでOCRを作成することとします。※ちなみに、中間層(隠れ層と言う場合もある)が複数あるニューラルネット構成の機械学習を「ディープラーニング」と言います。最近よく耳にしますよね。ニューラルネット構成OCRプログラム開発環境と学習素材のダウンロードが出来たら、OCRプログラムの作成を進めましょう。このプログラムでやろうとしていることは、「解答付きの学習素材をインプットとしてニューラルネットワークに入れて訓練させ、ネットワークを形成するパラメータを最適化する」ということになります。難易度の高そうな内容に思えますが、neurolabライブラリを使えばニューラルネットの形成を簡単に行うことができるので、コードは意外にも簡潔に書くことができます。コードの構成としては、1ライブラリのインポート2変数定義3学習素材の読み込み4データ形式の変換5ニューラルネットを生成6学習の実施という流れになります(大部分はデータの読み込みとその加工です)。これを実行するコードが下になります。後でテストを実施して文字認識率を確かめるのに使うデータを残しておくためです。3:letter.dataの中身は、2列目が正解ラベルデータ、7列目以降が手書きデータとなっているので、ここで必要な部分のみを抜き出してやります。4:読み込んだデータは3の時点でリストですが、これを数値的に取り扱いやすい様にnumpyの行列ライブラリで配列に変換してやります。5:「ニューラルネットの構成」のところで示した図に対応するニューラルネットワークをここで組んでいます。neurolabライブラリを使えば、上コードの通りたったの一行で記述できてしまいます。訓練の方法としては、勾配法による最適化アルゴリズムの一つである「Rprop」を指定しています。6:epochは訓練の上限回数、showは結果の表示ステップ、goalは訓練終了のエラー閾値を示しています。OCRの性能はこのgoalの値によって決まってくるため、この設定値が重要です。一概にどの程度の数値を設定すれば良いなどと言うことはできず、ニューラルネットの構成や取り扱う数値範囲(今回は0~1)、そしてプログラムの用途によって最適な設定値は変わってくるので、ここは試行錯誤しながら設定する必要があります。reached」と表示されてプログラムは終了します。※上コードで設定した条件で実行すると計算に丸一日くらいかかるので、最初はepochsの値を10とか100とか小さい値で試してみることをおすすめします。訓練を終えたニューラルネットを使って文字認識の正答率を測定してみます。読み込んだ学習素材のデータの内、訓練として使用したデータを除く残りの10%のデータをここで使います。下のコードの様に、.sim()メソッドを使って、データをシミュレートさせてみます。correct+=1print('正答率=',100*correct/test_n,'%')このコードのアウトプットとして、79%という数値が得られました!つまり、約8割程度が文字認識として一致するOCRになっていることがわかりました。実際に一文字の手書き画像を準備して性能テストをしてみます。今回はMacのPaintアプリを使ってテスト画像を作成します(Windowsでもペイントソフトで作成可能)。訓練した学習素材と同じ、8×16pixelにサイズを指定して、画像を編集します。”a”の手書き画像として、下の様な”a.png”テストファイルを作成しました。これを、以下のコードのインプットとして使用し、OCR性能をテストします。結果:aとなりました。無事文字認識に成功しています。続いての性能テストとして、文字列の認識が出来るかをテストします。一文字の”a”の時と同じ様にpaintアプリ下の手書き画像”ebiworks”を作成しました。''.join(result)print('結果:',result_str)これを自作OCRへインプットしてテストします。結果:ebiwoiksが得られました。残念ながら一つだけ間違った結果となってしまいました。人間の目から見れば、手書き画像の6文字目は明らかに”r”なのですが、今回作成したOCRには”i”に見えてしまったのでしょう。まとめ今回は、neurorabライブラリを使うことによって簡単にOCRプログラムを作成する方法を紹介しました。確かにプログラムは簡単に書けるのですが、機械学習を実用レベルで使用するには、ライブラリの動作原理や、指定パラメータの最適設定が必要になってきます。私自身も機械学習に関しては最近勉強を始めたばかりで実用レベルには至っていないので、さらなる学習が必要だと感じています。言え、やはりまずは自分の手で試してみることが大事です。現職の化学系エンジニアです。理系技術者やエンジニア向けのお役立ち情報を不定期に配信中。ディープラーニングの活用において学習済みモデルの保存・読み込みは必須作業です。今回は学習済みのディープラーニングモデルを使って、画像分類を試してみたいと思います。2020.01.16こんにちは、えびかずきです。転移学習で活用する方法について説明したいと思います。PMお忙しい中失礼いたします。私、大学でOCRについて学んでいるペーターと申します。学習するにあたって貴サイトを利用させていただいているのですが、#1文字画像の認識のプログラムを実行した際、num_dimsが定義されていないというエラーが出てしまいます。お手数ですが、ご教授いただければ幸いです。お忙しいとは思いますがご返信のほど、よろしくお願いいたします。PMご指摘ありがとうございます!どうも誤植のようです。データ数である8*16を代入することで解決しないでしょうか?ちなみにここはデータ形式をリストから配列へ変換する部分になります。PM親切な対応ありがとうございます!無事、プログラムを実行することができました。コメントをキャンセルメールアドレスが公開されることはありません。*サイト次回のコメントで使用するためブラウザーに自分の名前、メールアドレス、サイトを保存する。プロフィールえびかずき現職の化学系エンジニア。理系技術者やエンジニア向けのお役立ち情報を不定期に配信中。WordPress.。