我只需要为数字写一个OCR程序。我将使用MNIST数据集。问题是我不知道从哪里开始。有很多论文没有真正解释算法。我对模式识别并不是很了解。所以我有几个问题。
Q1:我在哪里可以找到算法(或教程) Q2:我如何对数字进行分类?我不需要非常先进的东西。我首先想到的是找到上半部/下半部和左侧/右侧的比例。是否有更有用和简单的分类方法。 问题3:什么是反向传播以及大多数论文中显示的层。我的简单OCR是否需要它们。
注意:我知道我的OCR程序不准确。现在这不是很重要。
答案 0 :(得分:8)
如果离您最近的工程图书馆有关于图像处理,计算机视觉或机器视觉的部分,那么幸运的是图书馆会有一本我推荐用于OCR的书的副本:
Cheriet,Kharma,Liu和Suen的字符识别系统
本书提供了对OCR技术和最新研究的相当全面的概述。它没有深入探讨任何特定的主题,但它确实提供了学术论文的参考。
确保您可以访问有关图像处理的优秀入门教材。冈萨雷斯和伍兹的这本书是许多大学的标准:
Gonzalez和Woods数字图像处理
即使是“简单”的OCR也很快变得棘手。如果你在掌握基本的图像处理原理之前先进入一个关于神经网络,贝叶斯定理等的课程,那就太过分了。
如果可以,请在尝试为手写字符编写算法之前,尝试为机器打印的字符编写一个或多个OCR算法。
Q1:我在哪里可以找到算法(或教程)
有许多OCR算法。 Cheriet书将为您提供一个良好的开端。
Q2:如何对数字进行分类?我不需要非常先进的东西。我首先想到的是找到上半部/下半部和左侧/右侧的比例。是否有更有用和简单的分类方法。
尝试实施该技术,看看它的工作情况。即使实施效果不如您所愿,实施它的经验教训可以在以后帮助您。
您还可以将字符细分为2 x 2网格或3 x 3网格,并检查相对密度的像素。与机器打印的字符不同,手写字符在直线网格中不能很好地排列。
使用规范化关联的模板匹配很简单,对于单个已知字体的机器打印字符,它可以很好地工作。它实现起来相对简单,值得学习: http://en.wikipedia.org/wiki/Cross-correlation#Normalized_cross-correlation
对于OCR,通常会将样本中的字符缩小为初始步骤。细化是一种将字符(或任何其他形状)减少到1像素宽的表示的技术。一旦你有一个变薄的角色,就可以更容易识别线条和交叉点。如果你能识别线条(或曲线)和相互作用,那么一种方法是观察每条线相对于其他线的相对位置和角度。
常见的细化算法包括Stentiford和Zhang-Suen。有一个免费版本的WinTopo,它演示了这两种算法: http://wintopo.com/
您可以查看有关“中风提取”的学术论文,但这些技术往往更难实施。
Q3:什么是反向传播以及大多数论文中显示的图层。我的简单OCR需要它们吗?
这些术语指的是人工神经网络。对于简单的OCR算法,您将对识别逻辑进行硬编码或使用简单的训练方法。可以训练人工神经网络识别软件中未经过硬编码的字符。 http://en.wikipedia.org/wiki/Neural_network
虽然您不需要学习人工神经网络来编写简单的OCR算法,但是简单的算法在手写字符方面的成功有限。
最重要的是,请记住,手写字符的OCR是一个非常棘手的问题。如果使用简单的技术可以达到20%的手写字符读取率,那么请考虑成功。