当前位置:   article > 正文

OCR识别常见开源库_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读取图像

import pytesseract
from PIL import Image
import matplotlib.pyplot as plt

srcImage = Image.open('./pic/t1.jpg')
plt.imshow(srcImage)
plt.show()
text = pytesseract.image_to_string(srcImage, lang='eng')
print(text)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

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

import pytesseract
import cv2 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()
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13

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
  • 1
  • 2
  • 3

使用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>

int main()
{
	// 加载图像
	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);
	const char* result = tess.GetUTF8Text();

	// 输出识别结果
	std::cout << "识别结果: " << result << std::endl;

	// 释放资源
	tess.End();
	delete[] result;

	return 0;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30

训练自定义字体

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
  • 1

其中,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文件,则上面灰显示软件预设的标签和矩形信息。修改错误的标签和矩形信息,校正完之后点击保存。
5:生成对应的字符特征文件:.tr文件。如:yxfa.test.exp1.tr。命令如下:

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

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

unicharset_extractor yxfa.test.exp1.box
  • 1

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

echo test 0 0 0 0 0 >font_properties
  • 1

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

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

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

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

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

cntraining yxfa.test.exp1.tr
  • 1

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

combine_tessdata yxfa.
  • 1

会生成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
  • 1

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文件。标注调整样本图,校正完之后点击保存。这里要注意每一行是一个矩形框,各个字符只是标签不同。最后换行符也是一个标签,不能删掉。不然后面训练会报错。
4:生成 lstmf 文件
在修正完错误的识别结果后,执行以下命令生成 lstmf 文件:

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

最后的 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
  • 1

其中,
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"
  • 1

其中:
–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终止
7。生成.traineddata文件
执行以下命令:

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

其中:
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+版本
  • 1
  • 2
  • 3
  • 4

命令行测试代码

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

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

from paddleocr import PaddleOCR, draw_ocr

# Paddleocr目前支持的多语言语种可以通过修改lang参数进行切换
# 例如`ch`, `en`, `fr`, `german`, `korean`, `japan`
ocr = PaddleOCR(use_angle_cls=False, use_gpu=False, lang="en")  
# need to 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)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

商业付费OCR

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

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

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/煮酒与君饮/article/detail/806724
推荐阅读
相关标签
  

闽ICP备14008679号