Lesson 2: 单个字符识别 (sklearn)

建议系统 ubuntu
开发语言 python

单个字符识别这个属于图片分类问题。换一句话说就是给出一张图片,然后给出其分类。

这个问题已经被研究了很多年了,包括传统的svm识别两类问题(是否属于一类),然后衍生到多类问题。

sklearn上面总结了几乎大部分的识别器,是不是很多?

sklearn 识别问题概括图, 这里引用他们的图:

screenshot-from-2016-10-01-16-08-59

总体来说,所有识别都分两部分:

1:训练 fit
2:识别 predict

在这篇文章中,我们采用一个经典的数据库,mnist来进行训练识别。

sphx_glr_plot_digits_classification_001

上图是mnist的案例,图片来源于sklearn。一般来说需要把数据库切割为训练部分和测试部分,而且所有数据的维度必须相同。对于图片来说,就是说图片的长宽是固定的。这样我们可以对识别器进行训练,然后用识别器识别。

sklearn中的mnist数据库里面的图片是8×8的。

每张图片被平坦化,即为一个长度为64向量,然后数据库里面有1797个样本。可以看到第一张图片是0。

可以见到每个图片对应一个数值,就是其标签值(0-9)。接着定义一个识别器。

上面定义一个svm的识别器clf,这个识别器的参数gamma=0.001, C=100,每个识别器都有自己参数,以后教教大家如何调参数。

接着训练识别器。

很简单,就一行代码就训练了。。。这是为什么我很喜欢sklearn,架构很简单。

在训练部分中,上面的代码把数据库的最后一个图片除去了。下面是拿这个图做预测。

可以看出预测结果为8,然后对最后一个图片进行可视化,哈哈,真的是8。

screenshot-from-2016-10-01-17-49-09

SVM的缺点或者大部分的识别器的缺点是图片必须居中,正放好,不能放偏,而且像数也要归一化(density normalization),这对图像的预处理要求很高。

深度学习网络可以很好解决这些问题,见lenet的例子:

lenet

asamples

后续再介绍复杂点方法。

这篇文章的代码:lesson2

发表评论

电子邮件地址不会被公开。 必填项已用*标注