华为云OCR应用实战详解资料整理

举报
cnlile 发表于 2020/11/21 00:25:39 2020/11/21
【摘要】 在2020年10月25日重阳节,在线上与大家做了一次关于华为云OCR服务应用实战解析的视频活动(ModelArt Developer Groups 社区活动),就如何使用华为云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 系统组成

    系统组成图如下:

    image.png


    以上是基于云服务的设计方案,具体组成部分如下:

    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能力。


【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

举报
请填写举报理由
0/200