当前位置: 首页 > Web前端 > JavaScript

再添神器!Paddle.js发布OCRSDK

时间:2023-03-27 15:07:03 JavaScript

关键词:OCR,Paddle.js,PaddleOCR01前言OCR(OpticalCharacterRecognition,光学字符识别)是文字识别的统称,不仅支持文档或书籍文字识别,还包括自然场景的识别。文本也可以称为STR(SceneTextRecognition)。OCR文字识别一般包括两部分,文字检测和文字识别;文本检测首先使用检测算法来检测图像中的文本行;然后检测到的文本行使用识别算法来识别特定文本。OCRSDK(@paddlejs-models/ocr)依赖的技术主要包括两部分:百度开源的超轻量级文本识别模型套件PaddleOCR和基于JavaScript的前端深度学习推理引擎Paddle.js。接下来详细介绍PaddleOCR和@paddlejs-models/ocr。02PaddleOCRPaddleOCR是百度开源的超轻量级文字识别模型套件。提供数十种文字检测识别模型,旨在打造丰富、领先、实用的文字检测识别模型/工具库,帮助用户训练创建更好的模型并落地应用。目前不仅开源了超轻量级的8.6M中英文模型,用户还可以自定义训练,使用自己的数据集Fine-tune,取得非常好的效果。并提供了一套完整的各种硬件推理部署工具(全面支持服务器、移动、嵌入式等),是OCR文字识别领域工业级应用的绝佳选择。Paddle.js框架内使用的模型有:ch\_PP-OCRv2\_det\_infer文本检测推理模型和ch\_PP-OCRv2\_rec\_infer文本识别推理模型。对于之前的PP-OCR版模型,主要有三方面的改进:模型效果方面,相比PP-OCR手机版,提升了7%以上;速度方面,与PP-OCR服务器版相比,提升了220%以上;在模型大小方面,总大小为11.6M,服务器端和移动端都可以轻松部署。GitHub项目:https://github.com/PaddlePadd...03@paddlejs-models/ocr@paddlejs-models/ocr是一个运行在浏览器端的模型SDK,提供文字识别AI能力。SDK封装了两个API:init(模型初始化)和recognize(文字识别),核心代码如下:import*asocrfrom'@paddlejs-models/ocr';//模型初始化awaitocr.init();//获取文本识别结果API,img为用户上传的图片,option为可选参数//option.canvasasHTMLElementCanvas:如果用户需要绘制文本框选择区域,则传入canvas元素//option.styleasobject:如果用户需要配置canvasStyle,传入style对象//option.style.strokeStyleasstring:文本框选择颜色//option.style.lineWidthasnumber:文本框选择线段width//option.style.fillStyleasstring:文本框选择填充颜色constres=awaitocr.recognize(img,option?);//识别文本结果console.log(res.text);//文本区域坐标控制台.log(res.points);import*asocrfrom'@paddlejs-models/ocr';//模型初始化awaitocr.init();//获取文字识别resultAPI,img为用户上传的图片,option为可选参数//option.canvasasHTMLElementCanvas:如果用户需要绘制文本框选择区域,传入canvas元素//option.styleasobject:如果用户需要配置画布样式,传入样式对象//option.style.strokeStyleasstring:文本框的颜色//option.style.lineWidthasnumber:文本框选择线宽//option.style.fillStyleasstring:文本框选择填充颜色constres=awaitocr.recognize(img,option?);//文本识别结果console.log(res.text);//文本区域坐标console.log(res.points);GitHub项目:https://github.com/PaddlePadd...丨**整体流程图丨**模型转换paddlejsconverter是Paddle.js的模型转换工具,其功能是转换PaddlePaddle将模型转换成浏览器友好的格式,供Paddle.js在浏览器等环境中加载预测使用工具安装命令:pip3installpaddlejsconverter工具使用命令:#paddle_model_file_pathisocr_det/ocr_recPaddlePaddle模型本地路径#paddle_param_file_pathisocr_det/ocr_recPaddlePaddle模型参数本地路径#paddlejs_model_directory为转换后的paddlejs模型本地路径(开发者自定义)paddlejsconverter\--modelPath=\--paramPath=\--outputDir=丨**model初始化模型初始化模块会先加载ocr\_det文本检测模型和ocr\_rec文本识别模型,并行执行模型预热逻辑以减少模型预热时间。模型初始化的主要实现如下:detectRunner=newRunner({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:真});constdetectInit=detectRunner.init();recRunner=newRunner({modelPath:'https://paddlejs.bj.bcebos.com/models/ocr_rec_new',意思是:[0.5,0.5,0.5],std:[0.5,0.5,0.5],bgr:true});constrecInit=recRunner.init();返回awaitPromise.all([detectInit,recInit]);Runner.initAPI主要完成模型加载、神经网络生成和模型预热过程,因为我们使用WebGL后端计算,所以在预热过程中需要完成shader(着色器)编译和上传权重数据到纹理(texture).丨**Modelinferenceruntime1.文本检测ocr_det文本检测模型用于检测图像中文本所在的区域,返回每个文本框选择区域的坐标点。Preprocessing预处理就是根据模型输入的shape[1,3,960,960],将原图的尺寸缩放到960*960。对于长图处理:对于宽图处理:推理模型的推理过程同Paddle.js部分,详见GitHub:https://github.com/PaddlePadd...模型后处理采用DB(differentiablebinarization)算法,具体计算过程如下:根据二值化图像获取所有文本框的轮廓根据轮廓信息获取最小外接矩形,返回顶点坐标和最小宽高rectangle根据二值化图像和矩形框的坐标计算矩形框的置信度展开文本框大小,返回展开后的轮廓信息根据展开后的轮廓信息计算最小外接矩形将最终的矩形框映射回原始图像得到矩形框的顶点坐标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(LongShortTermMemory)。LSTM是一种特殊的RNN,可以保存长期依赖。基于图像的序列,两个方向的上下文是相互有用和互补的。由于LSTM是单向的,因此将两个LSTM(一个向前,一个向后)组合成一个双向LSTM。此外,可以堆叠多层双向LSTM。ch\_PP-OCRv2\_rec\_infer识别模型是使用的双层双向LSTM结构。计算过程如下图:丨效果展示05Benchmark评测环境:MacBookProA2141(16寸/i7/16G/512GSSD)评测耗时阶段为图像预测耗时,不包括图像预置针对实际OCR应用场景的处理和后处理,随机采集50张图片浏览器环境