OpenCV中实现神经网络分类非常简单,使用CvANN_MLP定义分类器,CvANN_MLP_TrainParams设置训练参数,添加训练数据,使用train和predict进行训练和预测。

CvANN_MLP_TrainParams各训练参数说明:

term_crit:训练算法的终止标准,确定算法的最大迭代次数(对序列反向传播算法,该值乘以训练集大小)和两次迭代间权值变化量。
       Train_method 训练算法,可以是CvANN_MLP_TrainParams::BACKPROP (随机序列反向传播) 或者CvANN_MLP_TrainParams::RPROP (RPROP,默认值)。
        bp_dw_scale(只用于bp网络),该系数乘以计算出的权值梯度,推荐值为0.1。该参数可通过构造函数的param1设置。
        bp_moment_scale(只用于bp网络),该系数乘以前两次迭代的权值之差,平滑权值的随机影响,取值从0-1(0对应的特征被disable)或更大,0.1左右已经足够了。可通过构造函数的param1设置
        rp_dw0 (RPROP only):权值delta的初始化幅值,默认值为0.1,可通过构造函数的param1设置。
        rp_dw_plus(RPROP only):权值delta的增长因子,必须大于1,默认为1.2(根据算法的作者,该值大部分情况下可行)。该参数只能通过修改结构体成员来显式更改。
        rp_dw_minus (RPROP only): 权值delta的减小因子,必须小于1,默认为0.5(根据算法的作者,该值大部分情况下可行)。该参数只能通过修改结构体成员来显式更改。
        rp_dw_min (RPROP only): 权值delta的最小值,必须大于0,默认为FLT_EPSILON,可通过构造函数param2设置
        rp_dw_max (RPROP only): 权值delta的最大值,必须大于1,默认为50,该参数只能通过修改结构体成员来显式更改。
        结构体带有默认构造函数,初始化RPROP 算法参数。也有更多构造函数可以定制参数、选择bp算法,单个参数可在结构体创建后调整,使用构造方法初始化时param1可初始化化多个参数,他们往往是一样的

代码:

#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()
{CvANN_MLP bp;//设置训练参数CvANN_MLP_TrainParams params;params.train_method = CvANN_MLP_TrainParams::BACKPROP;//训练算法设置为随机序列反向传播//该系数乘以计算出的权值梯度,推荐值为0.1。params.bp_dw_scale = 0.1; //该系数乘以前两次迭代的权值之差,平滑权值的随机影响,取值从0-1(0对应的特征被disable)或更大,0.1左右已经足够了。params.bp_moment_scale = 0.1;//params.train_method=CvANN_MLP_TrainParams::RPROP;//正向传播//params.rp_dw0 = 0.1;//权值delta的初始化幅值,默认值为0.1,可通过构造函数的param1设置。 //params.rp_dw_plus = 1.2;//权值delta的增长因子,必须大于1,默认为1.2(根据算法的作者,该值大部分情况下可行)//params.rp_dw_minus = 0.5;//权值delta的减小因子,必须小于1,默认为0.5(根据算法的作者,该值大部分情况下可行)//params.rp_dw_min = FLT_EPSILON;//权值delta的最小值,必须大于0,默认为FLT_EPSILON //params.rp_dw_max = 50.;//权值delta的最大值,必须大于1,默认为50 //定义训练数据float labels[3][5] = { { 0, 0, 0, 0, 0 }, { 2, 2, 2, 2, 2 }, { 1, 1, 1, 1, 1 } };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);//神经元的层级结构,分5层,每层分支为5, 2, 2, 2, 5bp.create(layerSizes, CvANN_MLP::SIGMOID_SYM);//分类算法//CvANN_MLP::SIGMOID_SYM//CvANN_MLP::GAUSSIAN  //CvANN_MLP::IDENTITY  bp.train(trainingDataMat, labelsMat, Mat(), Mat(), params);bp.save("bp.xml");//保存训练结果//计算每个像素的分类int width = 512, height = 512;Mat image = Mat::zeros(height, width, CV_8UC3);Vec3b green(0, 255, 0), blue(255, 0, 0), red(0,0,255);// 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; k++){response += p[k];}//labels中0,1,2三种结果,我们分为三种颜色显示if (response >8)image.at<Vec3b>(j, i) = green;else if (response >4)image.at<Vec3b>(j, i) = blue;elseimage.at<Vec3b>(j, i) = red;}imwrite("result.png", image);        // save the image   imshow("BP Simple Example", image); // show it to the user  waitKey(0);}

结果:

图片分辨率为512x512,训练数据有3种结果,对应图中3个分类,分别用了3中颜色显示。

神经网络ANN分类器及OpenCV实现相关推荐

  1. 福利 | 从生物学到神经元:人工神经网络 ( ANN ) 简介

    文末有数据派THU福利哦 [ 导读 ] 我们从鸟类那里得到启发,学会了飞翔,从牛蒡那里得到启发,发明了魔术贴,还有很多其他的发明都是被自然所启发.这么说来看看大脑的组成,并期望因此而得到启发来构建智能 ...

  2. 卷积神经网络 svm分类器_使用卷积神经网络的狗品种分类器

    卷积神经网络 svm分类器 介绍 (Introduction) Do you know the breed of the dog in the picture above? If you don't ...

  3. 实现人工神经网络ANN对医疗数据分类

    2.3 使用ANN对医疗数据分类 IBM在2015年5月宣布推出Watson Health服务,收集健康数据交给Watson超级计算机进行分析.目前IBM Waston Health最主要的应用便是在 ...

  4. DL之ANN/DNN: 人工神经网络ANN/DNN深度神经网络算法的简介、应用、经典案例之详细攻略

    DL之ANN/DNN: 人工神经网络ANN/DNN深度神经网络算法的简介.应用.经典案例之详细攻略 相关文章 DL:深度学习(神经网络)的简介.基础知识(神经元/感知机.训练策略.预测原理).算法分类 ...

  5. Tensorflow2.x.x最基础的神经网络(ANN)

    Tensorflow2.x.x最基础的神经网络(ANN) 本章节主要使用Tensorflow2.x.x来搭建ANN神经网络. ANN原理 这里直接放上小伙伴ANN的原理博客~ 实现 使用ANN实现对M ...

  6. ann matlab,人工神经网络ann及其matlab仿真.ppt

    人工神经网络ann及其matlab仿真 人工神经网络 的研究方法及应用刘 长 安2004. 12. 31 引 言 利用机器模仿人类的智能是长期以来人们认识自然.改造自然和认识自身的理想. 研究ANN目 ...

  7. Tensorflow实践:用神经网络训练分类器

    正文共5873个字,3张图,预计阅读时间15分钟 . 任务: 使用tensorflow训练一个神经网络作为分类器,分类的数据点如下: 螺旋形数据点 原理 数据点一共有三个类别,而且是螺旋形交织在一起, ...

  8. 神经网络用作分类器(附代码matlab)

    神经网络用作分类器 自己实践了一下,对神经网络作分类器有了初步了解. 本文主要内容包括: (1) 介绍神经网络基本原理  (2) Matlab实现前向神经网络的方法 第0节.引例  本文以Fisher ...

  9. Python基于PyTorch实现BP神经网络ANN回归模型项目实战

    说明:这是一个机器学习实战项目(附带数据+代码+文档+视频讲解),如需数据+代码+文档+视频讲解可以直接到文章最后获取. 1.项目背景 在人工神经网络的发展历史上,感知机(Multilayer Per ...

  10. Python实现BP神经网络ANN单隐层回归模型项目实战

    说明:这是一个机器学习实战项目(附带数据+代码+文档+视频讲解),如需数据+代码+文档+视频讲解可以直接到文章最后获取. 1.项目背景 20世纪80年代中期,David Runelhart.Geoff ...

最新文章

  1. Scrum敏捷开发工具Leangoo
  2. 生成器与迭代器的区别
  3. JPG图片EXIF信息提取工具exif
  4. win7 将文件的背景色改为绿色
  5. 框架:SpringMVC常用注解总结
  6. Eclipse出现ContextLoaderListener not find
  7. Java AOP研究之how is my aop2 method called
  8. react学习(6)----react样式多用内联
  9. 详细分析如何利用python批量爬取百度图片
  10. python 编程刷题_一起刷题吧 | 100+Python编程题带你快速上手(附答案)
  11. iphone已停用怎么解锁_iPhone 已停用怎么办?使用锁屏密码需要注意
  12. 谷歌开源量子计算框架Cirq
  13. 拓端tecdat|用Rapidminer做文本挖掘的应用:情感分析
  14. VS中,DEBUG/RELEASE的宏定义不同引起的问题
  15. “程序已停止工作”问题的解决方法,停止解决方法
  16. [轻笔记]Juliav0.6配置jupyter
  17. dede config.chche.inc.php,dedecms 后台修改系统设置,但是config.cache.inc.php文件不能写入...
  18. OneNET麒麟座应用开发之九:与SD卡通讯并保存数据
  19. 数据库管理工具哪个好?强力推荐Navicat Premium 16 mac中文版
  20. Android安卓——入门学习

热门文章

  1. LINUX SHELL命令ls只列出目录名
  2. 全网首发:怎样制作CDKEY(0)-目录
  3. 机器太慢,导致获取系统剪贴板数据超时
  4. 编程基本功:while/for循环中,如果有switch,注意break是中断的哪一层
  5. WORD出错:布局也会超出内容区
  6. 从海康录像机取RTSP转发流,规律性的断流
  7. 安装APK时INSTALL_FAILED_ALREADY_EXISTS的解决办法
  8. is not allowed for source level below 1.7 的解决办法
  9. 简述RPL, DPL, CPL的区别与联系
  10. java怎么让二维数组不重复_java - 如何创建具有随机产生的,非重复数二维数组? [重复] - SO中文参考 - www.soinside.com...