opencv 机器学习算法汇总

opencv提供了非常多的机器学习算法用于研究。这里对这些算法进行分类学习和研究,以抛砖引玉。这里使用的机器学习算法包括:人工神经网络,boost,决策树,最近邻,逻辑回归,贝叶斯,随机森林,SVM等算法等。

机器学习的过程相同,都要经历1、收集样本数据sampleData2.训练分类器mode3.对测试数据testData进行预测

这里使用一个在别处看到的例子,利用身高体重等原始信息预测男女的概率。通过一些简单的数据学习,用测试数据预测男女概率。


import org.opencv.core.Core;
import org.opencv.core.CvType;
import org.opencv.core.Mat;
import org.opencv.core.TermCriteria;
import org.opencv.ml.ANN_MLP;
import org.opencv.ml.Boost;
import org.opencv.ml.DTrees;
import org.opencv.ml.KNearest;
import org.opencv.ml.LogisticRegression;
import org.opencv.ml.Ml;
import org.opencv.ml.NormalBayesClassifier;
import org.opencv.ml.RTrees;
import org.opencv.ml.SVM;
import org.opencv.ml.SVMSGD;
import org.opencv.ml.TrainData;

public class ML {
	public static void main(String[] args) {
		System.loadLibrary(Core.NATIVE_LIBRARY_NAME);
		// 训练数据,两个维度,表示身高和体重
		float[] trainingData = { 186, 80, 185, 81, 160, 50, 161, 48 };
		// 训练标签数据,前两个表示男生0,后两个表示女生1,由于使用了多种机器学习算法,他们的输入有些不一样,所以labelsMat有三种 
		float[] labels = { 0f, 0f, 0f, 0f, 1f, 1f, 1f, 1f };
		int[] labels2 = { 0, 0, 1, 1 };
		float[] labels3 = { 0, 0, 1, 1 };
		// 测试数据,先男后女
		float[] test = { 184, 79, 159, 50 };

		Mat trainingDataMat = new Mat(4, 2, CvType.CV_32FC1);
		trainingDataMat.put(0, 0, trainingData);

		Mat labelsMat = new Mat(4, 2, CvType.CV_32FC1);
		labelsMat.put(0, 0, labels);

		Mat labelsMat2 = new Mat(4, 1, CvType.CV_32SC1);
		labelsMat2.put(0, 0, labels2);

		Mat labelsMat3 = new Mat(4, 1, CvType.CV_32FC1);
		labelsMat3.put(0, 0, labels3);

		Mat sampleMat = new Mat(2, 2, CvType.CV_32FC1);
		sampleMat.put(0, 0, test);

		MyAnn(trainingDataMat, labelsMat, sampleMat);
		MyBoost(trainingDataMat, labelsMat2, sampleMat);
		MyDtrees(trainingDataMat, labelsMat2, sampleMat);
		MyKnn(trainingDataMat, labelsMat3, sampleMat);
		MyLogisticRegression(trainingDataMat, labelsMat3, sampleMat);
		MyNormalBayes(trainingDataMat, labelsMat2, sampleMat);
		MyRTrees(trainingDataMat, labelsMat2, sampleMat);
		MySvm(trainingDataMat, labelsMat2, sampleMat);
		MySvmsgd(trainingDataMat, labelsMat2, sampleMat);
	}

	// 人工神经网络
	public static Mat MyAnn(Mat trainingData, Mat labels, Mat testData) {
		// train data using aNN
		TrainData td = TrainData.create(trainingData, Ml.ROW_SAMPLE, labels);
		Mat layerSizes = new Mat(1, 4, CvType.CV_32FC1);
		// 含有两个隐含层的网络结构,输入、输出层各两个节点,每个隐含层含两个节点
		layerSizes.put(0, 0, new float[] { 2, 2, 2, 2 });
		ANN_MLP ann = ANN_MLP.create();
		ann.setLayerSizes(layerSizes);
		ann.setTrainMethod(ANN_MLP.BACKPROP);
		ann.setBackpropWeightScale(0.1);
		ann.setBackpropMomentumScale(0.1);
		ann.setActivationFunction(ANN_MLP.SIGMOID_SYM, 1, 1);
		ann.setTermCriteria(new TermCriteria(TermCriteria.MAX_ITER + TermCriteria.EPS, 300, 0.0));
		boolean success = ann.train(td.getSamples(), Ml.ROW_SAMPLE, td.getResponses());
		System.out.println("Ann training result: " + success);
		// ann.save("D:/bp.xml");//存储模型
		// ann.load("D:/bp.xml");//读取模型

		// 测试数据
		Mat responseMat = new Mat();
		ann.predict(testData, responseMat, 0);
		System.out.println("Ann responseMat:\n" + responseMat.dump());
		for (int i = 0; i < responseMat.size().height; i++) {
			if (responseMat.get(i, 0)[0] + responseMat.get(i, i)[0] >= 1)
				System.out.println("Girl\n");
			if (responseMat.get(i, 0)[0] + responseMat.get(i, i)[0] < 1)
				System.out.println("Boy\n");
		}
		return responseMat;
	}

	// Boost
	public static Mat MyBoost(Mat trainingData, Mat labels, Mat testData) {
		Boost boost = Boost.create();
		// boost.setBoostType(Boost.DISCRETE);
		boost.setBoostType(Boost.GENTLE);
		boost.setWeakCount(2);
		boost.setWeightTrimRate(0.95);
		boost.setMaxDepth(2);
		boost.setUseSurrogates(false);
		boost.setPriors(new Mat());

		TrainData td = TrainData.create(trainingData, Ml.ROW_SAMPLE, labels);
		boolean success = boost.train(td.getSamples(), Ml.ROW_SAMPLE, td.getResponses());
		System.out.println("Boost training result: " + success);
		// boost.save("D:/bp.xml");//存储模型

		Mat responseMat = new Mat();
		float response = boost.predict(testData, responseMat, 0);
		System.out.println("Boost responseMat:\n" + responseMat.dump());
		for (int i = 0; i < responseMat.height(); i++) {
			if (responseMat.get(i, 0)[0] == 0)
				System.out.println("Boy\n");
			if (responseMat.get(i, 0)[0] == 1)
				System.out.println("Girl\n");
		}
		return responseMat;
	}

	// 决策树
	public static Mat MyDtrees(Mat trainingData, Mat labels, Mat testData) {
		DTrees dtree = DTrees.create(); // 创建分类器
		dtree.setMaxDepth(8); // 设置最大深度
		dtree.setMinSampleCount(2);
		dtree.setUseSurrogates(false);
		dtree.setCVFolds(0); // 交叉验证
		dtree.setUse1SERule(false);
		dtree.setTruncatePrunedTree(false);

		TrainData td = TrainData.create(trainingData, Ml.ROW_SAMPLE, labels);
		boolean success = dtree.train(td.getSamples(), Ml.ROW_SAMPLE, td.getResponses());
		System.out.println("Dtrees training result: " + success);
		// dtree.save("D:/bp.xml");//存储模型

		Mat responseMat = new Mat();
		float response = dtree.predict(testData, responseMat, 0);
		System.out.println("Dtrees responseMat:\n" + responseMat.dump());
		for (int i = 0; i < responseMat.height(); i++) {
			if (responseMat.get(i, 0)[0] == 0)
				System.out.println("Boy\n");
			if (responseMat.get(i, 0)[0] == 1)
				System.out.println("Girl\n");
		}
		return responseMat;
	}

	// K最邻近
	public static Mat MyKnn(Mat trainingData, Mat labels, Mat testData) {
		final int K = 2;
		TrainData td = TrainData.create(trainingData, Ml.ROW_SAMPLE, labels);
		KNearest knn = KNearest.create();
		boolean success = knn.train(trainingData, Ml.ROW_SAMPLE, labels);
		System.out.println("Knn training result: " + success);
		// knn.save("D:/bp.xml");//存储模型

		// find the nearest neighbours of test data
		Mat results = new Mat();
		Mat neighborResponses = new Mat();
		Mat dists = new Mat();
		knn.findNearest(testData, K, results, neighborResponses, dists);
		System.out.println("results:\n" + results.dump());
		System.out.println("Knn neighborResponses:\n" + neighborResponses.dump());
		System.out.println("dists:\n" + dists.dump());
		for (int i = 0; i < results.height(); i++) {
			if (results.get(i, 0)[0] == 0)
				System.out.println("Boy\n");
			if (results.get(i, 0)[0] == 1)
				System.out.println("Girl\n");
		}

		return results;
	}

