简介:本文系统拆解OCR文字识别背后的算法体系:从灰度二值化、倾斜矫正等预处理,到DBNet类分割检测、CRNN+CTC与Attention、Transformer类序列识别,再到版面分析与表格结构还原,并延伸讨论CPU/GPU推理优化、显存管理与量化加速等工程要点,帮助读者建立完整的OCR技术认知,为技术选型与落地调优提供参考。
很多人以为OCR就是“一个模型把图变成字”,实际上工业级OCR是一套多阶段协同的算法流水线,典型链路如下:
图像输入 → 预处理 → 文本检测 → 几何/方向矫正 → 文本识别 → 版面分析与结构化 → 后处理与输出
理解了这条流水线,“OCR用的是什么算法”这个问题就可以拆解为:每个环节分别用了什么算法。
在深度学习普及之前,OCR主要依赖“手工特征 + 分类器”的组合:
传统方法的局限也很明显:对字体、背景、光照、分辨率高度敏感,规则需要逐场景定制,遇到复杂版面和不规则文本几乎无能为力,这正是它逐步被深度学习方案取代的根本原因。
文本行是长宽比极端、方向任意的“细长目标”,与通用目标检测差异较大,因此衍生出两条主流路线:
目前文档场景的工业主流多为分割式检测,主要看中其对长文本、密集排版的稳定性。
识别模型的输入通常是检测裁出的单行文本图,输出是字符序列,主流方案有三类:
CRNN + CTC:经典高性价比方案
CNN提取图像特征并将特征图沿宽度方向切成帧序列,双向LSTM建模字符上下文依赖,CTC(Connectionist Temporal Classification)解决“图像帧与字符无法一一对应”的对齐问题:引入空白符,训练时自动对齐,推理时折叠重复字符得到最终文本。其结构简洁、推理快、可端到端训练且无需字符级切分标注,至今仍是量产首选之一。
Attention / Seq2Seq 方案
编码器提特征,解码器带注意力逐字符生成,隐式完成对齐。对弯曲、透视变形文本(票据、街景招牌)效果更好,但推理更慢且可能漏字、重复,工程上常用“CTC+Attention”多任务融合折中。
基于Transformer的识别器
以自注意力替代LSTM建模长距离依赖,配合大规模合成数据预训练,是当前学术界与工业界公认的主流演进方向,在复杂场景与生僻字符上表现更佳。
对透视畸变、弯曲文本,常在识别器前接入基于TPS(薄板样条)的空间变换网络(STN),把不规则文本行“拉直”后再识别;方向分类器则判断整行是正向、180°旋转还是竖排,避免“识别对了但读反了”。
对于文档转Markdown、票据结构化提取这类需求,仅有检测识别还不够:
这一层决定OCR结果能否直接进入下游:知识库构建、检索增强、数据入库等场景中,结构化质量往往比单纯字符准确率更影响最终效果。
算法选对只是第一步,生产环境更需关注推理工程。
1. CPU还是GPU?
以典型的文档识别模型为例,模型加载后常驻显存约2~3GB,处理复杂版面(大表格、密集排版)时峰值可能达6GB左右;GPU吞吐通常是纯CPU的5~10倍。经验法则:
2. 推理优化三板斧
3. 服务化与稳定性
示意性伪代码(流水线编排):
# OCR流水线示意(伪代码)def ocr_pipeline(image, det, cls, rec, layout):image = preprocess(image) # 去噪、缩放、归一化boxes = det(image) # 文本检测:得到文本框lines = []for box in sort_by_reading_order(boxes):patch = crop_and_rotate(image, box)if cls(patch) != 0: # 方向矫正patch = rotate_180(patch)text, score = rec(patch) # 文本识别if score >= THRESHOLD:lines.append((box, text))doc = layout(lines) # 版面分析与结构化return postprocess(doc) # 纠错、格式化输出
回到最初的问题——“OCR文字识别用的是什么算法?”答案是分层叠加的:
算法原理决定识别准确率的上限,工程优化决定它在真实业务中的下限。理解整条流水线,才能在面对具体场景时做出正确的技术选型。