2010/02/08

続・距離校正はつらいよ(2)

ソフト班Shinpukuです。

ニューラルネットワークによる関数近似プログラムを書いてみました。

入力をピクセル数、出力を距離として、中間層のニューロンを3個に設定しています。

// ニューラルネット生成
int nc[3] = {1, 3, 1}; // {入力層、中間層、出力層}
CvMat NSetting = cvMat(1, 3, CV_32S, nc);
CvANN_MLP mlp(&NSetting, CvANN_MLP::SIGMOID_SYM, 1, 1);
// 終了条件(1000回繰り返し、精度1e-100)
CvTermCriteria criteria = cvTermCriteria(CV_TERMCRIT_ITER|CV_TERMCRIT_EPS, 1000, 1e-100);
// パラメータ
CvANN_MLP_TrainParams param(criteria, CvANN_MLP_TrainParams::RPROP, 0.05);
// 学習データ(pixel:画像中心からのピクセル数 distance:フィールド上での距離)
const int num = 16;
double pixel[num] = { 0, 32, 38, 43, 47, 52, 56, 59, 73, 82, 87, 92, 95, 98, 102, 120};
double distance[num] = {0.0, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1.0, 1.5, 2.0, 2.5, 3.0, 3.5, 4.0, 5.0, 15};
// 学習させる
CvMat in = cvMat(num, 1, CV_64FC1, pixel);
CvMat out = cvMat(num, 1, CV_64FC1, distance);
mlp.train(&in, &out, 0, 0, param);
// 学習結果から他データを計算(rには0~120の任意の整数が入ります)
float a[1] = {r}, b[1];
CvMat in = cvMat(1, 1, CV_32FC1, a);
CvMat out = cvMat(1, 1, CV_32FC1, b);
mlp.predict(&in, &out); // rに対応する距離がout.data.fl[0]に代入されます

実行するとこんな感じです。


青点がサンプル、黒実線がn次多項式による近似曲線、ピンクがニューラルネットワークの学習結果です。

なかなか良い結果です。

0 件のコメント: