0


OCR识别常见开源库

OCR (Optical Character Recognition,光学字符识别)技术是一种将印刷体或手写文字转化为可编辑文本的技术。亦即将图像中的文字进行识别,并以文本的形式返回。做OCR有很多库可以使用。免费开源库有:Tesseract,PaddleOCR。商业付费OCR有:腾讯云OCR,阿里云OCR。下面分别介绍。

Tesseract

Tesseract的GitHub网址:https://github.com/tesseract-ocr/tesseract
在这里插入图片描述

新建系统变量

我的电脑点击右键,属性,高级系统设置,环境变量,系统变量里面,新建一个TESSDATA_PREFIX变量名,路径就是tessdata文件夹的路径地址。如:D:\tessdata。

Python环境配置

pip install pytesseract
pip install matplotlib

测试代码

运行测试代码,使用Pillow读取图像

importpytesseract
from PIL importImageimportmatplotlib.pyplot as plt

srcImage = Image.open('./pic/t1.jpg')
plt.imshow(srcImage)
plt.show()
text = pytesseract.image_to_string(srcImage, lang='eng')print(text)

运行测试代码,使用OpenCV读取图像

importpytesseractimportcv2 as cv

srcImage = cv.imread('./pic/t7.jpg')
grayImage = cv.cvtColor(srcImage, cv.COLOR_BGR2GRAY)
thresh, binaryImage = cv.threshold(grayImage,0,255, cv.THRESH_BINARY|cv.THRESH_OTSU)
blurImage = cv.GaussianBlur(binaryImage,(5,5),3)
cv.imshow('blurImage',blurImage)
text = pytesseract.image_to_string(blurImage, lang='eng')print(text)

cv.waitKey(0)
cv.destroyAllWindows()

VS环境配置

Tesseract的GitHub网址:https://github.com/tesseract-ocr/tesseract
在Windows下Visual Studio 调用,要先配置环境。官方有3种方法:https://tesseract-ocr.github.io/tessdoc/Compiling.html。
CMake:https://cmake.org/,SW:https://software-network.org/,Vcpkg:https://vcpkg.io/en/index.html。

Vcpkg环境配置

使用Vcpkg官方方法:https://github.com/Microsoft/vcpkg/blob/master/README.md
下载Vcpkg,位置为:D:\vcpkg。我的电脑点击右键,属性,高级系统设置,环境变量,系统变量里面Path添加:D:\vcpkg。
推荐终端使用powershell,而不是cmd。https://github.com/PowerShell/PowerShell/releases/tag/v7.4.2
在powershell下,打开目录D:\vcpkg,运行命令:

vcpkg install tesseract:x64-windows 
vcpkg integrate install
vcpkg integrate project

使用CMake官方方法:https://github.com/tesseract-ocr/tesseract/blob/main/.github/workflows/cmake-win64.yml
将编译好的文件放在本地,如:D:\tesseract
我的电脑点击右键,属性,高级系统设置,环境变量,系统变量里面,Path添加:D:\tesseract\bin
新建一个项目,进入属性管理器:
VC++目录->包含目录:添加:D:\tesseract\include
VC++目录->库目录:添加:D:\tesseract\lib

链接器->输入->附加依赖项:添加:
tesseract50d.lib,Debug模式,tesseract50.lib,Realease 模式。那个 d 就是Debug 的意思。

这个时候,就可以运行代码,测试一下了。

测试代码

运行测试代码

#include<opencv2/opencv.hpp>#include<tesseract/baseapi.h>intmain(){// 加载图像
    cv::Mat image = cv::imread("testocr1.jpg");// 将图像转换为灰度图
    cv::Mat gray;
    cv::cvtColor(image, gray, cv::COLOR_BGR2GRAY);// 创建Tesseract OCR对象
    tesseract::TessBaseAPI tess;
    tess.Init(NULL,"eng");// 使用英语语言模型
    tess.SetImage((uchar*)gray.data, gray.cols, gray.rows,1, gray.cols);// 进行字符识别
    tess.Recognize(NULL);constchar* result = tess.GetUTF8Text();// 输出识别结果
    std::cout <<"识别结果: "<< result << std::endl;// 释放资源
    tess.End();delete[] result;return0;}

训练自定义字体

1. 训练工具安装

训练工具:jTessBoxEditor。使用说明可以参见网址:https://vietocr.sourceforge.net/training.html
jTessBoxEditor下载地址:https://github.com/nguyenq/jTessBoxEditor
java的JDK:由于jTessBoxEditor是用Java开发的,运行该工具需要java环境。下载地址:https://www.oracle.com/java/technologies/downloads/?er=221886#jdk22-windows

2. 单字符训练过程

解压jTessBoxEditor点击train.bat,运行软件。
具体步骤如下:
1:打开jTessBoxEditor,选择Tools->Merge TIFF,进入训练样本所在文件夹,选中要参与训练的样本图片。这里的图片可以是自己收集制作的数据集。
2:点击 “打开” 后弹出保存对话框,选择保存在当前路径下,文件命名为 “yxfa.test.exp1.tif” ,格式只有一种 “TIFF” 可选。
tif文面命名格式: [lang].[fontname].exp[num].tif。lang是语言,fontname是字体,num为自定义数字,方便记录训练样本。
3:将训练数据生成box文件。从官网下载tessdata_best-main压缩包解压缩放在本地,如:D:\tessdata。先删掉其中的configs文件,再从本地jTessBoxEditorFX软件的目录下\tesseract-ocr\tessdata复制configs,tessconfigs两个文件夹到D:\tessdata下面。不然不能生产box文件。
在生产的tiff文件夹目录下,提供管理员权限打开CMD,使用如下命令:注意-l是英文字母l,不是数字1。

tesseract yxfa.test.exp1.tif yxfa.test.exp1 -l eng --psm 6 batch.nochop makebox

其中,psm选项的含义如下:
0 = Orientation and script detection (OSD) only.
1 = Automatic page segmentation with OSD.
2 = Automatic page segmentation, but no OSD, or OCR. (not implemented)
3 = Fully automatic page segmentation, but no OSD. (Default)
4 = Assume a single column of text of variable sizes.
5 = Assume a single uniform block of vertically aligned text.
6 = Assume a single uniform block of text.
7 = Treat the image as a single text line.
8 = Treat the image as a single word.
9 = Treat the image as a single word in a circle.
10 = Treat the image as a single character.
11 = Sparse text. Find as much text as possible in no particular order.
12 = Sparse text with OSD.
13 = Raw line. Treat the image as a single text line

注意:–psm的语法,数字对应不同的页面分割模式。box文件和对应的tif一定要在相同的目录下,不然后面打不开。
这一步–psm参数选则不是很严格,实测选哪个关系不是很大。也可以自己新建一个txt文件,改名为对应的box文件。如;yxfa.test.exp1.box。只不过这个box文件是空的,没有预设的标签和矩形信息。
4:使用jTessBoxEditor矫正.box文件的错误
点击Box Editor,Open,打开上面的tif文件。如果有对应的box文件,则上面灰显示软件预设的标签和矩形信息。修改错误的标签和矩形信息,校正完之后点击保存。
在这里插入图片描述
jTessBoxEditor单字符训练使用截图
5:生成对应的字符特征文件:.tr文件。如:yxfa.test.exp1.tr。命令如下:

tesseract yxfa.test.exp1.tif yxfa.test.exp1 nobatch box.train

6:生成字符集文件:.unicharset文件。命令如下:

unicharset_extractor yxfa.test.exp1.box

7:定义字体特征文件
自己新建一个txt文件,改名为font_properties文件。注意,文件的名字就是font_properties,它没有.txt后缀。里面内容写入 test 0 0 0 0 0 表示默认普通字体。表示字体test的粗体、倾斜等共计5个属性。这里的“test”必须与“yxfa.test.exp1.box”中的“test”名称一致。
或者执行命令:

