2021SC@SDUSC
本文为PaddleDetection整体结构概述
结构图:
核心思想是通过yaml文件通过将主体模块和可拔插的模块组成完整的pipline,用于train、eval、infer、export_model. yaml文件就相当于设计图纸,程序会按照我们的图纸来设计我们想要的结构。
每个文件夹存放文件的主要作用:
'''
tree -f#显示显示完整路径
tree -d#显示所有文件夹
└── PaddleDetection #主目录
├── configs #存放配置文件
│ ├──_base_ 各个模块配置
├── dataset #存放数据集,数据集下载脚本,对应各数据集文件夹
│ ├── coco #80类 #物体
│ ├── fddb #1类 #人脸 通常用来评估人脸检测算法
│ ├── mot # 多目标跟踪
│ ├── roadsign_voc #车道线数据 4类
│ ├── voc #20类 #物体
│ └── wider_face #1类 人脸
├── deploy #部署相关
│ ├── cpp #C++部署
│ │ ├── cmake #cmake文件
│ │ ├── docs #部署文档
│ │ ├── include #库头文件
│ │ ├── scripts #依赖库配置脚本,build脚本
│ │ └── src #源码
│ └── python #python部署
├── ppdet #飞桨物体检测套件
│ ├── core #核心部分
│ │ └── config #实例、注册类的配置
│ ├── data #数据处理
│ │ ├── shared_queue #共享队列(数据多线程)
│ │ ├── source #各种数据集类
│ │ ├── tests #测试
│ │ ├── tools #工具(转coco数据格式)
│ │ └── transform #数据增强模块
│ ├── ext_op #增加op
│ │ ├── src #op实现源码
│ │ └── test #op测试
│ ├── modeling #模型结构
│ │ ├── architectures #网络结构
│ │ ├── backbones #主干网络
│ │ ├── heads #头(RPN、loss)
│ │ ├── losses #头(loss)
│ │ ├── mot #多目标跟踪(tracking)
│ │ ├── necks #颈(FPN)
│ │ ├── proposal_generator #建议框生成(anchor、rpnhead)
│ │ ├── reid #重识别
│ │ └── tests #测试
│ ├── py_op #一些前后处理
│ └── utils #实用工具
└── tools #训练,测试,验证,将来还有模型导出
'''
tools/train.py 模型训练
train执行实例:
!python tools/train.py -c configs/yolov3_darknet53_270e_coco.yml --eval -o use_gpu=true
train.py流程解析:
- 从程序入口开始(if name == 'main':)
- 1.直接进入main函数
- 初始化训练参数:
- ①.parser = ArgsParser() #读取命令行传递参数,加载yaml文件参数
- ②.将参数整合在一起,检查参数配置是否正确
- ③.是否使用GPU加速
- ④.查看paddledet版本是否正确
- ⑤.进入run()函数
- 配置阶段
- a.系统变量配置、初始化、得到使用GPU数量等
- b.创建数据读取类
- c.创建网络结构类
- d.创建学习率类
- e.创建优化器类
- f.初始化模型权重,加载预训练模型、模型与优化器整合,
- g.是否是多卡,实例多模型并行训练
- 开启训练
- g.遍历数据,开始循环训练,根据时间戳计算一系列时间(剩余时间,平均训练时间)
- h.模型前向推理,反向传播,(多卡模型并行,loss合并)
- j.每个iter结束后输出日志
- k.定期打印log,定期保存模型和优化器参数,(eval开启:最优 and 定时)
- 直到迭代结束
eval.py流程解析
- 从程序入口开始(if name == 'main':)
- 1.直接进入main函数
- 初始化训练参数:
- ①.parser = ArgsParser() #读取命令行传递参数,加载yaml文件参数
- ②.将参数整合在一起,检查参数配置是否正确
- ③.是否使用GPU加速
- ④.查看paddledet版本是否正确
- ⑤.进入run()函数
- 配置阶段
- a.创建网络结构类
- b.初始化模型权重,加载预训练模型
- c.创建数据读取类
- 开启评估
- d.遍历数据,开启前向推理,收集结果
- e.选择Metric评估标准
- f.输出日志
- 直到迭代结束输出结果
infer.py流程解析
- 从程序入口开始(if name == 'main':)
- 1.直接进入main函数
- 初始化训练参数:
- ①.parser = ArgsParser() #读取命令行传递参数,加载yaml文件参数
- ②.将参数整合在一起,检查参数配置是否正确
- ③.是否使用GPU加速
- ④.查看paddledet版本是否正确
- ⑤.进入run()函数
- 配置阶段
- a.创建网络结构类
- b.初始化模型权重,加载预训练模型
- c.创建数据读取类
- d.选择推理标准
- 开启推理
- e.遍历数据,开启前向推理,收集结果
- f.保存推理结果(box or mask)
- g.使用VisualDL保存图片结果
- 直到迭代结束输出结果
export_model.py流程解析
- 从程序入口开始(if name == 'main':)
- 1.直接进入main函数
- 初始化训练参数:
- ①.设置cpu环境执行,parser = ArgsParser() #读取命令行传递参数,加载yaml文件参数
- ②.BN中的参数转换为推理参数,将参数整合在一起,检查参数配置是否正确
- ③.是否使用GPU加速
- ④.查看paddledet版本是否正确
- ⑤.进入run()函数
- 配置阶段
- a.创建网络结构类
- b.初始化模型权重
- g.转为静态图,保存模型