OpenCV的ml模块实现了人工神经网络(Artificial Neural Networks, ANN)最典型的多层感知器(multi-layer perceptrons, MLP)模型。由于ml模型实现的算法都继承自统一的CvStatModel基类,其训练和预测的接口都是train(),predict(),非常简单。
下面来看神经网络CvANN_MLP 的使用~
定义神经网络及参数:
//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.;
可以直接定义CvANN_MLP神经网络,并设置其参数。BACKPROP表示使用back-propagation的训练方法,RPROP即最简单的propagation训练方法。
使用BACKPROP有两个相关参数:bp_dw_scale即bp_moment_scale:
使用PRPOP有四个相关参数:rp_dw0, rp_dw_plus, rp_dw_minus, rp_dw_min, rp_dw_max:
上述代码中为其默认值。
设置网络层数,训练数据:
// 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,中间隐含层每层有两个节点。
create第二个参数可以设置每个神经节点的激活函数,默认为CvANN_MLP::SIGMOID_SYM,即Sigmoid函数,同时提供的其他激活函数有Gauss和阶跃函数。
使用训练好的网络结构分类新的数据:
然后直接使用predict函数,就可以预测新的节点:
Mat sampleMat = (Mat_<float>(1,5) << i,j,0,0,0);
Mat responseMat;
bp.predict(sampleMat,responseMat);
完整程序代码:
//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);
}
结果:
分享到:
相关推荐
在opencv 2.4.10中使用神经网络的头文件,其中包含了两个类,一个是网络类,另一个是获取HOG的类
opencv249_ann_digital_number01-彩色转灰阶imread、改变图像解析度resize、灰阶转二值化threshold、二维数据转一维数据reshape、影像数据转ML运算数据convertTo、类神经CvANN_MLP、取出ML运算结果minMaxLoc ...
opencv指纹识别FVS_opencv_指纹识别_VC++
MLP-OpenCV. Skin Detection Under Changing illumination using Neural
基于c++的opencv人脸识别 记得要安装opencv
QT+OpenCV+ANN_MLP实现简单车牌识别源码,包括训练数字和字母的代码及样本
Drowsiness_Detection_人脸识别系统_人脸识别_opencv_opencv疲劳检测_识别系统_源码.rar.rar
自己写的基于OpenCV的神经网络的python训练程序,效果一般般..要求要有numpy
利用opencv实现人脸识别,基于C++,VisualStudio2017开发,配合opencv自带的人脸识别类
OpenCV人脸识别文件haarcascade_frontalface_alt.xml下载
可以获取摄像头图像并且检测出图像轮廓,识别图像中不同形状。画出外轮廓并且用标签进行标记。
人脸识别opencv,用多种方式实现,内附多个C++代码
基于OpenCV的车牌识别,通过图像处理方法定位车牌,SVM判定,神经网络识别
Project1_vs2017_人脸识别_opencv_VS2017opencv_vs2017人脸识别_源码.rar
opencv,C++,数字图像处理,车型识别系统
大学毕业设计 使用python基于opencv开发车牌识别系统,可以实现后台传输的图片识别 使用了两个相同结构的卷积神经网络 车牌识别系统可以分为两个部分, 第一个部分是车牌定位过滤部分; 第二个部分是字符识别部分; ...
基于opencv的人脸识别代码,可用于人脸识别项目,支持动态识别
利用opencv进行车牌识别,包含识别样本