SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

Javaで学ぶグラフィックス処理

ニューラルネットワークを用いたパターン認識

車両のナンバープレートの読取りシステムへの応用


  • このエントリーをはてなブックマークに追加

ニューラルネットワークの主要なアルゴリズムであるバックプロパゲーション法を、車両のナンバープレートの自動読取りへの応用例で紹介します。

  • このエントリーをはてなブックマークに追加

はじめに

 ニューラルネットワークの主要なアルゴリズムであるバックプロパゲーション法を、車両のナンバープレートの自動読取りへの応用例で紹介します。

対象読者

 パターン認識に興味を持ち、特にニューラルネットワークを用いる方法に関心のある人。

必要な環境

 J2SE 5.0を使っていますが、これより古いバージョンでも、本稿のコードをコンパイルし、実行することができます。ただし、添付のコンパイル済みアプレットの実行には、J2SE Runtime Environment 5.0が必要です。また、CPUパワーが足りないと、学習に時間がかかります。

パターン認識

 パターンには、音声、画像、図形、文字などがあります。これらが何であるかを認識することを「パターン認識」と呼び、音声認識の応用は音声入力装置に、画像認識の応用は顔や指紋の照合に使われます。文字認識は、大別して、手書き文字の認識と、印刷文字の認識に分けられます。手書き文字の認識では、郵便番号の自動読取りが有名ですが、最近は郵便物も印刷されることが多く、手書き文字認識の比率は低下しています。ここで紹介するのは印刷文字認識の一種で、ナンバープレート用フォントの文字を対象にします。

車両のナンバープレートの認識

 車両のナンバープレートの認識は、無人駐車場の管理や犯罪捜査などに需要が増大していて、市販システムが多数あります。認識原理はマッチングが用いられ、前処理として、1)車両の位置の探索、2)ナンバープレートの位置と文字の位置の探索、3)回転や歪の補正、が必要になります。高速で移動する車両を読取る場合には、処理の高速化が要求されます。

ニューラルネットワーク

 人間の脳をモデルにして、それをコンピュータ上でシミュレーションするものです。ハードウエア化したものもあります。マッチング法が、見本と実際の図形とをその都度、プログラム上で比較して認識するのに対し、ニューラルネットワークでは、一旦、見本で学習した後には、見本を参照することなく、結果を出力します。

 原理は非常に古く、世界中で盛んに研究されていて参考資料も多数ありますが、理論的には興味があるものの、実用化の面では、他の手法に比べて決定的な有利性がありません。しかし、最近のCPUパワーの飛躍的な向上で見直されています。

バックプロパゲーション(Backpropagation, BP)法

 ニューラルネットワークの主要なアルゴリズムであるバックプロパゲーション法は、誤差逆伝播法と訳され、出力結果を学習させるべき教師信号と比較し、その誤差をフィードバックして、重み係数や閾値を修正します。この繰り返しが多数回行われるため、学習にやや時間がかかります。バックプロパゲーション法の理論とアルゴリズムについては、多くの参考資料がありますので、省略します。

 バックプロパゲーション法の欠点は、次のとおりです。

  1. 学習速度を上げようとしてフィードバックの度合いを大きくすると、振動が起きて収束しなくなる。
  2. ローカルミニマ(local minima、真の最小ではなく、それより大きい局所的な窪み)に陥って、それ以上学習が進まなくなってしまうことがある。

 1.に対しては、後述する係数のALPHABETAを試行錯誤で決めて用いました。2.に対しては、必要に応じて「再学習」させることによって、ローカルミニマからの脱出を図りました。これらの議論や対策についても、非常に多くの論文があります。

 ALPHAは、逆方向演算(バックプロパゲーション)に用いられ、重みと閾値に対する修正量の係数(>0)です。これを大きくするとフィードバックが強められますので、学習時間が短縮されます。BETAは、順方向演算に用いるSigmoid関数の入力変数に対する係数(>0)で、これを大きくすると、ニューロンの増幅率を高め、出力を0または1の値に早く到達させることができます。分解能を高め、学習の高速化にも役立ちます。

プログラムの概要

 このプログラムの基本となるニューラルネットワークの構成、バックプロパゲーションのアルゴリズムについては、筆者のウエブサイト「Visual C++ 6.0の易しい使い方(17)-ニューロンをシミュレーションして排他的論理和を実現する-」をそのまま使用しています(オブジェクト名、メソッド名などは少し異なります)ので、参照してください。

 主要部分のフローチャートを図1に示します。

 同一パターンの繰返し学習を「内部サイクル」と呼び、パターンの種別すべてを一通り学習させるのを一つの単位として、その繰返し学習を「外部サイクル」と呼びます。

 学習の際には(「学習モード」)、学習用のパターン「sample_in」を用いて順方向演算を行ない、結果「recog_out」を得ます。学習が進まない最初の内は、教師信号「teach」と食い違いますが、その違いを利用して逆方向演算(バックプロパゲーション)を行ない、ニューラルネットワークの重みや閾値を修正します。

 認識の際には(「認識モード」)、手書き入力したパターン「written_in」を用いて順方向演算を行ない、結果「recog_out」を表示します。

図1 学習と認識のフローチャート
図1 学習と認識のフローチャート

会員登録無料すると、続きをお読みいただけます

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー

次のページ
プログラム

修正履歴

この記事は参考になりましたか?

  • このエントリーをはてなブックマークに追加
Javaで学ぶグラフィックス処理連載記事一覧

もっと読む

この記事の著者

石立 喬(イシダテ タカシ)

1955年東京工大卒。同年、NECへ入社し、NEC初のコンピュータの開発に参画。磁気メモリ、半導体メモリの開発、LSI設計などを経て、1989年帝京大学理工学部教授。情報、通信、電子関係の教育を担当。2002年定年により退職し現在に至る。2000年より、Webサイト「Visual C++の勉強部屋」を公開。...

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

  • このエントリーをはてなブックマークに追加
CodeZine(コードジン)
https://codezine.jp/article/detail/372 2008/03/16 10:34

おすすめ

アクセスランキング

アクセスランキング

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー

アクセスランキング

アクセスランキング