文档章节

OpenCV3的kNN算法进行OCR识别-使用Python

openthings
 openthings
发布于 2016/03/01 14:23
字数 1528
阅读 3876
收藏 2

OpenCV3的kNN算法进行OCR识别-使用Python

http://docs.opencv.org/master/d8/d4b/tutorial_py_knn_opencv.html


Goal

In this chapter

  • We will use our knowledge on kNN to build a basic OCR application.

  • We will try with Digits and Alphabets data available that comes with OpenCV.

目标

要根据我们掌握的 kNN 知识创建一个基本的 OCR 程序
使用 OpenCV 自带的手写数字和字母数据测试我们的程序

OCR of Hand-written Digits

Our goal is to build an application which can read the handwritten digits. For this we need some train_data and test_data. OpenCV comes with an image digits.png (in the folder opencv/samples/data/) which has 5000 handwritten digits (500 for each digit). Each digit is a 20x20 image. So our first step is to split this image into 5000 different digits. For each digit, we flatten it into a single row with 400 pixels. That is our feature set, ie intensity values of all pixels. It is the simplest feature set we can create. We use first 250 samples of each digit as train_data, and next 250 samples as test_data. So let's prepare them first.

1 手写数字的 OCR

我们的目的是创建一个可以对手写数字进行识别的程序。为了达到这个目 的我们需要训练数据和测试数据。OpenCV 安装包中有一副图片(/samples/ python2/data/digits.png), 其中有 5000 个手写数字(每个数字重复 500遍)。每个数字是一个 20x20 的小图。所以第一步就是将这个图像分割成 5000个不同的数字。我们在将拆分后的每一个数字的图像重排成一行含有 400 个像 素点的新图像。这个就是我们的特征集,所有像素的灰度值。这是我们能创建 的最简单的特征集。我们使用每个数字的前 250 个样本做训练数据,剩余的250 个做测试数据。先准备一下:

import numpy as np
import cv2
from matplotlib import pyplot as plt

img = cv2.imread('digits.png')
gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)

# Now we split the image to 5000 cells, each 20x20 size
cells = [np.hsplit(row,100) for row in np.vsplit(gray,50)]

# Make it into a Numpy array. It size will be (50,100,20,20)
x = np.array(cells)

# Now we prepare train_data and test_data.
train = x[:,:50].reshape(-1,400).astype(np.float32) # Size = (2500,400)
test = x[:,50:100].reshape(-1,400).astype(np.float32) # Size = (2500,400)

# Create labels for train and test data
k = np.arange(10)
train_labels = np.repeat(k,250)[:,np.newaxis]
test_labels = train_labels.copy()

# Initiate kNN, train the data, then test it with test data for k=1
knn = cv2.KNearest()
knn.train(train,train_labels)
ret,result,neighbours,dist = knn.find_nearest(test,k=5)

# Now we check the accuracy of classification
# For that, compare the result with test_labels and check which are wrong
matches = result==test_labels
correct = np.count_nonzero(matches)
accuracy = correct*100.0/result.size
print accuracy

So our basic OCR app is ready. This particular example gave me an accuracy of 91%. One option improve accuracy is to add more data for training, especially the wrong ones. So instead of finding this training data everytime I start application, I better save it, so that next time, I directly read this data from a file and start classification. You can do it with the help of some Numpy functions like np.savetxt, np.savez, np.load etc. Please check their docs for more details.

现在最基本的 OCR 程序已经准备好了,这个示例中我们得到的准确率为91%。改善准确度的一个办法是提供更多的训练数据,尤其是判断错误的那 些数字。为了避免每次运行程序都要准备和训练分类器,我们最好把它保留, 这样在下次运行是时,只需要从文件中读取这些数据开始进行分类就可以了。Numpy 函数 np.savetxt,np.load 等可以帮助我们,具体的查看相应的文档。

   1 # save the data
    2 np.savez('knn_data.npz',train=train, train_labels=train_labels)
    3 
    4 # Now load the data
    5 with np.load('knn_data.npz') as data:
    6     print data.files
    7     train = data['train']
    8     train_labels = data['train_labels']

In my system, it takes around 4.4 MB of memory. Since we are using intensity values (uint8 data) as features, it would be better to convert the data to np.uint8 first and then save it. It takes only 1.1 MB in this case. Then while loading, you can convert back into float32.

在我的系统中,占用的空间大概为 4.4M。由于我们现在使用灰度值 (unint8)作为特征,在保存之前最好先把这些数据装换成 np.uint8 格式,这样就只需要占用 1.1M 的空间。在加载数据时再转会到 float32

OCR of English Alphabets

Next we will do the same for English alphabets, but there is a slight change in data and feature set. Here, instead of images, OpenCV comes with a data file, letter-recognition.data in opencv/samples/cpp/ folder. If you open it, you will see 20000 lines which may, on first sight, look like garbage. Actually, in each row, first column is an alphabet which is our label. Next 16 numbers following it are its different features. These features are obtained from UCI Machine Learning Repository. You can find the details of these features in this page.

There are 20000 samples available, so we take first 10000 data as training samples and remaining 10000 as test samples. We should change the alphabets to ascii characters because we can't work with alphabets directly.

英文字母的 OCR

