主要内容翻译自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是怎么确定的。
另外,就是训练时各个参数的含义了。
基本上看例子就能懂了。
我把这些方法全部用c#进行了封装。更加符合c#程序员的习惯。
在对旋转和倾斜字符进行识别时达到94%的识别率。不过训练集和测试集都是用我自己的程序生成的。应用到具体验证码上不知道识别率怎么样。主要是准备样本要花很多时间。等寒假结束再来做这个工作。