OCR简介
ORC(Optical Character Recognition)光学字符识别,指提取图像中的文字信息,通常包括文本检测和文本识别
- 文本检测:将图片中的文字区域位置检测出来
- 文字识别:对文字区域中的文字进行识别
流程
传统方法
在深度学习之前,传统的OCR方法主要流程包括:
- 图像预处理:修正成像问题包括几何变换、去模糊、光线矫正
- 文本行检测:连通域、滑动窗口
- 单字符分割
- 单字符识别:图像分类、模板匹配
- 后处理
深度学习方法
- 文本行检测:输入图像、文字区域定位、文本行识别、输出
- 文本行识别:CNN、RNN、CTC
ORC检测方法
-
EAST
-
DB
-
SAST
-
基于回归的方法
- box回归
- CTPN
- EAST
- 像素值回归
- CRAFT
- SA-Text
- box回归
-
基于分割方法
- PSENet
-
SegLink
-
TextBoxes、TextBoxes++
-
R2CNN
论文 | 时间 | 数据集 | code | 特征 |
---|---|---|---|---|
EAST | CVPR2017 | ICDAR2013、2015, COCO-Text,MSRA | songdejia/EAST: This is a pytorch re-implementation of EAST: An Efficient and Accurate Scene Text Detector. (github.com) | 端到端的快速文本检测方法,消除中间多个步骤,直接预测文本行 |
SegLink | CVPR 2017 | |||
TextBoxes | AAAI 2017 | |||
TextBoxes++ | TIP 2018 | |||
R2CNN | CoRR 2017 | 基于Faster RCNN的斜框检测:R2CNN - 知乎 (zhihu.com) | ||
PixelLink | AAAI 2018 | |||
PSENet | CVPR 2019 |
OCR识别方法
文字识别之前需要先对文字进行定位(文字检测主要有基于物体检测和基于分割两种方法)
文字识别主要分为三种类型:
- 单字分类:当能够定位出单字的时候,用图像分类法对单字进行分类
- 整词分类:当需要预测整词数量较少时,可对整词进行分类
- 整词识别:当有大量整词需要预测并且没有单字定位时,需要用解码序列的方法进行识别。
文字识别中最常用的时文字序列识别,使用场景更为广泛。
识别难点
主要难点在于输入与输出的对齐,如果我们每间隔单位n预测一个字符,那么可能出现多个n预测同一个字符,这样将导致结果出现重复字符,因此需要设计针对文字识别的编码算法来解决输入输出对齐问题。
可能解决OCR解码一对多问题的有以下三种方法(即端到端方法):
- CTC
- Attention
- ACE
基于RNN进行文字识别的算法主要有两个:
- CNN + RNN + CTC(CRNN + CTC)
- CNN + Seq2Seq + Attention
论文 | 时间 | 数据集 | code | 特点 |
---|---|---|---|---|
CRNN | 2015 | ICDAR 2013 | meijieru/crnn.pytorch: Convolutional recurrent network in pytorch (github.com) | 使用CNN提取图像卷积特征,然后使用LSTM提取卷积特征中的序列特征,最后使用CTC解决对齐问题 |
RARE | CVPR 2016 | 对变形的图像文本效果很好,原因是输入图像首先被送入一个空间变换网络做处理 | ||
STAR-Net | 2016 | 学习一个投影变换矩阵,将变形的文字变换为正常模样 | ||
SAR | AAAI 2019 | |||
SRN | 2020 |
端到端检测+识别
论文 | 时间 | 数据集 | code | 特点 |
---|---|---|---|---|
E2E CRNN | ICCV 2017 | |||
STN-OCR | 2017 | |||
FOTS | CVPR 2018 | jiangxiluning/FOTS.PyTorch: FOTS Pytorch Implementation (github.com) | ||
Mask TextSpotter | ECCV 2018 | |||
CharNet | ICCV 2019 | |||
Mask TextSpotterV3 | ECCV 2020 |
文本检测
难点
- 文本存在多种分布,排布形式多样
- 文本存在多个方向
- 多语言混合
技术
Faster RCNN
将目标检测的四个基本步骤:
- 候选区域生成
- 特征提取
- 分类
- 位置精修
整合到一个深度网络中,剔除计算冗余,并可通过GPU训练,进一步提高运行速度
CTPN
基于Faster RCNN,目前比较成熟的文本检测框架,精度较好,但检测时间较长。
预测文本的竖直方向上的位置,水平方向的位置不预测,对非水平的文字不能检测
TextBoxes\TestBoxes++
调整Anchor长宽比,适用于文字细长的特点,但针对小文本会有露检
SegLink
CTPN + SSD,通常用于自然场景下,检测多角度文本
DMPNet
采用非矩形四边形选定Anchor进行检测,通过Monte-Carlo方法计算标注区域于矩形候选框和旋转候选框的重合度重新计算顶点坐标,得到非矩形四边形的顶点坐标。适用于自然场景下文本检测。
YOLO
文本检测时间短,精度好,但针对小目标效果一般,容易造成大范围漏检
EAST
采用FCN思路,做特征提取和特征融合,局部感知NMS阶段完成检测。网络的简洁使得检测准确率和速度都有进一步提升。(针对自然场景下使用较多)
Pixel-Anchor
针对Anchor数量多引起文本出现的丢失问题,Pixel感受野不足引起长文本丢失情况,结合两者各自的优点,对长行的中文检测场景有较好的适应性。网络结构可以分为两部分,其中Pixel-based的方法对EAST的改进,anchor-based的方法对SSD的改进。前者主要为了检测中等文本,后者主要为了检测长行和较小的文本
IncepText
针对大尺度、长宽比及方向变化问题,借鉴GoogLeNet中的inception模块来解决这些问题。在inception结构中通过不同尺寸的卷积核设计达到检测不同大小和宽高比的文字,同时引入deformable卷积层操作和deformable PSROI pooling层提升任意方向文字的检测效果。
文本识别
技术
CNN + RNN + CTC(如CRNN)
目前使用最广泛的文本识别框架。需要自己构建字词库(包含常用字、各类字符)
CNN(如Densenet) + CTC
效果一般,繁华能力较差。没有加入RNN的效果好
Tesserocr(Tesseract)
使用比较广泛的一种开源识别框架,支持多语言多平台。Tesseract在识别清晰的标准中文字体效果还行,稍微复杂的情况就很糟糕(多字体等),而且花费的时间也很多。
RARE
主要用于识别变形的文本图像效果好,用于自然场景下文本识别。
FOTS
EAST + CRNN,端到端OCR模型,检测和识别任务共享卷积特征层,节省计算时间,也比两阶段训练方式学习到更多图像特征。引入旋转感兴趣区域(RolRotate),可以从卷积特征图中产生出定向的文本区域,从而支持倾斜文本识别。
ASTER
模型主要分为两个部分,一个是矫正模型,一个是识别模型,矫正模型不需要矫正标注信息,对弯曲文本、透视文本有很好的矫正效果。识别模型中的CNN使用了ResNet的结构,最后的解码部分使用的是Sequence2Sequence机制来进行解码,不同于CRNN的CTCLoss
数据集
数据集 | 数据语言 大小 | 简要介绍 | 标注格式 | 下载地址 |
---|---|---|---|---|
ICDAR_2013 | 语言: 英文 train:229 test:233 | 水平文本 | x1 y1 x2 y2 text | 下载链接. |
ICDAR_2015 | 语言: 英文 train:1000 test:500 | 倾斜文本 | x1,y1,x2,y2,x3,y3,x4,y4,text | 下载链接. |
ICDAR2017-MLT | 语言: 混合 train:7200 test:1800 | 多语言文本 | x1,y1,x2,y2,x3,y3,x4,y4,text | 下载链接. 提取码: z9ey |
ICDAR2017-RCTW | 语言: 混合 train:8034 test:4229 | 主要是中文 | x1,y1,x2,y2,x3,y3,x4,y4,<识别难易程度>,text | 下载链接 |
天池比赛2018 | 语言: 混合 train:10000 test:10000 | 合成图像,产品描述,网络广告复杂排版,密集的小文本或多语言文本,水印等 | x1,y1,x2,y2,x3,y3,x4,y4,text | 检测。 识别 |
ICDAR2019-MLT | 语言: 混合 train:10000 test:10000 | 水平文本每个连续的1000个图像包含一种主要语言的文本 | x1,y1,x2,y2,x3,y3,x4,y4,语言类别,text | 下载链接. 提取码: xofo |
ICDAR2019-LSVT | 语言: 混合 train:30000 test:20000 | 中文街景图像 | json格式标签 | 下载链接 |
ICDAR2019-ReCTS | 语言: 混合 train:20000 test:5000 | 餐厅招牌上的中文文本 | json格式标签 | 下载链接 |
ICDAR2019-ArT | 语言: 混合 train:5603 test:4563 | 包含水平、多方向和弯曲等多种形状的文本 | json格式标签 | 下载链接 |
Synth800k | 语言: 英文 80k | 每个文本实例均使用文本字符串、字级和字符级边界框进行注释 | 基于字符标注 | 下载链接 |
360万中文数据集 | 语言: 中文 360k | 每个样本固定10个字符,字符随机截取自语料库中的句子 | 每张图片由10个字符构成 | 下载链接. 提取码:lu7m |
中文街景数据集CTW | 语言:中文 32285 | 包含平面文本,凸起文本,城市文本,农村文本,低亮度文本,远处文本,部分遮挡文本 | 基于字符标注的中文街景图片 | 下载链接 |
百度中文场景文字识别 | 语言: 混合 29万 | 由街景图片中的文字行区域(如店铺标牌、地标等)截取出来而形成图像经过一些预处理:将文字区域利用仿射变化,等比映射为一张高为48像素的图片 | 下载链接 | |
MSRA-TD500 | 语言: 中英文 Training:300 Test:200 | 多方向文本检测大部分文本都在引导牌上 | .gt格式标签 | 下载链接 |
Total-Text | 语言: 英文 Training:1255 Test:300 | 弯曲文本 | 下载链接 |