paddlepaddle训练网络的基本流程二(进阶Paddle-detection框架)

时间:2024-02-18 21:33:15

包含项目结构、整体训练流程、训练调用细节

目的仅为梳理paddle在目标检测方面的训练流程以及调用细节,详见官方文档及代码

Paddle-detection框架

首先,观察整个项目的目录结构:

 静态图选择配置模型在configs中,支持数据类型在dataset中,所有模型具体代码在ppdet中,数据加载处理部分在ppdet/data中,slim是模型蒸馏压缩,tools是常用的训练文件(包含train.py,eval.py,infer.py等),

dygraph即动态图部分,配置比上述静态图简单的多,与pytorch类似不做过多介绍。

pdpd配置文件:

Paddle-detection里面采用比较灵活的config设置,要记住非常多的设置都是在config里调整的,一套config设置联系了训练文件、模型、模型的结构、数据集、评估等系统。

从自动化和静态分析的原则出发,PaddleDetection采用了一种用户友好、 易于维护和扩展的配置设计。利用Python的反射机制,

PaddleDection的配置系统从Python类的构造函数抽取多种信息 - 如参数名、初始值、参数注释、数据类型(如果给出type hint)- 来作为配置规则。 这种设计便于设计的模块化,提升可测试性及扩展性。

 简单地说就是类上方有装饰器函数,类内有__inject__等定义具体的配置参数

目标检测的完整流程:

1.准备数据

2.模型选择(选择、修改config文件)

3.训练

4.评估和推理

5.模型压缩以及部署

1.数据相关

数据配置部分都在config目录中每个模型的配置文件中reader项,包括(TrainReader,EvalReader,TestReader)

 具体如何准备训练数据参照官方文档:(支持coco\voc\自定义)

2.模型选择(选择、修改config文件)

 一级文件夹代表可用模型,二级代表不同配置(例如backbone不同)

参照模型库中每个模型的具体参数(推理时间、准确率等),选择合适的模型

常改的参数包括:max_iters、num_classes、LearningRate、dataset路径、batch-size

3.开始训练

python tools/train.py -c configs/yolov3_mobilenet_v1_roadsign.yml -o use_gpu=true --eval

利用tools/train.py启动训练,参数带上configs文件等

多卡使用tools/train_multi_machine.py训练

python -m paddle.distributed.launch \
    --selected_gpus 0,1,2,3,4,5,6,7 \
    tools/train_multi_machine.py \
        -c configs/yolov3_mobilenet_v1_roadsign.yml

4.评估推理

利用tools/eval.py以及infer.py进行评估以及推理

5.模型压缩以及部署

压缩部分在slim文件夹里,包含剪枝、蒸馏、量化等操作,加速模型推理。

部署部分参考PaddleDetection预测部署文档,支持服务端、移动端、嵌入式多种方式,支持python\c++部署

使用tools/export_serving_model.py导出模型时,即可使用PaddleServing部署方式直接部署。

 

 训练时调用细节(以ppyolo模型为例)

首先从训练文件train.py找起

 加载全局配置文件,解析传入的ppyolo.yml,配置各种运行环境。

构建program,获取模型结构,损失函数、优化器等

 初始化以及编译program

 创建reader

 执行训练

 再从模型文件yolo.py找起

位于ppdet\modeling\architectures\yolo.py

定义了yolov3的结构,主要分为backbone、yolo_head、yolo_loss几部分,可参考ppyolo的结构图:

 每个模型中包含build、build_inputs函数,在训练时主要调用这两个函数。

build_inputs是定义模型输入的函数,在这里可以认为是feed_var

build函数主要是定义如何从inputs获得outputs的过程,中间经历了什么算子。一般是inputs通过backbone、neck、head得到loss,backbone定义在ppdet/modeling/backbones中,

neck即类fpn操作也是在ppdet/modeling/backbones中,head存在ppdt/modeling/anchor_heads中。整个modeling的目录定义了非常全的结构:

 再从数据配置找起:

在train.py中定义的train_reader,调用了ppdet/data/reader中的create_reader函数

此函数中实例化一个reader对象,reader类中包含了各种对于数据的处理(获取参数、数据增强、预加载、返回batch等等)。

config文件中对于数据集的数据增强

 对照reader类中transforms属性,

 

 最后调用_reader函数返回训练数据。

 训练时互相调用的关系、位置大概就是这样,先有大致印象,具体参照完整代码理解更佳。