深度学习——使用Tesseract.js在浏览器离线识别图片中的文字

Tesseract简介

Tesseract是惠普布里斯托实验室在1985到1995年间开发的一一个开源的OCR引擎,曾经在1995 UNLV精确度测试中名列前茅。但1996年后基本停止了开发。2005年,惠普将其对外开源,2006 由Google对Tesseract进行改进、消除Bug、优化工作。官网项目地址:https://github.com/tesseract-ocr/tesseract

Tesseract.js是基于Tesseract——OCR引擎的一个纯JavaScript接口。
图片测试地址:https://tesseract.projectnaptha.com/
官网地址:https://github.com/naptha/tesseract.js#tesseractjs

1.安装node.js

官网给出的示例基本都使用了node.js,安装这个主要是为了下一步利用npm工具下载安装Tesseract.js的相应文件,以实现离线的文字识别。
node.js的安装可以参考菜鸟教程:https://www.runoob.com/nodejs/nodejs-install-setup.html

2.从官网下载Tesseract.js的离线版本

在官网中可以找到链接,这里也给出:https://github.com/jeromewu/tesseract.js-offline
直接将其下载下来,当然你也可以选择使用git工具clone到本地
在这里插入图片描述
下载下来之后,将其解压。

3.命令行进入上一步解压的文件夹,使用npm install命令下载安装相关包。

截图示例:
在这里插入图片描述
在它下载安装完成后,你会发现在该目录文件夹下多了一个名为node_modules的文件夹,这个文件夹下的东西就是刚刚安装下载的东西,其中包含了所有文字识别需要的组件及库。

4.运行程序

这一步可以先试一试参照官方文档的示例,在上一步的命令行中输入

npm run start

截图如下:
在这里插入图片描述
这时服务器已经启动,在浏览器中输入http://localhost:3000/browser/访问,再按F12,查看浏览器控制信息,会发现程序正常运行,识别了该程序内置的图片,识别的结果在控制台中已经输出了,控制台截图如下:
在这里插入图片描述
其中最下面的文字时识别图片后的文本。

5.让其在本地idea的浏览器环境中直接运行

将该文件夹复制到你的idea项目中,然后找到F:\Projects\IdeaProjects\springboot01helloworld\src\main\resources\static\html\OCR\tesseract.js-offline-master\browser\index.html,即该目录下的browser文件夹下的index.html文件(前面的路径应该是你的具体本地),再选择使用浏览器打开,即可得到和第四步一样的结果。

6.在浏览器识别中文

这个tesseract.js的离线版本,只支持对英文的识别,不支持中文,如果你放一张中文的图片,会发现识别的结果是一堆乱码。
这里需要修改其中的代码,同时要去官网上下载对应的中文语言识别包。

1.下载中文识别包

tesseract.js的语言包下载地址为https://github.com/naptha/tessdata/tree/gh-pages/4.0.0
进入该网址,下载对应的中文语言包,具体名称为chi_sim.traineddata.gz,截图如下:
在这里插入图片描述
下载完成后,将该文件放到tesseract.js-offline-master\lang-data文件夹下,该文件夹存放了所有语言识别包文件。

2.修改相应的代码,实现识别中文

修改第五步中的index.html中的代码即可,程序逻辑很简单:

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>Tesseract.js Offline</title>
  <script src="../node_modules/tesseract.js/dist/tesseract.min.js"></script>
  <script>
    const { createWorker } = Tesseract;
    const worker = createWorker({
      workerPath: '../node_modules/tesseract.js/dist/worker.min.js',
      langPath: '../lang-data',
      corePath: '../node_modules/tesseract.js-core/tesseract-core.wasm.js',
      logger: m => console.log(m),
    });

    (async () => {
      await worker.load();
      await worker.loadLanguage('chi_sim');
      await worker.initialize('chi_sim');
      const { data: { text } } = await worker.recognize('../images/合同测试图片.png');
      //这里我使用了我自己的图片目录,
      //在实际使用时需要改成你自己的图片路径
      console.log(text);
      await worker.terminate();
    })();
  </script>
</head>
<body>
</body>
</html>

主要修改的是这三句

 	await worker.loadLanguage('chi_sim');
      await worker.initialize('chi_sim');
      const { data: { text } } = await worker.recognize('../images/合同测试图片.png');

修改后,再在idea中使用浏览器打开,会发现已经能够正常识别中文了。
贴一波结果:
识别时使用的图片:
在这里插入图片描述
识别的结果截图:
在这里插入图片描述

可以看出,识别的效果还是不错的。

题外话及过程记录

一开始是有一个在浏览器端实现离线文字识别的需求,查找资料后找到了 Tesseract.js这个开源库,但网上特别关于Tesseract.js这个js版本的学习文章介绍特别少,我参考了几篇文章,在实际使用的时候都会报错,始终无法识别。
迫于无奈,只能自己看官网的文档资料,发现官网的例子基本上是都用到了node.js以及npm,给出的例子都是,先用npm安装相应的包,然后启动node.js服务器,最后通过浏览器访问相应的服务器地址,实现了识别。这让我一度以为,这个框架不能离线识别,必须连接服务器。
在去补了下node.js以及npm的入门知识后,经过一番操作,终于是实现了不开启服务器,只打开浏览器即可实现文字识别的功能。
在这个过程中,踩了一些坑,同时也学会了要看官方文档,官方文档是最权威的,也是最详细的,英语看不惯,别急,可以一步步慢慢来,这样有时候比起网上无厘头找教程反而要快。

在 UniApp 开发 App 时,如果你想在离线状态下使用 Tesseract.js 这个 OCR (光学字符识别) 库,你需要做以下几步: 1. **下载 Tesseract.js 和依赖**:首先,在项目里安装 tesseract.js 的本地版本。由于 UniApp 没有原生支持 Node.js,你需要借助 HBuilderX 的 JSB 或者类似工具预编译 Tesseract.js。确保下载包含离线模式的 tesseract.min.js 文件。 ```sh // 使用 HBuilderX 的 JSB hbuilderx jsb install tesseractjs ``` 2. **处理离线文件**:将预编译后的 tesseract.min.js 和语言数据文件(比如 `.ttf` 字体和 `.data` 数据包)放在 App 的 `assets` 目录下,并确保它们能被打包到资源文件夹中。对于多语言支持,每个语言的数据包都需要独立保存。 3. **编写代码访问本地文件**:在你的 Vue 或小程序组件中,创建一个函数来读取本地的 Tesseract.js 文件并初始化它。例如: ```javascript const tesseract = { init() { const imgPath = 'file:///' +uni.getStorageSync('tesseract.min.js'); // 替换为你实际的路径 uni.createSelectorQuery().select(imgPath).async(res => { this.tesseract = await res.promise; // 初始化 Tesseract.js 并指定离线语言包路径 this.tesseract.load(tesseractDataPath); }); }, // ...其他识别方法 }; ``` 4. **离线使用**:确保在使用 Tesseract.js 功能之前,先调用 `init()` 函数加载必要的文件,然后就可以在离线环境下进行文字识别了。 5. **错误处理**:考虑到网络环境切换的情况,需要添加适当的错误处理,如检查文件是否已成功加载,以及在在线时是否可以访问远程资源。
评论 22
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值