	// 逻辑回归
	public static Mat MyLogisticRegression(Mat trainingData, Mat labels, Mat testData) {
		LogisticRegression lr = LogisticRegression.create();

		TrainData td = TrainData.create(trainingData, Ml.ROW_SAMPLE, labels);
		boolean success = lr.train(td.getSamples(), Ml.ROW_SAMPLE, td.getResponses());
		System.out.println("LogisticRegression training result: " + success);
		// lr.save("D:/bp.xml");//存储模型

		Mat responseMat = new Mat();
		float response = lr.predict(testData, responseMat, 0);
		System.out.println("LogisticRegression responseMat:\n" + responseMat.dump());
		for (int i = 0; i < responseMat.height(); i++) {
			if (responseMat.get(i, 0)[0] == 0)
				System.out.println("Boy\n");
			if (responseMat.get(i, 0)[0] == 1)
				System.out.println("Girl\n");
		}
		return responseMat;
	}

	// 贝叶斯
	public static Mat MyNormalBayes(Mat trainingData, Mat labels, Mat testData) {
		NormalBayesClassifier nb = NormalBayesClassifier.create();

		TrainData td = TrainData.create(trainingData, Ml.ROW_SAMPLE, labels);
		boolean success = nb.train(td.getSamples(), Ml.ROW_SAMPLE, td.getResponses());
		System.out.println("NormalBayes training result: " + success);
		// nb.save("D:/bp.xml");//存储模型

		Mat responseMat = new Mat();
		float response = nb.predict(testData, responseMat, 0);
		System.out.println("NormalBayes responseMat:\n" + responseMat.dump());
		for (int i = 0; i < responseMat.height(); i++) {
			if (responseMat.get(i, 0)[0] == 0)
				System.out.println("Boy\n");
			if (responseMat.get(i, 0)[0] == 1)
				System.out.println("Girl\n");
		}
		return responseMat;
	}

	// 随机森林
	public static Mat MyRTrees(Mat trainingData, Mat labels, Mat testData) {
		RTrees rtrees = RTrees.create();
		rtrees.setMaxDepth(4);
		rtrees.setMinSampleCount(2);
		rtrees.setRegressionAccuracy(0.f);
		rtrees.setUseSurrogates(false);
		rtrees.setMaxCategories(16);
		rtrees.setPriors(new Mat());
		rtrees.setCalculateVarImportance(false);
		rtrees.setActiveVarCount(1);
		rtrees.setTermCriteria(new TermCriteria(TermCriteria.MAX_ITER, 5, 0));
		TrainData tData = TrainData.create(trainingData, Ml.ROW_SAMPLE, labels);
		boolean success = rtrees.train(tData.getSamples(), Ml.ROW_SAMPLE, tData.getResponses());
		System.out.println("Rtrees training result: " + success);
		// rtrees.save("D:/bp.xml");//存储模型

		Mat responseMat = new Mat();
		rtrees.predict(testData, responseMat, 0);
		System.out.println("Rtrees responseMat:\n" + responseMat.dump());
		for (int i = 0; i < responseMat.height(); i++) {
			if (responseMat.get(i, 0)[0] == 0)
				System.out.println("Boy\n");
			if (responseMat.get(i, 0)[0] == 1)
				System.out.println("Girl\n");
		}
		return responseMat;
	}

