• OCR字符识别理论+实践


    1. 整体思路

    知乎: OCR文字识别用的是什么算法

    最全OCR资料汇总,awesome-OCR(论文集)

    两个步骤:

    1. 文字检测, Detection

      行定位算法,从传统的基于文本行的投影信息和二值连通域信息进行文本行检测,也有以MSER和SWT为代表的连通域分析方法进行文字检测,到目前基于深度学习技术的CTPN,pixellink,psenet等算法。

    2. 文字识别, Classification

      字符识别算法有最早的k近邻算法,贝叶斯分类算法,svm分类算法,BP神经网络,卷积神经网络,到现在流行的crnn+ctc以及cnn+rnn+attention。

    1.1. 文字检测, Detection

    近两年比较热门的 object detection modelfaster-rcnnyolo。yolo 比 faster-rcnn 的速度更快,但是在accuracy上有些损失。

    1. 先检测和提取 Text Region
    2. 接着利用 radon hough变换 等方法进行文本校正
    3. 通过投影直方图分割出单行的文本的图片

    1.2. 文字识别, Classification

    1.2.1. segmentation based method, 需要分割字符的方式

    分割字符的方法也比较多,用的最多的是基于投影直方图极值点作为候选分割点并使用 分类器+beam search 搜索最佳分割点(具体可以参考 tesseract 的 presentation)。

    该方法的不足在于要事先选定可预测的sequence的最大长度,较适用于门牌号码或者车牌号码(少量字符, 且每个字符之间可以看作是独立)。
    

    1.3. 最后进行后处理校正

    2. 关键技术

    2.1. 特征提取

    在深度学习方法出现之前,基于传统的手工设计特征(Handcraft Features),包括基于连通区域,以及基于HOG的检测描框的方法是比较主流的;如通过最大稳定极值区域(MSER-Maximally Stable Extremal Regions)得到字符的候选,并将这些字符候选看作连通图(graph)的顶点,此时就可以将文本行的寻找过程视为聚类(clustering)的过程,因为来自相同文本行的文本通常具有相同的方向、颜色、字体以及形状。OPENCV3.3中实现了MSER的场景文字检测和识别的算法。

    在基于深度学习的办法中,目前看到的大多数解决办法还是Detection和Recognition分开来研究,并没有真正的看Detection+Recognition的端到端完成识别的成果。

    Detection部分大多数也是基于proposal的,一般先借助 Faster R-CNN 或者 SSD 得到许多个proposal,然后训练分类器对proposal进行分类,最后再做细致处理得到精细的文本区域;这个过程中学者们也解决了文字的方向,大小等的问题。同时,也有基于图像分割来做的,但是看到的不是很多,具体可见参考文献。

    如果已经检测到了稳定的文本区域,Recognition部分可以采用比较通用的做法;可以对字符进行分割后单独识别,也可以进行序列识别,容易想见的是,序列识别才是真正有意义的。如前面的答主所说CNN+RNN+CTC的办法是论文中常看到的;这个办法也常用在验证码的自动识别上面。

    在Detection方面,乔宇老师团队的:Detecting Text in Natural Image with Connectionist Text Proposal Network, ECCV, 2016. 这篇文章在github上有多个实现(CPTN);

    在Recognition方面白翔老师的CRNN也有不错的表现。

    有人在github上将CPTN和CRNN结合了起来,前者采用Caffe实现,后者采用PyTorch实现,但是这并不是真正意义上的端到端。如何实现自然场景图片到正确有意义的文本输出是还需一些努力的。

    参考文献和链接:

    1. 文字的检测与识别资源 - dllTimes
    2. 趣谈“捕文捉字”——场景文字检测 | VALSE2017之十
    3. bgshih/crnn
    4. tianzhi0549/CTPN
    5. Scene Text Detection

    3. 开源项目整理

    3.1. Tesseract

    Tesseract OCR 引擎于20世纪80年代出现,更新迭代至今,它已经包括内置的深度学习模型,变成了十分稳健的 OCR 工具。而 Tesseract 和 OpenCV 的 EAST 检测器是一个很棒的组合,感兴趣的读者可参考机器之心报道。

    Tesseract 支持 Unicode(UTF-8)字符集,可以识别超过 100 种语言,还包含多种输出支持,比如纯文本、PDF、TSV 等。但是为了得到更好的 OCR 结果,还必须提升提供给 Tesseract 的图像的质量。

    值得注意的是,在执行实际的 OCR 之前,Tesseract 会在内部执行多种不同的图像处理操作(使用 Leptonica 库)。通常情况下表现不错,但在一些特定的情况下的效果却不够好,导致准确度显著下降。在将图像传递给 Tesseract 之前,可以尝试以下图像处理技术,但具体使用哪些技术取决于使用者想要读取的图像:

    • 反转图像
    • 重新缩放
    • 二值化
    • 移除噪声
    • 旋转/调整倾斜角度
    • 移除边缘

    所有这些操作都可以使用 OpenCV 或通过 Python 使用 numpy 实现。

    Tesseract (v4) 最新版本支持基于深度学习的 OCR,准确率显著提高。底层的 OCR 引擎使用的是一种循环神经网络(RNN)——LSTM 网络。

    3.1.1. TesserOCR

    pypi

    github

    pip install tesserocr

    不过上述命令安装时常出现错误。推荐以下方式安装:

    • Linux: sudo apt install python3-tesserocr
    • Windows: 下载 tesserocr 安装包。

    3.1.2. 结合OpenCV EAST

    OpenCV OCR and text recognition with Tesseract

    使用EAST和Tesseract进行文本识别

    1. 使用 OpenCV EAST 文本检测器执行文本检测,该模型是一个高度准确的深度学习文本检测器,可用于检测自然场景图像中的文本。
    2. 提取出每个文本 ROI,并将其输入 Tesseract,从而构建完整的 OCR 流程。

    EAST 文本检测器生成两个变量:

    • scores:文本区域的概率
    • geometry:文本区域的边界框位置

    3.2. 中文 OCR 项目

    中文 OCR,像身份证识别、火车票识别都是常规操作,它也可以实现更炫酷的功能,例如翻译笔在书本上滑动一行,自动获取完整的图像,并识别与翻译中文。

    目前比较常用的中文 OCR 开源项目是 chineseocr,它基于 YOLO V3 与 CRNN 实现中文自然场景文字检测及识别,目前该项目已经有 2.5K 的 Star 量。

    而机器之心之前介绍过另一个开源的中文 OCR 项目,基于 chineseocr 做出改进,是一个超轻量级的中文字符识别项目。详情可参考:实测超轻量中文OCR开源项目,总模型仅17M

    项目地址:https://github.com/ouyanghuiyu/chineseocr_lite

    该项目表示,相比 chineseocr,chineseocr_lite 采用了轻量级的主干网络 PSENet,轻量级的 CRNN 模型和行文本方向分类网络 AngleNet。尽管要实现多种能力,但 chineseocr_lite 总体模型只有 17M。目前 chineseocr_lite 支持任意方向文字检测,在识别时会自动判断文本方向。如下图所示机器之心实测效果示例:

  • 相关阅读:
    Find the Smallest K Elements in an Array
    Count of Smaller Number
    Number of Inversion Couple
    Delete False Elements
    Sort Array
    Tree Diameter
    Segment Tree Implementation
    Java Programming Mock Tests
    zz Morris Traversal方法遍历二叉树(非递归,不用栈,O(1)空间)
    Algorithm about SubArrays & SubStrings
  • 原文地址:https://www.cnblogs.com/brt2/p/13866069.html
Copyright © 2020-2023  润新知