paddledetection的安装并训练自己的数据集(支持voc与coco数据集)

PaddleDetection为基于飞桨PaddlePaddle的端到端目标检测套件,内置30+模型算法250+预训练模型,覆盖目标检测、实例分割、跟踪、关键点检测等方向,其中包括服务器端和移动端高精度、轻量级产业级SOTA模型、冠军方案和学术前沿算法,并提供配置化的网络模块组件、十余种数据增强策略和损失函数等高阶优化支持和多种部署方案,在打通数据处理、模型开发、训练、压缩、部署全流程的基础上,提供丰富的案例及教程,加速算法产业落地应用。

项目地址:PaddlePaddle/PaddleDetection - 码云 - 开源中国 (gitee.com)

1、基本介绍

特性

  • 模型丰富: 包含目标检测实例分割人脸检测关键点检测多目标跟踪250+个预训练模型,涵盖多种全球竞赛冠军方案。
  • 使用简洁:模块化设计,解耦各个网络组件,开发者轻松搭建、试用各种检测模型及优化策略,快速得到高性能、定制化的算法。
  • 端到端打通: 从数据增强、组网、训练、压缩、部署端到端打通,并完备支持云端/边缘端多架构、多设备部署。
  • 高性能: 基于飞桨的高性能内核,模型训练速度及显存占用优势明显。支持FP16训练, 支持多机训练。

套件结构 

Architectures Backbones Components Data Augmentation
  • Object Detection
    • Faster RCNN
    • FPN
    • Cascade-RCNN
    • Libra RCNN
    • Hybrid Task RCNN
    • PSS-Det
    • RetinaNet
    • YOLOv3
    • YOLOv4
    • PP-YOLOv1/v2
    • PP-YOLO-Tiny
    • PP-YOLOE
    • YOLOX
    • SSD
    • CornerNet-Squeeze
    • FCOS
    • TTFNet
    • PP-PicoDet
    • DETR
    • Deformable DETR
    • Swin Transformer
    • Sparse RCNN
  • Instance Segmentation
    • Mask RCNN
    • SOLOv2
  • Face Detection
    • FaceBoxes
    • BlazeFace
    • BlazeFace-NAS
  • Multi-Object-Tracking
    • JDE
    • FairMOT
    • DeepSORT
  • KeyPoint-Detection
    • HRNet
    • HigherHRNet
  • ResNet(&vd)
  • ResNeXt(&vd)
  • SENet
  • Res2Net
  • HRNet
  • Hourglass
  • CBNet
  • GCNet
  • DarkNet
  • CSPDarkNet
  • VGG
  • MobileNetv1/v3
  • GhostNet
  • Efficientnet
  • BlazeNet
  • Common
    • Sync-BN
    • Group Norm
    • DCNv2
    • Non-local
  • KeyPoint
    • DarkPose
  • FPN
    • BiFPN
    • BFP
    • HRFPN
    • ACFPN
  • Loss
    • Smooth-L1
    • GIoU/DIoU/CIoU
    • IoUAware
  • Post-processing
    • SoftNMS
    • MatrixNMS
  • Speed
    • FP16 training
    • Multi-machine training
  • Resize
  • Lighting
  • Flipping
  • Expand
  • Crop
  • Color Distort
  • Random Erasing
  • Mixup
  • AugmentHSV
  • Mosaic
  • Cutmix
  • Grid Mask
  • Auto Augment
  • Random Perspective

各模型结构和骨干网络的代表模型在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 

猜你喜欢

转载自blog.csdn.net/a486259/article/details/125693915