前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >数字识别

数字识别

作者头像
叶子陪你玩
发布2022-02-08 18:39:39
1.6K0
发布2022-02-08 18:39:39
举报

上篇文章提了一下模型,有点意思同学让举个例子写篇,拖了几天,今天晚上抽空补上。

我们都知道,计算机它只会计算,其它的能力都是我们赋予给它的,它只是按照我们的步骤去执行而已。

比如机器学习,关于它的定义有很多,不过也有很多共同点,里面都强调了经验还有数据;

我个人觉得很多先进的方法或者理念都是来源于人的大脑,比如人是如何学习的,这是一个很有意思的问题,尤其是刚出生的小孩,从一无所知,是如何慢慢建立起他的认知,认识生活中各种各样的动物等等。

理论和概念总是比较抽象的,通过实例来会更好理解,不过话又说回来,真正的理解就是能够对各种实例抽象出它们的共同点,这样才能推广到其它。

下面开始正文。

上篇的内容最后一个案例代码,其实来自官方的手写数字识别案例教程,我自己基于里面的内容自己删减了一些。

下面是其链接:

https://scikit-learn.org/stable/auto_examples/classification/plot_digits_classification.html

不过文章中代码可能还是比较难理解,主要里面没有对数据集进行讲解。

这里主要讲一下里面的数据集,sklearn自带了很多数据集,在安装包的data里面,就有手写数字识别数据集。

虽说是数字识别,不过这个数据集里面并没有实际图片。这个数据集只是一个csv文件,

打开文件可以看见一共有1797行,65列,每一行前64个数字表示一张8*8图片的数据,也就是图片的特征值;

最后一个数字叫做标签,就是这个图片的真实值;

大概清楚了里面的数据集后,下面看看其中的一些代码。

这里的数字识别核心的可以分为下面几步:

第一步:创建分类器模型

简单理解,可以看作一个映射函数,传入一个数据,就可以返回一个结果给你。

代码语言:javascript
复制
# 创建分类器
clf = svm.SVC(gamma=0.001)

第二步:准备训练数据集和测试数据

这些数据集前面讲了,都是有正确答案的。

代码语言:javascript
复制
# 分割数据集,训练数据和测试数据各50%
X_train, X_test, y_train, y_test = train_test_split(
    data, digits.target, test_size=0.5, shuffle=False
)

第三步:训练分类器模型

通过上面的数据训练后,分类器就可以用来进行数字图片识别了,不过识别前都会通过测试数据测试一下,先看看准确率怎么样,确定效果还不错,就可以用来测试没有见过的数字图片了。

代码语言:javascript
复制
# 训练模型
clf.fit(X_train, y_train)
# 预测测试集
print(X_test[:1])
predicted = clf.predict(X_test[:1])

第四步:识别未见过的图片

代码语言:javascript
复制
# 预测一张新图片
img = cv2.imread('1.jpg')
img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
img = cv2.resize(img,(8,8))
data = img.reshape(64,)
r= clf.predict(data)
print(r)

注:第四步如果你随意拿一张图片进来识别,大概率都是识别不出来的,第一个可能你的特征数量与模型特征数量不一致(不过我上面的代码已经进行了处理),第二个这个图片与训练的数据偏差很大。

实际训练的图片。

如果将下面的数据(和训练的数据风格类似)转换成图片,再拿去识别是没问题的。

代码语言:javascript
复制
[0,0,7,15,13,1,0,0,0,8,13,6,15,4,0,0,0,2,1,13,13,0,0,0,0,0,2,15,11,1,0,0,0,0,0,1,12,12,1,0,0,0,0,0,1,10,8,0,0,0,8,4,5,14,9,0,0,0,7,13,13,9,0,0]

相信通过上面一个例子,你可能大概知道这个流程了,不过中间的很多细节相信你还是很懵的,通过要给函数,传入数据,就可以训练出一个分类器,它到底是怎样训练的呢?

要想完全理解一个内容,造个简单的轮子是很有效且有必要的,如果你能自己做出一个同样的功能,那你大概率是明白其原理的。

我没有看过那些方法源码,不过一般的像上面的这种监督学习(也就是提供了答案的),其实后面应该就是相似度匹配的过程。

有一车牌,经过过预处理,并裁剪出对应的每个字符。

如何输入其中一张图片的名称,告诉你这个图片的数字是几呢?

实现过程:

1.准备好数据:

这是我很早之前下载的一个手写数字数据,里面有大量的图片,我处理了一下,每个文件夹中放了对应的20张图片。

2.从图片文件夹中将所有数字图片读取出来

这里只是做了数字图片的读取,所以只能识别数字。

3.定义一个单张图片匹配的方法。

4.最后找到最匹配的图片

实际测试:

以上这个方法识别会比较慢,因为会不断通过IO口打开图片,这个是非常影响速度的,可以像自带的案例一样,将所有数据变成数字导入到一个csv文件中,同时打上标签,处理速度应该会更快,这里的匹配代码似乎看不出什么机器学习,如果封装一下,应该会差不多吧。

刨除概念,仅仅使用其实还是很简单的,同样还有神经网络的,不过机制不同,感兴趣可以自己了解。

上面的内容只是个人理解,不保证正确性。

本文参与?腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2022-01-16,如有侵权请联系?cloudcommunity@tencent.com 删除

本文分享自 叶子陪你玩编程 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与?腾讯云自媒体分享计划? ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
文件存储
文件存储(Cloud File Storage,CFS)为您提供安全可靠、可扩展的共享文件存储服务。文件存储可与腾讯云服务器、容器服务、批量计算等服务搭配使用,为多个计算节点提供容量和性能可弹性扩展的高性能共享存储。腾讯云文件存储的管理界面简单、易使用,可实现对现有应用的无缝集成;按实际用量付费,为您节约成本,简化 IT 运维工作。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
http://www.vxiaotou.com