	// 支持向量机
	public static Mat MySvm(Mat trainingData, Mat labels, Mat testData) {
		SVM svm = SVM.create();
		svm.setKernel(SVM.LINEAR);
		svm.setType(SVM.C_SVC);
		TermCriteria criteria = new TermCriteria(TermCriteria.EPS + TermCriteria.MAX_ITER, 1000, 0);
		svm.setTermCriteria(criteria);
		svm.setGamma(0.5);
		svm.setNu(0.5);
		svm.setC(1);

		TrainData td = TrainData.create(trainingData, Ml.ROW_SAMPLE, labels);
		boolean success = svm.train(td.getSamples(), Ml.ROW_SAMPLE, td.getResponses());
		System.out.println("Svm training result: " + success);
		// svm.save("D:/bp.xml");//存储模型
		// svm.load("D:/bp.xml");//读取模型

		Mat responseMat = new Mat();
		svm.predict(testData, responseMat, 0);
		System.out.println("SVM responseMat:\n" + responseMat.dump());
		for (int i = 0; i < responseMat.height(); i++) {
			if (responseMat.get(i, 0)[0] == 0)
				System.out.println("Boy\n");
			if (responseMat.get(i, 0)[0] == 1)
				System.out.println("Girl\n");
		}
		return responseMat;
	}

	// SGD支持向量机
	public static Mat MySvmsgd(Mat trainingData, Mat labels, Mat testData) {
		SVMSGD Svmsgd = SVMSGD.create();
		TermCriteria criteria = new TermCriteria(TermCriteria.EPS + TermCriteria.MAX_ITER, 1000, 0);
		Svmsgd.setTermCriteria(criteria);
		Svmsgd.setInitialStepSize(2);
		Svmsgd.setSvmsgdType(SVMSGD.SGD);
		Svmsgd.setMarginRegularization(0.5f);
		boolean success = Svmsgd.train(trainingData, Ml.ROW_SAMPLE, labels);
		System.out.println("SVMSGD training result: " + success);
		// svm.save("D:/bp.xml");//存储模型
		// svm.load("D:/bp.xml");//读取模型

		Mat responseMat = new Mat();
		Svmsgd.predict(testData, responseMat, 0);
		System.out.println("SVMSGD responseMat:\n" + responseMat.dump());
		for (int i = 0; i < responseMat.height(); i++) {
			if (responseMat.get(i, 0)[0] == 0)
				System.out.println("Boy\n");
			if (responseMat.get(i, 0)[0] == 1)
				System.out.println("Girl\n");
		}
		return responseMat;
	}
}

输出结果:

Ann training result: true
Ann responseMat:
[0.014712702, 0.01492399;
 0.98786205, 0.987822]
Boy

Girl

Boost training result: true
Boost responseMat:
[0;
 0]
Boy

Boy

Dtrees training result: true
Dtrees responseMat:
[0;
 1]
Boy

Girl

Knn training result: true
results:
[0;
 1]
Knn neighborResponses:
[0, 0;
 1, 1]
dists:
[5, 5;
 1, 8]
Boy

Girl

LogisticRegression training result: true
LogisticRegression responseMat:
[0;
 1]
Boy

Girl

NormalBayes training result: true
NormalBayes responseMat:
[0;
 1]
Boy

Girl

Rtrees training result: true
Rtrees responseMat:
[0;
 1]
Boy

Girl

Svm training result: true
SVM responseMat:
[0;
 1]
Boy

Girl

SVMSGD training result: true
SVMSGD responseMat:
[1;
 1]
Girl

Girl



参考:

http://www.cnblogs.com/denny402/p/5032232.html

http://www.cnblogs.com/denny402/p/5032490.html


