OCR工具详细对比
1. Umi-OCR
官网/GitHub: github.com/hiroi-sora/…
核心技术: Paddle/Rapid双引擎
语言支持: 多国语言库
优点:
✅ 免费开源:完全免费,源代码公开,允许自由修改和分发。
✅ 离线使用:无需网络连接,保护隐私。
✅ 批量处理:支持截屏、批量导入图片、PDF识别,可排除水印/页眉页脚。
✅ 兼容性好:支持Windows 7 x64等旧系统,提供Paddle版(高精度)和Rapid版(高速度)。
✅ 高性能:Paddle版基于深度学习,识别准确;Rapid版优化速度。
缺点:
❌ 硬件限制:Paddle版不支持奔腾、赛扬、凌动等CPU。
❌ 配置复杂:非技术用户可能觉得设置困难。
❌ 缺乏官方支持:依赖社区维护,更新较慢。
❌ 界面简陋:UI设计简单,不如商业软件美观。
适用场景:
- 需要离线OCR的个人或企业用户。
- 批量处理图片/PDF,且注重隐私保护。
2. Tesseract OCR
官网/GitHub: github.com/tesseract-o…
核心技术: 传统图像处理 + LSTM神经网络(v4.0+)
语言支持: 100+种语言(包括中文)
优点:
✅ 成熟稳定:由HP开发,现由Google维护,历史最悠久的OCR开源项目。
✅ 多语言支持:覆盖中文、日文、阿拉伯文等复杂文字。
✅ 轻量级:无需深度学习依赖,适合低配置设备。
✅ 可定制性高:支持自定义训练(通过jTessBoxEditor工具)。
缺点:
❌ 复杂场景效果差:对倾斜、模糊、多列排版文本识别率低。
❌ 配置复杂:需手动预处理(如二值化、降噪)。
❌ 速度较慢:相比深度学习方案,处理大文件耗时较长。
适用场景:
- 嵌入式设备或老旧硬件环境。
- 需要自定义OCR模型的开发者。
3. PaddleOCR
官网/GitHub: github.com/PaddlePaddl…
核心技术: PP-OCR系列深度学习模型
语言支持: 80+种语言(中文效果最佳)
优点:
✅ 高精度:中文识别准确率最高,支持竖排文字、表格、手写体。
✅ 功能全面:集成文本检测(DB)、方向矫正(CLS)、识别(CRNN)全流程。
✅ 预训练模型丰富:提供轻量级(9M)、通用版、多语言版模型。
✅ 工业级部署:支持Python/C++/Java API,兼容TensorRT、ONNX加速。
✅ 中文文档友好:百度开发,中文社区活跃,教程丰富。
缺点:
❌ 依赖较多:需安装PaddlePaddle深度学习框架。
❌ 硬件要求:GPU加速需NVIDIA显卡(CPU也可运行,但速度较慢)。
适用场景:
- 中文OCR首选,适用于文档、表格、车牌识别等。
- 企业级应用,需要高精度OCR解决方案。
4. CnOCR
官网/GitHub: github.com/breezedeus/…
核心技术: 轻量级CNN+RNN
语言支持: 简体中文、繁体中文(部分)、英文、数字
优点:
✅ 轻量快速:执行速度略快于PaddleOCR。
✅ 开箱即用:支持pip直接安装,自带20+预训练模型。
✅ 识别效果好:中文OCR效果接近PaddleOCR。
✅ 支持训练:提供简单训练命令,可自定义模型。
缺点:
❌ 符号识别差:部分标点符号识别不准。
❌ 空格丢失:某些场景下文本空格可能丢失。
❌ 训练灵活性低:相比PaddleOCR,自定义训练不够方便。
适用场景:
- Python开发者快速集成中文OCR。
- 需要轻量级OCR,且对精度要求较高。
5. EasyOCR
官网/GitHub: github.com/JaidedAI/Ea…
核心技术: CRNN + ResNet(基于PyTorch)
语言支持: 80+种语言
优点:
✅ 简单易用:API设计简洁,3行代码即可完成OCR。
✅ 多语言混合:支持中英文混合文本识别。
✅ 自动预处理:内置图像增强(去模糊、对比度调整)。
缺点:
❌ 模型体积大:默认模型约300MB,内存占用高。
❌ 中文精度一般:对艺术字、古风字体识别率较低。
❌ 灵活性低:不支持自定义训练,依赖官方模型。
适用场景:
- 快速验证OCR功能或多语言混合文本识别。
- 非技术用户希望简单易用的OCR工具。
6. MMOCR
官网/GitHub: github.com/open-mmlab/…
核心技术: 模块化多模型(DBNet、ABCNet等)
语言支持: 英文、中文等
优点:
✅ 学术前沿:集成最新OCR论文模型(如SATRN)。
✅ 灵活训练:支持自定义数据集和模型微调。
✅ 模块化设计:可切换不同检测/识别模型。
缺点:
❌ 上手门槛高:需熟悉PyTorch和深度学习。
❌ 文档复杂:配置文件参数多,新手不友好。
适用场景:
- OCR算法研究或定制化模型开发。
- 需要最新OCR技术的开发者。
7. Kraken
官网/GitHub: github.com/mittagessen…
核心技术: PyTorch古籍OCR模型
语言支持: 英文、中文等
优点:
✅ 古籍优化:擅长处理旧书、手写古籍、复杂排版。
✅ 可训练性强:支持自定义字体和排版规则。
缺点:
❌ 小众场景:通用OCR效果不如PaddleOCR/EasyOCR。
❌ 社区资源少:用户群体小,问题解决较慢。
适用场景:
- 历史文献、古籍数字化项目。
- 需要处理特殊排版的研究机构。
推荐选择总结
| 需求场景 | 推荐工具 | 理由 |
|---|---|---|
| 中文OCR(高精度) | PaddleOCR | 中文识别最佳,功能全面,适合工业级应用。 |
| 快速开发/多语言混合 | EasyOCR | API简单,支持80+语言,适合快速验证。 |
| 古籍/手写文献 | Kraken | 专为复杂排版设计,支持自定义训练。 |
| 离线/隐私保护 | Umi-OCR | 完全离线,支持批量处理,适合无网环境。 |
| 嵌入式/低配置设备 | Tesseract | 轻量级,无需深度学习依赖,兼容老旧硬件。 |
| Python轻量级集成 | CnOCR | 安装简单,速度较快,中文识别效果接近PaddleOCR。 |
| 学术研究/模型定制 | MMOCR | 模块化设计,集成最新算法,适合深度学习开发者。 |
PaddleOCR demo
因为我是需要本地识别中英文,padddle最适合我;
模型库地址:paddlepaddle.github.io/PaddleOCR/l…
模型对比
以下是 PaddleOCR 各版本(V3、V4、V3-Slim、V4-Slim)的详细对比及优缺点分析,帮助您根据需求选择合适版本:
1. PaddleOCR V3
定位:通用场景下的平衡版本
核心改进:
- 基于PP-OCRv3模型,优化中文识别精度。
- 引入SVTR(Scene Text Recognition)模块,提升长文本识别能力。
优点:
✅ 高精度:中文识别准确率较V2提升5%+,尤其擅长复杂排版(如表格、多列文本)。
✅ 速度优化:推理速度比V2快20%,平衡精度与效率。
✅ 功能全面:支持文本检测(DB)、方向矫正(CLS)、识别(CRNN)全流程。
缺点:
❌ 模型体积较大:默认模型约10MB+,对嵌入式设备不友好。
❌ 硬件要求较高:需中端CPU或GPU才能发挥最佳性能。
适用场景:
- 通用中文OCR(如文档、车牌、广告牌)。
- 需要兼顾精度与速度的工业级应用。
2. PaddleOCR V4
定位:高性能最新版,覆盖更复杂场景
核心改进:
- 升级至PP-OCRv4模型,引入PAN++ 检测算法和SVTR-Lite识别模型。
- 支持多语言混合识别(如中英文混排)。
优点:
✅ 精度再提升:中文识别错误率比V3降低15%,尤其改善模糊、倾斜文本。
✅ 多语言增强:新增80+语言支持,混合文本识别效果更好。
✅ 端侧优化:提供量化模型,适配移动端(Android/iOS)。
缺点:
❌ 资源消耗大:默认模型体积更大(约15MB),需更高算力支持。
❌ 部署复杂:部分新功能需调整超参数(如检测阈值)。
适用场景:
- 高精度OCR需求(如金融合同、医疗报告)。
- 多语言混合文本识别。
3. PaddleOCR V3-Slim
定位:轻量级裁剪版,牺牲少量精度换速度
核心改进:
- 裁剪冗余网络层,模型体积缩减至4MB(仅为V3的40%)。
- 保留PP-OCRv3核心结构,针对边缘设备优化。
优点:
✅ 极速推理:在树莓派等低功耗设备上速度比V3快50%。
✅ 低资源占用:内存消耗减少60%,适合嵌入式场景。
✅ 开箱即用:保持80%+的V3精度,满足大多数简单场景。
缺点:
❌ 精度下降:复杂文本(如艺术字、密集排版)识别率较低。
❌ 功能裁剪:不支持部分高级特性(如表格结构化)。
适用场景:
- 移动端/边缘设备(如IoT、车载OCR)。
- 对实时性要求高、资源受限的环境。
4. PaddleOCR V4-Slim
定位:V4的轻量化版本,平衡精度与效率
核心改进:
- 基于PP-OCRv4模型裁剪,体积压缩至6MB。
- 引入蒸馏技术,保留V4 85%以上的精度。
优点:
✅ 轻量高精度:精度显著优于V3-Slim,接近V4标准版。
✅ 多语言支持:保留V4的多语言识别能力。
✅ 适配广泛:支持ARM架构(如华为昇腾、飞腾CPU)。
缺点:
❌ 仍需中端硬件:相比V3-Slim,资源需求略高。
❌ 训练成本高:蒸馏模型需更多数据微调。
适用场景:
- 轻量化但需多语言支持的场景(如跨境电商OCR)。
- 中端嵌入式设备(如工业平板、智能摄像头)。
横向对比总结
| 版本 | 模型体积 | 精度水平 | 推理速度 | 硬件需求 | 核心优势 |
|---|---|---|---|---|---|
| V3 | 10MB+ | ⭐⭐⭐⭐ | ⭐⭐⭐ | 中端CPU | 通用场景最佳平衡 |
| V4 | 15MB+ | ⭐⭐⭐⭐⭐ | ⭐⭐ | 高端CPU/GPU | 多语言、超高精度 |
| V3-Slim | 4MB | ⭐⭐ | ⭐⭐⭐⭐⭐ | 低端ARM/嵌入式 | 极速、超轻量 |
| V4-Slim | 6MB | ⭐⭐⭐ | ⭐⭐⭐⭐ | 中端ARM | 轻量且多语言支持 |
选择建议
- 优先精度 → 选 V4(复杂场景)或 V3(通用场景)。
- 资源受限 → 选 V3-Slim(极致轻量)或 V4-Slim(轻量+多语言)。
- 多语言需求 → 必须 V4 或 V4-Slim。
注:所有版本均支持通过PaddleSlim进一步量化压缩,满足定制化需求。
我这里测试过了,大部分场景v3 slim都能识别出来,图片不太复杂,1-3内能识别,个人推荐v3 slim
使用方法
- 先安装依赖包:
uv add paddleocr paddlepaddle
- 代码:
from paddleocr import PaddleOCR, draw_ocr
import cv2
import numpy as np
from PIL import Image
import time
# 注意:预处理必须加,否则会导致手机拍的照片识别不准确
def preprocess_image_common(img):
# 转灰度
img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
# 直方图均衡化
img = cv2.equalizeHist(img)
# 中值滤波去噪
img = cv2.medianBlur(img, 3)
# 转回RGB格式供OCR使用
return cv2.cvtColor(img, cv2.COLOR_GRAY2RGB)
# 图像预处理函数
def preprocess_image_by_path(img_path):
# 读取图像
img = cv2.imread(img_path)
# 调用通用预处理逻辑
return preprocess_image_common(img)
# 图像预处理函数(直接接收二进制数据)
def preprocess_image_by_data(image_data):
# 将二进制数据转为numpy数组并解码
nparr = np.frombuffer(image_data, np.uint8)
img = cv2.imdecode(nparr, cv2.IMREAD_COLOR)
# 调用通用预处理逻辑
return preprocess_image_common(img)
def get_ocr_result(image_input, det_model_dir, rec_model_dir, is_data=True):
start_time = time.time()
# Paddleocr目前支持的多语言语种可以通过修改lang参数进行切换
# 例如`ch`, `en`, `fr`, `german`, `korean`, `japan`
ocr = PaddleOCR(
det_model_dir=det_model_dir,
rec_model_dir=rec_model_dir,
cls_model_dir='./models/ch_ppocr_mobile_v2.0_cls',
use_angle_cls=True,
lang="ch",
# use_gpu=True, # 启用GPU加速[1,4,6](@ref)
# gpu_mem=2000, # 可选:限制GPU显存预分配(单位MB,按需调整)[5](@ref)
show_log=True
)
# 根据输入类型选择预处理方式
if is_data:
image = preprocess_image_by_data(image_input)
else:
image = preprocess_image_by_path(image_input)
# 执行 OCR
result = ocr.ocr(image, cls=True)
# 提取文本
text = ' '.join([line[1][0] for res in result for line in res])
end_time = time.time()
# 打印执行时间
print(f"OCR执行时间:{end_time - start_time:.2f}秒")
return text
# # 显示结果
# from PIL import Image
# result = result[0]
# image = Image.open(img_path).convert('RGB')
# boxes = [line[0] for line in result]
# txts = [line[1][0] for line in result]
# scores = [line[1][1] for line in result]
# Windows 系统
# font_path = 'C:/Windows/Fonts/simhei.ttf'
# im_show = draw_ocr(image, boxes, txts, scores, font_path='/System/Library/Fonts/STHeiti Medium.ttc')
# im_show = Image.fromarray(im_show)
# im_show.save('result.jpg')
def get_ocr_result_by_v3_slim(image_input, is_data=True):
return get_ocr_result(image_input, './models/ch_PP-OCRv3_det_slim_infer', './models/ch_PP-OCRv3_rec_slim_infer', is_data)
def get_ocr_result_by_v3(image_input, is_data=True):
return get_ocr_result(image_input, './models/ch_PP-OCRv3_det_infer', './models/ch_PP-OCRv3_rec_infer', is_data)
def get_ocr_result_by_v4(image_input, is_data=True):
return get_ocr_result(image_input, './models/ch_PP-OCRv4_det_infer', './models/ch_PP-OCRv4_rec_infer', is_data)
def get_ocr_result_by_v4_server(image_input, is_data=True):
return get_ocr_result(image_input, './models/ch_PP-OCRv4_det_server_infer', './models/ch_PP-OCRv4_rec_server_infer', is_data)
注意:paddle的预处理必须加,否则会导致手机拍的照片识别不准确