Opencv 关于BP神经网络实现

闲来无事,现在用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 }

训练的准确率还行。

转载于:https://www.cnblogs.com/ChudyShao/archive/2013/05/16/3082734.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值