关键词: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 项目: github.com/PaddlePaddl…
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 项目:
github.com/PaddlePaddl…
丨全体流程图
丨模型转化
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:github.com/PaddlePaddl…
模型后处理选用 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张图画
-
浏览器环境
模型称号 |
ch_ppocr_mobile |
ch_PP-OCRv2 |
检测耗时(WebGL) |
139ms |
258ms |
辨认耗时(WebGL) | 254ms |
60ms |
全体辨认F-score |
0.503 |
0.5224 |
检测模型巨细 |
2.6M |
3M |
辨认模型巨细 |
4.6M |
8.6M |