3. EasyOCR:多语言识别利器
这是什么:EasyOCR = 一个开箱即用的 Python OCR 库,一个 Reader 就能收下 80 多种语言。
为什么用:上一章你已经跑通了第一次识别,但那只是默认参数。真正干活时只会中英文还行,一遇到小语种、混进无关字符就露怯,参数得一个个调明白。
如何用:本章先练语言与混合识别,再用白名单、黑名单和 detail、paragraph 这几个重点参数把识别率调上去。
基线:EasyOCR 1.7.2(PyPI 上长期没大更新的稳定版,API 稳定,放心用)。
3.1 语言与混合识别
import easyocr
reader = easyocr.Reader(
['ch_sim', 'en'], # 简体中文 + 英文,中英混排场景标配
)
常用语言代码速查:
| 代码 | 语言 |
|---|---|
ch_sim / ch_tra |
简体 / 繁体中文 |
en |
英文 |
ja / ko |
日文 / 韩文 |
de / fr / ru |
德 / 法 / 俄 |
多种语言一起写进列表即可。中英混排场景(['ch_sim', 'en'])必配——只写 ['ch_sim'] 的话,图里的英文报错信息会整段漏掉。
代价也要知道:语言越多,模型越大、推理越慢。中文 + 英文已经是常见上限,再加日韩只会拖慢速度,除非图里真的出现那些文字。
3.2 白名单与黑名单:只认该认的字
知道要出现哪些字符时,直接告诉模型,比事后过滤快得多:
# 只认数字和百分号(适合读表格数字、仪表盘)
reader.readtext('meter.png', allowlist='0123456789.%')
# 排除掉常见误识别字符(比如型号里的 O 和数字 0 常混)
reader.readtext('code.png', blocklist='OIl')
3.3 重点参数:detail 与 paragraph
# detail=0:只要文字,最简模式
print(reader.readtext('test.png', detail=0))
# ['青蛙编程网', 'frog blog v1.0']
# detail=1:完整三元组(坐标/文本/置信度),默认
result = reader.readtext('test.png', detail=1)
段落模式——把零散的小框按视觉关系合并成整段:
result = reader.readtext('article.png', paragraph=True)
print(result[0][1]) # 这一整段的文字
注意:开了
paragraph=True,每条结果就只剩「框 + 文本」两项,置信度被合并掉了。所以想要置信度时不要开段落模式。
| 场景 | 建议 |
|---|---|
| 做数据导出 / 搜索 | detail=1 保留坐标和置信度 |
| 快速抓手本全文 | detail=0 + paragraph=True |
| 要复核可疑行 | detail=1,别开 paragraph(没有置信度) |
3.4 提升命中率的调参
reader.readtext('test.png',
detail=0,
decoder='beamsearch', # 精细解码(默认 greedy 更快)
text_threshold=0.7, # 文字判定阈值,调低可捞更淡的文字
mag_ratio=2.0 # 放大 2 倍再识别:小字救星
)
- 小字、糊图:
mag_ratio放大是第一奇招 - 艺术字 / 繁体书法:换
beamsearch,拿算力换准确率 - 浓背景淡文字:调低
text_threshold
调参顺序建议:mag_ratio(放大)→ 阈值 → 解码器。先简单后复杂,一个
mag_ratio=2.0常解 80% 烦恼。
另外两个影响「捞不捞得到」的参数:min_size(默认 20,小于这个高度的文字直接忽略)和 canvas_size(默认 2560,超大图会被缩放后再识别)。
3.5 GPU 加速(可选)
reader = easyocr.Reader(['ch_sim', 'en'], gpu=True) # 默认自动检测显卡
有 CUDA 环境就能用(Google Colab 自带 GPU)。CPU 首跑数秒 vs GPU 毫秒级,学习阶段不装 CUDA 也不影响一切。
3.6 常见翻车现场
| 报错 / 现象 | 原因 | 修法 |
|---|---|---|
ImportError: ... libGL.so.1 |
Linux 缺图形库 | sudo apt install libgl1 |
cv2 导入报错 |
同时装了多个 OpenCV 发行版 | 只留一个(见第 5 章 5.7) |
| 中文漏识别 | 语言列表没带 ch_sim |
加上 'ch_sim' |
| 段落模式下取值报错 | 开了 paragraph 还想解包 3 项 | 改成 item[1],或关掉 paragraph |
| 小字一个都没识别到 | 高度小于 min_size |
调小 min_size 或先放大 |
3.7 动手改
- 三种模式全跑:
detail=0/detail=1/paragraph=True,对比输出结构差异 - 找一张小字截图,
mag_ratio=2.0与不用对比识别率 - 试试
['ja', 'en']识别一段日文截图
3.8 小结
- 语言表列全即识别全;中英混排
['ch_sim', 'en']是默认起手 - 知道字符集就用
allowlist/blocklist,比事后过滤省事 - detail 控制输出粒度,paragraph 合并段落(但会丢掉置信度)
mag_ratio放大是对付小字的头号武器
下一章:PaddleOCR:中文识别的标杆 🐸