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 的使用~
定义神经网络及参数:
plaincopy
- //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:
使用PRPOP有四个相关参数:rp_dw0, rp_dw_plus, rp_dw_minus, rp_dw_min, rp_dw_max:
上述代码中为其默认值。
设置网络层数,训练数据:
plaincopy
- // 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和阶跃函数。
使用训练好的网络结构分类新的数据:
然后直接使用predict函数,就可以预测新的节点:
plaincopy
- Mat sampleMat = (Mat_<float>(1,5) << i,j,0,0,0);
- Mat responseMat;
- bp.predict(sampleMat,responseMat);
完整程序代码:
plaincopy
- //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);
- int response=0;
- for(int i=0;i<5;i++){
- // cout<<p[i]<<" ";
- response+=p[i];
- }
- 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相关推荐
- Opencv中ANN神经网络使用示例
前一段儿想用opencv做一下数字识别,用神经网络做识别. 在网上搜了一下关于opencv中ANN的使用方法,@小魏的修行路 的[模式识别]OpenCV中使用神经网络 CvANN_MLP 这篇文章写得 ...
- OpenCV中的神经网络
来源:http://blog.csdn.net/delltdk/article/details/8912867 OpenCV中封装了类CvANN_MLP,因而神经网络利用很方便. 首先构建一个网络模型 ...
- OpenCV中神经网络的应用
OpenCV中神经网络的应用 OpenCV中也提供神经网络的算法,下面对其中的一些参数进行介绍. 激活函数 OpenCV中提供三种激活函数,分别是线性激活函数.sigmoid激活函数和高斯激活函数. ...
- OpenCV中检测ChArUco的角点(2)
论文阅读模块将分享点云处理,SLAM,三维视觉,高精地图相关的文章.公众号致力于理解三维视觉领域相关内容的干货分享,欢迎各位加入我,我们一起每天一篇文章阅读,开启分享之旅,有兴趣的可联系微信diany ...
- OpenCV中使用YOLO对象检测
点击上方"小白学视觉",选择加"星标"或"置顶" 重磅干货,第一时间送达 本文转自:opencv学堂 OpenCV在3.3.1的版本中开始正 ...
- 在OpenCV中基于深度学习的边缘检测
点击上方"小白学视觉",选择加"星标"或"置顶" 重磅干货,第一时间送达 本文转自:AI算法与图像处理 导读 分析了Canny的优劣,并给出 ...
- opencv中使用K-近邻分类算法KNN
K-近邻(K-Nearest Neighbors, KNN)是一种很好理解的分类算法,简单说来就是从训练样本中找出K个与其最相近的样本,然后看这K个样本中哪个类别的样本多,则待判定的值(或说抽样)就属 ...
- 使用OpenCV的ANN_MLP神经网络实现数字识别
前言 1.OpenCV中的ML模块实现了前馈人工神经网络,具体地说是多层感知器(MLP),是最常用的神经网络类型. MLP由输入层,输出层和一个或多个隐藏层组成. MLP的每一层包括一个或多个与来自上 ...
- opencv画虚线_(四十四)OpenCV中的机器学习-SVM
时间为友,记录点滴. 本来还想在特征点检测的道路上再走一走,学习一下Harr级联或者HOG什么的,但总有些概念感觉绕不过去.择日不如撞日,撞日不如今日.我们先揭开机器学习中的一个小角,看看大热的机器学 ...
最新文章
- html表单的数据保存在哪里,提交和保存表单数据
- Java中传值与传地址
- 分块查询 缓解内存开销
- .NET Core 又一杀器! Web Blazor框架横空出世!
- socket php验证客户端验证,用Socket发送电子邮件(利用需要验证的SMTP服务器)
- 微型计算机的使用寿命,微型计算机使用注意事项及保养的一般方法
- 遍历进程链表,打印pcb相关字段的内核模块
- 关于中文乱码问题(总结)
- Linux进程控制与进程优先级
- stm8s103k3 周期 捕获_stm8s103k3的UART发送数据问题
- Atitit 人工智能声音处理乐器总类以及midi规范的标示 目录 1. Atitit 乐器分类 打击乐器	1 1.1. 1.1. 打击乐器(各种鼓 三角铁等	1	2 1.2. 1.2. 管乐器
- 调用百度识图api实现识图vue+springboot
- python右对齐_Python中print函数输出时的左右对齐问题
- JAVA音视频解决方案----开源jtt1078源码与沟通群
- thinkphp 页面上循环checkbox选择的值和radio混用,if判断
- Linux虚拟机下载和安装简单流程
- 波士顿大学计算机科学的就业,波士顿大学计算机科学本科申请(附案例)
- asii和unicode格式字符串之间的相互转换
- selenium代码中创建浏览器对象_Sinno_Song_新浪博客
- 220413数据分析总结
热门文章
- 听易中天品三国---看孔融,杨修之死
- c# 添加图片水印,可以指定水印位置+生成缩略图[付上帅图1,2,3,4]
- Ubuntu16.04 搭建SVN服务器(建立版本仓及import和checkout代码)
- wpf中的点击窗口放大放小按钮怎么写_Python tkinter教程01:创建窗口
- Android初级开发笔记-- activity启动模式的学习(1)
- [Jobdu] 题目1214:丑数
- 520戏精上身!纸短情长,一句顶一万句的花式告白语抱走不谢!
- shell编程学习笔记--整数自增
- PLSQL Developer连接Oracle数据库
- linux shell编程学习笔记(9)正则表达式