文章目录
https://arxiv.org/pdf/1806.10447
1. 简介
- LPRNet是2018.06 27 被上传到arxiv上的
- LPRNet 是第一个实时车牌检测算法中 不需要RNN的算法。
- LPRNet 是一个 端到端 的,不需要提前进行char分割的车牌识别算法。
- LPRNet 因为网络结构很小,所以速度很快,在英伟达1080上面 3ms/车牌。在Intel i7-6700K CPU 上1.3ms。
- LPRNet 前向计算量 0.34 GFLops。
2. 网络
2.1 Backbone
- 第一张图:LocNet 网络可以让车牌字母变的更清楚。(这一步可选可不选)
- 第二张图:是backbone的一个小组件
- 第三张图:整个backbon 的结构
- 看Table3里面最后一层,用了一个很大的kernel (1x13) 利用局部字符上下文信息: 与 LSTM-based RNN 相比,wide convolution 可以更有效地利用局部字符之间的空间关系,从而更好地识别字符。
- 因为decoder的输出和车牌序列的长度是不同的,作者用了CTC loss函数,这个损失函数可以不需要分割字符端到端的进行训练。 CTC LOSS损失函数的细节,在下一节3介绍。
2.2 进一步的提升表现:用global context embedding 来增强中间的特征图
全局上下文嵌入可以提供车牌图像的整体信息,帮助模型更好地理解车牌字符之间的关系。
- 选了几个中间的特征图,然后用不同的AveragePool来对齐维度,都是1x D x 4 x 8 这样一个维度. D分别为64, 128, 256, char_num,
- 然后把几个特征图concate起来,其实也就是上下文的特征,看的大小不一样,把他们整合起来,连接起了上下文的全部特征,进一步提高预测准确率。
- 然后用一个1x1的卷积去卷它,输出1 x char_num x 4 x 18 这样一个特征图
- 然后把4 x 18平均一下,输出 1 x char_num x 18 这样一个特征图,也就是一个概率图,每个char都有18个概率
- 接下来就是后处理了。在下一小节2.3讲解
![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/daa178d73b62446b92a597f0e6462604.png)
2.3 decoder 解码
在 LPRNet 的解码过程中,主要包含两个步骤:
2.3.1 序列解码
- 贪婪搜索: 这种方法在每个位置上选择概率最高的字符。它简单快速,但可能不会总是产生最准确的结果。
- 束搜索: 这种方法考虑了更广泛的可能序列,并在每一步都跟踪固定数量的最有希望的候选序列。它旨在最大化输出序列的总概率,可能会以增加计算复杂度为代价,从而获得更好的准确性。
2.3.2 后过滤
- 后过滤步骤与 束搜索 一起应用。它取束搜索找到的 top-N 个最可能的序列,并返回第一个符合预定义模板集合的序列。这确保了最终识别的序列既准确又符合目标国家的牌照规定。
3. CTC 损失函数
CTC Loss 是一种适用于输入和输出序列长度不匹配且长度可变的情况的损失函数。它能够有效地将每个时间步的字符概率转换为输出序列的概率
CTC 损失函数(Connectionist Temporal Classification loss) 是一种用于训练序列识别模型(例如语音识别、手写识别和车牌识别)的损失函数。它在处理输入和输出序列对齐问题和序列长度变化方面表现出色。
3.1 CTC 损失函数的工作原理
- 引入 blank 符号: CTC 损失函数引入了一个特殊的 blank 符号,用于表示输出序列中字符之间的间隔。这使得输出序列的长度与输入序列的长度一致。
- 计算路径得分: CTC 损失函数计算所有可能的输出序列路径的得分,其中每条路径都对应于一种可能的输出序列。
- 选择最高得分路径: CTC 损失函数选择得分最高的路径作为模型的预测结果。
3.2 CTC 损失函数的特点
处理对齐问题: CTC 损失函数允许输入序列和输出序列之间存在时间上的不匹配。这意味着即使输入序列的长度与输出序列的长度不同,模型仍然可以进行有效的训练。
处理长度变化: CTC 损失函数可以处理序列长度的变化。这意味着模型可以识别不同长度的序列,而无需对序列长度进行预先定义或限制。
高效计算: CTC 损失函数的计算效率较高,这使得它非常适合用于大规模数据集的训练。
3.3 CTC Loss 的局限性:
无法区分重复字符: CTC Loss 无法区分输出序列中的重复字符,例如 “AA” 和 “A”。
需要后处理: CTC Loss 的输出结果需要进行后处理,例如去除空格和重复字符。
4. 实验设置
4.1 setting
optimizer: Adam
batch size: 32
inital learning rate 0.001
gradient noise scale: 0.001
每100k迭代学习率除以一次10
一共迭代了 250k
4.2 数据增强
随机的仿射数据增强,旋转,平移,缩放
4.3 关于LocNet
由于这个网络前几轮不好收敛,在5k次迭代之后才开启LocNet的训练。
LPRNet 的实验环节主要分为以下几个部分:
1. 数据集:
- 使用一个包含中国牌照图片的私有数据集进行测试。该数据集包含从不同监控摄像头收集的各种牌照图片,并经过手动标注。
- 为了提高网络的鲁棒性,使用自动裁剪的牌照图片进行训练,这些图片包含了不同程度的边缘背景或缺失部分。
2. 基线模型: - 以 [2] 中的模型为基础,该模型主要基于 Inception 块,并使用双向 LSTM 解码器和 CTC 损失进行训练。
- 尝试将 LSTM 替换为 biGRU 单元,但未观察到明显优势。
3. 模型改进: - LPRNet Basic: 通过移除复杂的 biLSTM 解码器,并将其替换为完全卷积模型,实现了无需 RNN 的实时牌照识别。
- LPRNet Reduced: 通过在所有池化层中使用 2x2 步长,进一步降低了中间特征图的尺寸和总推理计算成本。
4. 消融研究: - 评估了各种模型改进对识别准确率的影响,包括全局上下文嵌入、数据增强、空间变换网络 (STN) 对齐、束搜索和后过滤等。
- 结果表明,全局上下文嵌入和数据增强对准确率的提升最为显著。
5. 性能分析: - 将 LPRNet Reduced 模型部署到 CPU、GPU 和 FPGA 等不同硬件平台上,测试其推理速度和准确性。
- 结果表明,LPRNet 能够在各种硬件平台上实现实时性能,并具有高准确性。
6. 未来工作: - 将基于 CNN 的检测部分集成到 LPRNet 算法中,实现端到端的牌照检测和识别。
- 使用现代剪枝和量化技术压缩 LPRNet 模型,进一步降低计算复杂度。