导读:随着人工智能的热度上升,图像识别这一分领域也渐渐被人们所关注。在公司的业务中,有很多扫描、拍照单据、凭证等进行识别的需求。 为了帮助业务实现这些图片文档的识别和结构化,我们进行了一系列的实践和探索,最终确定了深度学习的文字检测和识别模型,作为主要的实现手段,从而满足了业务上的需求。 实践过程中,我们遇到过一系列的问题和难点,最终都一一解决, 本次分享我们将结合目前的业务需求,说说我们在探索中遇到的痛点和难点,和识别技术中的一些技术细节。
分享大纲:
1、业务上的诉求和痛点;
2、OCR技术的应用场景,以及对业务的重要性;
3、宜信OCR技术解决方案:
——产品能力
——未来规划
4、OCR技术的的发展和演进;
5、主流算法科普:CTPN、EAST、PSENet;CRNN、Attention OCR;
6、OCR技术实践:样本生成、算法改造、论文的实现等。
PPT下载链接: https://pan.baidu.com/s/1XD0hVF_-VGMVbnlStTR2aw 密码: lnf8
以下为直播视频,可点击回放,时长 62m48s,建议在 WiFi 环境下观看。
https://v.qq.com/x/page/e3123usjdlg.html
分享实录
一、OCR 概述
1.1 OCR 技术演进
- 传统图像,冈萨雷斯的图像处理。
- 信号处理、频域分析以及各类算法: SIFT、HOG、HOUGH、Harris、Canny… 都很赞。
- 从 2016 年以后业界基本上都已经转向深度了,因为效果真的特别好。
1.2 OCR 技术商业服务
- 身份证卡证类相对容易些,但是要做到复杂场景的,也不是那么容易。
- 发票、业务单据相对复杂,除了识别,更重要的是版面分析。
- 最近表格识别比较火,各家都在努力实现,微软的开放 tablebank 数据集
- 移动端 backboneMobileNet,或者是 tesseract+opencv
二、我们的业务场景
2.1 业务需求
满足业务是第一需要,不同于大厂,对外服务 API,要求大并发那么强,多样性品类完备, 我们更强调单品要做到尽量达到业务要求,更强调定制化,可以分布走,业务上可以给反馈不断改进。
2.2 识别过程中需要解决的问题
三、OCR 算法详解
3.1 算法概述——分享原则
大家一定要自己弄细节,读代码、甚至自己动手撸,自己训练,调参,排错,才能有真正的体会和理解,只讲我认为每个算法里面不太好理解,重点,以及容易忽略的点,跟同行一起交流,沟通。
一个模型,要全面深入了解,需要:
- 目标、目的、意义是啥?
- 网络结构啥样?
- loss 是啥?
- 样本咋做?
- 后处理干了啥
3.2 算法概述——三大板块
- 文字检测: 把文字框住,缩小到最小范围内,从而降低识别难度。
- 文字识别: 检测出文字后,就可以通过识别工具(算法)来识别出文字,如中间图。
- 版面分析: 当文字识别出来后,我们得出的是文字和相应的坐标,可是当真正业务中要得到的不仅仅是这个,需要有一个结构,如何通过识别出的文字排版成为一个有逻辑结构的单据或者内容,这个工作也超级复杂。关于版面分析这方面,后面会有团队里面经验非常丰富的伙伴和大家分享。
3.3 算法概述——检测算法
- 表中从下往上的检测算法排序按照效果:越来越好
- 从 anchorbased(也就是右边所示的最下面的那张图),现在逐渐转向 pixel-based(像素级别)(右边所示的中间的那张图),主要是语义分割的技术效果实在是太好了。
CTPN: 找框的一个算法。
预测最终结果是: 10 个 anchor 的 y 坐标偏移,和高度的调整值,还有它是不是前景的概率。输出是前后景概率 [N,10,2],y、w 调整值 [N,10,2]。它只适合横向,或者纵向,不能同时。
一个模型主要从以下几个方面理解
- 亮点和核心思路是:预测框和
- loss 是啥(损失函数):anchor 前后景概率、y、w 调整
- label 怎么做:大框,弄成小框,然后正负样本均衡
- 后处理
算法被命名为 EAST (Efficient and Accuracy Scene Text),因为它是一个高效和准确的场景文本检测 pipeline。
首先,将图像送到 FCN 网络结构中并且生成单通道像素级的文本分数特征图和多通道几何图形特征图。文本区域采用了两种几何形状:旋转框(RBOX)和水平(QUAD),并为每个几何形状设计了不同的损失函数;然后,将阈值应用于每个预测区域,其中评分超过预定阈值的几何形状被认为是有效的,并且保存以用于随后的非极大抑制。NMS 之后的结果被认为是 pipeline 的最终结果。
- 最后预测:scoremap,textbox,textrotation
- 标注是:一个蒙版 mask,一个 4 张图,上下左右的距离,还有个角度:一共 3 个。
- 对应就可以出 loss 了。每个点预测出来,加上角度,就是 1 个框,太多了框,所以要做 LANMS(合并算法) 的合并。为何不直接用 socremap,我认为是置信度不够,所以要再加上 bbox 来加强验证。
PSENet 是一种新的实例分割网络,它有两方面的优势。首先,psenet 作为一种基于分割的方法,能够对任意形状的文本进行定位. 其次,该模型提出了一种渐进的尺度扩展算法,该算法可以成功地识别相邻文本实例。
- FPN,左面用 resnet50。为何是 resnet50,原因是效果不错,参数适中。
- 论文里是 6 个尺度,一个不行么?我理解是彻底分开不同行,逐渐扩大,渐进尺度可以防止彼此交叉哈
- FPN 和 UNET 都是 concat,FCN 是 add,这个细节。
使用 DB 模块之后,二值化操作就变成了可微的,可以加到网络里一起训练。
网络输出
- probabilitymap,代表像素点是文本的概率
- thresholdmap,每个像素点的阈值
- binarymap,由 1,2 计算得到,计算公式为 DB 公式
label 制作
- probabilitymap, 按照 pse 的方式制作即可,收缩比例设置为 0.4
- thresholdmap, 将文本框分别向内向外收缩和扩张 d(根据第一步收缩时计算得到) 个像素,然后计算收缩框和扩张框之间差集部分里每个像素点到原始图像边界的归一化距离。
3.4 算法概述——识别算法
Atttenion: Attention-basedExtraction of Structured Information from Street View Imagery-2017 最早的尝试
非常经典的算法,主要的核心是 CTC 算法 :Connectionist Temporal Classification (CTC) 适合那种不知道输入输出是否对齐的情况使用的算法,所以 CTC 适合语音识别和手写字符识别的任务。
缺点:不能精确地联系特征向量与输入图像中对应的目标区域,这种现象称为 attention drift。
- Muturaltraining:
- 我们知道什么?什么字符,第几个?这个信息!
- 哪个字符? 找到那个字符,第几个?然后和样本里的顺序比
- 第几个是啥字符?和对应位置的字符比
- 所以样本中不能存在重复字符。
四、我们的实践
4.1 实践之路
- 非单据:宽高比,白像素比例等
- 旋转角整:前面讲过了,通过旋转模型,以及投影分布
- 多单据:多张单据在一起,通过投影,阈值超参配置
- 表格识别:采用 mask-rcnn 的方法,来找出大表边缘
- 后处理:通过 NLP 纠错,后面会详细的讲
4.2 实践之路——旋转模型
大方向判断
第一版:
- VGG 做 backbone,全连接,四分类
- 样本:人工标注、增强
- 正确率 90%
第二版:
- 做切割,256x256
- 使用 MSER 找备选
- 训练小图
- 众数选出最可能方向
- 正确率 99.7%
微调
4.3 我们遇到的坑
把 crnn 论文论文中的自定义 cnn 网络,换成 resnet,但是 resnet 是缩小 32 倍,所以要拉长一些,到 512。
- 首先是:样本集是 1000 万 (50 万张,置信度单字 95%+)100 万真实 +100 万常用字(造) + 200 万数字时间英文(造)+ 600 万其他汉字(造)大概需要 3-4 天
- 接下来进行训练:Resnet50,5-6 天;Resize 扩大,1024,=>512x8,256x8
- 过程中需要对 greedy 算法进行改进:
=>beam_search/merge_repeated=True
单独测是有问题,但是在置信度很高的情况下,两者差距很小,但是得到了极大的速度改进,28 秒 =>10 秒,batch=128,size 是 512x32
- 因为有 crnn 的 prob,所以纠错就有的放矢,把怀疑的字,替换成某个字,
- Prob 有个细节,如果是挨着的字,“__ 我 我 __”,就取最大的 prob,
- 是根据一个字画相近度,对怀疑字替换的原则,是和原来识别字笔画最相近的,又是通过编辑距离。
4.4 我们的经验
Tensorflow 容器
- 模型部署使用官方推荐的 tensorflowserving,容器方式
- 没有开启 Batching,自己控制 batch
- 宿主机只需要显卡驱动•容器内包含 CUDA、cuDNN,免去版本适配
服务容器:
- 自己定义了 Web 容器基础镜像
- 自动构建容器、动态编排
作者介绍:
刘创,宜信高级研发工程师
本文转载自公众号宜信技术学院(ID:CE_TECH)。
原文链接:
https://mp.weixin.qq.com/s/awMhsBP1WasuoVc95GuZPA