宜信OCR技术摸索与实际|残缺视频回放

一、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%

微调

  • 每旋转1°做纵向投影
  • 方差最大的角度为微调角度

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 咱们的教训

1、 开发教训

2、生产教训

Tensorflow容器

  • 模型部署应用官网举荐的tensorflowserving,容器形式
  • 没有开启Batching,本人管制batch
  • 宿主机只须要显卡驱动•容器内蕴含CUDA、cuDNN,免去版本适配

服务容器:

  • 本人定义了Web容器根底镜像
  • 主动构建容器、动静编排
本文作者:宜信技术学院 刘创