软件工程应用与实践(十一):CRNN-CTC模型再介绍

2021SC@SDUSC

目录

一、前情回顾和背景介绍

1.1 PP-OCR文字识别策略回顾

1.2 CRNN-CTC模型概述

二、CRNN-CTC模型策略详解

2.1  模型流程

代码结构

数据

数据示例

数据准备

模型训练

测试

三、CTC model VS attention model

预测

预训练模型

总结


一、前情回顾和背景介绍

1.1 PP-OCR文字识别策略回顾

        策略的选用主要是用来增强模型能力和减少模型大小。下面是PP-OCR文字识别器所采用的九种策略:

  • 轻主干,选用采用 MobileNetV3 large x0.5 来权衡精度和效率;
  • 数据增强,BDA (Base Dataaugmented)和TIA (Luo et al. 2020);
  • 余弦学习率衰减,有效提高模型的文本识别能力;
  • 特征图辨析,适应多语言识别,进行向下采样 feature map的步幅修改;
  • 正则化参数,权值衰减避免过拟合;
  • 学习率预热,同样有效;
  • 轻头部,采用全连接层将序列特征编码为预测字符,减小模型大小;
  • 预训练模型,是在 ImageNet 这样的大数据集上训练的,可以达到更快的收敛和更好的精度;
  • PACT量化,略过 LSTM 层;

1.2 CRNN-CTC模型概述

        CRNN-CTC 使用CTC model识别图片中单行英文字符,用于端到端的文本行图片识别方法。

        识别图片中单行英文字符,可以使用CTC model和attention model两种不同的模型来完成该任务。

        这两种模型的有相同的编码部分,首先采用卷积将图片转为特征图, 然后使用im2sequence op将特征图转为序列,通过双向GRU学习到序列特征。

        两种模型的解码部分和使用的损失函数区别如下:

  • CTC model: 训练过程选用的损失函数为CTC(Connectionist Temporal Classification) loss, 预测阶段采用的是贪婪策略和CTC解码策略。
  • Attention model: 训练过程选用的是带注意力机制的解码策略和交叉信息熵损失函数,预测阶段采用的是柱搜索策略。



二、CRNN-CTC模型策略详解



2.1  模型流程

代码结构

├── data_reader.py  # 下载、读取、处理数据。
├── crnn_ctc_model.py   # 定义了OCR CTC model的网络结构。
├── attention_model.py   # 定义了OCR attention model的网络结构。
├── train.py   # 用于模型的训练。
├── infer.py   # 加载训练好的模型文件,对新数据进行预测。
├── eval.py     # 评估模型在指定数据集上的效果。
└── utils.py    # 定义通用的函数。

数据

数据的下载和简单预处理都在data_reader.py中实现。

数据示例

使用的训练和测试数据如图1所示,每张图片包含单行不定长的英文字符串,这些图片都是经过检测算法进行预框选处理的。

数据准备

训练集准备

把所有参与训练的图片放入同一个文件夹,暂且记为train_images。然后用一个list文件存放每张图片的信息,包括图片大小、图片名称和对应的label,这里暂记该list文件为train_list。

最终文件结构组织如下:

|-train_data
    |- train_list
    |- train_imags
        |- 00508_0215.jpg
        |- 00197_1893.jpg
        |- 00007_0219.jpg
        | ...

测试集和评估集

测试集、评估集的准备方式与训练集相同。 在训练时,测试集的路径通过train.py的选项--test_images 和 --test_list 来设置。 在评估时,评估集的路径通过eval.py的选项--input_images_dir 和--input_images_list 来设置。

待预测数据集

预测支持三种形式的输入:

第一种:设置--input_images_dir--input_images_list, 与训练集类似, 只不过list文件中的最后一列可以放任意占位字符或字符串。

第二种:仅设置--input_images_list, 其中list文件中只需放图片的完整路径,如下所示:

data/test_images/00000.jpg
data/test_images/00001.jpg
data/test_images/00003.jpg

第三种:从stdin读入一张图片的path,然后进行一次inference。

模型训练

图2为使用默认参数在默认数据集上训练CTC model的收敛曲线,其中横坐标轴为训练迭代次数,纵轴为样本级错误率。其中,蓝线为训练集上的样本错误率,红线为测试集上的样本错误率。

 相比于CTC model,attention model的收敛曲线如下:

测试

通过以下命令调用评估脚本用指定数据集对模型进行评估:

env CUDA_VISIBLE_DEVICES=0 python eval.py \
    --model_path="./models/model_0" \
    --input_images_dir="./eval_data/images/" \
    --input_images_list="./eval_data/eval_list"

三、CTC model VS attention model

预测

1.从标准输入读取一张图片的路径,并对其进行预测:

env CUDA_VISIBLE_DEVICES=0 python infer.py \
    --model_path="models/model_00044_15000"

2.从文件中批量读取图片路径,并对其进行预测:

env CUDA_VISIBLE_DEVICES=0 python infer.py \
    --model_path="models/model_00044_15000" \
    --input_images_list="data/test.list"

预训练模型

模型 错误率
CTC model 22.3%
attention model 15.8%



总结

  今天对PP-OCR的CRNN-CTC和Attention模型进行进行了整个实现流程的介绍,并比较了两个模型实现单行中英文语句的识别效率。

猜你喜欢

转载自blog.csdn.net/pinkray_c/article/details/121867065