ocr文字识别

ocr原理
1 机器学习(ML)和卷积神经网络(CNN)光学字符识别技术(OCR)
2 三种方案来识别票据,下文对这三种方案做了测试。

  1. 高阈值的自适应二值化技术。 2. 卷积神经网络(CNN)。 3. Haar特征分类器。
    3使用Opencv中的自适应阈值化函数adaptive_threshold和scikit-image框架来调整收据数据
    4 CNN只能找到文本的角度坐标,而文字的角度变化很大,
    5 使用opencv中的adaptive_threshold方法进行二值化,经过二值化处理,我们得到了一个不错的图片。
    6 文本检测 通过链接组件检测文本
    我们使用Opencv中的find Contours函数找到链接的文本组。大多数链接的组件是字符,但是也有二值化留下来嘈杂的文本,这里我们通过设置阈值的大小来过滤相关文本。
    7 通过判断文字是否高度一致来判断文本是否属于同一行。神经网络可以精准识别每个网格内的字符。
    8 对于文本识别,我们使用卷积神经网络(CNN)接收相关字体进行培训。
    LSTM网络
    图像非均匀分割技术
    9 图像非均匀分割技术
    因为收据字体是等宽的字体,所以我们决定按照字符分割字体。首先,我们需要知道每个字母的宽度。因此,字符的宽度尤为重要,我们需要估计每个字母的长度,利用函数,我们得到下图。选择多种模式来选取特定的字母宽度。
    10 从收据中提取含义
    我们使用正则表达式来查找收据中购买情况
    ocr相关知识点
    1OCR (Optical Character Recognition,光学字符识别)是指电子设备(例如扫描仪或数码相机)检查纸上打印的字符,通过检测暗、亮的模式确定其形状,然后用字符识别方法将形状翻译成计算机文字的过程;即,针对印刷体字符,采用光学的方式将纸质文档中的文字转换成为黑白点阵的图像文件,并通过识别软件将图像中的文字转换成文本格式,供文字处理软件进一步编辑加工的技术。如何除错或利用辅助信息提高识别正确率,是OCR最重要的课题,ICR(Intelligent Character Recognition)的名词也因此而产生。衡量一个OCR系统性能好坏的主要指标有:拒识率、误识率、识别速度、用户界面的友好性,产品的稳定性,易用性及可行性等。
    2 OCR软件主要是由下面几个部分组成。
    图像输入、预处理:
    图像输入:对于不同的图像格式,有着不同的存储格式,不同的压缩方式,目前有OpenCV,CxImage等开源项目 。预处理:主要包括二值化,噪声去除,倾斜较正等
    3 二值化:
    对摄像头拍摄的图片,大多数是彩色图像,彩色图像所含信息量巨大,对于图片的内容,我们可以简单的分为前景与背景,为了让计算机更快的,更好的识别文字,我们需要先对彩色图进行处理,使图片只前景信息与背景信息,可以简单的定义前景信息为黑色,背景信息为白色,这就是二值化图了。
    4 噪声去除:
    对于不同的文档,我们对噪声的定义可以不同,根据噪声的特征进行去噪,就叫做噪声去除
    倾斜较正:
    由于一般用户,在拍照文档时,都比较随意,因此拍照出来的图片不可避免的产生倾斜,这就需要文字识别软件进行较正。
    版面分析:
    将文档图片分段落,分行的过程就叫做版面分析,由于实际文档的多样性,复杂性,因此,目前还没有一个固定的,最优的切割模型。
    字符切割:
    由于拍照条件的限制,经常造成字符粘连,断笔,因此极大限制了识别系统的性能,这就需要文字识别软件有字符切割功能。
    字符识别:
    这一研究,已经是很早的事情了,比较早有模板匹配,后来以特征提取为主,由于文字的位移,笔画的粗细,断笔,粘连,旋转等因素的影响,极大影响特征的提取的难度。
    版面恢复:
    人们希望识别后的文字,仍然像原文档图片那样排列着,段落不变,位置不变,顺序不变地输出到word文档、pdf文档等,这一过程就叫做版面恢复。
    后处理、校对:
    根据特定的语言上下文的关系,对识别结果进行较正,就是后处理。
    5 影像输入、影像前处理、文字特征抽取、比对识别、最后经人工校正将认错的文字更正,将结果输出。
    【OCR技术系列之一】字符识别技术总览
    1OCR流程
    1判断页面上的文本朝向
    2第一件事就是进行图像预处理做角度矫正和去噪
    3对文档版面进行分析,进每一行进行行分割,把每一行的文字切割下来,最后再对每一行文本进行列分割,切割出每个字符,将该字符送入训练好的OCR识别模型进行字符识别,得到结果。
    4 用语法检测器去纠正这种拼写错误
    5 版面分析 -> 预处理-> 行列切割 -> 字符识别 -> 后处理识别矫正
    【OCR技术系列之二】文字定位与切割

