tesseract-ocr使用以及训练方法
作者:欧晨eli 发布时间:2022-07-06 17:23:37
本人最近在做字符识别,所以自行在网上寻找方法,接触到tesseract,自己按照网上方法做的时候,也遇到一些问题,解决了一些。所以我决定写下我第一个博客,一是方便自己以后查看,更新学习。二是方便和网友交流学习。
Tesseract介绍
Tesseract是一个开源的OCR(Optical Character Recognition,光学字符识别)引擎,可以识别多种格式的图像文件并将其转换成文本,目前已支持60多种语言(包括中文)。 Tesseract最初由HP公司开发,后来由Google维护,目前发布在Googel Project上。
安装Tesseract,从http://code.google.com/p/tesseract-ocr/downloads/list下载Tesseract,3.01上的版本支持中文。安装后在电脑上会有一个Tesseract-OCR目录,通过目录录下的tesseract.exe程序就可以对图像的字符进行识别。考虑到万一有人上不了谷歌,这个Tesseract-OCR文件夹我也上传了,地址:点击打开链接。文件夹中除了Tesseract的相应文件外,还有一个tesseract-vs2013-include-lib-dll文件,这个是VS2013用来调用API的配置文件,后面的博客会写到。打开如图所示。
使用默认的语言库识别
准备一张待识别的图片,我选取一段《成都》的歌词。
接着就可以打开命令行,进入Tesseract-OCR的目录,输入:
tesseract.exe gc.jpg result -l chi_sim
其中result表示输出结果文件txt名称,chi_sim表示用以识别的语言文件为英文。执行后文件夹中会多一个result.txt。
效果非常不好,因为很多汉字是左右结构,比如:眼泪。所以我要自己训练自己的中文库。
训练样本
训练样本需要一个工具,jTessBoxEditor,下载地址:点击打开链接。这个工具是用java开发的,需要jre7以上的版本支持。
1、获取训练的图片,为了方便我使用了原来的图片一张,样本当然是越多越好。
2、合并样本文件,打开jTessBoxEditor,点开train.bat。在菜单栏中Tools->Merge TIFF。在弹出的窗口中可以选择多张样本图片(网上之前有说要.tif格式的图片,测试.jpg格式的也行),我这边就用了一张样本图片。
一张或者多张图片可以合成一张tif文件。
3、生成box文件, 打开命令行,输入:
tesseract.exe gc.font.exp1.tif gc.font.exp1 batch.nochop makebox
生成的BOX文件为gc.font.exp1.box,BOX文件为Tessercat识别出的文字和其坐标。Make BOX的命名的个数为:
tesseract [lang].[fontname].exp[num].tif [lang].[fontname].exp[num] batch.nochop makebox
其中lang为语言名称,fontname为字体名称,num为序号,可以随便定义。有些博客说对于这个命名无所谓,但是我尝试到后免出错了,是tr文件名的问题,在下面我会贴出报错图。读者也可以试试,不知是不是我之前步骤哪里做错了。
4、文字矫正,打开jTessBoxEditor工具,打开gc.font.exp1.tif文件(必须将上一步生成的.box和.tif样本文件放在同一目录),如下图所示。可以看出有些字符分割和识别都不正确,可以通过该工具手动对每张图片中识别错误的字符进行校正。校正完成后保存即可。(注:发现中文打不上去,在菜单Setting->Font中可以修改,改为宋体即可)
对于标定的方框以及识别的字符进行修改。
选择两个或两个以上的框,Merge可进行合并;Split将框进行拆分;Insert插入框,如果图片上一个框也没有,那无法进行插入;Delete删除框。选择要修改的字符框,在Character中输入想要修改的字,再点击齿轮,即可修改。修改后,如下图所示:
5、生成.tr文件,在命令行中输入:
tesseract gc.font.exp1.tif gc.font.exp1 nobatch box.train
6、计算字符集,从生成的box文件中提取,继续输入:
unicharset_extractor gc.font.exp1.box
7、生成字体特征文件,在当前文件夹中新建任意名称的文件,里面格式为:
<span><fontname> <italic> <bold> <fixed> <serif> <fraktur> </span>
例如:我建了一个名为font的文件,里面内容为:font 0 0 0 0 0
这个文件可以是手动生成的txt文件,也可以在在命令行中输入:
echo font 0 0 0 0 0 >font
即可。
8、特征训练,继续在命令行输入:
mftraining -F font -U unicharset gc.font.exp1.tr
在这一步我出现了好几个错误,如下图
(1)Failed to load unicharset from file uncharset,这是因为刚刚的font的文件,如果是在txt中写的,一定要写成font.txt,加上后缀。
(2)feature training for Tesseract已停止工作。命令行显现:
Reading num.tr …
Font id = -1/0, class id = 1/13 on sample 0
font_id >= 0 && font_id < font_id_map_.SparseSiz..\..\classify\trainingsampleset.cpp, line 622
这个问题就是上面命名所导致的,所以还是规范命名。
9、聚集tesseract识别的训练文件,命令行输入:
cntraining gc.font.exp1.tr
有人会说其他还有一条shapeclustering语句,说下这个步骤可有可无,这个是在3.02中新加的,主要针对印度语,所以我们在做的时候会有一个警告 warning No shape table file present。
这时候文件夹中会多了四个文件,在unicharset,inttemp,normproto,pfftable文件名前面加上font.。如下图所示:
10、最后,合并相关文件,生成字典文件,输入:
combine_tessdata font.
所有输入命令如下图所示
最终,在当前目录中会产生一个为font.traineddata文件,将其拷到tessdata文件夹中,再测试一下。
虽然不是全部识别出来,但是较之前的识别率提高了很多,这个和样本数量也是有关系的,而且这句话中左右结构的字特别多,原图26个字,却识别出31个字出来了,这个问题,我还没想到什么方法,单个字训练?。我也试了其他字符训练,效果还可以
PS:tesseract-ocr还可从github下载:https://github.com/tesseract-ocr/
来源:https://blog.csdn.net/xiao_yi_xiao/article/details/122220949