echo test 00000>font_properties

执行完之后,会在当前目录生成font_properties文件。
8:生成shape文件,运行如下命令:

shapeclustering -F font_properties -U unicharset -O yxfa.unicharset yxfa.test.exp1.tr

执行完之后,会生成 shapetable 和 yxfa.unicharset 两个文件。
9:生成聚字符特征文件
执行下面命令:

mftraining -F font_properties -U unicharset -O yxfa.unicharset yxfa.test.exp1.tr

会生成 inttemp、pffmtable 两个文件。
10:生成字符正常化特征文件
执行下面命令:

cntraining yxfa.test.exp1.tr

会生成 normproto 文件。
11:文件重命名
重新命名inttemp、pffmtable、shapetable和normproto这四个文件的名字为[lang].xxx。
如修改为:yxfa.inttemp、yxfa.pffmtable、yxfa.shapetable和yxfa.normproto
12:合并训练文件
执行下面命令:

combine_tessdata yxfa.

会生成yxfa.traineddata文件。
yxfa.traineddata 便是最终生成的语言文件,将生成的 yxfa.traineddata 文件拷贝到本机的tessdata目录下(如D:\tessdata),就可以用它来进行字符识别了。

3. 多字符训练过程

1:生成. tif文件
打开jTessBoxEditor,选择Tools->Merge TIFF,进入训练样本所在文件夹,选中要参与训练的样本图片。点击 “打开” 后弹出保存对话框,选择保存在当前路径下,文件命名为 “XXX.tif” ,格式只有一种 “TIFF” 可选。如:“yxfa.test.exp1.tif”
2:生成.box文件
在生产的tiff文件夹目录下,提供管理员权限打开CMD,使用如下命令:注意-l是英文字母l,不是数字1。

tesseract yxfa.test.exp1.tif yxfa.test.exp1 -l eng --psm 6 lstmbox

tesseract: Tesseract-OCR 命令
yxfa.test.exp1.tif: 识别的 tif 文件
yxfa.test.exp1: 生成的 box 文件名
-l eng: 指定 eng 模型进行识别
–psm 6: 跟 tessearct 识别的 psm 参数一样,这里 6 表示使用 OSD 分割模式,自动检测文本的方向和脚本。
lstmbox: 输出 LSTM 网络box坐标文件
LSTM 的 box 文件跟低版本的 box 文件区别在于它以整行来进行识别,所有识别的字符box坐标都是整个行识别结果的坐标,不是单个字符的box坐标。
3:矫正.box文件的错误
打开jTessBoxEditor,点击Box Editor,Open,打开上面的tif文件。标注调整样本图,校正完之后点击保存。这里要注意每一行是一个矩形框,各个字符只是标签不同。最后换行符也是一个标签,不能删掉。不然后面训练会报错。
在这里插入图片描述
jTessBoxEditor多字符训练使用截图

4:生成 lstmf 文件
在修正完错误的识别结果后,执行以下命令生成 lstmf 文件:

tesseract yxfa.test.exp1.tif yxfa.test.exp1 -l eng --psm 6 lstm.train

最后的 lstm.train 表示生成 lstmf 文件,我们将得到 yxfa.test.exp1.lstmf 文件。同时还会生产同名的.txt文件:yxfa.test.exp1.txt。这个目前貌似没啥用。
5:提取已训练的 lstmf
LSTM 训练是在已完成训练模型基础上继续进行训练的方法,所以必须基于已完成训练的 lstmf。我们上面指定了 eng 语言进行识别,所以我们从 eng.traineddata 中提取 lstmf。执行以下命令:

combine_tessdata -e eng.traineddata eng.lstm

