PaddleDetection使用教程

详细的使用教程可以参考官方文档

一、安装说明

在安装PaddleDetection之前要先安装依赖项PaddlePaddle,你可以将其看作一个内核,有了它才可以安装PaddleDetection。

首先,我们可以新建一个虚拟环境,命名为paddle,并激活环境。

conda create -n paddle python=3.7
conda activate paddle

安装pp-yolo网络需要用到的库函数。

pip install opencv-python==4.2.0.34 Cython  matplotlib scikit-image numpy==1.17.4

安装PaddlePaddle

# 如果您的机器安装的是CUDA10,请运行以下命令安装
pip install paddlepaddle-gpu==1.8.4.post107 -i https://mirror.baidu.com/pypi/simple

其他版本请参考安装文档

使用以下命令验证是否安装成功:

# 查看PaddlePaddle版本
python -c "import paddle; print(paddle.__version__)"

其他依赖安装

安装pycocotools

pip install pycocotools

安装PaddleDetection

安装Python依赖库:

Python依赖库在requirements.txt中给出,可通过如下命令安装:

pip install -r requirements.txt

克隆PaddleDetection库:

通过以下命令克隆PaddleDetection:

cd <path/to/clone/PaddleDetection>
git clone https://github.com/PaddlePaddle/PaddleDetection.git

验证是否安装成功:

python ppdet/modeling/tests/test_architectures.py

测试通过后会提示如下信息:

..........
----------------------------------------------------------------------
Ran 12 tests in 2.480s
OK (skipped=2)

预训练模型预测

使用预训练模型预测图像,快速体验模型预测效果:

# use_gpu参数设置是否使用GPU
python tools/infer.py -c configs/ppyolo/ppyolo.yml -o use_gpu=true weights=https://paddlemodels.bj.bcebos.com/object_detection/ppyolo.pdparams --infer_img=demo/000000014439.jpg

会在output文件夹下生成一个画有预测结果的同名图像。

结果如下图:
PaddleDetection使用教程


二、快速开始

设置显卡

export CUDA_VISIBLE_DEVICES=0

一、快速体验

# 用PP-YOLO算法在COCO数据集上预训练模型预测一张图片
python tools/infer.py -c configs/ppyolo/ppyolo.yml -o use_gpu=true weights=https://paddlemodels.bj.bcebos.com/object_detection/ppyolo.pdparams --infer_img=demo/000000014439.jpg

PaddleDetection使用教程
二、准备数据
数据集参考Kaggle数据集 ,包含877张图像,数据类别4类:crosswalk,speedlimit,stop,trafficlight。将数据划分为训练集701张图和测试集176张图。

# 注意:可跳过这步下载,后面训练会自动下载
python dataset/roadsign_voc/download_roadsign_voc.py

三、训练、评估、预测
1、训练

# 边训练边测试 CPU需要约1小时(use_gpu=false),1080Ti GPU需要约5分钟。
# -c 参数表示指定使用哪个配置文件
# -o 参数表示指定配置文件中的全局变量(覆盖配置文件中的设置),这里设置使用gpu,
# --eval 参数表示边训练边评估,会自动保存一个评估结果最好的名为best_model.pdmodel的模型

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

如果想通过VisualDL实时观察loss变化曲线,在训练命令中添加–use_vdl=true,以及通过–vdl_log_dir设置日志保存路径,参考原文档
2、评估

# 评估 默认使用训练过程中保存的best_model
# -c 参数表示指定使用哪个配置文件
# -o 参数表示指定配置文件中的全局变量(覆盖配置文件中的设置),需使用单卡评估

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

3、预测

# -c 参数表示指定使用哪个配置文件
# -o 参数表示指定配置文件中的全局变量(覆盖配置文件中的设置)
# --infer_img 参数指定预测图像路径
# 预测结束后会在output文件夹中生成一张画有预测结果的同名图像

python tools/infer.py -c configs/yolov3_mobilenet_v1_roadsign.yml -o use_gpu=true --infer_img=demo/road554.png

结果如下图:
PaddleDetection使用教程


三、入门使用

可选参数列表
PaddleDetection使用教程

使用示例

边训练边测试

export CUDA_VISIBLE_DEVICES=0,1,2,3,4,5,6,7
python -u tools/train.py -c configs/faster_rcnn_r50_1x.yml --eval

在训练中交替执行评估, 评估在每个snapshot_iter时开始。每次评估后还会评出最佳mAP模型保存到best_model文件夹下。

Fine-tune其他任务

