文字识别软件cnocr学习笔记
• 安装
pip install cnocr
• 基础的使用方法
首次运行会下载安装模型,如果没有梯子,会报错:
在网络上查找cnocr的模型资源,并下载到本地。https://download.csdn.net/download/qq_33464428/89514689?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522751fb72b959dcac98e2fb460683254ea%2522%252C%2522scm%2522%253A%252220140713.130102334.pc%255Fcommercial.%2522%257D&request_id=751fb72b959dcac98e2fb460683254ea&biz_id=1&utm_medium=distribute.pc_search_result.none-task-download-2~all~insert_commercial~default-3-89514689-null-null.142^v101^pc_search_result_base5&utm_term=cnocr%20%E6%A8%A1%E5%9E%8B&spm=1018.2226.3001.4187.4
我放到了网盘:
链接: https://pan.baidu.com/s/1HQhyWNhWMjp09m-XTM97hQ
提取码: 6ddy
模型的默认目录:
Windows系统:C:\Users\当前用户\AppData\Roaming\cnstd\版本号\ppocr
Linux系统:~/.cnocr/版本号/
把下载得到的模型解压,每个模型按文件夹保存在上述目录即可。
• ocr() 标准的多行文字检测识别
参数:
img_fp:图像文件的路径,也可以是图像的二进制数据(如使用 open().read() 读取的内容),或者是一个 numpy.ndarray 类型的图像数据(例如使用 cv2.imread() 读取的图像)。
返回值:返回一个包含识别结果的列表,列表中的每个元素是一个字典,字典包含两个键:
text:识别出的文本内容。
score:识别结果的置信度得分,取值范围是 0 到 1,得分越高表示识别结果越可靠。
position:(np.ndarray or None),检测出的文字对应的矩形框;np.ndarray, shape: (4, 2),对应 box 4个点的坐标值 (x, y) ;
示例代码:
from cnocr import CnOcr
ocr = CnOcr()
img_path = 'test.jpg'
res = ocr.ocr(img_path)
for line in res:
print(f"文本: {line['text']}, 置信度: {line['score']}")
• 图像分辨率对速度的影响
使用不同的分辨率对ocr的生成时间做了如下测试:
分辨率 生成时间
3k*4k 28s
1.6k*1k 0.71s
900*500 0.29s
768*768 0.12s
800*300 0.33s
800150 0.7s
看得出,当图像很大时,由于数据量巨大,所以生成时间很长,但是图像很小时,时间也变长。这是由于模型内部的输入图形的标准像素是768*768,所以使用768*768速度最快。
• ocr_for_single_line() 识别单行文本
该方法适用于识别单行文本的图像,当图像中只有一行文本时,使用此方法可以获得更快的识别结果。
参数:
img_fp:与 ocr() 方法的 img_fp 参数含义相同。
返回值:
返回一个元组,包含两个元素:
第一个元素是识别出的文本内容。
第二个元素是识别结果的置信度得分。
示例代码:
from cnocr import CnOcr
ocr = CnOcr()
img_path = 'single_line_test.jpg'
text, score = ocr.ocr_for_single_line(img_path)
print(f"文本: {text}, 置信度: {score}")
其他说明:
模型选择:在初始化 CnOcr 类时,可以通过 model_name 参数选择不同的识别模型,以适应不同的识别需求。例如:
ocr = CnOcr(model_name='densenet_lite_136-fc')
• 速度:
对于800*150像素这样像素的图形,生成时间是0.01s级。
• 使用GPU:
要使用GPU,在创建ocr对象时使用以下参数:
ocr = CnOcr(model_backend='pytorch', context='cuda')
或
ocr = CnOcr(model_backend='pytorch', context='gpu')
第一次使用GPU会出现报错:
解决办法:卸载并重新安装onnxruntime
pip uninstall onnxruntime
pip install onnxruntime-gpu
经测试,使用RTX2080Ti,处理一个3024*4032像素的图像,时间为5秒,使用cpu为8秒,而处理一个768*768的图像,速度几乎没有区别。
• 自定义字符集
在初始化 CnOcr 对象时指定 vocab 参数。这样,模型只会识别 vocab 中包含的字符。
from cnocr import CnOcr
# 自定义字符集,只识别数字和字母
vocab = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'
ocr = CnOcr(vocab=vocab)
img_path = 'custom_charset_image.jpg'
res = ocr.ocr(img_path)
for line in res:
print(f"文本: {line['text']}, 置信度: {line['score']}")
• 使用不同的模型
Cnocr 提供了多种预训练模型,在初始化 CnOcr 对象时通过 model_name 参数选择不同的模型,以适应不同的识别需求。
from cnocr import CnOcr
# 使用 densenet_lite_136-fc 模型
ocr = CnOcr(model_name='densenet_lite_136-fc')
img_path = 'image.jpg'
res = ocr.ocr(img_path)
for line in res:
print(f"文本: {line['text']}, 置信度: {line['score']}")
• 批量识别
如果有多个图像需要进行识别,可以编写一个循环来实现批量识别。
from cnocr import CnOcr
import os
ocr = CnOcr()
image_dir = 'image_directory' # 包含多个图像的目录
for filename in os.listdir(image_dir):
if filename.endswith(('.png', '.jpg', '.jpeg')):
img_path = os.path.join(image_dir, filename)
res = ocr.ocr(img_path)
print(f"图像: {filename}")
for line in res:
print(f"文本: {line['text']}, 置信度: {line['score']}")
print()
• ocr_for_single_lines() 识别多个单行文本
与 ocr_for_single_line() 类似,不过它接受的输入是一个由多个单行文本图像数据的列表。