【前端OCR】如何用paddlejs开发一个属于前端本地的OCR文本识别功能

之前出过一篇关于用tesseract纯前端实现文本识别功能的文档,经测试之后,用是能用,但识别准确率并不高,而且耗时也相对比较久。

于是又找了一个paddlejs做开发测试,但是整体上来说,其实两个差不多。而且初始化过程还会相对久些,如图

在这里插入图片描述

下面简单介绍下关于paddlejs的一些信息和基础Demo吧。

官方文档:https://paddlejs.baidu.com/

PaddleJS 是百度开源的一个基于PaddlePaddle模型的Web端推理框架,它允许开发者在浏览器中直接运行深度学习模型,无需任何额外的安装或配置。通过使用PaddleJS,您可以轻松地将训练好的PaddlePaddle模型转换为可以在Web页面上执行的形式,从而实现在客户端进行图像识别、自然语言处理等多种AI功能。

主要特点

  1. 跨平台支持:由于PaddleJS运行于浏览器环境中,因此它可以无缝支持所有现代浏览器,包括桌面和移动设备上的浏览器,这使得开发的应用程序具有极高的可移植性。
  2. 高效性能:利用WebAssembly技术和GPU加速(通过WebGL),PaddleJS能够在保持高性能的同时,提供流畅的用户体验。
  3. 易用性:PaddleJS提供了简单易用的API,使开发者可以方便地加载模型并执行推理任务。同时,它还支持从PaddlePaddle到PaddleJS模型的转换工具,简化了模型部署流程。
  4. 安全性:所有的计算都在用户的本地设备上完成,这意味着数据不需要上传到服务器,既保护了用户隐私,也减少了网络传输带来的延迟。

使用场景

  • 图像分类与检测:如人脸识别、物体识别等。
  • 自然语言处理:例如文本分类、情感分析等。
  • 语音识别与合成:虽然目前主要集中在视觉和NLP领域,但未来也可能拓展至音频处理。

如何使用

  1. 准备模型:首先需要有一个训练好的PaddlePaddle模型,然后使用官方提供的转换工具将其转换成适用于PaddleJS的格式。
  2. 集成到项目:可以通过npm安装PaddleJS库,或者直接引入在线资源链接。之后就可以按照文档说明加载模型,并对输入数据执行预测。
  3. 执行推理:准备好输入数据后,调用相应API执行推理,并根据返回的结果做进一步处理。

其中:@paddlejs-models/ocr 是 PaddleJS 提供的一个用于光学字符识别(OCR)的预训练模型库。它使得开发者可以在浏览器环境中直接进行文本检测和识别,无需服务器端的支持。

@paddlejs-models/ocrdet 是 PaddleJS 提供的一个专注于文本检测的预训练模型库,适用于在浏览器环境中进行文本区域的检测。它通常用于从图像中定位文本的位置,是实现完整 OCR(光学字符识别)流程的一部分,专门负责“检测”步骤。

Vue框架下Demo展示区域:

npm安装@paddlejs-models/ocr

npm install @paddlejs-models/ocr

或者在 HTML 文件中直接引用 CDN 链接:

<script src="https://unpkg.com/@paddlejs-models/ocr"></script>

同时安装@paddlejs-models/ocrdet(可装可不装,按需)

npm install @paddlejs-models/ocrdet

如果安装下载不成功,那么直接访问这位开发同仁提供的demo代码:https://github.com/Lovely-Pig/PaddleOCR-Paddlejs-Vue-Demo

拉下来后直接npm install就行,而页面的实际使用和开发可以查看下面代码:

下面是一个基于Vue的完整页面案例代码

