【前端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" />
    <!-- 图片预览 -->
    <img
      v-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); // 创建预览图片的URL
        this.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就记录到这里,试了几个第三方,单单靠前端开发,也只能依赖于开源的做到这程度了。

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

受到大佬项目 免root跨平台自动化测试框架webrebot 本地离线OCR的启发和指引,成功的把百度开源的 PaddleOCR 应用到PYTHON及VC++ 经过小范围测试python的效果比VC++理想很多,绝大多数游戏及日常都可以成功通用识别. 更新添加DLL版本了 在网盘里已经更新了VC++的 DLL版本,及VC++调用测试的!知道易语言 怎么调用64位DLL的也发个例子吧 注: PYTHON代码里还用到了两个组件要在按下面的安装完成PaddlePaddlePaddleOCR后再执行两个命令才能使用 fastapi 一个异步的超强WEB框架 1、python -m pip install fastapi 2、python -m pip install uvicorn 游戏小图识别成功率比较高 大图测试 python部分代码: python 的安装很多的坑..在期间找了无数贴子。。自己把经验总结分享 一、安装python         安装3.7或者3.8 python         我的安装环境是 WIN10 X64 PYTHON 3.85 二、安装PaddlePaddle 升级PIP  python -m pip install --upgrade pip         如果您的机器安装的是CUDA9或CUDA10,请运行以下命令安装         python -m pip install paddlepaddle-gpu -i https://mirror.baidu.com/pypi/simple         如果您的机器是CPU,请运行以下命令安装, 工作室或者GPU不太好的就用这个, 正常也使用这个就好了         python -m pip install paddlepaddle -i https://mirror.baidu.com/pypi/simple 三、克隆\安装PaddleOCR代码         方法一:                git clone https://gitee.com/paddlepaddle/PaddleOCR                 安装第三方库                 cd PaddleOCR                 python -m pip install -r requirments.txt         方法二:                 pip install paddleocr -i https://mirror.baidu.com/pypi/simple PS:95% 运行不成功的问题, 是在这步造成的         安装完成后 再执行 更新 默认安装的numpy版本太高。。 python -m pip install numpy==1.19.3 -i https://mirror.baidu.com/pypi/simple 四、目前PYTHON的识别比C++的高 另附上VC++的识别图 VC++版本因为太大(几个文件,无需安装,命令行取回显方式调用)和PYTHON识别库上传到BAIDU网盘中 链接: https://pan.baidu.com/s/1jC7wgx7hiQ-FsYluiIKukQ  提取码: gycx
### 集成PaddleOCRPaddleJS至Vue项目 #### 准备工作 为了成功集成 PaddleOCRPaddleJS 到 Vue 项目中,需先安装必要的依赖项并配置开发环境。确保已安装 Node.js 及 npm 或 yarn。 #### 安装PaddleJS库 通过npm或yarn来安装PaddleJS客户端库: ```bash npm install paddlejs-core paddlejs-backend-webgl ``` 或者使用yarn: ```bash yarn add paddlejs-core paddlejs-backend-webgl ``` 此操作引入了核心功能以及WebGL后端支持[^1]。 #### 加载预训练模型 对于 OCR 功能而言,加载由 PaddleOCR 提供的预训练模型至关重要。由于浏览器环境中直接获取大型文件较为不便,建议预先下载所需模型并将它们托管在同一服务器上以便于访问。 创建`public/models/paddleocr`目录用于存储这些资源,并调整路径设置使其匹配实际部署情况下的URL结构。 #### 初始化PaddleJS实例 在组件内部初始化PaddleJS对象之前,确认已完成上述准备工作。下面是一个简单的例子展示如何完成这一过程: ```javascript import { createApp } from 'vue' import App from './App.vue' // 导入paddlejs模块 import * as paddlejs from "paddlejs-core"; import "paddlejs-backend-webgl"; const app = createApp(App); app.config.globalProperties.$paddle = new paddlejs.Paddle(); export default app; ``` 这段代码片段展示了怎样将全局属性 `$paddle` 添加到 Vue 实例中,从而可以在任何地方方便地调用它。 #### 使用PaddleOCR执行文字识别任务 一旦完成了前面提到的所有步骤,在页面里就可以轻松实现图像中的文本提取功能了。这里给出一段示范性的方法定义方式: ```javascript methods: { async recognizeText(imageUrl) { const result = await this.$paddle.ocr({ path: '/models/paddleocr/', // 模型所在位置 url: imageUrl, // 待处理图片链接 }); console.log('Recognition Result:', result); return result.text; // 返回解析出来的字符串内容 } } ``` 以上就是关于如何把基于Paddle框架构建的服务嵌入到前端应用内的基本指导说明。请注意根据具体需求适当修改参数选项以获得最佳性能表现。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值