七、OCR-PaddlePaddle训练源码解析系列-文字识别

一、linux调试

1、数据集下载

ICDAR 2015- OCR数据集-文本识别:https://aistudio.baidu.com/aistudio/datasetdetail/168666

1.1、数据格式目录

七、OCR-PaddlePaddle训练源码解析系列-文字识别_第1张图片

2、准备预训练模型

cd PaddleOCR/
# 下载英文PP-OCRv3的预训练模型
wget -P ./pretrain_models/ https://paddleocr.bj.bcebos.com/PP-OCRv3/english/en_PP-OCRv3_rec_train.tar
# 解压模型参数
cd pretrain_models
tar -xf en_PP-OCRv3_rec_train.tar && rm -rf en_PP-OCRv3_rec_train.tar

3、训练

python3 tools/train.py -c configs/rec/PP-OCRv3/en_PP-OCRv3_rec.yml -o Global.pretrained_model=./pretrain_models/en_PP-OCRv3_rec_train/best_accuracy Global.save_epoch_step=300 Train.dataset.data_dir=./train_data/rec/ Train.dataset.label_file_list=[./train_data/rec/rec_gt_train.txt] Eval.dataset.data_dir=./train_data/rec/ Eval.dataset.label_file_list=[./train_data/rec/rec_gt_test.txt]

二、win10调试

1、训练

python3 train.py -c ../configs/rec/PP-OCRv3/en_PP-OCRv3_rec.yml -o Global.pretrained_model=../pretrain_models/en_PP-OCRv3_rec_train/best_accuracy Global.use_gpu=false Global.character_dict_path=../ppocr/utils/en_dict.txt Train.dataset.data_dir=../train_data/rec/ Train.dataset.label_file_list=[../train_data/rec/rec_gt_train.txt] Train.loader.batch_size_per_card=2 Eval.dataset.data_dir=../train_data/rec/ Eval.dataset.label_file_list=[../train_data/rec/rec_gt_test.txt]

2、模型目录理解

PaddleOCR将网络划分为四部分,分别在ppocr/modeling下。 进入网络的数据将按照顺序(transforms->backbones->necks->heads)依次通过这四个部分。

├── architectures # 网络的组网代码
├── transforms # 网络的图像变换模块
├── backbones # 网络的特征提取模块
├── necks # 网络的特征增强模块
└── heads # 网络的输出模块

3、ctcloss

文章理解:https://zhuanlan.zhihu.com/p/137430917
视频理解:https://aistudio.baidu.com/aistudio/education/lessonvideo/1000471
强制一一对应,输入和输出对齐的训练
穷举,寻找最大的
七、OCR-PaddlePaddle训练源码解析系列-文字识别_第2张图片

Why ctc loss, ctc loss vs cross entropy
现实中有很多任务都可以看作是序列到序列的对齐训练。主要可以分为两类:NLP领域常见的机器翻译和对话。对于这类任务,在训练阶段,我们通常使用cross-entropy + teacher forcing来训练模型。这类任务的特点是源序列和目标序列没有严格的对齐关系。他们本质上可以看作是 conditional language model. 也就是目标序列作为条件语言模型,更看重连贯性、流利度,其次是与源序列的对应关系(所以他们会有多样性研究)。
识别领域常见的语音识别,OCR,手语识别。对于这类任务,我们则主要使用ctc loss作为损失函数来训练模型。这类任务的特点是源序列和目标序列有严格的对齐关系。对于语音或手语,目标序列有语言模型的特点,但是更看重与源序列的准确的对应关系。第二类任务其实也可以用cross entropy来训练,但是往往效果不太好。我们可以发现,对于第二类任务,最理想的情况是将源序列先进行分割,这样单独的对某一个音节,手语或者字符进行识别,准确率就会很高了。但是现实是,源序列更多的是未分割的情况。针对这类任务,[Alex Graves, 2006] 提出了Connectionist Temporal Classification.使用ctc进行训练有两个要求:源序列长度 >> 目标序列长度源序列的order与目标序列的order一致,且存在顺序对齐的关系

让所有路径的概率和最大化, 最后就成了一个极大似然的问题了

nn.CTCLoss(blank=0, reduction=‘mean’, zero_infinity=False)
功能: Connectionist Temporal Classification。主要是解决时序类数据的分类问题,特别是label 和output 不对齐的问题(Alignment problem)

4、训练loss

损失函数决定了整体的方向,决定了数据的构造方式以及模型的搭建方式,为何选择这样的损失函数,是背后的原理和规律。
在这里插入图片描述
在这里插入图片描述

你可能感兴趣的:(NLP实战项目,PaddlePaddle,PP/TF/PT,paddlepaddle,深度学习,linux)