深度学习之OCR相关经验记录

写在前面:最近实习阶段做了一些关于OCR相关的内容,在此记录一下

Q1:基于深度学习的文字检测方法有哪几种?各有什么优缺点?

A:常用的基于深度学习的文字检测方法一般可以分为基于回归的、基于分割的两大类,当然还有一些将两者进行结合的方法。
(1)基于回归的方法分为box回归和像素值回归。a. 采用box回归的方法主要有CTPN、Textbox系列和EAST,这类算法对规则形状文本检测效果较好,但无法准确检测不规则形状文本。 b. 像素值回归的方法主要有CRAFT和SA-Text,这类算法能够检测弯曲文本且对小文本效果优秀但是实时性能不够。
(2)基于分割的算法,如PSENet、DBNet,PSENet、PANNet算法不受文本形状的限制,对各种形状的文本都能取得较好的效果,但是往往后处理比较复杂,导致耗时严重。针对后处理复杂的问题,DBNET设计了二值化可导阈值融入训练,从而获取更准确的边界,大大降低了后处理的耗时。

Q2:行文本识别,CTC和Attention哪种更优?

A:(1)Attention:适合英文行文本识别(因为英文26个字母,字典有限,模型能够通过训练数据能够挖掘到这些字符之间的关系,相比较于CTC额外加入了先验知识)、对短语句识别效果不错,对长句子识别比较差
(2)CTC:适合中文行文本识别(由于常用中文汉字三千字以上,字典较多,Attention模型不容易挖掘到字符之间的关系,其模型优势无法体现。相比较于Attention,CTC对长句子识别更好。从训练和预测速度上看,Attention的串行解码结构限制了预测速度,而CTC网络结构更高效,预测速度更快

Q3:弯曲形变的文字识别需要怎么处理?TPS应用场景是什么,是否好用?

A:(1)在大多数情况下,如果遇到的场景弯曲形变不是太严重,检测4个顶点,然后直接通过仿射变换转正识别就足够了。
(2)如果不能满足需求,可以尝试使用TPS(Thin Plate Spline),即薄板样条插值。TPS是一种插值算法,经常用于图像变形等,通过少量的控制点就可以驱动图像进行变化。一般用在有弯曲形变的文本识别中,当检测到不规则的/弯曲的(如,使用基于分割的方法检测算法)文本区域,往往先使用TPS算法对文本区域矫正成矩形再进行识别,如,STAR-Net、RARE等识别算法中引入了TPS模块。 Warning:TPS看起来美好,在实际应用时经常发现并不够鲁棒,并且会增加耗时,需要谨慎使用。
(3)做过个印章识别项目,大体方案是使用DBNet检测印章主体区域,再接个轻量级四点定位网络,再跟个tps,再接个CRNN,针对普通场景,识别效果还可以。相比较将DBNet检测主体区域和四点定位放在一起的网络来看,识别效果会好一点,耗时也会多一些。【使用pytorch重写了opencv的tps,耗时减少了10倍左右,参考:tps改写】

Q4:简单的对于精度要求不高的OCR任务,数据集需要准备多少张呢?

A:训练数据的数量和需要解决问题的复杂度有关系。难度越大,精度要求越高,则数据集需求越大,而且一般情况实际中的训练数据越多效果越好。
(1)对于准确率要求不高的任务,检测需要至少500张图片,识别需要保证识别字典中每个字符出现在不同场景的行文本图像数目需要大于200张。
(2)真实数据不足时,可以使用GAN或数据增强或数据生成去合成。但也要保证一个batch内真实与合成数据比例最好不要低于1:3,若真实图片比例远低于这个比例,就只能先在合成数据集上先训练到最优,再在真实数据集上进行finetune。

Q5:背景干扰的文字(如印章盖到落款上,需要识别落款或者印章中的文字),如何识别?

A:(1)在人眼确认可识别的条件下,对于背景有干扰的文字,首先要保证检测框足够准确,如果检测框不准确,需要考虑是否可以通过过滤颜色等方式对图像预处理并且增加更多相关的训练数据;在识别的部分,注意在训练数据中加入背景干扰类的扩增图像。
(2)如果MobileNet模型不能满足需求,可以尝试ResNet系列大模型来获得更好的效果 。

Q6:OCR领域常用的评估指标是什么?

A:对于两阶段的可以分开来看,分别是检测和识别阶段
(1)检测阶段:常用的检测方法可以划分为基于回归的和基于分割的

  • 基于回归方法:先按照检测框和标注框的IOU评估,IOU大于某个阈值判断为检测准确。这里检测框和标注框不同于一般的通用目标检测框,是采用多边形进行表示。
  • 基于分割方法:将预测的mask按阈值分为正样本点与负样本点,通过预测与标注mask来计算检测准确率与召回率
  • 检测准确率(p):正确的检测框个数在全部检测框的占比,主要是判断检测指标。检测召回率(r):正确的检测框个数在全部标注框的占比,主要是判断漏检的指标。

(2)识别阶段: 常用的识别标准可以分为基于字符水平和基于文本行水平

  • 基于字符:通过计算预测与标注字符之间的编译距离(I、D、S),acc=识别正确/识别出的字符总数,corr=识别正确/标注的字符总数
  • 基于文本行:正确识别的文本行占标注的文本行数量的比例,只有整行文本识别对才算正确识别。

(3)端到端统计: 端到端召回率:准确检测并正确识别文本行在全部标注文本行的占比; 端到端准确率:准确检测并正确识别文本行在检测到的文本行数量 的占比;准确检测的标准是检测框与标注框的IOU大于某个阈值,正确识别的的检测框中的文本与标注的文本相同。

Q7:单张图上多语种并存识别(如单张图印刷体和手写文字并存),应该如何处理?

A:单张图像中存在多种类型文本的情况很常见,典型的以学生的试卷为代表,一张图像同时存在手写体和印刷体两种文本,这类情况下,可以尝试”1个检测模型+1个N分类模型+N个识别模型”的解决方案,有两种思路。
(1)方法1:让不同类型的文本共用同一个检测模型,N分类模型指额外训练一个分类器,将检测到的文本进行分类,如手写+印刷的情况就是二分类,N种语言就是N分类,在识别的部分,针对每个类型的文本单独训练一个识别模型,如手写+印刷的场景,就需要训练一个手写体识别模型,一个印刷体识别模型,如果一个文本框的分类结果是手写体,那么就传给手写体识别模型进行识别,其他情况同理。
(2)方法2:拿DBNet举例,普通检测任务的DBNet在fpn后预测1类mask(pro、thr、bin),通过阈值来卡binary的前景与背景区域。而面对多分类任务(如手写与印刷两种类别任务),fpn后预测2类mask(一组是手写,一组是印刷),然后通过分别对2类binary进行处理从而实现检测与分类。后续再接手写和印刷两种识别模型
(3)区别:方法1检测出区域再分类的方法,使得某个区域的类别之间是互斥的,即某一个区域只能属于一个类别(要不是背景,要不是手写,要不是印刷)。方法2所检测出的区域,它可能属于多个类别,即某一个区域可能是手写的,同时也可能是印刷的。两种方法针对具体场景需要具体使用。


参考1:OCR调参trick
参考2:OCR常见问题汇总

你可能感兴趣的:(OCR,ocr)