【模式识别】OpenCV中使用神经网络 CvANN_MLP

原文:http://blog.csdn.net/xiaowei_cqu/article/details/9027617

OpenCV的ml模块实现了人工神经网络(Artificial Neural Networks, ANN)最典型的多层感知器(multi-layer perceptrons, MLP)模型由于ml模型实现的算法都继承自统一的CvStatModel基类,其训练和预测的接口都是train(),predict(),非常简单。

下面来看神经网络 CvANN_MLP 的使用~

定义神经网络及参数:

[cpp]  view plain copy
  1. //Setup the BPNetwork  
  2.     CvANN_MLP bp;   
  3.     // Set up BPNetwork's parameters  
  4.     CvANN_MLP_TrainParams params;  
  5.     params.train_method=CvANN_MLP_TrainParams::BACKPROP;  
  6.     params.bp_dw_scale=0.1;  
  7.     params.bp_moment_scale=0.1;  
  8.     //params.train_method=CvANN_MLP_TrainParams::RPROP;  
  9.     //params.rp_dw0 = 0.1;   
  10.     //params.rp_dw_plus = 1.2;   
  11.     //params.rp_dw_minus = 0.5;  
  12.     //params.rp_dw_min = FLT_EPSILON;   
  13.     //params.rp_dw_max = 50.;  

可以直接定义CvANN_MLP神经网络,并设置其参数。 BACKPROP表示使用back-propagation的训练方法,RPROP即最简单的propagation训练方法。

使用BACKPROP有两个相关参数:bp_dw_scale即bp_moment_scale:

【模式识别】OpenCV中使用神经网络 CvANN_MLP_第1张图片

使用PRPOP有四个相关参数:rp_dw0, rp_dw_plus, rp_dw_minus, rp_dw_min, rp_dw_max:

【模式识别】OpenCV中使用神经网络 CvANN_MLP_第2张图片

上述代码中为其默认值。

设置网络层数,训练数据:

[cpp]  view plain copy
  1. // Set up training data  
  2.     float labels[3][5] = {{0,0,0,0,0},{1,1,1,1,1},{0,0,0,0,0}};  
  3.     Mat labelsMat(3, 5, CV_32FC1, labels);  
  4.   
  5.     float trainingData[3][5] = { {1,2,3,4,5},{111,112,113,114,115}, {21,22,23,24,25} };  
  6.     Mat trainingDataMat(3, 5, CV_32FC1, trainingData);  
  7.     Mat layerSizes=(Mat_<int>(1,5) << 5,2,2,2,5);  
  8.     bp.create(layerSizes,CvANN_MLP::SIGMOID_SYM);//CvANN_MLP::SIGMOID_SYM  
  9.                                                //CvANN_MLP::GAUSSIAN  
  10.                                                //CvANN_MLP::IDENTITY  
  11.     bp.train(trainingDataMat, labelsMat, Mat(),Mat(), params);  

layerSizes设置了有三个隐含层的网络结构:输入层,三个隐含层,输出层。输入层和输出层节点数均为5,中间隐含层每层有两个节点。

create第二个参数可以设置每个神经节点的激活函数,默认为CvANN_MLP::SIGMOID_SYM,即Sigmoid函数,同时提供的其他激活函数有Gauss和阶跃函数。

【模式识别】OpenCV中使用神经网络 CvANN_MLP_第3张图片

使用训练好的网络结构分类新的数据:

然后直接使用predict函数,就可以预测新的节点:

[cpp]  view plain copy
  1. Mat sampleMat = (Mat_<float>(1,5) << i,j,0,0,0);  
  2.             Mat responseMat;  
  3.             bp.predict(sampleMat,responseMat);  

完整程序代码:

[cpp]  view plain copy
  1. //The example of using BPNetwork in OpenCV  
  2. //Coded by L. Wei  
  3. #include <opencv2/core/core.hpp>  
  4. #include <opencv2/highgui/highgui.hpp>  
  5. #include <opencv2/ml/ml.hpp>  
  6. #include <iostream>  
  7. #include <string>  
  8.   
  9. using namespace std;  
  10. using namespace cv;  
  11.   
  12. int main()  
  13. {  
  14.     //Setup the BPNetwork  
  15.     CvANN_MLP bp;   
  16.     // Set up BPNetwork's parameters  
  17.     CvANN_MLP_TrainParams params;  
  18.     params.train_method=CvANN_MLP_TrainParams::BACKPROP;  
  19.     params.bp_dw_scale=0.1;  
  20.     params.bp_moment_scale=0.1;  
  21.     //params.train_method=CvANN_MLP_TrainParams::RPROP;  
  22.     //params.rp_dw0 = 0.1;   
  23.     //params.rp_dw_plus = 1.2;   
  24.     //params.rp_dw_minus = 0.5;  
  25.     //params.rp_dw_min = FLT_EPSILON;   
  26.     //params.rp_dw_max = 50.;  
  27.   
  28.     // Set up training data  
  29.     float labels[3][5] = {{0,0,0,0,0},{1,1,1,1,1},{0,0,0,0,0}};  
  30.     Mat labelsMat(3, 5, CV_32FC1, labels);  
  31.   
  32.     float trainingData[3][5] = { {1,2,3,4,5},{111,112,113,114,115}, {21,22,23,24,25} };  
  33.     Mat trainingDataMat(3, 5, CV_32FC1, trainingData);  
  34.     Mat layerSizes=(Mat_<int>(1,5) << 5,2,2,2,5);  
  35.     bp.create(layerSizes,CvANN_MLP::SIGMOID_SYM);//CvANN_MLP::SIGMOID_SYM  
  36.                                                //CvANN_MLP::GAUSSIAN  
  37.                                                //CvANN_MLP::IDENTITY  
  38.     bp.train(trainingDataMat, labelsMat, Mat(),Mat(), params);  
  39.   
  40.   
  41.     // Data for visual representation  
  42.     int width = 512, height = 512;  
  43.     Mat image = Mat::zeros(height, width, CV_8UC3);  
  44.     Vec3b green(0,255,0), blue (255,0,0);  
  45.     // Show the decision regions given by the SVM  
  46.     for (int i = 0; i < image.rows; ++i)  
  47.         for (int j = 0; j < image.cols; ++j)  
  48.         {  
  49.             Mat sampleMat = (Mat_<float>(1,5) << i,j,0,0,0);  
  50.             Mat responseMat;  
  51.             bp.predict(sampleMat,responseMat);  
  52.             float* p=responseMat.ptr<float>(0);  
  53.             int response=0;  
  54.             for(int i=0;i<5;i++){  
  55.             //  cout<<p[i]<<" ";  
  56.                 response+=p[i];  
  57.             }  
  58.             if (response >2)  
  59.                 image.at<Vec3b>(j, i)  = green;  
  60.             else    
  61.                 image.at<Vec3b>(j, i)  = blue;  
  62.         }  
  63.   
  64.         // Show the training data  
  65.         int thickness = -1;  
  66.         int lineType = 8;  
  67.         circle( image, Point(501,  10), 5, Scalar(  0,   0,   0), thickness, lineType);  
  68.         circle( image, Point(255,  10), 5, Scalar(255, 255, 255), thickness, lineType);  
  69.         circle( image, Point(501, 255), 5, Scalar(255, 255, 255), thickness, lineType);  
  70.         circle( image, Point( 10, 501), 5, Scalar(255, 255, 255), thickness, lineType);  
  71.   
  72.         imwrite("result.png", image);        // save the image   
  73.   
  74.         imshow("BP Simple Example", image); // show it to the user  
  75.         waitKey(0);  
  76.   
  77. }  

结果:

【模式识别】OpenCV中使用神经网络 CvANN_MLP_第4张图片


你可能感兴趣的:(ann,MLP)