Tesseract
文字识别是ORC的一部分内容,ORC的意思是光学字符识别,通俗讲就是文字识别。Tesseract是一个用于文字识别的工具。
Tesseract的安装及配置
https://digi.bib.uni-mannheim.de/tesseract/
在上述链接下载自己需要的版本。下载后安装,并设置全局变量。
命令行运行tesseract -v,如果和下图一样即安装成功。
下载语言包
Tesseract默认是不支持中文的,如果想要识别中文或者其它语言需要下载相应的语言包。下载地址如下:https://tesseract-ocr.github.io/tessdoc/Data-Files ,进入网站后我们往下翻
其中有两个中文语言包,一个Chinese-Simplified和Chinese-Traditional,它们分别是简体中文和繁体中文,我们选择需要的下载即可。下载完成后我们需要放到Tesseract的路径下的tessdata目录下。
pytesseract
pytesseract是一款用于光学字符识别(OCR)的python工具,能够识别图片上的数字、英文和中文等。
pytesseract是对Tesseract-OCR的一层封装,同时也可以单独作为对Tesseract引擎的调用脚本,支持使用PIL库(Python Imaging Library)读取各种图片文件类型,包括jpeg、png、gif、bmp、tiff等其它格式。作为脚本使用时,pytesseract将打印识别出的文字,而不是将其写入文件。
Tesseract-OCR是由HP实验室开发由Google维护的开源OCR(Optical Character Recognition,光学字符识别)引擎。可以不断的训练的库,使图像转换文本的能力不断增强;如果团队深度需要,还可以以它为模板,开发出符合自身需求的OCR引擎。
用于文字识别:
pip install pytesseract
用于图片读取:
pip install Pillow
识别文字的方法:
image_to_string(image, lang=None, boxes=False, config=None)
- image表示图像
- lang表示语言,默认使用英文
- 如果boxes设为True,那么“batch.nochop makebox”被添加到tesseract调用中
- 如果设置了config,则配置会添加到命令中,例如config =“ - psm 6”。
示例如下:
import pytesseract
from PIL import Image
# 读取图片
im = Image.open('sentence.jpg')
# 识别文字
string = pytesseract.image_to_string(im)
print(string)
若需识别中文,需要设置lang='chi_sim'
import pytesseract
from PIL import Image
# 读取图片
im = Image.open('sentence.png')
# 识别文字,并指定语言
string = pytesseract.image_to_string(im, lang='chi_sim')
print(string)
批量图片识别
- 设置txt文件中内容如下:
sentence1.jpg
sentence2.jpg
可用如下代码生成:
import os
# 文字图片的路径
path = 'text_img/'
# 获取图片路径列表
imgs = [path + i for i in os.listdir(path)]
# 打开文件
f = open('text.txt', 'w+', encoding='utf-8')
# 将各个图片的路径写入text.txt文件当中
for img in imgs:
f.write(img + '\n')
# 关闭文件
f.close()
- 识别文字
import pytesseract
# 识别文字
string = pytesseract.image_to_string('text.txt', lang='chi_sim')
print(string)
EasyOCR
Python中OCR第三方库非常多,比如easyocr、PaddleOCR、cnocr等等。
EasyOCR检测部分使用CRAFT算法,识别模型为CRNN,由3个组件组成:特征提取Resnet、序列标记LSTM、解码CTC。整个深度学习过程基于pytorch实现。
图片–预处理(去噪、色彩饱和度、尖锐处理等)–文字检测(CRAFT)–中间处理(倾斜处理等)—文字识别—后续处理—输出结果
安装EasyOCR
在官网https://pytorch.org/中找到操作系统对应的安装方法
- 先安装pytorch
pip3 install torch torchvision torchaudio
2. 安装easyocr
pip install easyocr
安装完成后,可以通过easyocr.__version__
查看版本号
3. 安装检测模型、识别模型(语言包)
https://www.jaided.ai/easyocr/modelhub/
下载文本检测模型:
下载识别模型,识别模型对应了各种语言包,下图是简体中文和英文的识别模型:
将下载的模型文件解压后拷贝到用户目录的.EasyOCR\model文件夹下。
【注】这里下载的识别模型(语言包)的文件名称和后面看到的语言类型并不是完全对应的,比如在代码中的语言类型ch_sim对应简体中文(zh_sim_g2),en对应英文(english_g2)。
使用
第1步创建Reader()实例,第2步用readtxt()方法检测和识别。
创建Reader()实例
参数如下:
- lang_list (list):识别语言代码,比如[‘ch_sim’,’en’]分别表示简体中文和英文。
- gpu (bool, string, default = True) :是否使能GPU,只有安装了GPU版本才有效。
- model_storage_directory (string, default = None) :模型存储位置,依次查找系统变量EASYOCR_MODULE_PATH (preferred)、MODULE_PATH (if defined)表示的路径或者~/.EasyOCR/路径。
- download_enabled (bool, default = True):如果没有对应模型文件时,自动下载模型。
- user_network_directory (bool, default = None) :用户自定义识别网络的路径,如果没有指明,则在MODULE_PATH + ‘/user_network’ (~/.EasyOCR/user_network)目录中查找。
- recog_network (string, default = ‘standard’) :替代标准模型,使用自定义的识别网络。
- detector (bool, default = True) :是否加载检测模型。
- recognizer (bool, default = True) :是否加载识别模型。
readtxt()方法检测和识别
参数详解:
- image (string, numpy array, byte) : 输入图像;
- decoder (string, default = ‘greedy’):选项有 ‘greedy’、‘beamsearch’ 和 ‘wordbeamsearch’;
- beamWidth (int, default = 5) : 当解码器 = ‘beamsearch’ 或 ‘wordbeamsearch’ 时要保留多少光束;
- batch_size (int, default = 1) : batch_size>1 将使 EasyOCR 更快但使用更多内存;
- worker (int, default = 0) : 数据加载器中使用的编号线程;
- allowlist (string) : 强制 EasyOCR 只识别字符的子集。对特定问题有用(例如车牌等);
- blocklist (string) : 字符的块子集。如果给定了允许列表,则此参数将被忽略。
- detail (int, default = 1): 将此设置为 0 以进行简单输出;
- paragraph (bool, default = False):将结果合并到段落中;
- min_size (int, default = 10) : 过滤文本框小于最小值(以像素为单位);
- rotation_info (list, default = None) : 允许 EasyOCR 旋转每个文本框并返回具有最佳置信度分数的文本框。符合条件的值为 90、180 和 270。例如,对所有可能的文本方向尝试 [90, 180 ,270]。
- contrast_ths (float, default = 0.1) : 对比度低于此值的文本框将被传入模型 2 次。首先是原始图像,其次是对比度调整为“adjust_contrast”值。结果将返回具有更高置信度的那个;
- adjust_contrast (float, default = 0.5) : 低对比度文本框的目标对比度级别。
- text_threshold (float, default = 0.7) : 文本置信度阈值
- low_text (float, default = 0.4) : 文本下限分数
- link_threshold (float, default = 0.4) : 链接置信度阈值
- canvas_size (int, default = 2560) :最大图像尺寸。大于此值的图像将被缩小。
- mag_ratio (float, default = 1) :图像放大率
- slope_ths (float, default = 0.1) - 考虑合并的最大斜率 (delta y/delta x)。低值意味着不会合并平铺框。
- ycenter_ths (float, default = 0.5) - y 方向的最大偏移。不应该合并不同级别的框。
- height_ths (float, default = 0.5) - 盒子高度的最大差异。不应合并文本大小非常不同的框。
- width_ths (float, default = 0.5) - 合并框的最大水平距离。
- add_margin (float, default = 0.1) - 将边界框向所有方向扩展某个值。这对于具有复杂脚本的语言(例如泰语)很重要。
- x_ths (float, default = 1.0) - 当段落=True 时合并文本框的最大水平距离。
- y_ths (float, default = 0.5) - 当段落 = True 时合并文本框的最大垂直距离。
示例:
import easyocr
reader = easyocr.Reader(
lang_list=['ch_sim', 'en'], # 需要导入的语言识别模型,可以传入多个语言模型,其中英语模型en可以与其他语言共同使用
gpu=False, # 默认为True
download_enabled=True # 默认为True,如果 EasyOCR 无法找到模型文件,则启用下载
)
result = reader.readtext('id_card.jpg', detail=1 ) # 图片可以传入图片路径、也可以传入图片链接。但推荐传入图片路径,会提高识别速度。包含中文会出错。设置detail=0可以简化输出结果,默认为1
print(result)
结果如下:readtext 返回的列表中,每个元素都是一个元组,内含三个信息:位置、文字、置信度:
[
([[27, 37], [341, 37], [341, 79], [27, 79]], '姓 名 爱新觉罗 。玄烨', 0.6958897643232619),
([[29, 99], [157, 99], [157, 135], [29, 135]], '性 别 男', 0.914532774041559),
([[180, 95], [284, 95], [284, 131], [180, 131]], '民蔟满', 0.4622474180193509),
([[30, 152], [94, 152], [94, 182], [30, 182]], '出 生', 0.6015505790710449),
([[110, 152], [344, 152], [344, 184], [110, 184]], '1654 年54日', 0.42167866223467815),
([[29, 205], [421, 205], [421, 243], [29, 243]], '住 址 北京市东城区景山前街4号', 0.6362530289101117),
([[105, 251], [267, 251], [267, 287], [105, 287]], '紫禁城乾清宫', 0.8425745057905053),
([[32, 346], [200, 346], [200, 378], [32, 378]], '公民身份证号码', 0.22538012770296922),
([[218, 348], [566, 348], [566, 376], [218, 376]], '000003165405049842', 0.902066405195785)
]
若:detail=0
,从而只返回文字内容:
['姓 名 爱新觉罗 。玄烨', '性 别 男', '民蔟满', '出 生', '1654 年54日', '住 址 北京市东城区景山前街4号', '紫禁城 乾清宫', '公民身份证号码', '000003165405049842']
若识别率不高,则可对图片进行一些处理,可参照如下:
cv2.pyrMeanShiftFiltering(src, dst, double sp, double sr, int maxLevel=1, TermCriteria termcrit=TermCriteria)
原理:meanShfit均值漂移算法是一种通用的聚类算法,它的基本原理是:对于给定的一定数量样本,任选其中一个样本,以该样本为中心点划定一个圆形区域,求取该圆形区域内样本的质心,即密度最大处的点,再以该点为中心继续执行上述迭代过程,直至最终收敛。可以利用均值偏移算法的这个特性,实现彩色图像分割.
- src,输入图像,8位,三通道的彩色图像,并不要求必须是RGB格式,HSV、YUV等Opencv中的彩色图像格式均可;
- dst,输出图像,跟输入src有同样的大小和数据格式
- sp,定义的漂移物理空间半径大小
- sr,定义的漂移色彩空间半径大小
- maxLevel,定义金字塔的最大层数
- termcrit,定义的漂移迭代终止条件,可以设置为迭代次数满足终止,迭代目标与中心点偏差满足终止,或者两者的结合