动态规划全局最优:在字符候选集中搜索最佳序列组合
技术背景与问题提出
光学字符识别(OCR)作为连接物理世界与数字信息的关键技术,广泛应用于文档数字化、票据识别、车牌提取等场景。尽管深度学习模型如CRNN已显著提升端到端识别能力,但在实际应用中仍面临一个核心挑战:如何从模型输出的字符概率分布中,找到最符合语言规律和上下文逻辑的完整文本序列?
传统的贪婪解码(Greedy Decoding)逐帧选择最高概率字符,虽计算高效但容易陷入局部最优。例如,在中文手写体或低质量图像中,单个字符识别可能产生多个高置信度候选,此时仅依赖最大概率无法保证整体语义通顺。
为此,我们需要一种能够在所有可能的字符路径中搜索全局最优解的方法——这正是动态规划(Dynamic Programming, DP)在序列建模中的关键价值所在。本文将深入解析如何利用动态规划思想,在CRNN模型输出的字符候选集中进行高效搜索,实现'全局最优'文本序列生成。
CRNN 模型架构与序列输出机制
1. CRNN 的三段式结构
CRNN(Convolutional Recurrent Neural Network)是一种专为序列识别设计的端到端网络,其结构由三部分组成:
- 卷积层(CNN):提取图像局部特征,生成特征图(Feature Map)
- 循环层(RNN):对时间步上的特征序列建模,捕捉上下文依赖
- 转录层(CTC Loss + Beam Search / DP):将帧级输出映射为最终字符序列
关键洞察:CRNN 不直接预测每个位置的字符,而是对输入图像沿宽度方向划分为若干'时间步',每一步输出一个字符概率分布。最终需通过解码策略合并这些分布,形成完整文本。
2. CTC 解码的本质:从帧到序列
由于图像中文本长度未知且字符间距不一,CRNN 使用 CTC(Connectionist Temporal Classification) 损失函数来处理对齐问题。CTC 允许网络输出包含空白符(blank)的扩展序列,并通过'折叠'规则生成真实文本。
例如:
模型输出帧序列:[好], [好], [空], [学], [学], [习], [习]
折叠后结果:好 学 习
然而,当存在多个合理路径时(如'好' vs '号'),简单的折叠不足以选出最佳序列。这就引出了我们的核心任务:在所有合法路径中寻找全局最优组合。
动态规划在序列搜索中的核心作用
1. 什么是'字符候选集'?
在每一帧 $t$,CRNN 输出一个字符概率分布 $P(y_t|x)$,通常取前 $k$ 个最高概率字符构成候选集 $C_t$。例如:
| 时间步 | 候选字符(按概率降序) |
|---|---|
| t=1 | 好 (0.7), 号 (0.25), 学 (0.05) |
| t=2 | 学 (0.6), 料 (0.3), 習 (0.1) |
| t=3 | 习 (0.8), 写 (0.15), 息 (0.05) |
目标是从这些候选集中挑选一条路径 $y = (y_1, y_2, ..., y_T)$,使得整个序列的联合概率最大化。

