EasyOCR 是一个开源的、支持多语言(28+种)和多文档格式(PDF/PNG/JPG/TIFF等)的 OCR(光学字符识别)工具库,由 Hugging Face 团队维护。其目标是简化 OCR 的开发流程,提供易用、高性能的文本识别能力,适用于工业、教育、医疗等多个领域。
EasyOCR 核心组件解析
1. 特征提取(Feature Extraction)
技术模型:ResNet(残差网络)、VGG
功能:
- 将输入图像转换为深度特征表示,为后续文本识别提供语义信息。
- ResNet:通过残差连接(skip connections)解决梯度消失问题,支持更深网络训练,提升特征表达能力。
- VGG:采用堆叠的 3×3 卷积核和均匀架构,简化模型设计,平衡计算效率与准确性。
关键优势:
- ResNet 降低模型复杂度,加速学习过程;
- VGG 通过小卷积核深化网络层次,增强局部特征捕捉能力。
2. 序列标注(Sequence Labeling)
技术模型:LSTM(长短期记忆网络)
功能:
-
基于特征序列建模时间依赖关系,完成文本模式识别与结构化解析。
-
LSTM 设计:
- 内置输入门、遗忘门、输出门,动态调控信息流动;
- 通过记忆单元(Cell State)长期保存上下文信息,避免传统 RNN 的梯度消失问题。
核心作用:
- 处理序列数据(如字符间时序关联);
- 适用于复杂文本布局(如多行、多列文本)的上下文建模。
3. 解码(Decoding)
技术模型:CTC(连接主义时间分类)
功能:
-
将序列标注结果映射为可变长度的实际文本,解决输入与输出不对齐问题。
-
技术原理:
- 引入空白符号(Blank Token)填充时序间隙;
- 通过动态规划计算所有可能对齐路径的损失值,最终输出最优解。
典型场景:
- 手写体、模糊文本等高噪声场景下的鲁棒识别;
- 支持不同语言混合排版(如中英文混杂)的解码任务。
主要特点与优势
训练框架与技术整合
- 训练基础:基于
deep-text-recognition-benchmark
框架,提供标准化训练流程。 - 模型兼容性:支持 ResNet、VGG 等特征提取器与 LSTM、Transformer 等序列标注器的灵活组合。
- 数据驱动:通过多语言、多场景标注数据集优化模型泛化能力。
组件协作流程
- 特征提取 → 2. 序列标注 → 3. CTC 解码
- 输入图像 → 提取特征 → 建立时序依赖 → 解码为最终文本。
优化亮点
- 模块化设计:各组件可独立替换(如用 Transformer 替代 LSTM),适应不同场景需求。
- 轻量化支持:通过模型剪枝与蒸馏技术,适配移动端部署。
- 多语言扩展:结合预训练语言模型(如 BERT),增强跨语言识别能力。
环境安装
首先确保已经安装了Pytorch,它是EasyOCR的核心依赖包。
pip3 install torch torchvision torchaudio
安装EasyOCR,命令如下:
pip install easyocr
# 安装简体中文
pip install easyocr[ch_sim]
EasyOCR支持多种语言,您可以为您需要的特定语言安装语言模型。默认情况下,安装英语(en)。您可以使用- model_dir添加其他语言,或者在初始化EasyOCR阅读器时在代码中指定它们。EasyOCR目前支持80多种语言,更多的语言正在开发中。代码名称支持的语言如下:
Abaza (abq), Adyghe (ady), Afrikaans (af), Angika (ang), Arabic (ar), Assamese (as), Avar (ava), Azerbaijani (az), Belarusian (be), Bulgarian (bg) , Bihari (bh), Bhojpuri (bho), Bengali (bn), Bosnian (bs), Simplified Chinese (ch_sim), Traditional Chinese (ch_tra), Chechen (che), Czech (cs), Welsh (cy), Danish (da), German (de), English (en), Spanish (es), Estonian (et), Persian (fa), Finnish (fi), French (fr), Irish (ga), Goan Konkani (gom), Hindi (hi), Croatian (hr), Hungarian (hu), Indonesian (id), Ingush (inh), Icelandic (is), Italian (it), Japanese (ja), Kabardian (kbd), Kannada (kn), Korean (ko), Kurdish (ku), Latin (la), Lak (lbe), Lezghian (lez), Lithuanian (lt), Latvian (lv), Magahi (mah), Maithili (mai), Maori (mi), Mongolian (mn), Marathi (mr), Malay (ms), Maltese (mt), Nepali (ne), Newari (new), Dutch (nl), Norwegian (no), Occitan (oc), Pali (pi), Polish (pl), Portuguese (pt), Romanian (ro), Russian (ru), Serbian (cyrillic) (rs_cyrillic), Serbian(latin) (rs_latin), Nagpuri (sck), Slovak (sk), Slovenian (sl), Albanian (sq), Swedish (sv), Swahili (sw), Tamil (ta), Tabassaran (tab), Telugu (te), Thai (th), Tajik (tjk), Tagalog (tl), Turkish (tr), Uyghur (ug), Ukranian (uk), Urdu (ur), Uzbek (uz), Vietnamese (vi)
简体中文:Simplified Chinese (ch_sim)
你也可以同时使用多种语言,只要它们彼此兼容。例如,如果你想使用英语和简体中文,你可以这样写:
reader = easyocr.Reader(['en', 'ch_sim'])
基本使用示例
下面是如何使用EasyOCR读取图像和提取文本的简单示例:
-
导入EasyOCR并创建阅读器对象。您需要指定要使用的语言作为语言代码列表。
-
加载图像文件并对其执行OCR。您可以使用阅读器对象的readtext方法从图像中获取文本及其坐标。
-
readtext方法返回一个结果列表,其中每个结果包含有关已识别文本、其边界框和准确性概率的信息。您可以遍历结果并访问以下信息:
import easyocr
reader = easyocr.Reader(['en']) # specify the language
result = reader.readtext('image.jpg')
for (bbox, text, prob) in result:
print(f'Text: {text}, Probability: {prob}')
输出结果示例:
Text: 姓名, Probability: 0.9750918540041094
Text: 王林, Probability: 0.7283910545488811
Text: 性别, Probability: 0.99506228162414
Text: 民族 汉, Probability: 0.11635302390479253
....
高级使用示例
EasyOCR提供了几个高级功能,如检测多种语言,从视频中检测文本,自动填写表单等等。以下是一些如何使用EasyOCR的高级用例:
多语言识别:EasyOCR支持80多种语言。您可以在创建阅读器对象时指定语言。例如,要从图像中识别英语和印地语文本:
import easyocr
reader = easyocr.Reader(['en','ch_sim'])
result = reader.readtext('image.jpg')
for (bbox, text, prob) in result:
print(f'Text: {text}, Probability: {prob}')
车牌识别:EasyOCR在识别车牌上的文字方面表现得非常出色,这是一项对许多应用至关重要的任务,包括安全和交通控制。该库是车牌识别的绝佳选择,因为它具有内置功能、多语言支持和复杂的识别方法。车牌识别:EasyOCR在识别车牌上的文字方面表现得非常出色,这是一项对许多应用至关重要的任务,包括安全和交通控制。该库是车牌识别的绝佳选择,因为它具有内置功能、多语言支持和复杂的识别方法。使用相机或智能手机拍摄清晰的车牌图像后,可以使用EasyOCR对车牌图像进行光学字符识别(OCR)。
import easyocr
reader = easyocr.Reader(['en','ch_sim'])
result = reader.readtext('image.jpg')
for (bbox, text, prob) in result:
(top_left, top_right, bottom_right, bottom_left) = bbox
print(f'Text: {text}, Probability: {prob}')
从灰度图像中读取文本:EasyOCR也可以从灰度图像中读取文本。您只需要在将图像传递给readtext方法之前将其转换为灰度。
from PIL import Image
import easyocr
reader = easyocr.Reader(['en'])
img = Image.open('image.jpg').convert('L')
result = reader.readtext(img)
for (bbox, text, prob) in result:
print(f'Text: {text}, Probability: {prob}')
由此可见,EasyOCR也能够从灰度图像中读取,首先将简单的文本图像转换为灰度,然后传递给EasyOCR阅读器进行识别。
处理噪声图像:如果图像有很多噪声,可以在将图像传递给EasyOCR之前使用图像处理技术来降低噪声。这里使用cv2库来降低噪声,然后将图像传递给EasyOCR阅读器进行识别。
import cv2
import easyocr
img = cv2.imread('noisy_image.jpg', 0)
blur = cv2.GaussianBlur(img,(5,5),0)
reader = easyocr.Reader(['en'])
result = reader.readtext(blur)
for (bbox, text, prob) in result:
print(f'Text: {text}, Probability: {prob}')
批处理:如果您有多个图像,并且希望一次处理所有图像,则可以在循环中使用readtext方法。
import easyocr
reader = easyocr.Reader(['en'])
images = ['image1.jpg', 'image2.jpg', 'image3.jpg']
for img in images:
result = reader.readtext(img)
print(result)
获取边界框:readtext方法返回已识别的文本以及边界框坐标。您可以使用这些坐标进行进一步处理。
import easyocr
reader = easyocr.Reader(['en'])
result = reader.readtext('image.jpg')
for res in result:
print(f"Text: {res[1]}, Coordinates: {res[0]}")
最后总结
本文解释了如何使用EasyOCR,这是一个强大而平易近人的OCR库,可以从各种图像格式中识别和提取文本。我们已经看到EasyOCR可以批量分析大量照片,处理噪声和灰度图像,支持80多种语言,并为已识别的文本返回边界框和置信度分数。EasyOCR以其简单有效的方法从照片中提取文本,具有高度的准确性,是图像文本识别的伟大工具。该库强大的算法和用户友好的界面使其成为需要快速处理大量文档和图像的公司和组织的完美选择。