详细的使用教程可以参考官方文档
一、安装说明
在安装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文件夹下生成一个画有预测结果的同名图像。
结果如下图:
二、快速开始
设置显卡
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
二、准备数据
数据集参考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
结果如下图:
三、入门使用
可选参数列表
使用示例
边训练边测试
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 \
也可以显示的指定忽略参数名,可采用如下两种方式:
- 在YAML配置文件中设置finetune_exclude_pretrained_params
- 在命令行中添加-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-CNN
和SSD
模型目前暂不支持多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
支持的主要参数配置如下表所示:
4.修改参数配置
数据路径配置: 在yaml配置文件中,依据1.数据准备中准备好的路径,配置TrainReader
、EvalReader
和TestReader
的路径。
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卡数变化,依据lr
,batch-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/xmls
与val/annotations/xmls
下的所有xml标注文件拷贝到VOCdevkit/VOC2007/Annotations
中,将该数据集中的train/images/
与val/images/
下的所有图片拷贝到VOCdevkit/VOC2007/JPEGImages
中,将第一步生成的trainval.txt
和test.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