关键词 :OCR、Paddle.js、PaddleOCR

01 前言

OCR (Optical Character Recognition,光学字符识别)是文字识别的统称,不仅支持文档或书本文字识别,还包括识别自然场景下的文字,又可以称为 STR (Scene Text Recognition)。

OCR 文字识别一般包括两个部分,文本检测和文本识别;文本检测首先利用检测算法检测出图像中的文本行;然后检测到的文本行用识别算法去识别出具体文字。

OCR SDK(@paddlejs-models/ocr) 所依赖的技术主要包含两大部分:百度开源的超轻量级文字识别模型套件 PaddleOCR 和基于 JavaScript 的前端深度学习推理引擎 Paddle.js 。接下来将对 PaddleOCR @paddlejs-models/ocr 进行详细介绍。

02 PaddleOCR

PaddleOCR 是百度开源的超轻量级文字识别模型套件,提供了数十种文本检测、识别模型,旨在打造一套丰富、领先、实用的文字检测、识别模型/工具库,助力使用者训练出更好的模型,并应用落地。目前,不仅开源了 超轻量 8.6M 中英文模型,而且用户可以自定义训练,使用自己的数据集 Fine-tune 一下就能达到非常好的效果。并且提供了多种硬件推理(服务器端、移动端、嵌入式端等全支持)的一整套部署工具,是 OCR 文字识别领域工业级应用的绝佳选择。

