OpenCV的神经网络使用(CvANN_MLP)
概要
首先,我们应该知道在OpenCV中已经有了很多的分类和回归算法。其中,在ml模块中我们可以使用OpenCV自带的神经网络算法CvANN_MLP。神经网络的具体实现我就不详细介绍了,在这里我们主要是介绍CvANN_MLP的定义及如何调用。
原文参考:http://blog.csdn.net/qq_15947787/article/category/6115133/2 、http://blog.csdn.net/xiaowei_cqu/article/details/9027617 和 http://www.cnblogs.com/farewell-farewell/p/6027888.html
ANN – Artificial Neural Networks 人工神经网络
MLP – Multi-layer perceptrons 多重感知器
其实,CvANN_MLP的最重要三个调用函数是 creat()、train() 和 predict();
定义人工神经网络
CvANN_MLP bp;
// Set up BPNetwork's parameters
CvANN_MLP_TrainParams params;
params.train_method=CvANN_MLP_TrainParams::BACKPROP;
params.bp_dw_scale=0.1;
params.bp_moment_scale=0.1;
//params.train_method=CvANN_MLP_TrainParams::RPROP;
//params.rp_dw0 = 0.1;
//params.rp_dw_plus = 1.2;
//params.rp_dw_minus = 0.5;
//params.rp_dw_min = FLT_EPSILON;
//params.rp_dw_max = 50.;
在这里,我们可以很清楚地了解到OpenCV实现神经网络主要使用两种训练方法: BACKPROP 与 RPROP
创建分类器,设置网络层数
Mat layerSizes=(Mat_<int>(1,5) << 5,2,2,2,5);
//create第二个参数可以设置每个神经节点的激活函数,默认为 CvANN_MLP::SIGMOID_SYM,即Sigmoid函数
//同时提供的其他激活函数有Gauss(CvANN_mlp::GAUSSIAN)和阶跃函数 (CvANN_MLP::IDENTITY)。
bp.create(layerSizes,CvANN_MLP::SIGMOID_SYM); //CvANN_MLP::SIGMOID_SYM
layerSizes设置了有5层的网络结构:输入层,三个隐含层,输出层。输入层和输出层节点数均为5,中间隐含层每层有两个节点。
create第二个参数可以设置每个神经节点的激活函数,默认为CvANN_MLP::SIGMOID_SYM,即Sigmoid函数,同时提供的其他激活函数有Gauss和阶跃函数。
训练数据
// Set up training data
float labels[3][5] = {
{
0,0,0,0,0},{
1,1,1,1,1},{
0,0,0,0,0}};
Mat labelsMat(3, 5, CV_32FC1, labels);
float trainingData[3][5] = { {
1,2,3,4,5},{
111,112,113,114,115}, {
21,22,23,24,25} };
Mat trainingDataMat(3, 5, CV_32FC1, trainingData);
Mat layerSizes=(Mat_<int>(1,5) << 5,2,2,2,5);
CvANN_MLP_TrainParams params;
params.train_method=CvANN_MLP_TrainParams::BACKPROP; //(Back Propagation,BP)反向传播算法
params.bp_dw_scale=0.