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)]
特点:
- 输入层→中间层→输出层
- 同一层的神经元没有连接
- 第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