<template><div class="hello"><!-- 文件上传控件 --><input type="file" accept="image/*" @change="onImageChange" /><!-- 图片预览 --><imgv-if="imageUrl":src="imageUrl"alt="Preview"style="max-width: 300px; margin-top: 20px"/><!-- OCR识别按钮 --><button @click="performOCR" style="margin-top: 20px">开始识别</button><!-- 日志输出区域 --><div v-if="log.length"><div>日志:</div><div v-for="(item, index) in log" :key="index">{{ item }}</div></div><!-- 耗时展示 --><div v-if="times.length"><div>耗时:</div><div v-for="(time, index) in times" :key="index">{{ time.label }}: {{ time.duration }} ms</div></div><!-- 识别结果展示 --><div><div>识别结果:</div><div>{{ result }}</div></div></div>
</template><script>
import * as ocr from "@paddlejs-models/ocr";export default {name: "HelloWorld",data() {return {msg: "Welcome to Your Vue.js App with OCR",imageFile: null,imageUrl: "",result: null,log: [],times: [],startTime: 0,initTime: 0,endTime: 0,first: false,};},methods: {onImageChange(event) {this.imageFile = event.target.files[0];if (this.imageFile) {this.imageUrl = URL.createObjectURL(this.imageFile); // 创建预览图片的URLthis.log.push("图片已加载");}},async performOCR() {this.log.push("点击了开始识别按钮");this.startTime = performance.now(); // 记录开始时间await ocr.init().then(() => {// 初始化OCR模型this.initTime = performance.now(); // 记录模型初始化完成的时间this.log.push("OCR模型初始化完成,开始识别...");const img = new Image();img.src = this.imageUrl;img.onload = async () => {try {const results = await ocr.recognize(img); // 使用recognize方法执行OCR识别this.endTime = performance.now(); // 记录识别完成的时间console.log("OCR识别完成", results);this.log.push("OCR识别完成");this.log.push(`识别结果: ${JSON.stringify(results.text || "未识别到")}`);const prefixes = "783|784|731";const regex = new RegExp(`(?:\D|^)(${prefixes})\d{10}`, "g");// 用于存放匹配成功的下标const matchedItems = [];// 遍历数组并检查每个元素results.text.forEach((text, index) => {if (regex.test(text)) {matchedItems.push({ index: index, content: text });}});// 创建描述匹配下标的文本let outputText;if (matchedItems.length > 0) {outputText = `在识别结果中,以下结果符合条件: `;matchedItems.forEach((item) => {outputText += `${item.content}\n`;});} else {outputText = "在识别结果中,没有找到符合的。";}this.result = outputText || "未识别到";// 计算并记录耗时this.times = [{label: "模型初始化耗时",duration: this.initTime - this.startTime,},{label: "识别过程耗时",duration: this.endTime - this.initTime,},{ label: "总耗时", duration: this.endTime - this.startTime },];} catch (error) {this.log.push(`发生错误: ${error.message}`);}};}).catch((error) => {this.log.push(`初始化OCR模型失败: ${error.message}`);});},},
};
</script><!-- Add "scoped" attribute to limit CSS to this component only -->
<style scoped>
div {font-size: 12px;
}
input[type="file"],
button {margin-top: 20px;
}
</style>

在这里加入了一些从识别结果中,正则提取到自己需要的结果,要注意识别出来的是一个文本数组,而且不支持竖向识别。

OCR就记录到这里,试了几个第三方,单单靠前端开发,也只能依赖于开源的做到这程度了。

想要更好的效果,去付费吧。省时省力还好用。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/17806.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Spring IoC的实现机制是什么?

大家好&#xff0c;我是锋哥。今天分享关于【Spring IoC的实现机制是什么&#xff1f;】面试题。希望对大家有帮助&#xff1b; Spring IoC的实现机制是什么&#xff1f; 1000道 互联网大厂Java工程师 精选面试题-Java资源分享网 Spring IoC&#xff08;Inversion of Control…

Web3 开发者周刊 36 | 构建自主未来:Agent、可扩展性与赏金

欢迎来到 Web3 开发者周刊 36&#xff0c;这里汇聚了赋能您的 Web3 构建之旅的各种资源。本周我们将剖析基于Agent的系统&#xff0c;讨论来自 Vitalik 关于以太坊 L1 和 L2 的最新思考&#xff0c;并提供最新高价值Bounty消息。 开始Build吧&#xff01; ✅ One Trillion Age…

网络安全-防御 第一次作业(由于防火墙只成功启动了一次未补截图)

防火墙安全策略课堂实验报告 一、拓扑 本实验拓扑包含预启动设备、DMZ区域&#xff08;含OA Server和Web Server&#xff09;、防火墙&#xff08;FW1&#xff09;、Trust区域&#xff08;含办公区PC和生产区PC&#xff09;等。具体IP地址及连接关系如给定拓扑图所示&#xf…

Vue.js 与低代码开发:如何实现快速应用构建

在当今数字化时代&#xff0c;企业对应用开发的效率要求越来越高。传统开发模式往往耗时费力&#xff0c;难以满足快速变化的市场需求。而 Vue.js 与低代码开发的结合&#xff0c;为快速构建应用提供了新的解决方案&#xff0c;让企业能够更敏捷地响应市场变化&#xff0c;抢占…

第39周:猫狗识别 2(Tensorflow实战第九周)

目录 前言 一、前期工作 1.1 设置GPU 1.2 导入数据 输出 二、数据预处理 2.1 加载数据 2.2 再次检查数据 2.3 配置数据集 2.4 可视化数据 三、构建VGG-16网络 3.1 VGG-16网络介绍 3.2 搭建VGG-16模型 四、编译 五、训练模型 5.1 上次程序的主要Bug 5.2 修改版…

朝天椒USB服务器解决前置机U盾虚拟机远程连接

本文探讨朝天椒USB服务器用Usb Over Network技术&#xff0c;解决前置机虚拟化部署后U盾的远程连接问题。 在金融、电信等关键行业&#xff0c;后台核心处理系统承担着至关重要的业务数据交互职责。为保障系统安全&#xff0c;这些单位要求企业通过前置机与他们的内网进行数据…

《刚刚问世》系列初窥篇-Java+Playwright自动化测试-23- 操作鼠标拖拽 - 番外篇(详细教程)

拉票 亲爱的小伙伴们或者童鞋们&#xff0c;喜欢宏哥文章的&#xff0c;请动动你们发财小手&#xff0c;给我投投票票 。 祝2025小伙伴们工作顺利&#xff0c;家庭和睦&#xff0c;心想事成&#xff0c;财源滚滚&#xff01; 我的票还有7票&#xff0c;互票的朋友私信给我。 投…

教程 | 从零部署到业务融合:DeepSeek R1 私有化部署实战指南

文章目录 1. 什么是 DeepSeek R1&#xff1f;a. 主要介绍a. 版本区别 2. 部署资源要求a. 硬件资源要求 3. 本地安装DeepSeek-R1a. 为什么选择本地部署&#xff1f;b. 部署工具对比c. 演示环境配置d. Ollama安装流程 4. 可视化工具a. 工具对比b. Open-WebUI部署 5. AI API应用a.…

学习总结2.14

深搜将题目分配&#xff0c;如果是两个题目&#xff0c;就可以出现左左&#xff0c;左右&#xff0c;右左&#xff0c;右右四种时间分配&#xff0c;再在其中找最小值&#xff0c;即是两脑共同处理的最小值 #include <stdio.h> int s[4]; int sum0; int brain[25][25]; …

Qt Creator 5.0.2 (Community)用久了突然变得很卡

目录 1.现象 2.解决方案 1.现象 很久没有用Qt Creator开发项目了&#xff0c;刚刚结束的项目又是用VS2019开发的&#xff1b;这两天刚好有时间去学习一下Qt&#xff0c;刚好要用Qt Creator&#xff0c;结果一打开就没反应&#xff0c;主界面显示出来要好几分钟&#xff0c;最…

DeepSeek的深度解析:由来、研发过程、公司背景、优势、劣势与总结

DeepSeek的由来 DeepSeek&#xff0c;中文名“深度求索”&#xff0c;是一个在人工智能领域崭露头角的创新项目。其英文名“DeepSeek”由“深思”&#xff08;Deep&#xff09;与“探索”&#xff08;Seek&#xff09;组合而成&#xff0c;寓意着凭借深度学习技术不断探索未知…

初阶c语言(练习题,猜随机数)

前言&#xff1a; 学习c语言&#xff0c;学习来源b站鹏哥&#xff0c;37天吧应该是 内容&#xff1a; 这集内容挺多&#xff0c;源代码放到文章最后 题目是&#xff0c;使用函数编写一个随机数&#xff0c;然后自己猜&#xff0c;猜随机数 这里囊括了很多的知识点&#xf…

w206基于Spring Boot的农商对接系统的设计与实现

&#x1f64a;作者简介&#xff1a;多年一线开发工作经验&#xff0c;原创团队&#xff0c;分享技术代码帮助学生学习&#xff0c;独立完成自己的网站项目。 代码可以查看文章末尾⬇️联系方式获取&#xff0c;记得注明来意哦~&#x1f339;赠送计算机毕业设计600个选题excel文…

Python PyCharm DeepSeek接入

Python PyCharm DeepSeek接入 创建API key 首先进入DeepSeek官网,https://www.deepseek.com/ 点击左侧“API Keys”,创建API key,输出名称为“AI” 点击“创建",将API key保存,复制在其它地方。 在PyCharm中下载Continue插件 安装 下载中 下载完成后,点击OK 配…

鸿蒙开发:了解@Builder装饰器

前言 本文代码案例基于Api13&#xff0c;温馨提示&#xff1a;内容相对来说比较简单&#xff0c;如果您已掌握&#xff0c;略过即可。 如果说一个页面中组件有很多&#xff0c;我们都统一写到build函数中&#xff0c;显而易见&#xff0c;会导致build函数代码非常冗余&#xff…

一文深入了解DeepSeek-R1:模型架构

本文深入探讨了 DeepSeek-R1 模型架构。让我们从输入到输出追踪 DeepSeek-R1 模型&#xff0c;以找到架构中的新发展和关键部分。DeepSeek-R1 基于 DeepSeek-V3-Base 模型架构。本文旨在涵盖其设计的所有重要方面。 &#x1f4dd; 1. 输入上下文长度 DeepSeek-R1的输入上下文长…

Linux进程管理

一、进程查看 1、进程 进程 process 计算机执行任务的最小单位 2、进程查看 ps auxa&#xff1a;all u&#xff1a;user x&#xff1a;所有终端 所有用户所有终端的所有进程 COMMAND&#xff1a; 进程名称 USER&#xff1a; 启动进程的用户&…

(5/100)每日小游戏平台系列

新增一个数字迷宫游戏&#xff01; 数字迷宫游戏是一款基于迷宫探索的益智游戏。玩家从迷宫的起点出发&#xff0c;必须根据迷宫中的数字指示&#xff0c;选择正确的方向&#xff0c;通过迷宫最终到达终点。游戏的目标是尽快找到并到达终点。 游戏规则 起点与终点&#xff1a;…

latex二重闭合积分显示

latex二重闭合积分显示 环境 texlive2024texstdio4.8.6 解决 添加宏包 \usepackage{esint} % 在导言区加载宏包符号 \oiint测试 documentclass[12pt]{article} \usepackage{esint} % 在导言区加载宏包 \title{Hello} \author{Houor}\begin{document}\maketitleHello, \L…

WebP2P+自研回音消除:视频通话SDK嵌入式EasyRTC构建高交互性音视频应用

随着移动互联网时代的到来&#xff0c;手机端的扬声器大多采用外置设计&#xff0c;且音量较大。在这种情况下&#xff0c;扬声器播放的声音更容易被麦克风捕捉&#xff0c;从而导致回声问题显著加剧。这种设计虽然方便用户在免提模式下使用&#xff0c;但也带来了更复杂的音频…