华为云OCR应用实战详解资料整理
在2020年10月25日重阳节,在线上与大家做了一次关于华为云OCR服务应用实战解析的视频活动(ModelArt Developer Groups 社区活动),就如何使用华为云OCR服务,用微信小程序作为应用范例,做了具体的实战讲解,现在把当时讲解的内容资料做了整理,并且增加了一些内容(因活动时间,有些地方没有详解)。
1、华为云OCR服务介绍
华为云提供OCR服务以开放API(Application Programming Interface,应用程序编程接口)方式,实现了提供文字识别能力,将图片或扫描件中的文字识别成可编辑的文本。支持用户使用Python、Java等编程语言调用OCR服务API将图片识别成文字,帮助用户自动采集关键数据,打造智能化业务系统,提升业务效率。它提供了三大类OCR功能:1、通用类;2、票据类、3、证件类。
1.1 使用方式
华为云OCR服务提供的使用方式是:1、在线调用,通过华为云EI智能体验馆 > 文字识别,通过该方式体验部分OCR服务,适合于非技术人员进行技术体验;2、可视化工具,通过可视化工具(如curl、Postman)发送请求调用OCR服务API。也可以通过postman方式调用接口使用服务,适合开发者调测和技术验证;3、代码调用OCR服务,使用华为云提供的Java、Python、iOS、Android、Node.js等版本的SDK,或者自己编写http api 请求代码访问华为云服务,适合工程技术人员进行实际的开发生产使用。
1.2 使用步骤
华为云OCR的使用步骤:1、注册华为云正式用户,华为云EI企业智能中的文字识别内,选择待开通的服务进行申请服务;2、获取API接口认证,分为token和AK/SK两种鉴权方式;3、接入文字识别服务,使用华为云提供SDK的,配置环境,根据范例进行编码接入。如果使用的开发语言没有SDK,则自己根据API接入文档,按照文档的算法,自己编写鉴权认证的代码,进行接入服务。
2、小程序的OCR技术方案
本次实战解析,以微信小程序做了案例,做具体讲解,首先要介绍一个这个技术方案。
方案的设计理念是基于云服务架构,这样做的优点是降低开发复杂度,实现了移动端的轻应用,满足快速实现+快速迭代的产品需求,大大提供了开发的效能。
2.1 系统组成
系统组成图如下:
以上是基于云服务的设计方案,具体组成部分如下:
1、华为OCR云服务:华为云服务是基于互联网云技术的相关服务,通过提供API接入,提供云上OCR服务。
2、云函数:云函数即在云端运行的代码函数,具有天然鉴权的属性,开发者只需编写函数代码并部署到云端即可提供服务。
3、微信小程序:小程序的一种,是一种不需要下载安装即可使用的应用。
4、云数据库:是指被部署到一个虚拟云计算环境中的数据库,具有按需付费、按需扩展等优势。
5、云存储:是一种云上在线存储的模式,即把数据存放在通常云上的多台虚拟服务器。
2.2 系统流程
1、获取图片信息:用户访问小程序,使用小程序功能,选择图片或者拍摄照片,获取所需要的图片数据。
2、云服务处理数据:小程序将图片数据送至云服务中,利用云函数对数据进行处理。
3、访问OCR服务:在云服务中,使用云函数发起访问华为OCR服务的请求。
4、返回服务数据处理:对华为OCR处理返回的数据进行处理,在云数据库中对相关数据进行检索。
5、界面数据信息呈现:将相关数据进行加工和整理,呈现在客户的小程序界面中。
3、OCR技术的实现具体代码解析
3.1、上传图片
利用小程序的API 功能调用 wx.chooseImage 方法,从本地相册选择图片或使用相机拍照。这里设置是一张图片,可以获得一张图片的本地临时文件路径 (本地路径),和尺寸信息。
// 1、上传图片-- getImage: function(){ wx.chooseImage({ count: 1, sizeType: ['original', 'compressed'], sourceType: ['album', 'camera'], success (res) { // tempFilePath可以作为img标签的src属性显示图片 const tempFilePaths = res.tempFilePaths; console.log(tempFilePaths); wx.navigateTo({ url: '../display/display?imagepath=' + tempFilePaths[0] }) } }) }
3.2、调用云函数处理
这里首先读取云存储种的图片路径,从中读取数据,转化为Base64的数据格式内容,然后调用一个用于处理华为云OCR服务的API ,将Base64 数据传输过去,然后华为云处理信息的结果。
var image = wx.getFileSystemManager().readFileSync(options.imagepath, 'base64'); wx.cloud.callFunction({ name: 'ocrAnalysis', data: {image: image}, success: res => { console.log('[云函数] [onAnalysisImage]: ', res); let ret = res.result; if (ret.error == null){ this.setData({ text: ret.text, gbResult: ret.gbResult }); }else{ this.setData({ error: ret.error }); }; }, fail: err => { console.error('[云函数] [onAnalysisImage] 调用失败', err) wx.navigateTo({ url: '../deployFunctions/deployFunctions', }) } })
3.3、封装的调用函数ocrApi
这里封装了一个处理函数,是一个Promise返回对象。在里面进行配置参数后,生成一个新的处理API 对象OcrClientAksk,然后进行调用,处理返回结果。
function ocrApi(image){ return new Promise(function(resolve, reject){ let appKey = config.appKey; // your ak let appSecret = config.appSecret; // your sk let endPoint2 = 'ocr.cn-north-4.myhuaweicloud.com'; let httpUri2 = '/v1.0/ocr/general-text'; let ocrClientAksk = new OcrClientAksk(appKey, appSecret, endPoint2); let opt2 = {}; ocrClientAksk.requestOcrServiceBase64(httpUri2, image, opt2).then(result => { let data = result.result; resolve(data); }).catch(error => { reject(error) }); }); };
这里可以看到使用了AK/SK 方式鉴权,因为token鉴权会是http请求header部内容大于10K,使NodeJS程序的https组件出现异常。
3.4、https 请求API
这里是云函数内处理对象OcrClientAksk内的https请求方式,首先调用了getOptions进行参数处理,里面包含签名算法的调用,然后使用request方法发起https请求,根据不同的结果返回一个Promise对象。
httpRequest (service, image, opt) { return new Promise((resolve, reject) => { let options = this.getOptions(service, image, opt); request.post(options, (error, response, body) => { if (error) { reject(error) } let result = JSON.parse(body); result.statusCode = response.statusCode; resolve(result) }) }); } };
3.5、OCR返回数据的处理
API返回数据的格式:返回为一个JSON数据内容,包含如下:
1、result:调用成功时表示调用结果。调用失败时无此字段。
2、direction:图片朝向。
3、words_block_count:识别文字块数目。
4、words_block_list:识别文字块列表,输出顺序从左到右,从上到下。
根据业务内容分别处理GB/T,GB和GSB的内容,分别类型和提取业务代码。在资料数据库内,根据提取的数据关键字,对数据库进行检索,搜索所需要的商品信息。
var text = ''; for(let i = 0; i < result.words_block_count; i++){ let txt = result.words_block_list[i].words; text += txt + '\n'; if (txt.indexOf('GB/T') > -1){ type = 'GB/T'; let retCode = getCode(txt, type); code = retCode.code; codeNumber = retCode.codeNumber; break; }else if (txt.indexOf('GB') > -1){ type = 'GB'; let retCode = getCode(txt, type); code = retCode.code; codeNumber = retCode.codeNumber; break; }else if (txt.indexOf('GSB') > -1){ type = 'GSB'; let retCode = getCode(txt, type); code = retCode.code; codeNumber = retCode.codeNumber; break; }; }; let retDB = await db.collection('gb_list').where({ code: code, type: type }).get();
4、OCR应用服务的发展
4.1、应用场景:
1、数字图片:数字以及各种字体、背景、排列、组合等,最复杂多样,信息量最大。
2、自然类场景:无具体数据类型定义,比如街拍数据、摄像监控、自动驾驶,市场潜力巨大。
3、文档类:文档类OCR需求非常广,涉及各种公务场景,商业价值非常成熟。
4、拍照表单:拍照表单类OCR价值非常大,数据具有隐私性,典型行业应用场景沉淀技术能力。
4.2、业务落地:
大致两类方向为主:
1、金融:金融行业用戶涉足的AI技术领域非常广,对人体与人脸识别、OCR、内容安全审核等领域都有关注。
2、互联网服务:专业服务/互联网/信息服务用戶涉足的技术领域也非常广泛,引入了NLP、机器学习平台、图像、语音等多种AI能力。
- 点赞
- 收藏
- 关注作者
评论(0)