简介
文字的发明是人类文明史上的重要进步,它改变了人类知识的存储方式和传播方式。文字于日常生活中无处不在,比如马路上的标志牌,商店的招聘,商品的包装盒等。办公自动化、工业自动化等应用场景迫切需要一套直接从图像中检测,识别并理解文字的工具。
典型的OCR系统,按照流程分为两大支:
- 先检测后识别(detection then recognition);
- 端到端识别(end to end text spotting);
tesseract-ocr
Tesseract是一个由HP公司开发(后由Google接手)的开源的OCR(Optical Character Recognition,光学字符识别)引擎,可以识别多种格式的图像文件并将其转换成文本,目前已支持多种语言(包括中文)
- 该库有C++语言编写,可编译为一个库,有C++接口与python接口;
- 底层OCR引擎本身使用LSTM网络(RNN)
- 当前景文本与背景有非常清晰的分割时,Tesseract效果最好,对于比如有干扰线的简单验证码,会识别不好。此外,这些分割需要尽可能高的分辨率,并且输入图像中的字符在分割后不能出现“像素化”。如果字符表现出像素化,那么Tesseract很难正确识别文本——我们甚至在应用理想条件下拍摄的图像时也发现了这一点(一个PDF截图)。
- 对于安装好的tesseract库,具体运行方式:
./tesseract ./input.jpg ./result -l eng --psm 4 --oem 0
- 训练tesseract词库:
需要下载jTessBoxEditor,可以直接从官网下载压缩包,下载地址Browse。解压后,可直接使用。但是这个工具是用java开发的,需要jre7以上的版本支持。此外, jTessBoxEditor解压包中自带了一个tesseract-ocr文件包。我们需要使用第二步中自己安装tesseract-ocr生成的文件覆盖掉jTessBoxEditor\tesseract-ocr\中的文件。 - tesseract库方便移植到ARM平台
- tesseract库只有字符识别功能,没有检测功能
EasyOCR
EasyOCR是一个用 Python 编写的 OCR 库,该 OCR 库使用深度神经网络构建而成:CNN+LSTM+CTC loss,包含三个解码器可选项:贪心搜索、束搜索和词束搜索(word-beam search),支持超过80种语言的识别,包括英语、中文(简繁)、阿拉伯文、日文等,并且该库在不断更新中,未来会支持更多的语言。
- 与标准的开源 OCR 工具 Tesseract 相比,Easy OCR 的准确率更高,不过速度稍慢
- EasyOCR的优势在于多语言支持,非常适合有小语种需求的开发者
- 模型较大不适合端侧部署
- 不支持自定义训练,不过可以参考该库 https://github.com/clovaai/deep-text-recognition-benchmark 进行模型重训练。
- 整理算法的检测部分基于 CRAFT 算法预训练得到,识别部分则基于作者自有数据集训练得到。CRAFT是一个字符级别的文本检测网络,使用分水岭算法生成 label,采用 heatmap 得到激活值最大的目标区域。
chineseocr_lite
chineseocr_lite 是基于chineseocr的改进(chineseocr基于 YOLO V3 与 CRNN 实现中文自然场景文字检测及识别),相比 chineseocr,它采用了轻量级的主干网络 PSENet,轻量级的 CRNN 模型和行文本方向分类网络 AngleNe,它支持竖排文字识别,支持 ncnn 推理,psenet (8.5M) + crnn (6.3M) + anglenet (1.5M) 总模型仅 17M。此外,该项目支持linux/macos/windows 平台。
- 提供轻量的backone检测模型psenet(8.5M),crnn_lstm_lite(9.5M) 和行文本方向分类网络(1.5M)
- 任意方向文字检测,在识别时会自动判断行文本方向
- crnn\crnn_lite lstm\dense识别(ocr-dense和ocr-lstm是搬运chineseocr的)
- 支持竖排文本识别
- ncnn 实现 (支持lstm) nihui大佬实现的crnn_lstm推理 具体操作详解: 详细记录超轻量中文OCR LSTM模型ncnn实现
- 提供竖排文字样例以及字体库(旋转90度的字体)
PaddleOCR
PaddleOCR旨在打造一套丰富、领先、且实用的OCR工具库,助力使用者训练出更好的模型,并应用落地。
- 轻量中英文OCR模型是经过产业实践考验的
- 语种识别上PaddleOCR目前包括中英文、英文、法语、德语、韩语、日语等
- 对于普通场景来说,比如身份证识别、票据识别,其实大多数算法的准确率都不错,但特殊场景更考验模型的泛化性能。相较而言PaddleOCR至少在检测能力上比其他几个开源工具要好,但识别能力仍有待提升
- 无论是对文档图像还是场景图像,PaddleOCR都有不俗的表现
- 提供标注工具
- 整体算法主要分文本检测、检测包围框校正和文本识别三部分
- 与其他开源库的对比:
语种 | 与训练模型大小 | 端侧部署 | 自定义训练 | |
---|---|---|---|---|
chineseocr_lite | 中英文 | 10M | 是 | 不支持 |
EasyOCR | 多语言 | 218M | 否 | 不支持 |
PaddleOCR | 多语言 | 轻量:8.6M 通用:203M | 是 | 支持 |
MMOCR
MMOCR 具有以下特点:
- 全流程:支持文字检测、文字识别以及其下游任务,比如关键信息提取等。
- 多模型:我们实现了 10 余种优秀算法。文字检测算法包括单阶段检测算法和双阶段检测算法;文字识别包含规则文字识别和非规则文字识别算法;关键信息提取包含基于图模型的关键信息提取算法。
- 只支持英文字符识别
对于文字检测,MMOCR 实现了最新的优秀的文字检测算法,同时支持多方向文字和任意形状文字的检测。它们包括:
- 单阶段文字检测算法:PANet,PSENet,DBNet,TextSnake
- 双阶段文字检测算法:MaskRCNN
对于文字识别,MMOCR 不但实现了经典的 CRNN算法,也实现了最近的基于 encoder-decoder 和 2d attention的 SAR 算法,增加位置增强模块的 RobustScanner , 基于 Transformer 的算法,以及实现了基于分割网络的文字识别基准算法。基于 CTC loss 的 CRNN,支持规则文字的识别, 速度快, 广泛应用于工业界。基于 Transformer 或者分割网络的识别模型,以及基于注意力机制的 SAR 和 RobustScanner, 在非规则文字识别方向具有显著优势。
关键信息提取是图像文字识别一个常见和重要的下游任务。文字识别只能给出一个文字框对应的识别字符串,然而实际应用场景往往需要结构化的文字输出。比如针对小票图片,我们需要提取消费的地点,时间,店名,商品明细,以及消费金额等。传统的关键信息提取算法,基于模板匹配算法,具有不鲁棒、每种版式需要定制研发的缺点。MMOCR 实现了最近提出的基于图神经网络的通用关键信息提取算法SDMG-R。它利用了文字框空间位置关系,图片视觉信息,文字的语义信息,通过深度学习网络,端到端地实现了关键信息提取任务。
STR
STR(Scene Text Recognition)的任务是识别文字框中的内容,Vedastr是基于PyTorch的场景文本识别工具箱。