在 Paddle.js 框架内使用的模型是:ch_PP-OCRv2_det_infer 文本检测推理模型和 ch_PP-OCRv2_rec_infer 文本识别推理模型。对于之前 PP-OCR 版本模型,主要有三个方面提升:

  • 在模型效果上,相对于 PP-OCR mobile 版本提升超 7%
  • 在速度上,相对于 PP-OCR server 版本提升超过 220%
  • 在模型大小上, 11.6M 的总大小,服务器端和移动端都可以轻松部署。
  • GitHub 项目: https://github.com/PaddlePaddle/PaddleOCR

    03 @paddlejs-models/ocr

    @paddlejs-models/ocr 是运行在浏览器端的模型 SDK,提供文本识别 AI 能力。SDK 封装两个API: init (模型初始化)和 recognize (文本识别),核心代码如下:

    import * as ocr from '@paddlejs-models/ocr';
    // 模型初始化
    await ocr.init();
    // 获取文本识别结果API,img为用户上传图片,option为可选参数 
    // option.canvas as HTMLElementCanvas:若用户需要绘制文本框选区域,传入canvas元素
    // option.style as object:若用户需要配置canvas 样式,传入style 对象
    // option.style.strokeStyle as string:文本框选颜色
    // option.style.lineWidth as number:文本框选线段宽度
    // option.style.fillStyle as string:文本框选填充颜色
    const res = await ocr.recognize(img, option?);
    // 识别文字结果
    console.log(res.text);
    // 文本区域坐标
    console.log(res.points);import * as ocr from '@paddlejs-models/ocr';
    // 模型初始化
    await ocr.init();
    // 获取文本识别结果API,img为用户上传图片,option为可选参数 
    // option.canvas as HTMLElementCanvas:若用户需要绘制文本框选区域,传入canvas元素
    // option.style as object:若用户需要配置canvas 样式,传入style 对象
    // option.style.strokeStyle as string:文本框选颜色
    // option.style.lineWidth as number:文本框选线段宽度
    // option.style.fillStyle as string:文本框选填充颜色
    const res = await ocr.recognize(img, option?);
    // 识别文字结果
    console.log(res.text);
    // 文本区域坐标
    console.log(res.points);

    GitHub 项目:

    https://github.com/PaddlePaddle/Paddle.js/tree/master/packages/paddlejs-models/ocr

    整体流程图

    模型转换

    paddlejsconverter 是适用于 Paddle.js 的模型转换工具,其作用是将 PaddlePaddle 模型转化为浏览器友好的格式,以供 Paddle.js 在浏览器等环境中加载预测使用。工具安装命令:-

    pip3 install paddlejsconverter
    

    工具使用命令:

    # paddle_model_file_path 为ocr_det/ocr_rec PaddlePaddle模型本地路径
    # paddle_param_file_path 为ocr_det/ocr_rec PaddlePaddle模型参数本地路径
    # paddlejs_model_directory 为转换完成的paddlejs模型本地路径(开发者自定义)
    paddlejsconverter  \
    --modelPath=<paddle_model_file_path> \
    --paramPath=<paddle_param_file_path> \
    --outputDir=<paddlejs_model_directory>

    模型初始化

    模型初始化模块首先会加载 ocr_det 文本检测模型和 ocr_rec 文本识别模型,并行执行模型预热逻辑,减少模型预热时间。模型初始化主要实现如下:

    detectRunner = new Runner({ modelPath: 'https://paddlejs.bj.bcebos.com/models/ocr_det_new', mean: [0.485, 0.456, 0.406], std: [0.229, 0.224, 0.225], bgr: true const detectInit = detectRunner.init(); recRunner = new Runner({ modelPath: 'https://paddlejs.bj.bcebos.com/models/ocr_rec_new', mean: [0.5, 0.5, 0.5], std: [0.5, 0.5, 0.5], bgr: true const recInit = recRunner.init(); return await Promise.all([detectInit, recInit]);

    Runner.init API 主要完成模型加载、神经网络生成以及模型预热过程,由于我们使用 WebGL backend 计算,所以在预热过程中需要完成 着色器(shader)编译 以及权重数据上传至纹理(texture)。

    模型推理运行时

    1. 文本检测

    ocr_det 文本检测模型用于检测图片内文本所在区域,返回每个文本框选区域的坐标点。

    预处理是将原图大小按照模型输入 shape [1, 3, 960, 960] 缩放至 960 * 960

  • 对长图处理:
  • 对宽图处理:
  • 模型推理过程同 Paddle.js 部分,详见GitHub:https://github.com/PaddlePaddle/Paddle.js

    模型后处理采用 DB(可微二值化)算法 ,具体计算过程如下:

  • 根据二值化图像获取所有文本框轮廓
  • 根据轮廓信息获取最小外接矩形,返回矩形的顶点坐标和宽高最小值
  • 根据二值化图像和矩形框坐标计算矩形框的置信度
  • 扩张文本框大小,返回扩张后的轮廓信息
  • 根据扩张后的轮廓信息计算最小外接矩形
  • 将最终的矩形框映射回原图,获取矩形框的顶点坐标
  • 2. 文本识别

    ocr_rec 模型采用 CRNN 算法,该算法的主要思想是认为文本识别是针对 序列 进行预测,所以采用了预测序列常用的 RNN 网络。算法通过 CNN (卷积层)提取图片特征,然后采用 RNN (循环层)对序列进行预测,最终使用 CTC (转录层)得到文本序列。

    ocr_rec 模型输入 shape 为 [1, 3, 32, 100],模型推理前会对图片文本框选区域进行处理:图片文本框选区域宽高比 <= 100 / 32,对缺省部分进行 #000 填充 ;框选区域宽高比

    100 / 32,对框选区域按宽度进行 裁剪 。最终传入识别模型的图片宽高比为 100 : 32 。以下图文本框为例:

    将预处理过后的图片传入 Paddle.js 框架引擎中,进行模型推理计算,得到文本序列 置信度列表 ,在字典中查找置信度最大值索引对应的字符,完成文字识别。

    在模型推理过程中,核心算法为 RNN RNN 是循环神经网络,由输入层、隐藏层和输出层组成,擅长对序列数据进行处理。 t时刻,输入层为xt,隐藏层为st,输出层为ot。从上图可知,st的值不仅仅取决于输入层xt,还取决于t−1时刻的隐藏层st−1。计算公式如下: 因为 RNN 有梯度消失问题,不能获取更多上下文信息,所以 CRNN 中使用的是 LSTM(Long Short Term Memory) ,LSTM 是一种特殊的 RNN,能够保存长期的依赖关系。

    基于图像的序列,两个方向的上下文是相互有用且互补的。由于 LSTM 是单向的,所以将两个 LSTM,一个向前和一个向后组合到一个 双向 LSTM 中。此外,可以堆叠多层双向 LSTM。ch_PP-OCRv2_rec_infer 识别模型就是使用的双层双向 LSTM 结构。计算过程如下图所示:

    效果展示

    05 Benchmark

    评估环境:

  • MacBook Pro A2141(16英寸/i7/16G/512GSSD)
  • 评估耗时阶段为图像预测耗时,不包括图像的预处理和后处理
  • 针对OCR实际应用场景,随机收集的50张图像
  • 浏览器环境
  • 6月5日,一张券商降薪截图在社交媒体疯传。截图提到,当日上午,某中字头头部券商召开大会,除了MD外全员降薪,且降薪不只是降奖金,而是直接降底薪。按照职级不同,SA1降6K,SA3降8K,VP降8K—10K。据了解,降薪大概率整体属实,但具体幅度有所差异,且不同区域、不同业务条线目前掌握的降薪情况也不尽相同。

    发布于:13天以前 1822次阅读 详细内容 » Meta公司周一(5月22日)推出了一个开源AI语言模型——大规模多语言语音(Massively Multilingual Speech, MMS)模型,可以识别和产生1000多种语言的语音——比目前可用的模型增加了10倍。研究人员表示,他们的模型可以转换1000多种语言,但能识别4000多种语言。

    发布于:26天以前 782次阅读 详细内容 » 5月31日晚,荣耀方面对澎湃新闻记者表示,上海荣耀智能科技开发有限公司是荣耀位于上海的研究所,是荣耀在中国的5个研究中心之一,重点方向在终端侧核心软件、图形算法、通信、拍照等方面研究开发工作。荣耀强调,坚持以用户为中心,开放创新,与全球合作伙伴一起为用户提供最佳产品解决方案。

    发布于:19天以前 377次阅读 详细内容 » 日前,以押注“颠覆性创新”著称的ARK Invest创始人Cathie Wood在接受媒体采访时表示,软件提供商将是人工智能狂潮的下一个受益板块。英伟达每卖出1美元的硬件,软件供应商SaaS供应商就会产生8美元的收入。

    发布于:19天以前 269次阅读 详细内容 » 超过 350 名从事人工智能工作的高管、研究人员和工程师签署了这份由非盈利组织人工智能安全中心发布的公开信,认为人工智能具备可能导致人类灭绝的风险,应当将其视为与流行病和核战争同等的社会风险。

    发布于:20天以前 245次阅读 详细内容 » 据报道,阿里巴巴研究员吴翰清已于近期离职,钉钉显示其离职时间是5月19日。在阿里内部,研究员的职级为P10。据消息人士透露,吴翰清离职后,选择AI短视频赛道创业,已经close一轮融资。对于上述消息,截至发稿,阿里尚未回应。

    发布于:23天以前 244次阅读 详细内容 » 5月29日消息,继上周远超预期的财报业绩预测引得股价和市值史诗级暴涨后,今日,英伟达(NVIDIA)创始人兼CEO黄仁勋穿着标志性的皮衣,意气风发地出现在台北电脑展COMPUTEX 2023上,在主题演讲期间先是现场给自家显卡带货,然后一连公布涉及加速计算和人工智能(AI)的多项进展。

    发布于:21天以前 224次阅读 详细内容 » 董明珠称:“手机是坚决不会放弃的,前段时间别人说格力的手机解散了,我觉得很好笑,不知道哪里来的声音。我现在用的手机就是我自己的(格力手机),现在消费者用完我们的手机,确实给了我们很正确的评价。不是我说好,是消费者用了以后觉得我们的手机好。”

    发布于:11天以前 214次阅读 详细内容 »