【模式识别】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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 圆周率两千万亿位_圆周率后3000万亿位

    圆周率两千万亿位_圆周率后3000万亿位网友一:对于我们日常生活应用来说,π=3.14就够用了,这就是小学毕业的要求。如果是工程上用,π=3.1415927也足够用了,也就是计算器的精度。那么如果继续计算圆周率,到100位、1万位,其实已经不是实用价值,而是数学研究价值了。1,信念,验证无限不循环π肯定是无限不循环的,不需要验证了。但是,作为数学的信念,我们就想验证一下。这种信念不仅仅在数学家中有,在其他学科领域、行业领域也有。2,研究…

    2025年11月5日
    2
  • 【Spring】代理模式:静态代理

    【Spring】代理模式:静态代理为什么要学代理模式?因为这就是SpringAOP的底层!【面试时,SpringAOP和SpringMVC一定会问】代理模式的分类:静态代理 动态代理静态代理角色分析:抽象角色:一般会使用接口或抽象类来解决 真是角色:被代理的角色 代理角色:代理真实角色,代理真实角色后,我们一般会做一些附属操作 客户:访问代理对象的人!代码步骤:接口(Rent.java)packagecom.company.org;publicinterfaceRent{pu

    2022年10月17日
    3
  • getchar的用法举例_c语言strlen函数用法

    getchar的用法举例_c语言strlen函数用法在K&R的开头碰到了getchar函数的用法有些迷糊,在查找了一些资料以及动手实践后有了大致的了解。getchar函数,是从缓冲区读取数据的,而不是直接从键盘输入中读取数据的键盘的输入会保存在缓冲区中,同时会显示在屏幕上getchar函数执行时,每次从缓冲区中读取一个字符键盘输入enter或者ctrl+D后,getchar会检查缓冲区中是否有数据,如果有的话,会开始读…

    2022年10月9日
    4
  • VMware虚拟机 桥接模式 无法上网 校园网「建议收藏」

    VMware虚拟机 桥接模式 无法上网 校园网「建议收藏」VMware桥接模式桥接模式就是将主机网卡与虚拟机虚拟的网卡利用虚拟网桥进行通信。在桥接的作用下,类似于把物理主机虚拟为一个交换机,所有桥接设置的虚拟机连接到这个交换机的一个接口上,物理主机也同样插在这个交换机当中,所以所有桥接下的网卡与网卡都是交换模式的,相互可以访问而不干扰。在桥接模式下,虚拟机ip地址需要与主机在同一个网段,如果需要联网,则网关与DNS需要与主机网卡一致。无法上网的检查步骤1.VMware中虚拟网络编辑器设置桥接网卡在“编辑”——“虚拟网络编辑器”里进.

    2022年6月7日
    126
  • 77道Spring面试题以及参考答案(2021年最新版)

    77道Spring面试题以及参考答案(2021年最新版)一、Spring概述1.什么是spring?Spring是一个轻量级Java开发框架,最早有RodJohnson创建,目的是为了解决企业级应用开发的业务逻辑层和其他各层的耦合问题。它是一个分层的JavaSE/JavaEEfull-stack(一站式)轻量级开源框架,为开发Java应用程序提供全面的基础架构支持。Spring负责基础架构,因此Java开发者可以专注于应用程序的开发。Spring最根本的使命是解决企业级应用开发的复杂性,即简化Java开发。Spring可以做很多事情,它为企

    2022年5月7日
    106
  • html完整网页实例简单_html简单网页代码解读

    html完整网页实例简单_html简单网页代码解读要完成一个网页的制作其实本质上是很简单的,本实例适合于初学HTML的同学。该实例里面有设置了css的样式设置,有div的样式格局,同样的也有js的动画效果,这个实例比较全面,有助于同学的学习。本实例仅供参考,其他行为自负。本实例分为四篇来观看。一共有一个HTML文件,三个css样式表,三个js,有16张图片。其中img里面的图片可以自行下载,或用本实例里面的图片。测试项目是建议大家用谷歌…

    2022年9月23日
    1

发表回复

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

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