关于paddle:再添神器Paddlejs-发布-OCR-SDK

12次阅读

共计 4024 个字符,预计需要花费 11 分钟才能阅读完成。

关键词: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 版本模型,次要有三个方面晋升:

  1. 在模型成果上,绝对于 PP-OCR mobile 版本晋升超 7%
  2. 在速度上,绝对于 PP-OCR server 版本晋升超过 220%
  3. 在模型大小上,11.6M 的总大小,服务器端和挪动端都能够轻松部署。

GitHub 我的项目: https://github.com/PaddlePadd…

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/PaddlePadd…

** 整体流程图

** 模型转换

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/PaddlePadd…

模型后处理采纳 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 框架引擎中,进行模型推理计算,失去文本序列 置信度列表,在字典中查找置信度最大值索引对应的字符,实现文字辨认。

在模型推理过程中,外围算法为 RNNRNN 是循环神经网络,由输出层、暗藏层和输入层组成,善于对序列数据进行解决。

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 张图像
  • 浏览器环境
正文完
 0