• 七、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

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

  • 相关阅读:
    高校会议管理系统毕业设计
    如何一眼看穿软件测试行业的高深?实现月薪上万不是梦,开发也得惊呼
    【React框架基础知识】React框架的简介与基本使用方法
    【3D 图像分割】基于 Pytorch 的 VNet 3D 图像分割10(测试推理篇)
    博客摘录「 Linux部署nginx」2023年7月28日
    算法day31|455,476,53
    Spring
    Spring中的批处理:数据处理的瑞士军刀
    PostgreSQL的视图pg_rules
    计算机毕设(附源码)JAVA-SSM基于智能推荐的胖达大码服装定制网
  • 原文地址:https://blog.csdn.net/qq_15821487/article/details/126852469