原文: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
plaincopy
  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:

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

上述代码中为其默认值。

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

[cpp] view
plaincopy
  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. float trainingData[3][5] = { {1,2,3,4,5},{111,112,113,114,115}, {21,22,23,24,25} };
  5. Mat trainingDataMat(3, 5, CV_32FC1, trainingData);
  6. Mat layerSizes=(Mat_<int>(1,5) << 5,2,2,2,5);
  7. bp.create(layerSizes,CvANN_MLP::SIGMOID_SYM);//CvANN_MLP::SIGMOID_SYM
  8. //CvANN_MLP::GAUSSIAN
  9. //CvANN_MLP::IDENTITY
  10. bp.train(trainingDataMat, labelsMat, Mat(),Mat(), params);

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

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

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

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

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

完整程序代码:

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

结果:

OpenCV中使用神经网络 CvANN_MLP相关推荐

  1. Opencv中ANN神经网络使用示例

    前一段儿想用opencv做一下数字识别,用神经网络做识别. 在网上搜了一下关于opencv中ANN的使用方法,@小魏的修行路 的[模式识别]OpenCV中使用神经网络 CvANN_MLP 这篇文章写得 ...

  2. OpenCV中的神经网络

    来源:http://blog.csdn.net/delltdk/article/details/8912867 OpenCV中封装了类CvANN_MLP,因而神经网络利用很方便. 首先构建一个网络模型 ...

  3. OpenCV中神经网络的应用

    OpenCV中神经网络的应用 OpenCV中也提供神经网络的算法,下面对其中的一些参数进行介绍. 激活函数 OpenCV中提供三种激活函数,分别是线性激活函数.sigmoid激活函数和高斯激活函数. ...

  4. OpenCV中检测ChArUco的角点(2)

    论文阅读模块将分享点云处理,SLAM,三维视觉,高精地图相关的文章.公众号致力于理解三维视觉领域相关内容的干货分享,欢迎各位加入我,我们一起每天一篇文章阅读,开启分享之旅,有兴趣的可联系微信diany ...

  5. OpenCV中使用YOLO对象检测

    点击上方"小白学视觉",选择加"星标"或"置顶" 重磅干货,第一时间送达 本文转自:opencv学堂 OpenCV在3.3.1的版本中开始正 ...

  6. 在OpenCV中基于深度学习的边缘检测

    点击上方"小白学视觉",选择加"星标"或"置顶" 重磅干货,第一时间送达 本文转自:AI算法与图像处理 导读 分析了Canny的优劣,并给出 ...

  7. opencv中使用K-近邻分类算法KNN

    K-近邻(K-Nearest Neighbors, KNN)是一种很好理解的分类算法,简单说来就是从训练样本中找出K个与其最相近的样本,然后看这K个样本中哪个类别的样本多,则待判定的值(或说抽样)就属 ...

  8. 使用OpenCV的ANN_MLP神经网络实现数字识别

    前言 1.OpenCV中的ML模块实现了前馈人工神经网络,具体地说是多层感知器(MLP),是最常用的神经网络类型. MLP由输入层,输出层和一个或多个隐藏层组成. MLP的每一层包括一个或多个与来自上 ...

  9. opencv画虚线_(四十四)OpenCV中的机器学习-SVM

    时间为友,记录点滴. 本来还想在特征点检测的道路上再走一走,学习一下Harr级联或者HOG什么的,但总有些概念感觉绕不过去.择日不如撞日,撞日不如今日.我们先揭开机器学习中的一个小角,看看大热的机器学 ...

最新文章

  1. html表单的数据保存在哪里,提交和保存表单数据
  2. Java中传值与传地址
  3. 分块查询 缓解内存开销
  4. .NET Core 又一杀器! Web Blazor框架横空出世!
  5. socket php验证客户端验证,用Socket发送电子邮件(利用需要验证的SMTP服务器)
  6. 微型计算机的使用寿命,微型计算机使用注意事项及保养的一般方法
  7. 遍历进程链表,打印pcb相关字段的内核模块
  8. 关于中文乱码问题(总结)
  9. Linux进程控制与进程优先级
  10. stm8s103k3 周期 捕获_stm8s103k3的UART发送数据问题
  11. Atitit 人工智能声音处理乐器总类以及midi规范的标示 目录 1. Atitit 乐器分类 打击乐器 1 1.1. 1.1. 打击乐器(各种鼓 三角铁等 1 2 1.2. 1.2. 管乐器
  12. 调用百度识图api实现识图vue+springboot
  13. python右对齐_Python中print函数输出时的左右对齐问题
  14. JAVA音视频解决方案----开源jtt1078源码与沟通群
  15. thinkphp 页面上循环checkbox选择的值和radio混用,if判断
  16. Linux虚拟机下载和安装简单流程
  17. 波士顿大学计算机科学的就业,波士顿大学计算机科学本科申请(附案例)
  18. asii和unicode格式字符串之间的相互转换
  19. selenium代码中创建浏览器对象_Sinno_Song_新浪博客
  20. 220413数据分析总结

热门文章

  1. 听易中天品三国---看孔融,杨修之死
  2. c# 添加图片水印,可以指定水印位置+生成缩略图[付上帅图1,2,3,4]
  3. Ubuntu16.04 搭建SVN服务器(建立版本仓及import和checkout代码)
  4. wpf中的点击窗口放大放小按钮怎么写_Python tkinter教程01:创建窗口
  5. Android初级开发笔记-- activity启动模式的学习(1)
  6. [Jobdu] 题目1214:丑数
  7. 520戏精上身!纸短情长,一句顶一万句的花式告白语抱走不谢!
  8. shell编程学习笔记--整数自增
  9. PLSQL Developer连接Oracle数据库
  10. linux shell编程学习笔记(9)正则表达式