Opencv3神经网络的使用

Ann神经网络,看网上没搜到相关的博客,所有参照以前旧版的ANN改写了下新版的ANN使用方法


参考了博客,把2.4版本的旧版cvAnn改成了新版的ml::ANN_MLP,如果有问题欢迎留言交流~

结果如下:


下面就是简单粗暴的代码了:

//编程环境:VS2015 + Opencv3.1

#include<opencv2/opencv.hpp>
#include <iostream>  
#include <string>  

using namespace std;
using namespace cv;
using namespace ml;
int main()
{

	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



	Ptr<ANN_MLP> ann = ANN_MLP::create();
	ann->setLayerSizes(layerSizes);//
	ann->setActivationFunction(ANN_MLP::SIGMOID_SYM);
//	ann->setTermCriteria(TermCriteria(TermCriteria::MAX_ITER + TermCriteria::EPS, 300, FLT_EPSILON));
	ann->setTrainMethod(ANN_MLP::BACKPROP,0.1,0.9);
	Ptr<TrainData> tData = TrainData::create(trainingDataMat, ROW_SAMPLE, labelsMat);
	ann->train(tData);

																 // 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);
	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;
			ann->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;
}


祝机器学习愉快~

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

朱铭德

五毛也是爱٩(●´৺`●)૭

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值