使用预训练模型fine-tune其他任务时,可以直接加载预训练模型,形状不匹配的参数将自动忽略,例如:

export CUDA_VISIBLE_DEVICES=0,1,2,3,4,5,6,7
python -u tools/train.py -c configs/faster_rcnn_r50_1x.yml \
                       -o pretrain_weights=output/faster_rcnn_r50_1x/model_final \

也可以显示的指定忽略参数名,可采用如下两种方式:

  1. 在YAML配置文件中设置finetune_exclude_pretrained_params
  2. 在命令行中添加-o finetune_exclude_pretrained_params对预训练模型进行选择性加载。
export CUDA_VISIBLE_DEVICES=0,1,2,3,4,5,6,7
python -u tools/train.py -c configs/faster_rcnn_r50_1x.yml \
                       -o pretrain_weights=output/faster_rcnn_r50_1x/model_final \
                          finetune_exclude_pretrained_params=['cls_score','bbox_pred']

提示:

CUDA_VISIBLE_DEVICES 参数可以指定不同的GPU。例如: export CUDA_VISIBLE_DEVICES=0,1,2,3.
若本地未找到数据集,将自动下载数据集并保存在~/.cache/paddle/dataset中。
预训练模型自动下载并保存在〜/.cache/paddle/weights中。
模型checkpoints默认保存在output中,可通过修改配置文件中save_dir进行配置。

模型评估

指定权重和数据集路径

export CUDA_VISIBLE_DEVICES=0
python -u tools/eval.py -c configs/faster_rcnn_r50_1x.yml \
                      -o weights=https://paddlemodels.bj.bcebos.com/object_detection/faster_rcnn_r50_1x.tar \

评估模型可以为本地路径,例如output/faster_rcnn_r50_1x/model_final, 也可以是MODEL_ZOO中给出的模型链接。

通过json文件评估

export CUDA_VISIBLE_DEVICES=0
python -u tools/eval.py -c configs/faster_rcnn_r50_1x.yml \
           --json_eval \
           --output_eval evaluation/

json文件必须命名为bbox.json或者mask.json,放在evaluation/目录下。

提示:
R-CNNSSD模型目前暂不支持多GPU评估,将在后续版本支持.

模型预测

设置输出路径 && 设置预测阈值

export CUDA_VISIBLE_DEVICES=0
python -u tools/infer.py -c configs/faster_rcnn_r50_1x.yml \
                    --infer_img=demo/000000570688.jpg \
                    --output_dir=infer_output/ \
                    --draw_threshold=0.5 \
                    -o weights=output/faster_rcnn_r50_1x/model_final \

如何训练自定义数据集

1.准备数据

首先需要将数据集转换为标准COCO格式或VOC格式。

2.选择模型
PaddleDetection中提供了丰富的模型库,具体可在模型库中查看各个模型的指标,您可依据实际部署算力的情况,选择合适的模型,同时也可以根据使用场景不同选择合适的模型,具体参考特色模型

3.生成Anchor
在yolo系列模型中,可以运行tools/anchor_cluster.py来得到适用于你的数据集Anchor,使用方法如下:

python tools/anchor_cluster.py -c configs/ppyolo/ppyolo.yml -n 9 -s 608 -m v2 -i 1000

目前tools/anchor_cluster.py支持的主要参数配置如下表所示:
PaddleDetection使用教程
4.修改参数配置

数据路径配置: 在yaml配置文件中,依据1.数据准备中准备好的路径,配置TrainReaderEvalReaderTestReader的路径。

COCO数据集:

dataset:
     !COCODataSet
     image_dir: val2017 # 图像数据基于数据集根目录的相对路径
     anno_path: annotations/instances_val2017.json  # 标注文件基于数据集根目录的相对路径
     dataset_dir: dataset/coco  # 数据集根目录
     with_background: true  # 背景是否作为一类标签,默认为true。

VOC数据集:

dataset:
     !VOCDataSet
     anno_path: trainval.txt   # 训练集列表文件基于数据集根目录的相对路径
     dataset_dir: dataset/voc  # 数据集根目录
     use_default_label: true   # 是否使用默认标签,默认为true。
     with_background: true  # 背景是否作为一类标签,默认为true。

说明: 如果您使用自己的数据集进行训练,需要将use_default_label设为false,并在数据集根目录中修改label_list.txt文件,添加自己的类别名,其中行号对应类别号。

类别数修改: 如果您自己的数据集类别数和COCO/VOC的类别数不同, 需修改yaml配置文件中类别数,num_classes: XX。 注意:如果dataset中设置with_background: true,那么num_classes数必须是真实类别数+1(背景也算作1类)

