閑來無事,現在用Opencv將關於目標跟蹤識別匹配的Matlab程序重寫了一遍,里邊用到BP神經網絡訓練,在網上找了些資料,然后自己根據程序改了下適合自己所用:1個輸入層(1*3),兩個隱層(1*10),一個輸出層(1*2)。
1 #pragma once 2 #include "ml.h" 3 #include <fstream> 4 5 class BPClassifier 6 { 7 public: 8 BPClassifier(void); 9 ~BPClassifier(void); 10 void getData(); 11 void calc_correct_rate(); 12 void train(); 13 int classify(double [3]); 14 15 private: 16 CvANN_MLP BP; 17 // string file_path; 18 int train_samples; 19 int classes; 20 int size; 21 CvMat* trainData; 22 CvMat* trainClasses; 23 CvMat* neuralLayers; 24 CvMat* sampleWts; 25 };
1 #include "StdAfx.h" 2 #include "BPClassifier.h" 3 4 BPClassifier::BPClassifier(void) 5 { 6 train_samples = 500; 7 classes= 2;//輸出 8 size=3;//輸入單個元素大小 9 trainData = cvCreateMat(train_samples,3, CV_32FC1);//輸入數據,500*3 10 trainClasses = cvCreateMat(train_samples, 2, CV_32FC1);//輸出矩陣,500*2 11 neuralLayers=cvCreateMat(4,1,CV_32SC1);//兩個隱層+輸入層+輸出層 12 sampleWts=cvCreateMat(train_samples,1,CV_32FC1);//權值 13 for (int i=0;i<train_samples;i++)//初始化權值 14 { 15 cvSet1D(sampleWts,i,cvScalar(1)); 16 } 17 cvSet1D(neuralLayers,0,cvScalar(3)); 18 cvSet1D(neuralLayers,1,cvScalar(10)); 19 cvSet1D(neuralLayers,2,cvScalar(2)); 20 cvSet1D(neuralLayers,3,cvScalar(2));//2個輸出 21 22 //calc_correct_rate();//訓練時 23 BP.load("bp.xml"); //訓練好后,檢測 24 } 25 26 BPClassifier::~BPClassifier(void) 27 { 28 cvReleaseMat(&trainData); 29 cvReleaseMat(&trainClasses); 30 cvReleaseMat(&neuralLayers); 31 cvReleaseMat(&sampleWts); 32 } 33 34 void BPClassifier::calc_correct_rate()//計算之前訓練集檢測結果 35 { 36 getData(); 37 train(); 38 double inp[3]; 39 int bike=0,car=0,person=0,other=0; 40 for (int i=0;i<train_samples;i++)//01bike-1:100, 10car0:50, 00person1:100, 11other-5:250 41 { 42 inp[0]=cvGetReal2D(trainData,i,0); 43 inp[1]=cvGetReal2D(trainData,i,1); 44 inp[2]=cvGetReal2D(trainData,i,2); 45 int rst=classify(inp); 46 if (i<100) 47 { 48 if (rst==-1) 49 bike++; 50 } 51 else if (i<150) 52 { 53 if(rst==0) 54 car++; 55 } 56 else if (i<250) 57 { 58 if(rst==1) 59 person++; 60 } 61 else if (i<500) 62 { 63 if(rst==-5) 64 other++; 65 } 66 } 67 } 68 void BPClassifier::getData() 69 { 70 std::ifstream nn_input_if("NN_input.txt"); 71 std::ifstream nn_want_if("NN_want.txt"); 72 double data; 73 //int i=0,j=0; 74 for (int i=0;i<size;i++)//3 75 { 76 for (int j=0;j<train_samples;j++)//500 77 { 78 nn_input_if>>data; 79 cvSet2D(trainData,j,i,cvScalar(data)); 80 } 81 } 82 for (int i=0;i<classes;i++)//2 83 { 84 for (int j=0;j<train_samples;j++)//500 85 { 86 nn_want_if>>data; 87 cvSet2D(trainClasses,j,i,cvScalar(data)); 88 } 89 } 90 double x=cvGetReal2D(trainData,17,0),y=cvGetReal2D(trainData,18,0),z=cvGetReal2D(trainData,19,0);; 91 nn_input_if.close(); 92 nn_want_if.close(); 93 } 94 void BPClassifier::train() 95 { 96 BP.create(neuralLayers); 97 //printf(" 訓練中\n"); 98 BP.train(trainData, 99 trainClasses, 100 sampleWts, 101 0, 102 CvANN_MLP_TrainParams(cvTermCriteria(CV_TERMCRIT_ITER+CV_TERMCRIT_EPS,10000000,0.00001),CvANN_MLP_TrainParams::BACKPROP,0.01) 103 ); 104 //printf(" 訓練結束\n"); 105 BP.save("bp.xml"); 106 107 } 108 int BPClassifier::classify(double inp[3]) 109 { 110 //BP.load("bp.xml"); 111 CvMat* input=cvCreateMat(1,3,CV_32FC1); 112 cvSet1D(input,0,cvScalar(inp[0])); 113 cvSet1D(input,1,cvScalar(inp[1])); 114 cvSet1D(input,2,cvScalar(inp[2])); 115 CvMat* output=cvCreateMat(1,2,CV_32FC1); 116 BP.predict(input,output); 117 double xd=cvGetReal1D(output,0); 118 double yd=cvGetReal1D(output,1); 119 int x=static_cast<int>((xd>=0)?(xd+0.5):(xd-0.5)); 120 int y=static_cast<int>((yd>=0)?(yd+0.5):(yd-0.5)); 121 122 int rst=-5; 123 if (x==0) 124 { 125 if (y==0) 126 rst=1; 127 else 128 rst=-1; 129 } 130 else if (x==1) 131 { 132 if (y==0) 133 rst=0; 134 else 135 rst=-5; 136 } 137 138 cvReleaseMat(&input); 139 cvReleaseMat(&output); 140 return rst; 141 }
訓練的准確率還行。