其中,
combine_tessdata: Tesseract 工具
-e eng.traineddata: 从 eng.traineddata 中提取特定模型
eng.lstm: 提取目标名称
我们将得到一个 eng.lstm 文件
eng.traineddata 必须使用 tessdata_best 库中的字体。
6:进行训练
在当前目录下新建output文件夹,用来存储训练输出 文件。创建一个 eng.yxfa.txt 文件,内容写num.lstmf,保存。执行以下命令:

lstmtraining --debug_interval=-1--max_iterations=9000--target_error_rate=0.01--continue_from=".\eng.lstm"--model_output=".\output\output"--train_listfile=".\eng.yxfa.txt"--traineddata=".\eng.traineddata"

其中:
–debug_interval 当值为-1时,训练结束,会显示训练的一些结果参数,此参数可略去
–max_iterations 指明训练遍历次数 最大是9000,0 表示无限迭代(类型:整数默认值:0)
–target_error_rate 0.01 训练至错误率低于0.01终止
–continue_from 训练从哪里开始(可以是第四步提取的lstm文件路径。也可以是上次训练的output_checkpoint文件路径)
–model_output 模型训练输出的路径(模型训练文件,会自动生成output_checkpoint文件可以用于后期训练)
–train_listfile 创建的eng.yxfa.txt文件路径
–traineddata .traineddata文件的路径(此例以eng.traineddata)
–target_error_rate 0.01 训练至错误率低于0.01终止

在这里插入图片描述
训练过程如上图
在这里插入图片描述
在output文件夹下生产文件

7。生成.traineddata文件
执行以下命令:

lstmtraining --stop_training --traineddata=".\eng.traineddata"--model_output=".\yxfa.traineddata"--continue_from=".\output\output_checkpoint"

其中:
lstmtraining: Tesseract 工具,用于训练 LSTM 模型
–stop_training: 停止训练
–traineddata=“.\eng.traineddata”: 基础数据,将和训练数据进行合并输出
–model_output=“.\yxfa.traineddata”: 训练字体输出路径
–continue_from=第6步model_output输出路径的output_checkpoint文件路径
将新生成的num.traineddata文件拷贝到tessdata文件夹下,通过代码进行识别。

PaddleOCR

PaddleOCR的GitHub网址:https://github.com/PaddlePaddle/PaddleOCR
在这里插入图片描述

环境配置

在Windows下Python调用,要先配置环境。
官方方法:https://github.com/PaddlePaddle/PaddleOCR/blob/main/doc/doc_ch/environment.md#1.1
先安装Anaconda,然后创建环境:

conda create --name paddle python=3.8--channel https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/free/  
python -m pip install paddlepaddle-gpu -i https://mirror.baidu.com/pypi/simple  #GPU版本
python -m pip install paddlepaddle -i https://mirror.baidu.com/pypi/simple  #CPU版本
pip install "paddleocr>=2.0.1" # 推荐使用2.0.1+版本

命令行测试代码

paddleocr --image_dir ./imgs/11.jpg --use_angle_cls false--use_gpu false

创建ocr.py文件,加入测试代码。

from paddleocr importPaddleOCR, draw_ocr

#Paddleocr目前支持的多语言语种可以通过修改lang参数进行切换
# 例如`ch`, `en`, `fr`, `german`, `korean`, `japan`
ocr =PaddleOCR(use_angle_cls=False, use_gpu=False, lang="en")#needto run only once to download and load model into memory
img_path ='./imgs/11.jpg'
result = ocr.ocr(img_path, cls=True)for idx in range(len(result)):
    res = result[idx]for line in res:print(line)

商业付费OCR

腾讯OCR官方网址:
https://cloud.tencent.com/product/ocr
在这里插入图片描述

阿里云OCR官方网址:
https://duguang.aliyun.com/experience?type=universal&subtype=general_text#intro
在这里插入图片描述


本文转载自: https://blog.csdn.net/yxfamyself/article/details/138608329
版权归原作者 yxfamyself 所有, 如有侵权,请联系我们删除。

“OCR识别常见开源库”的评论:

还没有评论