猜你喜欢
- 双击编辑功能如何实现:例如:标题 (鼠标双击“标题”文字 即出现可编辑的输入框形式及提交按钮) <!D
- 冒泡排序冒泡排序(英语:Bubble Sort)是一种简单的排序算法。它重复地遍历要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们
- 当代码已经写得差不多,发现某个变量名需要修改,但代码中很多地方都有该变量,一一修改太麻烦了,在不同的情景下,可以采取更加简便的方法,如下介绍
- 如何处理DataFrame的inf值在用DataFrame计算变化率时,例如(今天-昨天) / 昨天恰好为(2-0) / 0时,这些结果数据
- 前言pymssql模块是用于sql server数据库(一种数据库通用接口标准)的连接。另外pyodbc不仅限于SQL server,还包括
- 前言:情人节、三八女神节、520、七夕节、圣诞节、元旦、生日、新年、各种纪念日……这些节日,对于
- 这次做一个比较贴近我实际的东西:python分析作业提交情况。要求: 将服务器中交作业的学生(
- 语法df.drop_duplicates(subset = None,
- 需求背景公司前端使用 Highcharts 构建图表,图表的图例支持点击显示或隐藏相应的指标。现在有需求后端需要存储用户在前端点击后显示图表
- Linux下MySQL整个数据库的备份与还原[root]# /usr/bin/mysqldump -h127.0.0.1 -uusernam
- 不知不觉大半年没更新了...前面小二介绍过使用Typora+MinIO+Java代码打造舒适写作环境,然后有很多大佬啊,说用Java来实现简
- 本文实例讲述了PHP面向对象程序设计继承用法。分享给大家供大家参考,具体如下:<?php//继承是子类(派生类)从父类(基类,超类)继
- 配置环境: 1、数 据 库:Oracle 8i R2 (8.1.7) for NT 企业版 2、安装路径:C:ORACLE 实现方法: 1.
- 从文件中读取数据读取整个文件这里假设在当前目录下有一个文件名为'pi_digits.txt'的文本文件,里面的数据如下:3.
- 在使用Django项目中,From表单提交了图片集合var formdata = new FormData();formdata.appen
- python3启动web服务引发的一系列问题背景在某行的实施项目,需要使用python3环境运行某些py脚本。由于行内交付的机器已自带pyt
- 生活中几乎没有什么保证:死亡、税收和需要处理字符串的程序员。字符串可以有多种形式。它们可以是非结构化文本、用户名、产品描述、数据库列名称,或
- 问题一:python启动报错api-ms-win-crt-process-l1-1-0.dll 丢失解决:下载api-ms-win-crt-
- hmac主要应用在身份验证中,它的使用方法是这样的:1. 客户端发出登录请求(假设是浏览器的GET请求)2. 服务器返回一个随机值,并在会话
- 关于string的split 和 join 方法对导入os模块进行os.path.splie()/os.path.join() 貌似是处理机