根据需要修改LearningRate相关参数:
如果GPU卡数变化,依据lrbatch-size关系调整lr: 学习率调整策略

自己数据总数样本数和COCO不同,依据batch_size,总共的样本数,换算总迭代次数max_iters,以及LearningRate中的milestones(学习率变化界限)。
预训练模型配置:通过在yaml配置文件中的pretrain_weights: path/to/weights参数可以配置路径,可以是链接或权重文件路径,详情可参考迁移学习文档

5.开始训练与部署
参数配置完成后,就可以开始训练模型了。训练测试完成后,根据需要可以进行模型部署。


附:一个自定义数据集demo

我们以AI识虫数据集为例

第一步:准备数据

该数据集标注文件都是xml文件,数据集中缺少已标注图片名列表文件trainval.txt和test.txt,所以需要进行生成,利用如下python脚本,在数据集根目录下执行,便可生成trainval.txt和test.txt文件:

import os
file_train = open('trainval.txt', 'w')
file_test = open('test.txt', 'w')
for xml_name in os.listdir('train/annotations/xmls'):
    file_train.write(xml_name[:-4] + '\n')
for xml_name in os.listdir('val/annotations/xmls'):
    file_test.write(xml_name[:-4] + '\n')
file_train.close()
file_test.close()

将该数据集中的train/annotations/xmlsval/annotations/xmls下的所有xml标注文件拷贝到VOCdevkit/VOC2007/Annotations中,将该数据集中的train/images/val/images/下的所有图片拷贝到VOCdevkit/VOC2007/JPEGImages中,将第一步生成的trainval.txttest.txt文件移动到VOCdevkit/VOC2007/ImageSets/Main中。

最后在数据集根目录下输出最终的trainval.txt和test.txt文件:

python dataset/voc/create_list.py -d path/to/dataset

第二步:选择模型并修改配置文件

由于昆虫比较小,属于小物体检测范畴,我们选择Faster-Rcnn系列模型。

然后基于configs/faster_rcnn_r50_fpn_1x.yml文件进行修改:

修改Reader模块:为了方便模型评估需要将metric改为VOC;Reader部分已经在faster_fpn_reader.yml中定义完成,此处将要修改的内容覆写即可,如下yaml配置所示:

...
metric: VOC
...
_READER_: 'faster_fpn_reader.yml'
TrainReader:
  dataset:
    !VOCDataSet
    dataset_dir: path/to/dataset
    anno_path: trainval.txt
    use_default_label: false
  batch_size: 2

EvalReader:
  inputs_def:
    fields: ['image', 'im_info', 'im_id',  'im_shape', 'gt_bbox', 'gt_class', 'is_difficult']
  dataset:
    !VOCDataSet
    dataset_dir: path/to/dataset
    anno_path: test.txt
    use_default_label: false

TestReader:
  dataset:
    !ImageFolder
    anno_path: path/to/dataset/label_list.txt
    use_default_label: false

修改训练轮数与学习率等参数:

学习率与GPU数量呈线性变换关系,如果GPU数量减半,那么学习率也将减半。由于PaddleDetection中的faster_rcnn_r50_fpn模型是在8卡GPU环境下训练得到的,所以我们要将学习率除以8:

max_iters: 10200
...
LearningRate:
base_lr: 0.0025
schedulers:
- !PiecewiseDecay
  gamma: 0.1
  milestones: [6800, 9000]

第三步:开始训练

为了使模型更快的收敛,我们使用在COCO数据集上训好的模型进行迁移学习,并且增加–eval参数,表示边训练边测试:

export CUDA_VISIBLE_DEVICES=0
python -u tools/train.py -c configs/faster_rcnn_r50_fpn_1x.yml \
              -o pretrain_weights=https://paddlemodels.bj.bcebos.com/object_detection/faster_rcnn_r50_fpn_1x.tar \
              finetune_exclude_pretrained_params=['cls_score','bbox_pred'] \
              --eval

如果想让模型收敛的更好,可以继续增大max_iters,训练2x、3x等模型,但并不是意味着训练轮数越多效果越好,要防止过拟合的出现。

训练完之后,可以任意挑选一张测试集图片进行测试,输出的结果图片会默认保存在output目录中:

python -u tools/infer.py -c configs/faster_rcnn_r50_fpn_1x.yml \
              --infer_img=path/to/dataset/2572.jpeg

PaddleDetection使用教程

上一篇:PaddleDetection FAQ(常见问题) 第一期


下一篇:paddleDetection训练自己的数据集遇到的问题及解决方法