1 图片预处理,把文本位置矫正,把噪声去除,然后才可以进行进一步的字符分割和文字识别。
2在预处理工作做好之后,我们就可以开始切割字符了。最普通的切割算法可以总结为以下几个步骤:
对图片进行水平投影,找到每一行的上界限和下界限,进行行切割
对切割出来的每一行,进行垂直投影,找到每一个字符的左右边界,进行单个字符的切割
3 水平投影,就是对一张图片的每一行元素进行统计(就是往水平方向统计),然后我们根据这个统计结果画出统计结果图,进而确定每一行的起始点和结束点。
4 //获取文本的投影以用于分割字符(垂直,水平),默认图片是白底黑色

5 通过上面的水平投影图,确定每一行文字的位置
以每个小山峰的起始结束点作为我们文本行的起始结束点,当然我们要对这些山峰做些约束,比如这些山峰的跨度不能太小。这样子我们就得到每一个文本行的位置,接着我们就根据这些位置将每个文本行切割下来用于接下来的单个字符的切割。
6 垂直投影求出来每个字符的边界值进行单个字符切割
7 针对行字符分割,左右偏旁的字难以分割的情况,我觉得可以做以下处理:
先用通用的分割方法切割字符,得到一堆候选的切割字符集合。
统计字符集合的大多数字符的尺寸,作为标准尺寸。
根据标准尺寸选出标准的字符,切割保存。并对切割保存好的字符原位置涂成白色
对剩下下来的图片进行腐蚀,让字体粘连。
用1中算法再次分割,得到完整字体集合。

int GetTextProjection(Mat &src, vector<int>& pos, int mode)
{
    if (mode == V_PROJECT)
    {
        for (int i = 0; i < src.rows; i++)
        {
            uchar* p = src.ptr<uchar>(i);
            for (int j = 0; j < src.cols; j++)
            {
                if (p[j] == 0)  //是黑色像素
                {
                    pos[j]++;
                }
            }
        }
    }
    else if (mode == H_PROJECT)
    {
        for (int i = 0; i < src.cols; i++)
        {

            for (int j = 0; j < src.rows; j++)
            {
                if (src.at<uchar>(j, i) == 0)
                {
                    pos[j]++;
                }
            }
        }
    }

    return 0;
}
```cpp


**【OCR技术系列之三】大批量生成文字训练集**
先捋一捋思路,生成文字集需要什么步骤:
确定你要生成多少字体,生成一个记录着汉字与label的对应表。
确定和收集需要用到的字体文件。
生成字体图像,存储在规定的目录下。
适当的数据增强。
2 我们可以做的一些图像增强工作有这些:
文字扭曲
背景噪声(椒盐)
文字位置(设置文字的中心点)
笔画粘连(膨胀来模拟)
笔画断裂(腐蚀来模拟)
文字倾斜(文字旋转)
多种字体
3 文字图像生成
首先是定义好输入参数,其中包括输出目录、字体目录、测试集大小、图像尺寸、图像旋转幅度等等

**【OCR技术系列之四】基于深度学习的文字识别**
用深度学习做文字识别,用的网络当然是CNN,那具体使用哪个经典网络?VGG?RESNET?还是其他?我想了下,越深的网络训练得到的模型应该会更好,但是想到训练的难度以及以后线上部署时预测的速度,我觉得首先建立一个比较浅的网络(基于LeNet的改进)做基本的文字识别,然后再根据项目需求,再尝试其他的网络结构。这次任务所使用的深度学习框架是强大的Tensorflow。
2 第一步当然是搭建网络和计算图
其实文字识别就是一个多分类任务,比如这个3755文字识别就是3755个类别的分类任务。我们定义的网络非常简单,基本就是LeNet的改进版,值得注意的是我们加入了batch normalization。另外我们的损失函数选择sparse_softmax_cross_entropy_with_logits,优化器选择了Adam,学习率设为0.1
3  
**【OCR技术系列之五】自然场景文本检测技术综述(CTPN, SegLink, EAST)**

文字识别分为两个具体步骤:文字的检测和文字的识别,
1 找出每个文本在图片中出现的位置,因为我们的类别只有2个(有文字和没文字),看起来就像一个简单的单类别目标检测的任务,自然而然我们就会想到用经典的目标检测网络来进行文本检测,比如经典的Faster R-CNN。
2 Faster RCNN
我们回顾一下Faster RCNN做目标检测的关键步骤有哪些:
基础网络做特征提取;
特征送入RPN做候选框提取;
分类层对候选框内物体进行分类,回归层对候选框的(x,y,w,h)进行精细调整。
3CTPN(2016)
深度神经网络叫做CTPN
先检测大物体的一小部分,等所有小部分都检测出来,大物体也就可以检测出来了。
4 最后总结一下CTPN这个流行的文本检测框架的三个闪光点:
将文本检测任务转化为一连串小尺度文本框的检测;
引入RNN提升文本检测效果;
Side-refinement(边界优化)提升文本框边界预测精准度。











你可能感兴趣的:(ocr,计算机视觉)