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


    一、linux调试

    1、数据集下载

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

    1.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
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    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]
    
    • 1

    二、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]
    
    • 1

    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
    强制一一对应,输入和输出对齐的训练
    穷举,寻找最大的
    在这里插入图片描述

    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

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

  • 相关阅读:
    Decoupled Contrastive Learning 论文解读和感想
    操作系统初识
    kinetic: 编译navgation包遇到的问题
    长安三万里,安全无边界
    如何使用腾讯会议录屏?腾讯会议不允许录屏怎么办?这个方法教你解决
    Nginx代理服务器和真实后端服务器都配置了跨域导致的跨域问题
    服务器数据恢复—RAID5阵列重建重建导致数据丢失的数据恢复案例
    Windows 快捷方式
    采用一种估值方法,自动化评估某个股票价格合理性
    【RocketMQ】sendDefaultImpl call timeout 问题及其解决办法
  • 原文地址:https://blog.csdn.net/qq_15821487/article/details/126852469