OpenCV——ANN神经网络

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[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);
// layerSizes设置了有三个隐含层的网络结构:输入层,三个隐含层,输出层。输入层和输出层节点数均为5,中间隐含层每层有两个节点

    Mat layerSizes=(Mat_<int>(1,5) << 5,2,2,2,5);

//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>(1,5) << i,j,0,0,0);
            Mat responseMat;
            bp.predict(sampleMat,responseMat);  

完整代码:

#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[10][2] = {{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(10, 2, CV_32FC1, labels);  

    float trainingData[10][2] = { {11,12},{111,112}, {21,22}, {211,212},{51,32}, {71,42}, {441,412},{311,312}, {41,62}, {81,52} };
    Mat trainingDataMat(10, 2, CV_32FC1, trainingData);
    Mat layerSizes=(Mat_<int>(1,5) << 2, 2, 2, 2, 2);                   //5层:输入层,3层隐藏层和输出层,每层均为两个perceptron
    bp.create(layerSizes,CvANN_MLP::SIGMOID_SYM);
    bp.train(trainingDataMat, labelsMat, Mat(),Mat(), params);
    int width = 512, height = 512;
    Mat image = Mat::zeros(height, width, CV_8UC3);
    Vec3b green(0,255,0), blue (255,0,0);  

    for (int i = 0; i < image.rows; ++i)
    {
        for (int j = 0; j < image.cols; ++j)
        {
            Mat sampleMat = (Mat_<float>(1,2) << i,j);
            Mat responseMat;
            bp.predict(sampleMat,responseMat);
            float* p=responseMat.ptr<float>(0);
            //
            if (p[0] > p[1])
            {
                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(111,  112), 5, Scalar(  0,   0,   0), thickness, lineType);
    circle( image, Point(211,  212), 5, Scalar(  0,   0,   0), thickness, lineType);
    circle( image, Point(441,  412), 5, Scalar(  0,   0,   0), thickness, lineType);
    circle( image, Point(311,  312), 5, Scalar(  0,   0,   0), thickness, lineType);
    circle( image, Point(11,  12), 5, Scalar(255, 255, 255), thickness, lineType);
    circle( image, Point(21, 22), 5, Scalar(255, 255, 255), thickness, lineType);
    circle( image, Point(51,  32), 5, Scalar(255, 255, 255), thickness, lineType);
    circle( image, Point(71, 42), 5, Scalar(255, 255, 255), thickness, lineType);
    circle( image, Point(41,  62), 5, Scalar(255, 255, 255), thickness, lineType);
    circle( image, Point(81, 52), 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);  

    return 0;
}  
时间: 2024-10-24 12:28:02

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

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

http://blog.sina.com.cn/s/blog_98238f850102w7ik.html 目前所有的ANN神经网络算法大全 (2016-01-20 10:34:17) 转载▼ 标签: it   概述 1 BP神经网络 1.1 主要功能 1.2 优点及其局限性 2 RBF(径向基)神经网络 2.1 主要功能 2.2 优点及其局限性 3 感知器神经网络 3.1 主要功能 3.2 优点及其局限性 4 线性神经网络 4.1 主要功能 4.2优点及其局限性 5自组织神经网络 5.1 自组织

【opencv】神经网络识别美女

最近比较闲,想做一个判断是否是美女的算法 从网上搜集了一些图片,首先要提取这些图片中的人脸并保存作为训练集,可以参考文章: http://blog.csdn.net/qq_15947787/article/details/51393030 下面是完整的代码 //opencv2.4.9 + vs2012 + win7 x64 #include <opencv2/opencv.hpp> #include <iostream> #include <stdio.h> #incl

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

# ---------- # # There are two functions to finish: # First, in activate(), write the sigmoid activation function. # Second, in update(), write the gradient descent update rule. Updates should be # performed online, revising the weights after each da

OpenCV 神经网络

简要介绍 OpenCV的人工神经网络是机器学习算法中的其中一种,使用的是多层感知器(Multi- Layer Perception,MLP),是常见的一种ANN算法.MLP算法一般包括三层,分别是一个输入层,一个输出层和一个或多个隐藏层的神经网络组成.每一层由一个或多个神经元互相连结.一个"神经元"的输出就可以是另一个"神经元"的输入.例如,下图是一个简单3层的神经元感知器:(3个输入,2个输出以及包含5个神经元的隐藏层) MLP算法中,每个神经元都有几个输入和输出

opencv中BP神经网络的使用

参考网址: 1.http://fanjun.info/2011/07/19/opencv中神经网络的搭建/ 2.http://www.cnblogs.com/ronny/p/opencv_road_more_01.html

基于人工神经网络的数字字符识别系统demo(一):字符去噪、分割

最近尝试利用神经网络做数字字符识别,大概做了一下.整体很简陋,就是先对测试图片做下预处理,然后通过重采样提取特征,最后通过神经网络进行训练和识别.感兴趣的可以点击这里 了解一下,欢迎多多指教. 这里我大概介绍一下怎样将一副包含多个字符的图片进行去噪处理进而分割出单个字符,关于opencv中怎样使用ANN详见Opencv中ANN神经网络使用示例. 原始图: 效果图: 下面介绍一下处理步骤, 1.载入图像并作灰度化 2.二值化并作反色处理 3.提取外轮廓 4.根据轮廓大小去除噪声 5.再次查找轮廓并

OpenCV——手势识别

使用ANN神经网络训练数据后进行手势识别. #include "header.h" int main() { const int sample_num = 10; //训练每类图片数量 const int class_num = 3; //训练类数3:石头剪刀布 const int image_cols = 30; const int image_rows = 30; string Name, Path; float trainingData[class_num * sample_nu

反思:毕业入职的第一家公司

得到这第一份工作,说来还真有几分传奇.大四下学期一开学,就买好去深圳的火车票,和同学几个踏上了南漂的路.由于是穷学生,所以买了硬卧票,很巧的是在火车上遇到了一个潜江的老乡,反正火车要开一天一夜也怪无聊的,于是在火车过道找了个桌子几个年轻小伙就开始畅谈人生和憧憬未来.这位刚认识的老乡年龄和我们差不多,但社会经验比我们丰富很多,于是就说起他在中专技校里面是如何半夜溜出去上网,毕业如何被分配到工厂做车厂机加工人,说和自己同班出来做机加工人的一个女同学的女同事由于金属镁粉过敏全身都红肿,那个女同学见到这

一个典型的语音识别系统

一.语音识别技术 语音识别技术,广泛来说是指语意识别和声纹识别:从狭义上来说指语音语义的理解识别,也称为自动语音识别(ASR).其关键技术包括选择识别单元.语音端点检测.特征参数提取.声学模型及语音模型的建立.语音识别技术目前在桌面系统.智能手机.导航设备等嵌入式领域均有一定程度的应用.其主要技术难题是识别系统的适应性较差.受背景噪声影响较大,未来的发展方向应是无限词汇量连续语音非特定人语音识别系统. (1)信号处理及特征提取模块 该模块的主要任务是从输入信号中提取特征,供声学模型处理.同时,它