Optical Character Recognition (OCR)
光学字符识别 (OCR) 可将扫描件和照片中的文本转换为机器可读的字符。了解检测和识别阶段及相关代码。
光学字符识别 (OCR) 是将图像中的文字(例如扫描页面、照片、屏幕截图和视频帧中的文字)转换为机器可读字符的过程,使软件能够搜索、编辑和分析这些内容。早期系统会将每个字符与已存储的字体模板进行匹配。现代 OCR 使用深度学习来查找图像任意位置的文字,并一次性读取完整的词语和行,因此能够处理多种字体、低分辨率、透视变形和杂乱背景。OCR 既能识别文档文字(例如发票和书籍),也能识别场景文字(例如标志、产品标签和车牌)。
OCR 如何工作#
大多数 OCR 系统会依次运行两个模型:
- 文本检测:检测器会找到图像中包含文字的区域,并为每个词语或文本行输出一个框或多边形。EAST、CRAFT 和 DBNet 等场景文字检测器会逐像素预测文本区域,因此也能处理弯曲和旋转的文字。
- 文本识别:每个区域会先被裁剪、拉直并调整到固定高度,然后由识别器读取其中的字符。CRNN设计会先将裁剪区域输入 CNN,再通过双向 LSTM从左到右读取生成的特征列,最后使用连接主义时序分类 (CTC) 将逐列预测解码为字符串,无需标注每个字符的起始位置。Microsoft 的 TrOCR等 Transformer 识别器则会改用文本解码器生成字符。
在较差的扫描件上,预处理(例如二值化和倾斜校正)仍然有所帮助;后处理则会根据词典、预期格式或语言模型检查输出。EasyOCR整合了这两个阶段:CRAFT 检测器和 CRNN 识别器,可处理 80 多种语言:
import easyocr
# Load EasyOCR's CRAFT text detector and English CRNN text recognizer
reader = easyocr.Reader(["en"])
# Detect every text region in the photo, then read the characters inside it
results = reader.readtext("https://ultralytics.com/images/bus.jpg")
# Each result holds a 4-corner box, the recognized string, and a confidence score
for box, text, confidence in results:
if confidence > 0.5:
print(f"{text}: {confidence:.2f}")它会打印 cero: 0.95 和 emisiones: 0.99,也就是画在公交车侧面的文字。检测器还会找到公交车上的点阵目的地标牌和车窗上的小字,但识别器对这些内容返回了置信度低于 0.5 的乱码字符串,因此阈值会将它们丢弃。
文档识别会在识别之前增加版面分析步骤。版面模型会将页面拆分为多个区块,针对不同区块类型采用各自的处理方式,然后按阅读顺序重新组合结果,因此双栏文章会按列逐一读取:
准确率通过字符错误率 (CER)和词错误率 (WER)衡量。字符错误率是将输出改为正确文本所需的字符插入、删除和替换数量除以正确文本长度;词错误率则以词为单位用相同方式计算。
OCR 引擎和模型#
开源 Tesseract 引擎于 20 世纪 80 年代在 Hewlett-Packard 启动,2005 年作为开源软件发布,并在 2006 至 2018 年间由 Google 赞助开发;4 版增加了基于 LSTM 网络的识别引擎。Google Cloud Vision和 Amazon Textract等云服务还提供版面、表格和表单信息提取功能。视觉语言模型也越来越多地用于端到端读取文档:Allen Institute for AI 推出的 olmOCR使用微调后的视觉语言模型将 PDF 页面转换为整洁文本;而无需 OCR 的文档模型可以直接回答有关页面的问题,无需先单独生成转录文本。
OCR 与相关术语#
- 手写识别:也称为手写文本识别(HTR)或智能字符识别(ICR),用于读取手写内容。与印刷体相比,手写字母的形状变化大得多,而且字符经常连在一起。
- 目标检测:检测器可以将停止标志识别为一个对象,而 OCR 则读取标志上印着的 S-T-O-P 字母。OCR 自身的检测阶段只定位文字,不负责读取文字。
- 图像分类:为整张图像分配一个标签,例如“发票”;OCR 则会提取图像中的字符序列。
- 智能文档处理:在 OCR 的基础上增加版面分析和命名实体识别 (NER),以提取发票日期、供应商和总金额等特定字段,并将其导入业务系统。