### 回答1: OpenCV是一个开源计算机视觉库,它提供了一组用于图像处理和计算机视觉算法的函数。如果你想要集成BP神经网络算法,你需要使用OpenCV的ml模块。下面是一个简单的例子: ```python import cv2 import numpy as np # 生成训练数据 train_data = np.array([[0, 0], [0, 1], [1, 0], [1, 1]], dtype=np.float32) train_label = np.array([[0], [1], [1], [0]], dtype=np.float32) # 创建BP神经网络 bp = cv2.ml.ANN_MLP_create() bp.setLayerSizes(np.array([2, 10, 1])) bp.setActivationFunction(cv2.ml.ANN_MLP_SIGMOID_SYM) # 训练BP神经网络 criteria = (cv2.TERM_CRITERIA_MAX_ITER, 1000, 0.01) bp.train(train_data, cv2.ml.ROW_SAMPLE, train_label, criteria) # 使用BP神经网络进行预测 _, result = bp.predict(np.array([[0, 0], [0, 1], [1, 0], [1, 1]], dtype=np.float32)) print(result) ``` 在这个例子中,我们首先生成了一个包含4个样本的训练数据集,每个样本包含2个特征。然后,我们创建了一个包含3层的BP神经网络,其中第一层包含2个输入神经元,第二层包含10个隐藏神经元,第三层包含1个输出神经元。我们使用sigmoid激活函数,并使用最大迭代次数为1000和阈值为0.01的终止准则训练BP神经网络。最后,我们使用训练好的BP神经网络对4个样本进行预测,并输出预测结果。 ### 回答2: OpenCV是一个开源的计算机视觉库,提供了众多图像处理和计算机视觉相关的功能和算法。虽然OpenCV本身并不提供BP神经网络算法的实现,但我们可以通过集成其他的机器学习库来使用BP神经网络算法。 要在OpenCV中集成BP神经网络算法,可以借助其他的机器学习库,比如TensorFlow或者Keras。下面是一个大致的步骤: 1. 安装OpenCV、TensorFlow或者Keras等必要的库和依赖项。 2. 导入所需的库和模块,比如OpenCV、TensorFlow和Keras等。 3. 准备训练数据和标签,将其转化为适合BP神经网络算法的格式。 4. 构建BP神经网络模型,在Keras中可以使用Sequential模型或者Functional API来构建。 5. 编译和训练BP神经网络模型,使用Keras提供的编译和训练函数。 6. 使用训练好的BP神经网络模型进行预测或者分类,根据OpenCV提供的函数对输入数据进行预处理,并将其输入到BP神经网络模型中,得到所需的结果。 需要注意的是,以上只是一个大致的步骤,具体的实现细节和代码会根据具体情况而有所不同。此外,在集成和使用BP神经网络算法时,还需要对网路结构、训练参数等进行合理的设置,并进行适当的调整和优化。 综上所述,通过集成其他的机器学习库(如TensorFlow或者Keras),我们可以在OpenCV中使用BP神经网络算法进行图像处理和计算机视觉相关的任务。 ### 回答3: 要将BP神经网络算法集成到OpenCV中,可以按照以下步骤进行: 1. 首先,确保已经安装了OpenCV和相应的依赖库。可以通过在终端中执行适当的安装命令来完成。 2. 接下来,创建一个新的OpenCV项目。可以使用任何喜欢的集成开发环境(IDE)或文本编辑器来完成。 3. 在项目中,需要导入相关的头文件以及库文件,这些文件通常是在OpenCV安装目录中。可以使用“#include”指令来导入所需的头文件。 4. 接下来,需要加载和准备用于训练的数据集。可以使用OpenCV提供的函数和类来读取和处理图像或其他类型的数据。 5. 创建BP神经网络模型的结构。可以选择使用OpenCV的“ml”模块中的类来创建和配置神经网络。 6. 设置神经网络的超参数,如学习率、迭代次数等。 7. 进行训练。使用准备好的数据集和设置好的超参数来训练神经网络模型。可以调用相应的函数来执行训练过程。 8. 完成训练后,可以使用训练好的神经网络模型进行预测。可以通过调用相关函数并传入测试数据来获得模型的输出。 9. 对训练和测试结果进行评估和分析。可以使用OpenCV提供的一些函数和工具来计算和可视化模型的性能。 10. 最后,根据项目的需求,可以将集成了BP神经网络算法OpenCV应用程序部署到目标环境中,并进行进一步的应用和优化。 综上所述,将BP神经网络算法集成到OpenCV中需要按照特定的步骤来完成,包括导入所需的库文件、加载和准备数据、创建模型结构、设置超参数、进行训练、进行预测和评估等。通过这些步骤,可以实现使用OpenCV进行BP神经网络算法的训练和推理。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值