OCR大综述

文章目录

  • 端到端OCR实验与结果记录
    • 相关工作
      • 1. 检测
        • 1.1 水平文本检测
        • 1.2 旋转文本检测
        • 1.3 任意文本检测
      • 2. 识别
      • 3. 整合的项目
    • 端到端OCR
    • 自己实现的端到端OCR
    • Reference
    • 其他

端到端OCR实验与结果记录

上一份工作主要是做OCR识别的相关工作。当时的主要思路就是分成检测+ocr识别两个步骤来实现。
关键点:

  1. 图像采集设备。很容易出现曝光过重的情况。
  2. 文字有长,有短。
  3. 文本行有倾斜,旋转的情况,对检测部分就需要支持旋转文本检测

同时在很多OCR识别场景中是比较简单的。比如车牌识别,在这个任务中:1. 检测部分目标较少。一个场景中最多只有几张车牌。2. 识别部分相对来说也是比较容易的,因为车牌没有宽度变化。注意: 文字识别的主要难点为不定长文本变化带来的问题。所以在车牌识别等相对容易的场景中,在使用检测+识别的方案,感觉就很麻烦。所以做一个端到端的OCR模型还是有必要的。
以上说的端到端是将检测和识别网络融合在一起,并且一起训练,一起推理。

相关工作

在OCR这块已经有很多相关的项目,这里主要总结采用深度学习的方法,因为个人感觉要达到商用,鲁棒性好,适用场景多样等各种问题,深度学习是首选。

1. 检测

检测方面,对于自然场景中的文本检测主要的难度为文本是多尺度的(就是文字有大有小,有长有短),多形状的,比如圆弧的,水平的,旋转的,倾斜的。所以在检测这块可以由简单到困难分为3个层次:只有水平文本的检测,旋转文本的检测,任意形状文本的检测。

1.1 水平文本检测

1.2 旋转文本检测

1.3 任意文本检测

coming soon

2. 识别

文字识别这块现在应该是CRNN一统天下,主要是bone net的替换,比如采用resnet,densenet替换主干网络。其次是谷歌提出的attention ocr,主要使用的是Seq2Seq的技术,当时是用在谷歌街景中的路牌识别。到现在(2019年)应该主要就是这两种方法及变体了。
CRNN是华科的老师提出的。真的是模型简单,而且效果好。所以现在就是一统江湖之势。同时github上有各种版本的实现。
CRNN项目链接:

  • 官方torch实现:bgshih/crnn
  • pytorch实现,简单好调试。meijieru/crnn.pytorch
  • tensorflow 实现。MaybeShewill-CV/CRNN_Tensorflow

CRNN是很好,而且简单。所以针对CRNN的优化只有3个部分:1. 针对bone cnn的替换;2. 针对序列学习LSTM的优化;3. 针对损失函数CTC的优化。第一个是最简单的,所以一般都没有paper,都是个人github的实现。后续两个后面看到了再补充。欢迎大家留言添加或pull request

既然CRNN这么好了,谷歌为啥还提出Attention OCR呢。这就要去问谷歌自己了。

Attention OCR比CRNN,首先从理解上要复杂一些,而且模型中用了LSTM做序列学习,LSTM 是公认的不好训练的。同时推理的时候要上一时刻的输出作为当前时刻的输入,所以理论上速度是没有CRNN快的。
Attention OCR的模型主要就是使用CNN+seq2seq两种技术,损失函数采用交叉熵。

Attention OCR项目链接:

  • tensorflow版,da03/Attention-OCR
  • 另外一个tensorflow版emedvedev/attention-ocr
  • 本人用pytorch实现的针对中文的一个版本,有不同的分支,可以学习不同的注意力求解方式。chenjun2hao/Attention_ocr.pytorch

3. 整合的项目

  1. 该项目用VGG16做旋转方向的分类,用CTPN做字符检测,用CRNN做字符识别。链接
  2. 该项目使用CTPN做检测,densenet crnn做识别,针对中文训练的模型。链接
  3. 该项目使用yolo3做检测,crnn做识别。支持0,90,180,270度的文本检测,支持身份证,火车票。chineseocr/chineseocr

端到端OCR

端到端ocr应该是将检测是识别任务整合在一个模型内,两个任务采用同样的CNN进行特征提取,进行统一训练。然后现在网上将CRNN也叫做端到端,或者将上面梳理的整合起来的项目叫做端到端。这就是不对的。

详情coming soon

自己实现的端到端OCR

主要参考的是阿里巴巴的一篇论文实现的,A Novel Integrated Framework for Learning both Text Detection and Recognition

采用faster rcnn的two stage方案,检测部分使用yolo,ssd等one stage的检测方法,识别部分使用CRNN,两个任务采用同一个 bone net进行特征提取。这样有一个优点,就是识别部分相对于用crop+crnn的方案能获得更大的视野,所以即使出现检测不精确的情况,识别部分也可能是正确的。另外还有就是这篇OCR之Deep TextSpotter。二者的思路基本是一样的,但是deep textspotter支持旋转文本的检测和识别。

本人暂时实现的是水平文本,单图单文本的场景。在实际中可以用于车牌识别,电表识别等场景。
实际效果:
OCR大综述_第1张图片
代码和项目还在整理中:coming soon…

Reference

  1. https://zhuanlan.zhihu.com/p/43024857
  2. A Novel Integrated Framework for Learning both Text Detection and Recognition
  3. chenjun2hao/Attention_ocr.pytorch
  4. ICPR-2018-OCR笔记

其他

  1. https://github.com/qjadud1994?tab=repositories一个韩国的,做OCR相关工作
  2. 训练文本识别器,你可能需要这些数据集

你可能感兴趣的:(ocr,深度学习,OCR,ctpn,textboxes,rrpn)