PaddleDetection为基于飞桨PaddlePaddle的端到端目标检测套件,内置30+模型算法及250+预训练模型,覆盖目标检测、实例分割、跟踪、关键点检测等方向,其中包括服务器端和移动端高精度、轻量级产业级SOTA模型、冠军方案和学术前沿算法,并提供配置化的网络模块组件、十余种数据增强策略和损失函数等高阶优化支持和多种部署方案,在打通数据处理、模型开发、训练、压缩、部署全流程的基础上,提供丰富的案例及教程,加速算法产业落地应用。
项目地址:PaddlePaddle/PaddleDetection - 码云 - 开源中国 (gitee.com)
1、基本介绍
特性
- 模型丰富: 包含目标检测、实例分割、人脸检测、关键点检测、多目标跟踪等250+个预训练模型,涵盖多种全球竞赛冠军方案。
- 使用简洁:模块化设计,解耦各个网络组件,开发者轻松搭建、试用各种检测模型及优化策略,快速得到高性能、定制化的算法。
- 端到端打通: 从数据增强、组网、训练、压缩、部署端到端打通,并完备支持云端/边缘端多架构、多设备部署。
- 高性能: 基于飞桨的高性能内核,模型训练速度及显存占用优势明显。支持FP16训练, 支持多机训练。
套件结构
Architectures | Backbones | Components | Data Augmentation |
|
|
|
|
各模型结构和骨干网络的代表模型在COCO数据集上精度mAP和单卡Tesla V100上预测速度(FPS)对比图。
2、安装命令
安装命令分为3步,下载paddldetection,安装paddldetection的依赖性,安装paddldetection
git clone https://gitee.com/paddlepaddle/PaddleDetection.git
cd PaddleDetection
python -m pip install -r requirements.txt
python setup.py install
3、准备voc数据(coco数据集非必要)
在PaddleDetection中voc数据默认放在PaddleDetection/dataset/voc/目录下,数据的组织结构如下图中红框所示,包含Annotations(存储xml标注)、ImageSets(没啥用)、JPEGImages(存储图片)三个目录。test.txt与trainval.txt分别存储着测试集,训练验证集数据。
test.txt与trainval.txt的数据格式相同,具体如下所示,包含jpg相对路径,xml相对路径。
VOCdevkit/VOC2007/JPEGImages/shoot127_1.jpg VOCdevkit/VOC2007/Annotations/shoot127_1.xml
VOCdevkit/VOC2007/JPEGImages/shoot134_2.jpg VOCdevkit/VOC2007/Annotations/shoot134_2.xml
VOCdevkit/VOC2007/JPEGImages/shoot192_2.jpg VOCdevkit/VOC2007/Annotations/shoot192_2.xml
VOCdevkit/VOC2007/JPEGImages/shoot195_2.jpg VOCdevkit/VOC2007/Annotations/shoot195_2.xml
VOCdevkit/VOC2007/JPEGImages/shoot197_2.jpg VOCdevkit/VOC2007/Annotations/shoot197_2.xml
VOCdevkit/VOC2007/JPEGImages/shoot215_2.jpg VOCdevkit/VOC2007/Annotations/shoot215_2.xml
VOCdevkit/VOC2007/JPEGImages/shoot260_6.jpg VOCdevkit/VOC2007/Annotations/shoot260_6.xml
VOCdevkit/VOC2007/JPEGImages/shoot26_5.jpg VOCdevkit/VOC2007/Annotations/shoot26_5.xml
VOCdevkit/VOC2007/JPEGImages/shoot274_5.jpg VOCdevkit/VOC2007/Annotations/shoot274_5.xml
VOCdevkit/VOC2007/JPEGImages/shoot285_8.jpg VOCdevkit/VOC2007/Annotations/shoot285_8.xml
VOCdevkit/VOC2007/JPEGImages/shoot2_8.jpg VOCdevkit/VOC2007/Annotations/shoot2_8.xml
此外,还有一个label_list.txt,该文件存储着类别名称列表。如博主的数据集只有一个类别(shoot),因此里面只有一个类别名。如果是多个类别,则就存储多行文本。
shoot
额外代码,用于将常规的voc划分数据集转换为paddledetection需要的格式
root='PaddleDetection/dataset/voc/'
fnames=['trainval.txt','test.txt']
for fname in fnames:
with open(root+fname,'r') as f:
lines = f.readlines()
with open(root+fname,'w') as f:
for line in lines:
line=line.split('\n')[0]
new_line='VOCdevkit/VOC2007/JPEGImages/%s.jpg VOCdevkit/VOC2007/Annotations/%s.xml\n'%(line,line)
f.write(new_line)
print(new_line)
4、coco数据集处理
如果是coco数据集的话,不需要额外的处理,只要按照特定的格式存储就行(存放在dataset/coco目录下),具体如下图所示。其中train2017存储训练集图片,val2017存储测试集图片(博主这里使用的是软连接)。
5、微调任务yml
paddledetection通过yml文件描述训练任务,并通过继承的方式实现配置文件的复用。此外,这种继承的方式还支持配置项的覆盖(改写)。配置文件的格式(文件为configs/yolov3/yolov3_darknet53_270e_voc.yml)如下所示,_BASE_中的配置就是复用的默认配置项,后面的内容是改写的配置项。(博主这里用的是yolov3,所以数据配置项为voc.yml;如果使用的是yolox,配置项则需要修改为coco_detection.yml).
_BASE_: [
'../datasets/voc.yml',
'../runtime.yml',
'_base_/optimizer_270e.yml',
'_base_/yolov3_darknet53.yml',
'_base_/yolov3_reader.yml',
]
snapshot_epoch: 5
weights: output/yolov3_darknet53_270e_voc/model_final
# set collate_batch to false because ground-truth info is needed
# on voc dataset and should not collate data in batch when batch size
# is larger than 1.
EvalReader:
collate_batch: false
训练自己的数据集时,需要修改任务yml中的配置项num_classes,该配置项继承自../datasets/voc.yml中,我们只需要在上传的配置中添加num_classes即可,最后的配置文件如下所示
_BASE_: [
'../datasets/voc.yml',
'../runtime.yml',
'_base_/optimizer_270e.yml',
'_base_/yolov3_darknet53.yml',
'_base_/yolov3_reader.yml',
]
num_classes: 1
snapshot_epoch: 5
weights: output/yolov3_darknet53_270e_voc/model_final
# set collate_batch to false because ground-truth info is needed
# on voc dataset and should not collate data in batch when batch size
# is larger than 1.
EvalReader:
collate_batch: false
5、执行训练任务
执行训练任务需要进入Paddledetection的目录,下面训练命令中的-c文件表示配置文件路径(上文博主编辑yml任务文件的路径)
训练自己的任务
python tools/train.py -c configs/yolov3/yolov3_mobilenet_v1_roadsign.yml
边训练,边评估
在训练中交替执行评估, 评估在每个epoch训练结束后开始。每次评估后还会评出最佳mAP模型保存到best_model
文件夹下。
python tools/train.py -c configs/yolov3/yolov3_mobilenet_v1_roadsign.yml --eval
Fine-tune其他任务
使用预训练模型fine-tune其他任务时,可以直接加载预训练模型,形状不匹配的参数将自动忽略,例如:
python tools/train.py -c configs/yolov3/yolov3_mobilenet_v1_roadsign.yml -o pretrain_weights=output/model_final
模型恢复训练
在日常训练过程中,有的用户由于一些原因导致训练中断,用户可以使用-r的命令恢复训练
python tools/train.py -c configs/yolov3/yolov3_mobilenet_v1_roadsign.yml -r output/faster_rcnn_r50_1x_coco/10000
6、评估与测试
评估
默认将训练生成的模型保存在当前output
文件夹下
python tools/eval.py -c configs/yolov3/yolov3_mobilenet_v1_roadsign.yml -o weights=https://paddledet.bj.bcebos.com/models/yolov3_mobilenet_v1_roadsign.pdparams
如果验证集很大,测试将会比较耗时,建议调整configs/runtime.yml
文件中的 snapshot_epoch
配置以减少评估次数,或训练完成后再进行评估。
预测
--draw_threshold
是个可选参数. 根据 NMS 的计算,不同阈值会产生不同的结果。 keep_top_k
表示设置输出目标的最大数量,默认值为100,用户可以根据自己的实际情况进行设定。
python tools/infer.py -c configs/yolov3/yolov3_mobilenet_v1_roadsign.yml \
--infer_img=demo/road554.png \
--output_dir=infer_output/ \
--draw_threshold=0.5 \
-o weights=output/yolov3_mobilenet_v1_roadsign/model_final \
--use_vdl=Ture
预测目录
python3 tools/infer.py -c ~/PaddleDetection/configs/yolox/yolox_s_300e_coco.yml \
-o weights=/home/aistudio/PaddleDetection/output/yolox_s_300e_coco/best_model.pdparams \
--infer_dir=/home/aistudio/test_img \
--save_results=True\
--output_dir ./result
paddledetection的更多使用可以参考docs/tutorials/GETTING_STARTED_cn.md · PaddlePaddle/PaddleDetection - Gitee.comhttps://gitee.com/paddlepaddle/PaddleDetection/blob/release/2.4/docs/tutorials/GETTING_STARTED_cn.md