您的位置:首页 > 运维架构

opencv中的机器学习

2015-08-13 23:19 288 查看
主要内容翻译自learning opencv 2.0

机器学习的目的是把数据转换成信息。。。。通过从数据从提取规则或模式做到。这个过程叫做学习

如果数据是已标记的叫监督学习,如果未标记叫做无监督学习。

如果用一个名称来标记数据,我们要做的是分类。如果用一个数值来标记数据,我们要做的是回归。

Supervised learning also comes in shades of gray:(这话翻译不来)

监督学习可以是一对一的,也可以包含延迟学习(或者叫加强学习)--在一系列的数据后给一个奖励或惩罚标签。监督学习还有一些数据没有标签,叫做半监督学习,或者噪声标签(错误的标签)。

相反的,聚簇算法是对未标记的数据自动分类。聚簇结果可以形成一个特征向量提交给高级的有监督的分类器。

机器学习中常用的两个方法:聚簇和分类overlap with计算机视觉中的两个主要任务:识别和分割。

似然方法在opencv中支持较少,因为这些方法比较新还在发展中,Opencv 倾向支持diccriminative算法而不是generative算法

数据准备好后,你必须选择一种分类器。分类器的选择一般依据:计算量,数据,内存,如果实时性要求较高,最近邻,普通贝叶斯,决策树比较好。如果要考虑内存,boosting和随机树比较好,要求最好的性能,可以试下boosting或随机树。

为了保证学习结果更加符合真实情况。交叉验证,bootstrapping,bootstrapping的效果比交叉验证好。

另外两个有用的调整分类器性能的方法是描绘ROC(受试者工作特征)和制作confusion matrix(混淆矩阵)

2009-1-27今天学习下mlp,就是熟悉的bp网络。理论知识可以看神经网络设计中文版。learning opencv中关于mlp基本没介绍,但是可以看opencv手册。

但给出了一个c++的例子。

第一步是数据准备

第二步是创建或者说初始化一个mlp网络,

int layer_sz[] = { data->cols, 100, 100, class_count };//输入层的元素个数是data-cols,隐层1,隐层2分别是100,100,输出层是class-count,

CvMat layer_sizes = cvMat( 1, (int)(sizeof(layer_sz)/sizeof(layer_sz[0])), CV_32S, layer_sz );//整理成mlp需要的格式

mlp.create( &layer_sizes );//创建

第3步是训练

mlp.train( &train_data, new_responses, 0, 0,

CvANN_MLP_TrainParams(cvTermCriteria(CV_TERMCRIT_ITER,300,0.01),

CvANN_MLP_TrainParams::RPROP,0.01));

cvReleaseMat( &new_responses );

new_responses是网络的输出,这里是特征的标签。

第4步就是识别了。

mlp.predict( &sample, mlp_response ); 识别结果是各个可能值的概率。

所以要

cvMinMaxLoc( mlp_response, 0, 0, 0, &max_loc, 0 );

opencv的例子中,数据是来自mnist。

从以上数据来看,关键一点就是layer_sz是怎么确定的。

另外,就是训练时各个参数的含义了。

基本上看例子就能懂了。也可以看下下面的博客

http://blog.csdn.net/anders0821/archive/2009/05/04/4147230.aspx

我把这些方法全部用c#进行了封装。更加符合c#程序员的习惯。

在对旋转和倾斜字符进行识别时达到94%的识别率。不过训练集和测试集都是用我自己的程序生成的。应用到具体验证码上不知道识别率怎么样。主要是准备样本要花很多时间。等寒假结束再来做这个工作。

版权声明:本文为博主原创文章,未经博主允许不得转载。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: