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

【模式识别】OpenCV中使用神经网络 CvANN_MLPOpenCV的ml模块实现了人工神经网络(ArtificialNeuralNetworks,ANN)最典型的多层感知器(multi-layerperceptrons,MLP)模型。由于ml模型实现的算法都继承自统一的CvStatModel基类,其训练和预测的接口都是train(),predict(),非常简单。下面来看神经网络CvANN_MLP的使用~定义神经网络及参数:…

大家好,又见面了,我是你们的朋友全栈君。

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

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

定义神经网络及参数:

 

//Setup the BPNetwork
	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.;

 

 

 

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

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

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

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

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

上述代码中为其默认值。

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

 

// 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);
	bp.create(layerSizes,CvANN_MLP::SIGMOID_SYM);//CvANN_MLP::SIGMOID_SYM
	                                           //CvANN_MLP::GAUSSIAN
	                                           //CvANN_MLP::IDENTITY
	bp.train(trainingDataMat, labelsMat, Mat(),Mat(), params);

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

 

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

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

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

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

 

Mat sampleMat = (Mat_<float>(1,5) << i,j,0,0,0);
			Mat responseMat;
			bp.predict(sampleMat,responseMat);

 

完整程序代码:

 

 

 

//The example of using BPNetwork in OpenCV
//Coded by L. Wei
#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/ml/ml.hpp>
#include <iostream>
#include <string>

using namespace std;
using namespace cv;

int main()
{
	//Setup the BPNetwork
	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.;

	// 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);
	bp.create(layerSizes,CvANN_MLP::SIGMOID_SYM);//CvANN_MLP::SIGMOID_SYM
	                                           //CvANN_MLP::GAUSSIAN
	                                           //CvANN_MLP::IDENTITY
	bp.train(trainingDataMat, labelsMat, Mat(),Mat(), params);


	// Data for visual representation
	int width = 512, height = 512;
	Mat image = Mat::zeros(height, width, CV_8UC3);
	Vec3b green(0,255,0), blue (255,0,0);
	// Show the decision regions given by the SVM
	for (int i = 0; i < image.rows; ++i)
		for (int j = 0; j < image.cols; ++j)
		{
			Mat sampleMat = (Mat_<float>(1,5) << i,j,0,0,0);
			Mat responseMat;
			bp.predict(sampleMat,responseMat);
			float* p=responseMat.ptr<float>(0);
			float response=0.0f;
			for(int k=0;k<5;i++){
			//	cout<<p[k]<<" ";
				response+=p[k];
			}
			if (response >2)
				image.at<Vec3b>(j, i)  = green;
			else  
				image.at<Vec3b>(j, i)  = blue;
		}

		// Show the training data
		int thickness = -1;
		int lineType = 8;
		circle(	image, Point(501,  10), 5, Scalar(  0,   0,   0), thickness, lineType);
		circle(	image, Point(255,  10), 5, Scalar(255, 255, 255), thickness, lineType);
		circle(	image, Point(501, 255), 5, Scalar(255, 255, 255), thickness, lineType);
		circle(	image, Point( 10, 501), 5, Scalar(255, 255, 255), thickness, lineType);

		imwrite("result.png", image);        // save the image 

		imshow("BP Simple Example", image); // show it to the user
		waitKey(0);

}

结果:

 

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

 

 

 

(转载请注明作者和出处:http://blog.csdn.net/xiaowei_cqu 未经允许请勿用于商业用途)

 

 

 

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/148610.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 关于fmincon和cvx[通俗易懂]

    关于fmincon和cvx[通俗易懂]网上有很多fmincon函数如何使用的,这里不多讲。我主要总结我自己知道的。1.精度问题。在我的使用过程中,感觉cvx和fmincon都有精度限制,到10^(-6)左右就不准了。碰到精度问题,我采取做法是同时乘上一个放大因子10^(10)。2.cvx写起来更方便;3.fmincon目标函数和约束函数都可以有多个输入变量,而不仅仅是需要优化的那个变量,这样当目标函数和约束函数以及主要模

    2022年5月29日
    68
  • 二叉树的基本性质及证明

    二叉树的基本性质及证明性质1:一棵非空二叉树的第i层上最多有2^(i-1)个结点,(i>=1)。性质2:一棵深度为k的二叉树中,最多具有2^k-1个结点,最少有k个结点。性质3:对于一棵非空的二叉树,度为0的结点(即叶子结点)总比度为1的结点多一个,即叶子结点数为n0,度为2的结点数为n2,则有n0=n2+1。证明:如果n0表示度为0(即叶子结点)的结点数,用n1表示度为1的结点数,n2表示度为2的结点数,

    2022年5月31日
    37
  • MT4安卓版官网下载[通俗易懂]

    MT4安卓版官网下载[通俗易懂]目前,mt4因为特有的优势,吸引了许多投资者使用。MT4是目前最受欢迎的外汇交易平台。如果你的手机是安卓手机,要使用mt4交易,首先就得下载一个安卓版的软件。那么安卓如何下载呢。

    2022年8月15日
    5
  • uniqueidentifier转换_unique函数哪个版本有

    uniqueidentifier转换_unique函数哪个版本有uniqueidentifier中文含义“唯一的标识符”。uniqueidentifier数据类型是16个字节的二进制值,应具有唯一性,必须与NEWID()函数配合使用。uniqueidentifier数据类型与identity自增不同,不会为插入的新行自动生成新的ID,新值由NEWID()函数指定。NEWID()函数值会生成全球唯一的标识,标识由网卡号和CPU时钟组成,如:6

    2022年9月7日
    0
  • windows7下预览psd

    windows7下预览psdPhotoshopcs5安装完后电脑里PSD格式的文件无法显示缩略图,想看原图必须打开软件才能知道图片的内容,安装此补丁之后不用打开软件,在文件夹里就可以看到PSD格式图片的内容,挺方便的,本人亲自测试可以在win7下使用。使用方法:将"psicon.dll"文件拷备到系统system32目录下,不然的话重启之后又看不到缩略图了。步骤一:解压到任何文件夹;步骤二:将psicon.dll拷备到…

    2022年6月11日
    31
  • 41-新的信号注册函数 sigaction

    41-新的信号注册函数 sigaction在这之前,我们一直使用signal来注册信号处理函数,而且一开始我甚至都没有提起过甚至signal还有一个兄弟——sigaction.我相信,把sigaction放到这里是适合的,因为你已经具备了足够的基础去理解它了。1.sigaction函数不同于signal函数,sigaction函数是符合POSIX标准的,而signal只是ANSIC标准函数。除了上面的区

    2022年5月25日
    34

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号