【无标题】

1.简介

    ANN是指由大量的处理单元(神经元) 互相连接而形成的复杂网络结构,是对人脑组织结构和运行机制的某种抽象、简化和模拟。 [1]   [人工神经网络](https://baike.baidu.com/item/人工神经网络/382460)(Artificial Neural Network,简称ANN ),以数学模型[模拟神经元](https://baike.baidu.com/item/模拟神经元/12726594)活动,是基于模仿大脑神经网络结构和功能而建立的一种[信息处理系统](https://baike.baidu.com/item/信息处理系统/9873668)。

    人工神经网络有多层和单层之分,每一层包含若干神经元,各神经元之间用带可变权重的有向弧连接,网络通过对已知信息的反复学习训练,通过逐步调整改变神经元连接权重的方法,达到处理信息、模拟输入输出之间关系的目的。它不需要知道输入输出之间的确切关系,不需大量参数,只需要知道引起输出变化的非恒定因素,即非常量性参数。因此与传统的数据处理方法相比,神经网络技术在处理模糊数据、随机性数据、非线性数据方面具有明显优势,对规模大、结构复杂、信息不明确的系统尤为适用。

    由Minsley和Papert提出的多层前向神经元网络(也称[多层感知器](https://baike.baidu.com/item/多层感知器/10885549))是最为常用的网络结构

2.ANN的原理

全连接神经网络(Full Connected FNN)原理图

[(img-rawrW4FK-1656834365851)(https://secure2.wostatic.cn/static/diD7oShKTiiS4jgHSwRJRM/image.png)]

特点:

  1. 输入层→中间层→输出层
  2. 同一层的神经元没有连接
  3. 第N-1层的输出是第N层的输入

3.OpenCV代码实现


// 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 输出层节点:5 中间隐含层节点:2

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

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

Mat sampleMat = (Mat_<float>(1,5) << i,j,0,0,0);
Mat responseMat;
bp.predict(sampleMat,responseMat);

完整程序代码(其他博主示例代码只适用于opencv3以下的版本)

//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);
      float response=0.0f;
      for(int k=0;k<5;i++){
      //  cout<<p[k]<<" ";
        response+=p[k];
      }
      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);
 
}

OpenCV4.4+Ubuntu20.04代码

#include<iostream>
int main()
{

  return 0;
}

参考文章
ANN(人工神经网络) - 百度百科
人工神经网络(ANN)模型简介
【模式识别】OpenCV中使用神经网络 CvANN_MLP

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值