批量文字识别(OCR)是Python办公自动化的基本操作,应用在我们工作生活中的方方面面,比如车牌识别、证件识别、银行卡识别、票据识别等等。
Python中OCR第三方库非常多,比如easyocr、PaddleOCR、cnocr等等。
EasyOCR 是一个用 Python 编写的 OCR 库,用于识别图像中的文字并输出为文本,支持 80 多种语言。
检测部分使用CRAFT算法,识别模型为CRNN,由3个组件组成:特征提取Resnet、序列标记LSTM、解码CTC。整个深度学习过程基于pytorch实现。
图片--预处理(去噪、色彩饱和度、尖锐处理等)--文字检测(CRAFT)--中间处理(倾斜处理等)---文字识别---后续处理---输出结果
pip3 install -i https://pypi.tuna.tsinghua.edu.cn/simple easyocr
模型储存路径:
windows: C:\Users\username\.EasyOCR\
linux:/root/.EasyOCR/
easyocr 的深度学习算法依赖于另一个著名的第三方模块 pytorch,图形处理部分则会用到 opencv、Pillow 等,所以还需要确保自己电脑上已经安装这些基础模块。
首次使用easyocr识别图片,会自动从网络中下载预训练模型。下载耗时较长,而且大概率遇到URLError错误,
推荐下载模型文件(下载链接:Jaided AI: EasyOCR model hub),不用解压直接复制粘贴于~/.EasyOCR/model/目录下。
参数:
属性:
Reader对象的主要方法。有 4 组参数:General、Contrast、Text Detection 和 Bounding Box Merging。
参数1:General
参数2:Contrast 对比度
参数3:Text Detection 文本检测(来自CRAFT)
参数4:Bounding Box Merging 边界框合并
这组参数控制相邻边界框何时相互合并。除了 'slope_ths' 之外的所有参数都以盒子高度为单位。
返回:结果列表
EasyOCR/custom_model.md at master · JaidedAI/EasyOCR · GitHubReady-to-use OCR with 80+ supported languages and all popular writing scripts including Latin, Chinese, Arabic, Devanagari, Cyrillic and etc. - EasyOCR/custom_model.md at master · JaidedAI/EasyOCR https://github.com/JaidedAI/EasyOCR/blob/master/custom_model.md
可以使用自己的数据或生成自己的数据集。要生成您自己的数据建议使用 TextRecognitionDataGenerator(GitHub - Belval/TextRecognitionDataGenerator: A synthetic data generator for text recognition)。我们在此处提供了一个数据集示例。拥有数据集后,您可以按照此存储库 deep-text-recognition-benchmark(https://github.com/clovaai/deep-text-recognition-benchmark)训练自己的模型。网络需要完全卷积才能预测灵活的文本长度。我们当前的网络是“None-VGG-BiLSTM-CTC”。一旦你有了训练好的模型(一个.pth文件),你需要两个额外的文件来描述识别网络架构和模型配置。此处custom_example.zip的文件中提供了一个示例。
我们还在此处提供我们的训练脚本版本。它是deep-text-recognition-benchmark的修改版本。
需要三个文件,这三个文件必须共享相同的名称,即yourmodel.pth, yourmodel.yaml,yourmodel.py,然后您将使用它们在 EasyOCR API 中调用您的模型。
请下载custom_example.zip 作为示例,解压并放置custom_example.py,custom_example.yaml在user_network_directory(默认= ~/.EasyOCR/user_network),放置custom_example.pth在模型目录(默认= ~/.EasyOCR/model)。一旦你将所有3个文件放在各自的位置,你可以通过设置recog_network来使用custom_example:reader = easyocr.Reader(['en'], recog_network='custom_example')
可以通过命令行使用如下:
$ easyocr -l ch_sim en -f chinese.jpg --detail=1 --gpu=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']
识别后的结果并不完全准确: