Opencv中ANN神经网络使用示例
来源:互联网 发布:java初级教程 编辑:程序博客网 时间:2024/06/06 17:42
原文链接:点击打开链接
前一段儿想用OpenCV做一下数字识别,用神经网络做识别。
在网上搜了一下关于opencv中ANN的使用方法,@小魏的修行路 的【模式识别】OpenCV中使用神经网络 CvANN_MLP 这篇文章写得挺好,照搬里面的例程运行了一下,发现有些错误,而且从他最后的结果图片来看明显是分类分错了。但是他的这篇博文还是写的挺好的,简单,通俗易懂。关于OPENCV中神经网络相关的使用方法这里就不作介绍了,大家可以直接看他的博客。这里说一下例程的简单思路:
1.首先定义两种类型的若干个点,
2.然后利用这些样本点训练出一个模型,
3.新建一张图片,使用图片中的每一个像素作为测试点,利用上一步训练出的模型把这些像素分为两类,并用不同的颜色标记出来。
这里是程序运行的结果:
以下源码只是对 @小魏的修行路 的程序作了小部分改动:
//编程环境:VS2010 + Opencv2.4.8#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; //(Back Propagation,BP)反向传播算法 params.bp_dw_scale=0.1; params.bp_moment_scale=0.1; // Set up training data 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);//CvANN_MLP::SIGMOID_SYM ,选用sigmoid作为激励函数 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 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;}
阅读全文
0 0
- Opencv中ANN神经网络使用示例
- Opencv中ANN神经网络使用示例
- 神经网络ANN分类器及OpenCV实现
- 神经网络 ANN 分类器 OpenCV实现 例子
- ANN神经网络
- 神经网络ANN
- OpenCV中使用神经网络 CvANN_MLP
- OpenCV中使用神经网络 CvANN_MLP
- OpenCV中使用神经网络 CvANN_MLP
- OpenCV中使用神经网络 CvANN_MLP
- opencv中使用bp神经网络
- OpenCV实现车牌识别,OCR分割,ANN神经网络
- OpenCV实现车牌识别,OCR分割,ANN神经网络
- 【模式识别】OpenCV中使用神经网络 CvANN_MLP
- 【模式识别】OpenCV中使用神经网络 CvANN_MLP
- 【模式识别】OpenCV中使用神经网络 CvANN_MLP
- 【模式识别】OpenCV中使用神经网络 CvANN_MLP
- 人工神经网络(ANN)
- STM32串口使用
- File类的构造方法以及常用方法
- Android中的IPC方式
- HDU
- 【第4章】Python外壳:代码结构
- Opencv中ANN神经网络使用示例
- 【TensorFlow】第三课 卷积神经网络与图像应用
- sql优化
- java 正则杂记
- 深度优先搜索和广度优先搜索( DFS&BFS )
- 【Java编程】多线程之线程间的通信
- spring中的异步事件
- 多线程有几种实现方法?同步有几种实现方法?
- 集合的嵌套