EasyOCR 是一个基于 PyTorch 的 OCR(光学字符识别)库,能够识别多种语言的文本。该库由 Jaided AI 开发,旨在为开发者提供一个简单易用的 OCR 解决方案。以下是 EasyOCR 库的详细解释和分析:
1. 主要功能
- 多语言支持:EasyOCR 支持超过 80 种语言,包括中文、日文、韩文、拉丁语系语言等。
- 高精度识别:使用深度学习模型(如 CRNN 和 Transformer),提供高精度的文本识别。
- 轻量级:相比其他 OCR 库(如 Tesseract),EasyOCR 更轻量且易于安装和使用。
- 易于集成:可以很方便地与其他 Python 项目集成,特别是与计算机视觉项目。
2. 安装
使用 pip 可以非常方便地安装 EasyOCR:
3. 基本语法
以下是使用 EasyOCR 的基本步骤:
1
2
3
4
5
6
7
8
9
10
11
| import easyocr
# 初始化阅读器
reader = easyocr.Reader(['ch_sim', 'en']) # 支持简体中文和英文
# 读取图像并识别文本
result = reader.readtext('path_to_image.jpg')
# 输出识别结果
for (bbox, text, prob) in result:
print(f"Detected text: {text} with confidence {prob}")
|
4. 主要组件
- Reader:这是 EasyOCR 的核心类,用于加载模型和执行 OCR 任务。
- readtext:这是 Reader 类的主要方法,用于从图像中读取文本。
5. 高级用法
除了基本用法外,EasyOCR 还提供了一些高级功能和参数:
默认情况下,EasyOCR 会使用 CPU。如果想使用 GPU,可以在初始化 Reader 时设置 gpu=True。
1
| reader = easyocr.Reader(['ch_sim', 'en'], gpu=True)
|
- 调整识别模型:可以调整检测和识别模型的参数,例如检测文本框的阈值、识别字符的置信度等。
1
| result = reader.readtext('path_to_image.jpg', detail=1, text_threshold=0.6, low_text=0.3)
|
6. 优缺点分析
优点:
- 多语言支持:支持超过 80 种语言,适用范围广。
- 高精度:基于深度学习的 OCR 模型,识别精度较高。
- 简单易用:接口设计简洁,易于上手。
- 跨平台:支持在多种操作系统(如 Windows、Linux、MacOS)上运行。
缺点:
- 依赖深度学习模型:由于使用了深度学习模型,运行时需要一定的计算资源,尤其是在处理大量图像时。
- 模型体积较大:预训练模型文件较大,占用一定的存储空间。
7. 应用场景
- 文档扫描:识别和提取扫描文档中的文本。
- 自然场景文本识别:识别图片或视频中的自然场景文本,例如街道标志、广告牌等。
- 图像翻译:结合翻译 API,可以实现实时图像翻译。
- 自动化办公:在自动化办公流程中,识别并处理图像中的文本信息。
8. 示例项目
案例一
以下是一个使用 EasyOCR 进行身份证识别的简单示例:
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
| import cv2
import easyocr
# 初始化阅读器
reader = easyocr.Reader(['ch_sim', 'en'])
# 读取图像
image_path = 'path_to_id_card.jpg'
image = cv2.imread(image_path)
# 识别文本
result = reader.readtext(image_path)
# 绘制识别结果
for (bbox, text, prob) in result:
# 获取文本框的坐标
top_left = tuple([int(val) for val in bbox[0]])
bottom_right = tuple([int(val) for val in bbox[2]])
# 绘制矩形框和文本
image = cv2.rectangle(image, top_left, bottom_right, (0, 255, 0), 2)
image = cv2.putText(image, text, top_left, cv2.FONT_HERSHEY_SIMPLEX, 0.8, (255, 0, 0), 2)
# 显示图像
cv2.imshow('Result', image)
cv2.waitKey(0)
cv2.destroyAllWindows()
|
通过以上的详细解释与分析,EasyOCR 可以成为文本识别任务中的一个强有力的工具。它的简单易用、多语言支持和高识别精度使其在各种应用场景中广泛适用。
案例二
使用 requests 库来获取网络图片,然后用 EasyOCR 进行识别,使用 OpenCV 对识别结果进行标记,并将处理后的图片保存到本地。下面是一个完整的示例代码:
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
31
32
33
34
35
36
37
38
39
40
41
| import requests
import easyocr
import io
from PIL import Image
import numpy as np
import cv2
# 获取图片的二进制数据
image_url = 'https://example.com/path/to/image.jpg' # 替换为你的图片 URL
response = requests.get(image_url)
binary_stream = response.content
# 使用 BytesIO 将二进制流转换为图像对象
image_stream = io.BytesIO(binary_stream)
image = Image.open(image_stream)
# 将图像对象转换为 OpenCV 格式
image_np = np.array(image)
image_cv = cv2.cvtColor(image_np, cv2.COLOR_RGB2BGR)
# 初始化 EasyOCR 阅读器
reader = easyocr.Reader(['ch_sim', 'en'])
# 使用 EasyOCR 进行文本识别
result = reader.readtext(image_cv)
# 绘制识别结果
for (bbox, text, prob) in result:
# 获取文本框的坐标
top_left = tuple([int(val) for val in bbox[0]])
bottom_right = tuple([int(val) for val in bbox[2]])
# 绘制矩形框和文本
image_cv = cv2.rectangle(image_cv, top_left, bottom_right, (0, 255, 0), 2)
image_cv = cv2.putText(image_cv, text, top_left, cv2.FONT_HERSHEY_SIMPLEX, 0.8, (255, 0, 0), 2)
# 保存处理后的图像到本地
output_image_path = 'processed_image.jpg'
cv2.imwrite(output_image_path, image_cv)
print(f"Processed image saved to {output_image_path}")
|
详细步骤解释
- 获取图片的二进制数据:
- 使用 requests.get 方法从 URL 获取图片的二进制数据。
- 二进制流转换为图像对象:
- 使用 io.BytesIO 将二进制流包装为一个字节流对象。
- 使用 PIL.Image.open 将字节流对象读取为图像。
- 图像对象转换为 OpenCV 格式:
- 将 PIL 图像转换为 NumPy 数组。
- 使用 cv2.cvtColor 将图像从 RGB 转换为 BGR 格式。
- 初始化 EasyOCR 阅读器:
- 使用 easyocr.Reader 初始化阅读器,并指定要识别的语言。
- 进行文本识别:
- 使用 reader.readtext 方法对图像进行文本识别,并输出结果。
- 绘制识别结果:
- 遍历识别结果,获取文本框的坐标。
- 使用 cv2.rectangle 绘制文本框。
- 使用 cv2.putText 绘制识别出的文本。
- 保存处理后的图像到本地:
- 使用 cv2.imwrite 将处理后的图像保存到指定的本地路径。
通过这种方式,可以从网络获取图片数据,进行文本识别并标记结果,最后将处理后的图片保存到本地。
案例三
如果写图片的内容有中文
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
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
| import io
import os
import easyocr
import numpy as np
import requests
from PIL import Image, ImageDraw, ImageFont
import cv2
if __name__ == '__main__':
print(os.name)
response = requests.get("https://tse2-mm.cn.bing.net/th/id/OIP-C.CqqgpmzS979w0JR5XE0TCgHaLH?w=203&h=304&c=7&r=0&o=5&dpr=2&pid=1.7")
print(response.status_code)
binary_stream = response.content
# 使用 BytesIO 将二进制流转换为图像对象
image_stream = io.BytesIO(binary_stream)
image = Image.open(image_stream)
# 将图像对象转换为 OpenCV 格式
image_np = np.array(image)
# image_cv = cv2.cvtColor(image_np, cv2.COLOR_RGB2BGR)
draw = ImageDraw.Draw(image)
# 确定字体路径
if os.name == 'nt': # Windows
font_path = "C:\\Windows\\Fonts\\simhei.ttf"
elif os.name == 'posix': # macOS or Linux
font_path = "/Library/Fonts/Arial Unicode.ttf" # macOS 默认字体之一
else:
raise ValueError("Unsupported OS")
# 加载字体
font = ImageFont.truetype(font_path, 32)
reader = easyocr.Reader(["ch_sim", "en"])
for (bbox, text, prob) in reader.readtext(image_np, detail=1):
print(bbox, text, prob)
# 获取文本框的坐标
top_left = tuple([int(val) for val in bbox[0]])
bottom_right = tuple([int(val) for val in bbox[2]])
# 绘制矩形框和文本
draw.rectangle([top_left, bottom_right], outline=(0, 255, 0), width=2)
draw.text(top_left, text, font=font, fill=(255, 0, 0))
# 将 PIL 图像转换回 OpenCV 格式
image_cv = cv2.cvtColor(np.array(image), cv2.COLOR_RGB2BGR)
# 保存处理后的图像到本地
output_image_path = './processed_image.jpg'
cv2.imwrite(output_image_path, image_cv)
|
说明
关于模型
EasyOCR 在首次运行时会自动下载所需的预训练模型并将其保存在本地缓存目录中。通常,这些模型会存储在用户主目录下的 .EasyOCR 目录中。在一台联网的机器上下载好这些模型后,可以将其复制到不联网的机器上对应的目录中。
具体步骤
- 在联网机器上下载模型
在一台联网的机器上,运行以下代码以确保所需的模型已被下载:
1
2
3
4
| import easyocr
# 初始化阅读器(这将下载必要的模型)
reader = easyocr.Reader(['ch_sim', 'en'])
|
- 找到模型存储位置
模型文件通常存储在用户主目录下的 .EasyOCR 目录中。具体路径为:
在 Windows 上,路径可能类似于:
1
| C:\Users\<YourUsername>\.EasyOCR\
|
- 复制模型文件
将 .EasyOCR 目录复制到不联网的机器上。
可以使用 USB 设备、外部硬盘或其他文件传输方式将该目录复制到目标机器的相同位置。
- 在不联网的机器上设置模型路径
确保不联网的机器上的 .EasyOCR 目录路径与联网机器上的路径一致。如果路径不同,可以在不联网的机器上设置 EASYOCR_MODULE_PATH 环境变量指向新的模型路径。例如,如果模型被复制到一个不同的目录:
1
2
| import os
os.environ['EASYOCR_MODULE_PATH'] = '/path/to/your/model/directory'
|
示例代码
假设你已经在联网机器上下载并复制了模型文件,下面是如何在不联网的机器上使用 EasyOCR 进行本地图片识别的示例代码:
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
31
32
33
| import os
import easyocr
import cv2
import numpy as np
from PIL import Image
# 设置模型路径(如果需要)
os.environ['EASYOCR_MODULE_PATH'] = '/path/to/your/model/directory' # 如果模型文件不在默认位置
# 初始化阅读器
reader = easyocr.Reader(['ch_sim', 'en'], gpu=False) # 使用CPU进行识别
# 读取本地图片
image_path = 'path_to_your_local_image.jpg'
image = Image.open(image_path)
image_np = np.array(image)
image_cv = cv2.cvtColor(image_np, cv2.COLOR_RGB2BGR)
# 使用 EasyOCR 进行文本识别
result = reader.readtext(image_cv)
# 绘制识别结果
for (bbox, text, prob) in result:
top_left = tuple([int(val) for val in bbox[0]])
bottom_right = tuple([int(val) for val in bbox[2]])
image_cv = cv2.rectangle(image_cv, top_left, bottom_right, (0, 255, 0), 2)
image_cv = cv2.putText(image_cv, text, top_left, cv2.FONT_HERSHEY_SIMPLEX, 0.8, (255, 0, 0), 2)
# 保存处理后的图像到本地
output_image_path = 'processed_image.jpg'
cv2.imwrite(output_image_path, image_cv)
print(f"Processed image saved to {output_image_path}")
|
通过这种方法,你可以在没有网络连接的设备上使用 EasyOCR 进行文本识别,只需要在联网机器上预先下载好模型并复制到目标设备上即可。
Reader参数
easyocr.Reader 类是 EasyOCR 的核心组件,用于加载模型并执行文本识别任务。下面是 Reader 类的初始化参数及其详细说明:
Reader 初始化参数
1
2
3
4
5
6
7
8
9
10
| easyocr.Reader(
lang_list,
gpu=True,
model_storage_directory=None,
user_network_directory=None,
download_enabled=True,
detector=True,
recognizer=True,
verbose=True
)
|
参数详解
通过设置 model_storage_directory 和 download_enabled=False,可以确保在没有网络连接的情况下使用预先下载好的模型文件。其他参数可以根据需要进行调整以优化性能和适应特定的使用场景。
- lang_list (必需):
- 类型: list
- 说明: 需要识别的语言列表。例如,[‘en’] 表示只识别英文,[‘ch_sim’, ‘en’] 表示识别简体中文和英文。
- 示例: [‘ch_sim’, ‘en’]
- gpu (可选):
- 类型: bool
- 默认值: True
- 说明: 是否使用 GPU 进行推理。如果设置为 False,将使用 CPU。
- 示例: gpu=False
- model_storage_directory (可选):
- 类型: str
- 默认值: None
- 说明: 模型存储的目录。如果为 None,模型将存储在默认路径 ~/.EasyOCR/。
- 示例: model_storage_directory=’/path/to/your/model/directory’
- user_network_directory (可选):
- 类型: str
- 默认值: None
- 说明: 自定义模型网络定义的目录,用于加载用户自定义模型。
- 示例: user_network_directory=’/path/to/your/network/directory’
- download_enabled (可选):
- 类型: bool
- 默认值: True
- 说明: 是否允许在模型文件不存在时自动下载。如果设置为 False,且模型文件不存在,则会报错。
- 示例: download_enabled=False
- detector (可选):
- 类型: bool
- 默认值: True
- 说明: 是否启用文本检测器。如果只需要文本识别部分(输入已经是文本区域),可以设置为 False 以加快处理速度。
- 示例: detector=False
- recognizer (可选):
- 类型: bool
- 默认值: True
- 说明: 是否启用文本识别器。如果只需要文本检测部分(不需要识别文本内容),可以设置为 False。
- 示例: recognizer=False
- verbose (可选):
- 类型: bool
- 默认值: True
- 说明: 是否输出详细信息。如果设置为 False,将不输出中间过程信息。
- 示例: verbose=False
常见问题
- 确保图片数据是正确的 OpenCV 格式,然后调用 reader.readtext 方法进行文本识别。有些图像格式可能需要额外处理。如果图片是 GIF 格式,PIL(Pillow)可能会更好地处理:
1
2
3
4
5
6
| from PIL import Image
# 使用 PIL 读取 GIF 文件并转换为 NumPy 数组
image = Image.open(image_path).convert('RGB')
image_np = np.array(image)
image_cv = cv2.cvtColor(image_np, cv2.COLOR_RGB2BGR)
|
通过上述方法,可以确保图片被正确读取并处理,避免 NoneType 错误,并成功使用 EasyOCR 进行文本识别。
- reader.readtext(detail=detail)
当 detail=1 时,reader.readtext 返回一个包含边界框、文本和置信度的元组列表。
处理每个结果,分别解包 bbox, text, prob 并绘制矩形框和文本。
当 detail=0 时,reader.readtext 仅返回识别出的文本列表。
这种情况下,你只需要处理返回的文本。