OCR文字识别在股票查询的运用逻辑
本文将以行业+AI的角度,介绍OCR技术在证券业务中的运用,且详细介绍功能背后的AI技术和技术选型思考。
一、需求分析
1. 需求背景
对于股票服务类软件,添加自选股是用户的高频需求,自此之前查询股票是前置步骤,APP中批量查询股票并添加自选股一直是一个无法解决的痛点问题,如果添加几十只股票,需要一只一只的查询添加,操作非常麻烦。
另一方面,股票业务经过多年的互联网线上发展,线上新手用户已经很难开拓,获客方式是通过提供差异化的服务,吸引其他股票产品用户,并提高用户转化留存,培养用户使用自己产品的习惯。此场景中老用户都有自己的自选股池,批量导入自选股,是提高用户留存的必经之路和关键环节。对于运营转化提升,有非常重要的价值。
2. 为什么使用OCR
添加自选股的第一步是查询股票,查询股票可以通过三种方式操作:手动输入查询、语音查询、图片识别查询。
三种查询方式对比如下表:
从表中可以看出图片识别查询在进行批量操作有绝对的优势。此外,灵活的使用场景,便捷的操作方式,未来可能会逐步成为用户查询股票的高频行为之一。
3. 确定场景和需求
1)移动端主流场景分析
- 在新用户首次使用过程中,会将已经的自选股进行截图,通过相册获取截图进行OCR文字识别查询股票。
- 老用户对网上的推荐股票进行截图或拍照,通过相册或相机获取截图或照片进行OCR文字识别查询股票
- 在新闻、热点文章中会多只关联股票,通过对相应文本进行截图或拍照,获取图片进行OCR文字识别查询股票。
2)功能需求及非功能需求
- 基于需求场景,OCR识别的图像,多是截图和照片,图片中会有长文本,会有场景复杂的拍照文字识别。
- 基于产品功能定义,OCR技术识别语言目前只需支持A股市场股票名称识别,未来随着业务发展有可能要支持港美股。所以,OCR文字识别技术首先要识别中文和数字,未来需要扩展英文识别。手写字体识别是一个发生概率比较低的小场景,所以对手写体识别率要求不高。
- OCR识别出的文字,需要从文本中提取股票名称,文字提取也是必要的过程。
对于非功能性需求,需要基于使用场景考虑,查询股票虽然是一个高频需求,但用户使用场景不像下单购买那么急迫,对识别的速度、并发量行业平均水平即可,在2秒左右可以接受。识别失败是体验中比较受挫的事情,对用户体验影响大,对常用的印刷体识别准确率要高,至少达到90%以上。
二、产品方案规划
[2-1图片识别股票名称框架图]
基于图片查询股票功能,主要由三部分构成:第一部分是前端交互流程,第二部分是OCR文字识别,第三部分是文字提取。
1)前端界面交互
[2-2 图片识别股票名称界面流程图]
2)OCR文字识别
相比于传统OCR场景(印刷体、扫描文档),移动端OCR场景主要是针对手机拍摄的照片或手机截图进行文字信息提取和识别,考虑到线下用户的多样性,因此主要面临以下挑战:
- 成像复杂:噪音、模糊、光线变化、变现
- 文字复杂:字体、字号、色彩、磨损、笔画宽度不固定、方向任意
- 背景复杂:版面缺失,背景干扰
以上问题,普遍使用基于深度学习OCR进行解决。
3)文字提取
股票名称提取,涉及到从识别的文本中提取文字。
股票名称有维护中的数据表单,A股市场整体也就2000多只股票,数据量不大,所以通过正则表达式,进行股票名称提取即可。如果从大数据中提取文字,用NLP技术是当前比较普遍的方式。
[2-3 图片识别股票名称功能流程图]
批量添加自选股功能是以APP为载体,除了必要的功能及交互之外,大量计算都是服务端进行处理,适合以接口形式获取OCR文字识别和文字提取服务。从性能和体验的角度考虑,相比API接口,通过SDK的调取方式是最好的。
三、OCR文字识别技术选型
OCR文字识别是产品方案的核心技术。
对于OCR文字识别技术,可以从两种途径获得:
- 是公司内部自建AI团队,搭建技术框架,准备数据,训练算法,并包装成接口供业务层调用。
- 是从外部得到技术支持,调用AI开放平台提供的云服务接口,获得通用OCR文字识别技术。
实践过程中,两种方案各有利弊,需要从公司资源和业务规划层面评估,哪种方案是最好的,下面来介绍两种方案的实现。
自己团队研发OCR技术,实践中的关键点在于如何设计网络结构和合成训练数据。虽然有公开数据集,但是数据集并不一定完全吻合自身业务,可能需要自建数据集,或多个数据集筛选整合到一起,如何获取高质量的数据集和训练出高识别率的网络结构,是AI技术的团队的核心工作。
1)数据集
OCR算法训练最有难度的是数据,一方面是训练数据集大。普遍应用的深度学习OCR技术,需要大量的数据来保证训练效果,此外,中文汉字库非常大,一级字库有3755个汉字,再加上三级字库,就有上万个汉字,印刷体汉字还有9种常用的字体,手写体汉字更是千人千面,这些组成一个庞大的数据集。
另一方面数据集图片种类多,数据标注成本高。OCR场景图片识别会有很多因素影响识别效果,如复杂背景、艺术字体、低分辨率、非均匀光照、图像退化、字符变现、多语言混合、文本行复杂版式、检测框字符残缺等等,有效的数据集需要包含这些关联因素。
根据功能定义,OCR文字识别技术需要识别中文和数字,兼容印刷体识别和手写体识别,未来需要扩展英文识别。
对于手写体识别数据集,选择中科院自动化研究所的公开收集。对于印刷体识别数据集获取方式是:公开数据集+合成数据,公开数据集主要来自ICDAR比赛和AI研究机构。
除此之外,需要自己合成数据,来进行数据增强,对于数据增强需要考虑字体、形变、模糊、噪声、背景变化等因素。合成数据可以弥补深度学习数据量和数据多样性不够的问题,使训练出来的模型泛化能力更好。
一般我们获取到的是最原始的数据集,会有不同的格式,在图像深度学习训练中我们一般都会把原始数据集转化为统一的数据格式以方便后续的网络训练。
2)框架工具
OCR技术已经从传统OCR发展到深度学习OCR,并已成为主流趋势,所以需要选择深度学习框架和工具进行算法训练。
常用工具有下面几种:
Tesseract:
Tesseract是一款很流行的开源OCR引擎,它的特点是开源、免费、支持多语言、多平台,是一直以来使用比较普通的OCR工具,可以快速搭建图文识别系统。它可以读取各种格式的图像并将它们转化成超过60种语言的文本,但是中文的识别效果不理想,需要使用自己的库进行训练,开发符合自身需求的OCR引擎。
以前的Tesseract是基于传统机器学习的引擎,现在Tesseract (v4) 最新版本支持基于深度学习的OCR。底层的 OCR 引擎使用的是一种循环神经网络(RNN)——LSTM 网络,准确率显著提高,更符合当前的深度学习OCR趋势。因为使用的是别人的OCR引擎,所以自己优化网络结构提高识别率的灵活性差。
Tensorflow:
Tensorflow是非常流行的深度学习框架,尤其是对图像处理有很好的效果,基于其深度学习库,可以很好的进行OCR文字识别训练。
使用Tensorflow虽然没有Tessract效率高,但是有更高的灵活性和探索性,基于深度学习库的使用,可以设计出更适应业务需求的网络结构,更好的提高OCR识别效率。对于研发能力强的团队,更倾向于使用基础框架,自己设计网络结构。
OpenCV:
OpenCV是一个跨平台的开源计算机视觉库,提供基本的计算机视觉、图像处理和模式识别的开源项目,实现了图像处理和计算机视觉方面的很多通用算法。
OpenCV模块支持
3)框架设计
设计网络结构是OCR实践中的另外一个关键点。识别文字建模为一个多分类任务,比如3755个文字识别就需要3755个类别的分类任务,实际训练中可能有上万个分类。
深度学习OCR框架通常包括文字检测和文字识别2个模块,文字检测是通过检测算法定位到文本行,然后通过文字识别算法阅读出文本行的内容。
【3-1 深度学习OCR框架】
文字检测是场景文字识别的前提条件,要在杂乱无序、千奇百怪的复杂场景中准确地定位出文字的位置,需要高效合理的文字检测框架支持。适用于通用场景的主流文字检测框架有两种FCN和CTPN,对广泛应用的Faster-RCNN框架适用于特定场景文字检测,如身份证识别、银行卡识别、发票识别等场景。
FCN:
FCN是基于全卷积网络的文字检测方法,在通用场景的文字检测领域有很好的效果,尤其是背景复杂的户外广告牌识别。
FCN框架基于全卷积网络的方法,同时使用分割(Segmentation)和边界框回归(Bounding Box Regression)的方式对场景文字进行检测,直接产生单词或文本行级别的预测(旋转矩形或任意四边形),通过非极大值抑制产生最终结果。
【3-2基于FCN的文本检测流程图】
【3-3 基于FCN的文本检测网络结构图】
CTPN:
CTPN是基于联结文本建议网络的文字检测方法,与传统文字定位方法相比,通过CNN提取深度特征,并结合RNN进行序列学习提升文本检测效果,大幅提高文本框边界检测精度,尤其对于长文本(水平及具有一定倾斜角度的长文本)的检测。
CTPN算法框架主要思路是:将文本行识别看做一个序列识别问题,通过在卷积网络的特征图上提取Anchors,并计算每个Anchor的得分,并在计算得分的过程中,综合利用上下文信息、每行的文本序列特性,采用RNN进行建模以判断文字的得分。
【3-4基于联结文本建议网络的文本检测模型架构图】
【3-5经典的CTPN网络模型架构图】
在文字识别过程中,将整行文字识别问题归结为一个序列学习问题。
基本思路是:CNN与RNN结合,CNN被用于提取有表征能力的图像特征,而RNN处理序列问题,学习上下文关系。
文字识别框架近两年比较受关注的主要有两种:一种是CNN+RNN+CTC的方法,另一种是Attention model+CNN+RNN。
CNN+RNN+CTC:
文字识别可建模为时序依赖的词汇或者短语识别问题,基于联结时序分类训练RNN的算法。
相比于传统OCR,其识别效果更好。CNN+RNN+CTC网络结构包含三部分,从下到上依次为:
- 卷积层,使用CNN,作用是从输入图像中提取特征序列。
- 循环层,使用RNN,作用是预测从卷积层获取的特征序列的标签(真实值)分布。
- 转录层,使用CTC,作用是把从循环层获取的标签分布通过去重整合等操作转换成最终的识别结果。
【3-6 CNN+RNN+CTC算法模型架构图】
Attention model+CNN+RNN:
Attention model+CNN+RNN是基于注意力模型的文字识别方法,其实这两大方法主要区别在于最后的输出层(翻译层)——即怎么将网络学习到的序列特征信息转化为最终的识别结果。
这两大主流技术在其特征学习阶段都采用了CNN+RNN的网络结构,CRNN OCR在对齐时采取的方式是CTC算法,而attention OCR采取的方式则是attention机制。注意力模型在广告图像、自然场景图像等极具挑战性的场景取得了很好的端到端识别效果。
4)算法测试
衡量一个OCR算法性能的常用指标包括精准率、召回率、F值和识别速度。
精准率与召回率:
精准率可以理解为:模型识别字符“A”,最终识别成功的数量占所有被识别为字符“A”的比例。精准率是算法最重要的标准之一,精准率测试除了对字符进行测试外,还对条目进行测试。在印刷体识别中OCR的识别率比较高,普遍达到90%以上,但在自然场景文字识别中,获得理想的准确率面临着非常大的挑战。
计算公式为:
精准率=TP/(TP+FP)
召回率可以理解为:模型识别字符“A”,最终识别成功的数量占所有字符“A”的比例。召回率与精准率在一般情况下是矛盾的。
计算公式为:
召回率=TP/(TP+TN)
F值(也称F1值):
精准率和召回率是互相影响的,理想情况下肯定是两者都高最好,但是一般情况下准确率与召回率是矛盾的。召回率高、准确率低,召回率低、准确率高,当然如果两者都低,那是什么地方出问题了。
当精准率和召回率矛盾的情况下,单一依靠某个指标并不能较为全面地评价一个模型的性能。如何评估一个模型,常见的方法是F-Measure(又称F-Sorce),通过引入F值作为综合指标,评价模型的性能,F值是精准率和召回率的加权调和平均值。
F-Measure方法中,常用F1值作为精准率和召回率的加权调和平均值,实践中如果我们想创建一个具有最佳的精度—召回率平衡的模型,那么就要尝试将 F1 值 最大化。
F1=2*精准率*召回率/(精准率+召回率)
举例说明精准率、召回率、F值:
OCR模型的测试方法为比较图片中识别字符与标注的字符是否一致。例如:识别100个字符,标注是“A”识别为“A”的情况有30次,标注是“A”没有识别为“A”的情况为5次,标注不是“A”被识别为“A”的次数有8次。综上所述:TP为30次,FN为5次,FP为8次。
【3-7 文字识别精准率、召回率与F值】
通过公式计算字符识别的精准率、召回率、F1值:
- 精准率:30/30+8=0.79
- 召回率:30/30+5=0.86
- 模型的综合评价F1值: 2*0.79*0.86/0.79+0.86= 0.82
在OCR识别中,不管是FN和FP都是识别错误,对业务场景的影响没有区别,不像人脸识别,高召回率意味着模型风控更严格,所以OCR应该更关注模型的F值,尽可能取最大F值。
识别速度:
深度学习OCR的识别流程是输入图片,进行文字检测识别文字位置,然后进行文字识别,输出识别文本结果。整个过程算法识别速度,一般在200ms – 2s,真实场景中识别速度会受图片大小、字数多少及网络环境影响。
5)模型封装
模型训练好,通常还需要对模型进行裁剪迁移到实际运行环境中并封装成SDK接口供前端调用,其中还涉及到模型在真实环境中参数的跳转和优化。
2. 第三方OCR云服务接口
分析完自研发OCR技术的实现流程后,接下来分析第二种实现方案,接入外部AI开放平台的OCR接口实现产品功能。对于接入外部接口,要从多个方面来衡量OCR系统,除了关注指标识别准确率、识别速度、接口的稳定性、抗压性、易用性及用户界面的友好性等因素外,还要关注成本因素。
1)OCR技术比较
对行业知名的AI开放平台百度、腾讯、阿里、有道,进行通用OCR文字识别分析比较:
百度—通用文字识别:
腾讯—通用印刷体识别:
有道-通用OCR:
阿里云—通用文字识别:
2)通用OCR服务选择
根据功能定义、产品规划、场景需求和成本费用,比较后,选择百度通用文字识别接口。因为其常用文字的印刷体中文识别率比较高,识别速度和并发量都是可接受的范围,对于文字位置识别,生僻字识别等功能没有太强需求。
同时,百度通用OCR价格也是比较有有优势的,根据每日的接口请求数据估算,提供的免费额度很充分,性价比很高。
最重要的因素之一是:其提供移动端SDK接口,可以更灵活的设计前端界面和交互。
3)小结
使用第三方技术接口,有很多局限性,OCR技术的优化升级依赖第三方公司,无法根据自己的业务场景优化OCR识别效果。另一方面,使用第三方接口,产品测试主要是常规的接口、整个系统联调测试,OCR文字识别算法测试精细度受限。
四、方案选择
通过两个技术方案的分析,自己建立AI团队,训练出的算法会跟满足自身产品的需求,识别效果更好。但整个AI开发过程的周期是比较长的,同时团队的算法工程师大多是做大数据和量化投资方向的,没有专门OCR技术经验,无法保证短时间内设计出合理的OCR网络结构。
在综合考量了时间成本、人力成本、技术难度等各方面的因素后,决定通过第三方云服务接口来获取OCR技术。
五、总结
行业+AI方向的业务中,由于人才和成本的限制,大多数是没有自建AI算法团队,很大程度上依赖AI开放平台上的技术能力。这个时候需要产品经理去了解各种AI开放平台的技术能力,各自的技术优劣势,做好技术选型。
作为业务层产品经理虽不参与AI技术研发,还是要了解AI技术实践,一是为功能规划选择最有利的,便于业务层功能的设计开发;二是对领导可以阐述清楚,获得领导层的支持。
参考资料
- 《AI in 美团》深度学习在OCR中的应用
- OCR技术浅析——吴兆阳
- OCR检测与识别
- 【OCR技术系列之七】端到端不定长文字识别CRNN算法详解
- ICDAR2013文本检测算法的衡量方法(一)Evaluation Levels
本文由 @夏薇 原创发布于人人都是产品经理。未经许可,禁止转载
题图来自Unsplash,基于CC0协议
很不错的想法。不过从需求而言。感觉有更好的方法