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 支持任意方向文字检测,在识别时会自动判断文本方向。如下图所示机器之心实测效果示例:

原文地址:https://www.cnblogs.com/brt2/p/13866069.html