接下来我们来做英文字母的 OCR。和上面做法一样,但是数据和特征集有 一些不同。现在 OpenCV 给出的不是图片了,而是一个数据文件(/samples/ cpp/letter-recognition.data)。如果打开它的话,你会发现它有 20000 行, 第一样看上去就像是垃圾。实际上每一行的第一列是我们的一个字母标记。接 下来的 16 个数字是它的不同特征。这些特征来源于UCI Machine Learning Repository。你可以在此页找到更多相关信息。

20000 个样本可以使用,我们取前 10000 个作为训练样本,剩下的10000 个作为测试样本。我们应在先把字母表转换成 asc 码,因为我们不能直接处理字母。

import cv2
import numpy as np
    3 import matplotlib.pyplot as plt
    4 
    5 # Load the data, converters convert the letter to a number
    6 data= np.loadtxt('letter-recognition.data', dtype= 'float32', delimiter = ',',
    7                     converters= {0: lambda ch: ord(ch)-ord('A')})
    8 
    9 # split the data to two, 10000 each for train and test
   10 train, test = np.vsplit(data,2)
   11 
   12 # split trainData and testData to features and responses
   13 responses, trainData = np.hsplit(train,[1])
   14 labels, testData = np.hsplit(test,[1])
   15 
   16 # Initiate the kNN, classify, measure accuracy.
   17 knn = cv2.KNearest()
   18 knn.train(trainData, responses)
   19 ret, result, neighbours, dist = knn.find_nearest(testData, k=5)
   20 
   21 correct = np.count_nonzero(result == labels)
   22 accuracy = correct*100.0/10000
   23 print accuracy

It gives me an accuracy of 93.22%. Again, if you want to increase accuracy, you can iteratively add error data in each level.

准确率达到了 93.22%。同样你可以通过增加训练样本的数量来提高准确率。


© 著作权归作者所有

openthings
粉丝 302
博文 1110
码字总数 636346
作品 1
东城
架构师
私信 提问
OpenCV3中的机器学习算法

OpenCV3中加入了几种机器学习算法,可以将机器学习算法与图像和视频处理结合起来。可参考: OpenCV/OpenCV3计算机视觉软件支持库和最新资源 OpenCV3的最新特征 OpenCV3的人脸检测-使用Pytho...

openthings
2016/03/01
126
0
机器学习 Day 7 | K-NN算法的简单实现

机器学习第七天 K-NN算法的简单实现 数据包下载地址: https://www.xiehaoo.com/media/record/pinke/2018/08/2.KNN.zip KNN使用场景 电影可以按照题材分类,那么如何区分 动作片 和 爱情片 ...

raphah
2018/08/14
0
0
深入学习使用ocr算法识别图片中文字的方法

  公司有个需求,简单点说需要从一张图片中识别出中文,通过python来实现,当然其他程序也行,只要能实现,而小编主要学习python,所以就提了python。一个小白在网上遨游了一天,终于找到一...

战争热诚
2018/08/08
0
0
Python图像处理之图片验证码识别

  在上一篇博客Python图像处理之图片文字识别(OCR)中我们介绍了在Python中如何利用Tesseract软件来识别图片中的英文与中文,本文将具体介绍如何在Python中利用Tesseract软件来识别验证码...

jclian91
2018/06/10
0
0
tesseract OCR识别工具及pytesseract

简介 可以使用pytesseract库从图像中提取文本。Tesseract是一款由Google赞助的开源OCR。 pytesseract是python包装器,它为可执行文件提供了pythonic API。 Tesseract(/'tesərækt/) 这个词的...

人工智能python自动化测试
2018/08/22
0
0

没有更多内容

加载失败,请刷新页面

加载更多

JWT学习总结

官方 https://jwt.io 英文原版 https://www.ietf.org/rfc/rfc7519.txt 或 https://tools.ietf.org/html/rfc7519 中文翻译 https://www.jianshu.com/p/10f5161dd9df 1. 概述 JSON Web Token(......

冷基
今天
4
0
AOP的学习(1)

AOP 理解AOP编程思想(面向方法、面向切面) spring AOP的概念 方面 -- 功能 目标 -- 原有方法 通知 -- 对原有方法增强的方法 连接点 -- 可以用来连接通知的地方(方法) 切入点 -- 将用来插入...

太猪-YJ
今天
4
0
一张图看懂亮度、明度、光度、光亮度、明亮度

亮度、明度、光亮度,Luminance和Brightness、lightness其实都是一个意思,只是起名字太难了。 提出一个颜色模型后,由于明度的取值与别人的不同,为了表示区别所以就另想一个词而已。 因此在...

linsk1998
昨天
11
0
Python应用:python链表示例

前言 python链表应用源码示例,需要用到python os模块方法、函数和类的应用。 首先,先简单的来了解下什么是链表?链表是一种物理存储单元上非连续、非顺序的存储结构,数据元素的逻辑顺序是...

python小白1
昨天
5
0
Source Insight加载源码

Source Insight是一个图形化的源代码查看工具(当然也可以作为编译工具)。如果一个项目的源代码较多,此工具可以很方便地查找到源代码自建的依赖关系。 1.创建工程 下图为Snort源代码的文件...

天王盖地虎626
昨天
6
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部