はじめに
ニューラルネットワークの主要なアルゴリズムであるバックプロパゲーション法を、車両のナンバープレートの自動読取りへの応用例で紹介します。
- 完成版のアプレットを見る
対象読者
パターン認識に興味を持ち、特にニューラルネットワークを用いる方法に関心のある人。
必要な環境
J2SE 5.0を使っていますが、これより古いバージョンでも、本稿のコードをコンパイルし、実行することができます。ただし、添付のコンパイル済みアプレットの実行には、J2SE Runtime Environment 5.0が必要です。また、CPUパワーが足りないと、学習に時間がかかります。
パターン認識
パターンには、音声、画像、図形、文字などがあります。これらが何であるかを認識することを「パターン認識」と呼び、音声認識の応用は音声入力装置に、画像認識の応用は顔や指紋の照合に使われます。文字認識は、大別して、手書き文字の認識と、印刷文字の認識に分けられます。手書き文字の認識では、郵便番号の自動読取りが有名ですが、最近は郵便物も印刷されることが多く、手書き文字認識の比率は低下しています。ここで紹介するのは印刷文字認識の一種で、ナンバープレート用フォントの文字を対象にします。
車両のナンバープレートの認識
車両のナンバープレートの認識は、無人駐車場の管理や犯罪捜査などに需要が増大していて、市販システムが多数あります。認識原理はマッチングが用いられ、前処理として、1)車両の位置の探索、2)ナンバープレートの位置と文字の位置の探索、3)回転や歪の補正、が必要になります。高速で移動する車両を読取る場合には、処理の高速化が要求されます。
ニューラルネットワーク
人間の脳をモデルにして、それをコンピュータ上でシミュレーションするものです。ハードウエア化したものもあります。マッチング法が、見本と実際の図形とをその都度、プログラム上で比較して認識するのに対し、ニューラルネットワークでは、一旦、見本で学習した後には、見本を参照することなく、結果を出力します。
原理は非常に古く、世界中で盛んに研究されていて参考資料も多数ありますが、理論的には興味があるものの、実用化の面では、他の手法に比べて決定的な有利性がありません。しかし、最近のCPUパワーの飛躍的な向上で見直されています。
バックプロパゲーション(Backpropagation, BP)法
ニューラルネットワークの主要なアルゴリズムであるバックプロパゲーション法は、誤差逆伝播法と訳され、出力結果を学習させるべき教師信号と比較し、その誤差をフィードバックして、重み係数や閾値を修正します。この繰り返しが多数回行われるため、学習にやや時間がかかります。バックプロパゲーション法の理論とアルゴリズムについては、多くの参考資料がありますので、省略します。
バックプロパゲーション法の欠点は、次のとおりです。
- 学習速度を上げようとしてフィードバックの度合いを大きくすると、振動が起きて収束しなくなる。
- ローカルミニマ(local minima、真の最小ではなく、それより大きい局所的な窪み)に陥って、それ以上学習が進まなくなってしまうことがある。
1.に対しては、後述する係数のALPHA
とBETA
を試行錯誤で決めて用いました。2.に対しては、必要に応じて「再学習」させることによって、ローカルミニマからの脱出を図りました。これらの議論や対策についても、非常に多くの論文があります。
ALPHA
は、逆方向演算(バックプロパゲーション)に用いられ、重みと閾値に対する修正量の係数(>0)です。これを大きくするとフィードバックが強められますので、学習時間が短縮されます。BETA
は、順方向演算に用いるSigmoid
関数の入力変数に対する係数(>0)で、これを大きくすると、ニューロンの増幅率を高め、出力を0または1の値に早く到達させることができます。分解能を高め、学習の高速化にも役立ちます。
プログラムの概要
このプログラムの基本となるニューラルネットワークの構成、バックプロパゲーションのアルゴリズムについては、筆者のウエブサイト「Visual C++ 6.0の易しい使い方(17)-ニューロンをシミュレーションして排他的論理和を実現する-」をそのまま使用しています(オブジェクト名、メソッド名などは少し異なります)ので、参照してください。
主要部分のフローチャートを図1に示します。
同一パターンの繰返し学習を「内部サイクル」と呼び、パターンの種別すべてを一通り学習させるのを一つの単位として、その繰返し学習を「外部サイクル」と呼びます。
学習の際には(「学習モード」)、学習用のパターン「sample_in」を用いて順方向演算を行ない、結果「recog_out」を得ます。学習が進まない最初の内は、教師信号「teach」と食い違いますが、その違いを利用して逆方向演算(バックプロパゲーション)を行ない、ニューラルネットワークの重みや閾値を修正します。
認識の際には(「認識モード」)、手書き入力したパターン「written_in」を用いて順方向演算を行ない、結果「recog_out」を表示します。