ANN—— Artificial Neural Networks 人工神经网络

//定义人工神经网络
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.;

两种训练方法:BACKPROP 与 RPROP

BACKPROP的两个参数:

RPROP的四个参数:

//  training data
float labels[][] = {{,,,,},{,,,,},{,,,,}};
Mat labelsMat(, , CV_32FC1, labels); float trainingData[][] = { {,,,,},{,,,,}, {,,,,} };
Mat trainingDataMat(, , CV_32FC1, trainingData);
// layerSizes设置了有三个隐含层的网络结构:输入层,三个隐含层,输出层。输入层和输出层节点数均为5,中间隐含层每层有两个节点 Mat layerSizes=(Mat_<int>(,) << ,,,,); //create第二个参数可以设置每个神经节点的激活函数,默认为CvANN_MLP::SIGMOID_SYM,即Sigmoid函数
//同时提供的其他激活函数有Gauss(CvANN_mlp::GAUSSIAN)和阶跃函数(CvANN_MLP::IDENTITY)。
 bp.create(layerSizes,CvANN_MLP::SIGMOID_SYM);   //CvANN_MLP::SIGMOID_SYM  
bp.train(trainingDataMat, labelsMat, Mat(),Mat(), params);
//预测新节点
Mat sampleMat = (Mat_<float>(,) << i,j,,,);
Mat responseMat;
bp.predict(sampleMat,responseMat);

float CvANN_MLP::predict(constMat&inputs,Mat&outputs)

图像进行特征提取,把它保存在inputs里,通过调用predict函数,我们得到一个输出向量,它是一个1*nClass的行向量,

其中每一列说明它与该类的相似程度(0-1之间),也可以说是置信度。我们只用对output求一个最大值,就可得到结果。

完整代码:

#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; //(Back Propagation,BP)反向传播算法
params.bp_dw_scale=0.1;
params.bp_moment_scale=0.1; float labels[][] = {{0.9,0.1},{0.1,0.9},{0.9,0.1},{0.1,0.9},{0.9,0.1},{0.9,0.1},{0.1,0.9},{0.1,0.9},{0.9,0.1},{0.9,0.1}};
//这里对于样本标记为0.1和0.9而非0和1,主要是考虑到sigmoid函数的输出为一般为0和1之间的数,只有在输入趋近于-∞和+∞才逐渐趋近于0和1,而不可能达到。
Mat labelsMat(, , CV_32FC1, labels); float trainingData[][] = { {,},{,}, {,}, {,},{,}, {,}, {,},{,}, {,}, {,} };
Mat trainingDataMat(, , CV_32FC1, trainingData);
Mat layerSizes=(Mat_<int>(,) << , , , , ); //5层:输入层,3层隐藏层和输出层,每层均为两个perceptron
bp.create(layerSizes,CvANN_MLP::SIGMOID_SYM);
bp.train(trainingDataMat, labelsMat, Mat(),Mat(), params);
int width = , height = ;
Mat image = Mat::zeros(height, width, CV_8UC3);
Vec3b green(,,), blue (,,); for (int i = ; i < image.rows; ++i)
{
for (int j = ; j < image.cols; ++j)
{
Mat sampleMat = (Mat_<float>(,) << i,j);
Mat responseMat;
bp.predict(sampleMat,responseMat);
float* p=responseMat.ptr<float>();
//
if (p[] > p[])
{
image.at<Vec3b>(j, i) = green;
}
else
{
image.at<Vec3b>(j, i) = blue;
}
}
}
// Show the training data
int thickness = -;
int lineType = ;
circle( image, Point(, ), , Scalar( , , ), thickness, lineType);
circle( image, Point(, ), , Scalar( , , ), thickness, lineType);
circle( image, Point(, ), , Scalar( , , ), thickness, lineType);
circle( image, Point(, ), , Scalar( , , ), thickness, lineType);
circle( image, Point(, ), , Scalar(, , ), thickness, lineType);
circle( image, Point(, ), , Scalar(, , ), thickness, lineType);
circle( image, Point(, ), , Scalar(, , ), thickness, lineType);
circle( image, Point(, ), , Scalar(, , ), thickness, lineType);
circle( image, Point(, ), , Scalar(, , ), thickness, lineType);
circle( image, Point(, ), , Scalar(, , ), thickness, lineType); imwrite("result.png", image); // save the image imshow("BP Simple Example", image); // show it to the user
waitKey(); return ;
}

