原文链接:OpenCV3 Java 机器学习使用方法汇总

 前言

按道理来说,C++版本的OpenCV训练的版本XML文件,在java中可以无缝使用。但要注意OpenCV本身的版本问题。从2.4 到3.x版本出现了很大的改变,XML文件本身的存储格式本身也不同,不能通用。

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;
}
}

备注:作者的代码运行无误,可直接测试。

OpenCV3 Java 机器学习使用方法汇总的更多相关文章

  1. java事件响应方法汇总(容器类监听、监听器类、AbstractAction、反射)

    Java图形用户界面中,处理事件时所必须的步骤是: 1.创建接受响应的组件(控件)2.实现相关事件监听接口3.注册事件源的动作监听器4.事件触发时的事件处理 相应的可以通过以下的集中方式来作出事件响应 ...

  2. java实现时钟方法汇总

    import java.awt.Dimension; import java.text.SimpleDateFormat; import java.util.Calendar; import java ...

  3. Java实现时间动态显示方法汇总

    这篇文章主要介绍了Java实现时间动态显示方法汇总,很实用的功能,需要的朋友可以参考下 本文所述实例可以实现Java在界面上动态的显示时间.具体实现方法汇总如下: 1.方法一 用TimerTask: ...

  4. java机器学习工具包

    下面是25个Java机器学习的工具&&库列表: 1. Weka 是一个数据挖掘任务机器学习算法的集合.这些算法可以直接应用于数据集或者在你自己的Java代码中调用.Weka 包含 数据 ...

  5. java面试笔试大汇总

    java面试笔试题大汇总5 JAVA相关基础知识 1.面向对象的特征有哪些方面 1.抽象:2.继承:3.封装:4. 多态性: 2.String是最基本的数据类型吗? 基本数据类型包括byte.int. ...

  6. 25个Java机器学习工具和库

    本列表总结了25个Java机器学习工具&库: 1. Weka集成了数据挖掘工作的机器学习算法.这些算法可以直接应用于一个数据集上或者你可以自己编写代码来调用.Weka包括一系列的工具,如数据预 ...

  7. Linux下查看线程数的几种方法汇总

    Linux下查看线程数的几种方法汇总 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.Linux下查看某个进程的线程数量 pstree命令以树状图显示进程间的关系(display ...

  8. 25个Java机器学习工具&库--转载

    本列表总结了25个Java机器学习工具&库: 1. Weka集成了数据挖掘工作的机器学习算法.这些算法可以直接应用于一个数据集上或者你可以自己编写代码来调用.Weka包括一系列的工具,如数据预 ...

  9. 转:25个Java机器学习工具和库

    转自:http://www.cnblogs.com/data2value/p/5419864.html 本列表总结了25个Java机器学习工具&库: 1. Weka集成了数据挖掘工作的机器学习 ...

随机推荐

  1. c++中的set_new_handler和new_handler

    当operator new申请一个内存失败的时候,它会进行如下的处理步骤:    1.如果存在客户指定的处理函数,则调用处理函数(new_handler),如果不存在则抛出一个异常. 2.继续申请内存 ...

  2. 从理论到实践,全方位认识DNS(实践篇)

    在理论篇中,我们基本了解了DNS的整个协议原理,但是可能还会有着下面的疑问: 为什么我想申请的域名都没了? DNS 域名还要备案,这是为什么啊? 如何将刚申请的域名绑定到自己的网站呢? 怎么才能看到那 ...

  3. win7下安装SQLSERVER2000

    来自为知笔记(Wiz)

  4. 深入理解 JBoss 7/WildFly Domain 模式启动过程

    概述 JBoss 7/WildFly 以 domain 模式启动时会启动多个 JVM.比如例如以下通过启动脚本启动 domain 模式: ./domain.sh 启动后我们查看进程: [kylin@l ...

  5. 操作系统的时区设置会影响数据库查询SYSDATE和SYSTIMESTAMP的值

    SYSDATE和SYSTIMESTAMP的值并不受数据库參数DBTIMEZONE的影响,操作系统时区的环境变量(如TZ)会影响它们的输入,由于SYSDATE和SYSTIMESTAMP实际是调用操作系统 ...

  6. research plan

  7. Android 完全退出应用程序

    随着业务逻辑越来越复杂,退出应用程序也不像之前那个直接将Activity finish()掉就可以了,在网上看到很多完全退出App的文章,但是实践之后发现,并不像文章中描述的那样,不是方法过时了,就是 ...

  8. Kaggle "Microsoft Malware Classification Challenge"——就是沙箱恶意文件识别,有 Opcode n-gram特征 ASM文件图像纹理特征 还有基于图聚类方法

    使用图聚类方法:Malware Classification using Graph Clustering 见 https://github.com/rahulp0491/Malware-Classi ...

  9. go语言笔记——数组长度不可变,但是元素值是可变的!!!

    数组声明的格式是: var identifier [len]type 例如: var arr1 [5]int 在内存中的结构是: 对索引项为 i 的数组元素赋值可以这么操作:arr[i] = valu ...

  10. LuoguP3261 [JLOI2015]城池攻占

    题目描述 小铭铭最近获得了一副新的桌游,游戏中需要用 m 个骑士攻占 n 个城池.这 n 个城池用 1 到 n 的整数表示.除 1 号城池外,城池 i 会受到另一座城池 fi 的管辖,其中 fi &l ...