tesseract.js学习到放弃
钢翼
编程
优点:能在网页上跑的ocr。
1.引入模块
yarn add tesseract.js
2.将js移到public文件夹,保证内网可用
worker.min.js 和 tesseract-core.wasm.js从node_module里面移到public,
下载中文训练数据chi_sim.traineddata.gz,也放到public的指定文件夹内。
示例结构如下,可按个人喜好修改目录结构
- public
- tesseract.js
- lang-data
- chi_sim.traineddata.gz
- worker.min.js
- tesseract-core.wasm.js
3.封装前端组件
<script lang="ts" setup>
import { ref } from "vue"
import { ElMessage } from "element-plus"
import { createWorker, PSM, OEM ,Worker} from "tesseract.js"
const image = ref("")
const value = ref("")
let worker:Worker
(async() => {
worker = await createWorker({
workerPath: "/tesseract.js/worker.min.js",
langPath: "/tesseract.js/lang-data",
corePath: "/tesseract.js/tesseract-core.wasm.js",
logger: m => console.log(m)
})
})()
const ready = ref(false)
const pasteHandle = (event: ClipboardEvent) => {
const { items } = event.clipboardData || (window as any).clipboardData
let file = null
if (!items || items.length === 0) {
ElMessage.error("当前浏览器不支持本地")
return
}
// 搜索剪切板items
for (let i = 0; i < items.length; i++) {
if (items[i].type.indexOf("image") !== -1) {
file = items[i].getAsFile()
break
}
}
if (!file) {
ElMessage.error("粘贴内容非图片")
return
}
image.value = URL.createObjectURL(file);
(async() => {
if(!ready.value) {
await worker.load()
await worker.loadLanguage("chi_sim")
await worker.initialize("chi_sim",OEM.LSTM_ONLY)
await worker.setParameters({
tessedit_pageseg_mode: PSM.SINGLE_BLOCK
})
ready.value = true
}
const {data:{text}} = await worker.recognize(image.value)
value.value = text
})()
}
</script>
<template>
<div class=" border-2 border-dashed border-gray-500 p-4 rounded text-center" @paste="pasteHandle">
<img v-if="image" :src="image" class="border"/>
点击此处,按Ctrl+V,将图片粘贴到这里
</div>
<el-input v-model="value" class="mt-1"></el-input>
</template>
4.存在问题
识别率过低,严重到基本可以弃用。
5.windows训练数据(没成功)
为了能解决识别率低的问题,寻思可能自己训练会好点。
5.0 准备字库
找个一级和二级字表,大概6500个中文,网上找个word拷到文本文档即可。
用换行符或制表符隔开文字。可用vscode正则替换,(.) 替换成 $1\n或 $1\t
5.1 下载 tesseract4
下载地址: https://digi.bib.uni-mannheim.de/tesseract/
选tesseract-ocr-setup-4.00.00dev.exe 下载即可。
安装时选上下载语言模型
5.2 配置环境变量
- 在Path加上安装后的目录地址。
- 添加TESSDATA_PREFIX变量,值为 "{安装目录}\tessdata"
5.3 训练
以下是网上抄的一些指令,实际上到最后一步都是报错,不是 Image too small... 又不就Image to large....又不就Can't encode transcription。
无论是改字体大小,还是改psm参数都没法处理。已经放弃了,等下次有时间在研究吧
chcp 65001
::语言
set lang=chi_sim
::字体名称,从步骤0获取
set fontName=Microsoft YaHei
::字体自命名
set font=Microsoft_YaHei
set root=%cd%
:: 0.查看可使用字体
::text2image --list_available_fonts --fonts_dir=C:\Windows\Fonts
:: 1.生成.tif和.box
if not exist data ( mkdir data)
text2image --text="text2.txt" --outputbase=".\data\%lang%.%font%.exp0" --fontconfig_tmpdir="%temp%" --font="%fontName%" --fonts_dir="C:\Windows\Fonts" --ptsize=64
:: 2.生成.lstmf -l 语言 -psm 识别模式
if not exist lstmf (mkdir lstmf)
tesseract .\data\%lang%.%font%.exp0.tif .\lstmf\%lang%.%font%.exp0 -l %lang% --psm 7 lstm.train
:: 3.从已有的.traineddata 提取 .lstm
if not exist lstm ( mkdir lstm)
combine_tessdata -e .\traineddata\%lang%.traineddata .\lstm\%lang%.lstm
:: 4.训练(需要先新建training_files.txt文件,并且内容为lstmf的路径,一行一个)
if not exist output (mkdir output)
lstmtraining --model_output=".\output" --continue_from=".\lstm\chi_sim.lstm" --train_listfile=".\training_files.txt" --debug_interval -1 --max_iterations 800