OpenCV——ANN神经网络的更多相关文章

  1. 目前所有的ANN神经网络算法大全

    http://blog.sina.com.cn/s/blog_98238f850102w7ik.html 目前所有的ANN神经网络算法大全 (2016-01-20 10:34:17) 转载▼ 标签: ...

  2. opencv BP神经网络使用过程

       1.OpenCV中的神经网络 OpenCV中封装了类CvANN_MLP,因而神经网络利用很方便.   首先构建一个网络模型:     CvANN_MLP ann;     Mat structu ...

  3. OpenCV 之 神经网络 (一)

    人工神经网络(ANN) 简称神经网络(NN),能模拟生物神经系统对真实物体所作出的交互反应,是由具有适应性的简单单元(称为神经元)组成的广泛并行互连网络. 1  神经元 1.1  M-P 神经元 如下 ...

  4. ANN神经网络——实现异或XOR (Python实现)

    一.Introduction Perceptron can represent AND,OR,NOT 用初中的线性规划问题理解 异或的里程碑意义 想学的通透,先学历史! 据说在人工神经网络(artif ...

  5. ANN神经网络——Sigmoid 激活函数编程练习 (Python实现)

    # ---------- # # There are two functions to finish: # First, in activate(), write the sigmoid activa ...

  6. OpenCV进阶之路:神经网络识别车牌字符

    1. 关于OpenCV进阶之路 前段时间写过一些关于OpenCV基础知识方面的系列文章,主要内容是面向OpenCV初学者,介绍OpenCV中一些常用的函数的接口和调用方法,相关的内容在OpenCV的手 ...

  7. 使用HOG特征+BP神经网络进行车标识别

    先挖个坑,快期末考试了,有空填上w 好了,今晚刚好有点闲,就把坑填上吧. //-------------------------------开篇---------------------------- ...

  8. OpenCV——手势识别

    使用ANN神经网络训练数据后进行手势识别. #include "header.h" int main() { ; //训练每类图片数量 ; //训练类数3:石头剪刀布 ; ; st ...

  9. Python实现一个简单的微信跳一跳辅助

    1.  前言 微信的跳一跳相信大家都很熟悉了,而且现在各种外挂.辅助也是满天飞,反正本人的好友排行榜中已经是八九百都不足为奇了.某宝上一搜一堆结果,最低的居然只要3块多,想刷多少分就刷多少分,真是离谱 ...

随机推荐

  1. Linux下MySQL的彻底卸载和安装配置字符集

    前言: Linux环境下MySQL的安装和配置在网上已经有很多教程了.之所以写这篇文章是因为在配置字符集的时候找了网上的一些教程发现并不能用导致折腾了一阵子.下面的教程均是亲自实践. MySQL的彻底 ...

  2. jQuery源码分析1

    写在开头: 昨天开始,我决定要认真的看看jQuery的源码,选择1.7.2,源于公司用的这个版本.由于源码比较长,这将会是一个比较持久的过程,我将要利用业余时间,和偶尔上班不算忙的时间来进行.其实原本 ...

  3. POJ2002 二分查找&哈希

    问题重述: 给定整数n,以及n个点的坐标xi, yi.求这n个点可以组成的正方形的数目(每个点可重复使用). 分析: 根据正方形的性质,给定两个点就能确定可能构成的两个正方形的另外两个顶点.因此,只需 ...

  4. 向asp.net项目中添加控件AspNetPager

    1.打开项目,把.dll文件放入项目中: 2.在工具栏中添加一个自定义选项卡

  5. C语言初学 简单定义圆的面积计算问题

    #include<stdio.h> #define PI 3.14159 main() { double a; scanf("%lf",&a); printf( ...

  6. ubuntu12.04下同步cm10源码(个人记录,当作笔记)

    环境:AMD N850,4G,ubuntu12.04 x64, 老规矩,先是各种依赖: sudo apt-get install git-core gnupg flex bison python ra ...

  7. C语言中如何获得文件大小

    方法一: 获得文件大小需要用到2个函数:fseek() , ftell() fseek()函数: 原型:intfseek(FILE *stream, long offset, int fromwher ...

  8. 使用iText生成带底图的PDF

    package com.wzh.itext; import com.itextpdf.text.Chunk; import com.itextpdf.text.Document; import com ...

  9. MFC消息映射与命令传递

    题外话:刚开始学视窗程序设计的时候,我就打印了一本Windows消息详解,里面列举了各种已定义消息的意义和作用,共10多页,在编程的时候翻翻,有时觉得很受用.我发觉很多编程的朋友,虽然每天都面对消息, ...

  10. Qt在Mac OS X下的编程环境搭建

    尊重作者,支持原创,如需转载,请附上原地址:http://blog.csdn.net/libaineu2004/article/details/46234079 在Mac OS X下使用Qt开发,需要 ...