未验证 提交 0e5f87c3 编写于 作者: C cnn 提交者: GitHub

Repalce fruit dataset with roadsign dataset, and update QUICK_STARTED, use...

Repalce fruit dataset with roadsign dataset, and update QUICK_STARTED, use PP-YOLO as demo, test=document_fix. (#1407)
上级 67fc203f
#####################################基础配置#####################################
# 检测算法使用YOLOv3,backbone使用MobileNet_v1,数据集使用roadsign_voc的配置文件模板,本配置文件默认使用单卡,单卡的batch_size=1
# 检测模型的名称
architecture: YOLOv3
# 根据硬件选择是否使用GPU
use_gpu: true
# ### max_iters为最大迭代次数,而一个iter会运行batch_size * device_num张图片。batch_size在下面 TrainReader.batch_size设置。
max_iters: 1200
# log平滑参数
log_smooth_window: 20
# 模型保存文件夹
save_dir: output
# 每隔多少迭代保存模型
snapshot_iter: 200
# ### mAP 评估方式,mAP评估方式可以选择COCO和VOC或WIDERFACE,其中VOC有11point和integral两种评估方法
# VOC数据格式只能使用VOC mAP评估方法
metric: VOC
map_type: integral
# ### pretrain_weights 可以是imagenet的预训练好的分类模型权重,也可以是在VOC或COCO数据集上的预训练的检测模型权重
# 模型配置文件和权重文件可参考[模型库](https://github.com/PaddlePaddle/PaddleDetection/blob/release/0.4/docs/MODEL_ZOO.md)
pretrain_weights: https://paddlemodels.bj.bcebos.com/object_detection/yolov3_mobilenet_v1.tar
# best模型保存路径
weights: output/yolov3_mobilenet_v1_roadsign_voc_template/best_model
# ### 根据用户数据设置类别数
num_classes: 4
# finetune时忽略的参数,按照正则化匹配,匹配上的参数会被忽略掉
finetune_exclude_pretrained_params: ['yolo_output']
# 是否使用ppdet中的YOLOv3Loss,ppdet中的YOLOv3Loss兼容Paddle中yolov3_loss,且可设置参更多参数。
# true: 使用ppdet/modeling/losses/yolo_loss.py
# false:使用Paddle中yolov3_loss,文档:https://www.paddlepaddle.org.cn/documentation/docs/zh/api_cn/layers_cn/yolov3_loss_cn.html#yolov3-loss
use_fine_grained_loss: false
# 检测模型的结构
YOLOv3:
backbone: MobileNet
yolo_head: YOLOv3Head
# 检测模型的backbone
MobileNet:
norm_type: sync_bn
norm_decay: 0.
conv_group_scale: 1
with_extra_blocks: false
# 检测模型的Head
YOLOv3Head:
# anchor_masks
anchor_masks: [[6, 7, 8], [3, 4, 5], [0, 1, 2]]
# 3x3 anchors
anchors: [[10, 13], [16, 30], [33, 23],
[30, 61], [62, 45], [59, 119],
[116, 90], [156, 198], [373, 326]]
# norm_decay
norm_decay: 0.
# yolo_loss
yolo_loss: YOLOv3Loss
# nms 类型参数,可以设置为[MultiClassNMS, MultiClassSoftNMS, MatrixNMS], 默认使用 MultiClassNMS
nms:
background_label: -1
keep_top_k: 100
# nms阈值
nms_threshold: 0.45
nms_top_k: 1000
normalized: false
score_threshold: 0.01
YOLOv3Loss:
# 这里的batch_size与训练中的batch_size(即TrainReader.batch_size)不同.
# 仅且当use_fine_grained_loss=true时,计算Loss时使用,且必须要与TrainReader.batch_size设置成一样
batch_size: 8
# 忽略样本的阈值 ignore_thresh
ignore_thresh: 0.7
# 是否使用label_smooth
label_smooth: true
LearningRate:
# ### 学习率设置 参考 https://github.com/PaddlePaddle/PaddleDetection/blob/release/0.4/docs/FAQ.md#faq%E5%B8%B8%E8%A7%81%E9%97%AE%E9%A2%98
# base_lr
base_lr: 0.0001
# 学习率规划器
# 具体实现参考[API](fluid.layers.piecewise_decay)
schedulers:
# 学习率衰减策略
- !PiecewiseDecay
gamma: 0.1
milestones:
# ### 参考 https://github.com/PaddlePaddle/PaddleDetection/blob/release/0.4/docs/FAQ.md#faq%E5%B8%B8%E8%A7%81%E9%97%AE%E9%A2%98
# ### 8/12 11/12
- 800
- 1100
# 在训练开始时,调低学习率为base_lr * start_factor,然后逐步增长到base_lr,这个过程叫学习率热身,按照以下公式更新学习率
# linear_step = end_lr - start_lr
# lr = start_lr + linear_step * (global_step / warmup_steps)
# 具体实现参考[API](fluid.layers.linear_lr_warmup)
- !LinearWarmup
start_factor: 0.3333333333333333
steps: 100
OptimizerBuilder:
# 默认使用SGD+Momentum进行训练
# 具体实现参考[API](fluid.optimizer)
optimizer:
momentum: 0.9
type: Momentum
# 默认使用SGD+Momentum进行训练
# 具体实现参考[API](fluid.optimizer)
regularizer:
factor: 0.0005
type: L2
#####################################数据配置#####################################
# 模型训练集设置参考
# 训练、验证、测试使用的数据配置主要区别在数据路径、模型输入、数据增强参数设置
# 如果使用 yolov3_reader.yml,下面的参数设置优先级高,会覆盖yolov3_reader.yml中的参数设置,对于用自定义数据建议将数据配置文件写到下面。
# _READER_: 'yolov3_reader.yml'
TrainReader:
# 训练过程中模型的输入设置
# 包括图片,图片长宽高等基本信息,图片id,标记的目标框,类别等信息
# 不同算法,不同数据集 inputs_def 不同,有的算法需要限制输入图像尺寸,有的不需要###
inputs_def:
# YOLO 输入图像大小,必须是32的整数倍###
# 注意需要与下面的图像尺寸的设置保存一致###
image_shape: [3, 608, 608]
# 不同算法,不同数据集 fields 不同###
# YOLO系列 VOC格式数据: ['image', 'gt_bbox', 'gt_class', 'gt_score'],且需要设置num_max_boxes
# YOLO系列 COCO格式数据:['image', 'gt_bbox', 'gt_class', 'gt_score'],且需要设置num_max_boxes
# FasterRCNN 系列 COCO格式数据:['image', 'im_info', 'im_id', 'gt_bbox', 'gt_class', 'is_crowd']
# MaskRCNN 系列 COCO格式数据:['image', 'im_info', 'im_id', 'gt_bbox', 'gt_class', 'is_crowd', 'gt_mask']
# AnchorFree 系列 COCO格式数据:['image', 'im_id', 'gt_bbox', 'gt_class', 'tl_heatmaps', 'br_heatmaps', 'tl_regrs', 'br_regrs', 'tl_tags', 'br_tags', 'tag_masks']
# VOC数据格式需要读取的字段,注意与COCO不同。注意TrainReader、EvalReader、TestReader字段略有不同
fields: ['image', 'gt_bbox', 'gt_class', 'gt_score']
# 仅YOLO系列需要设置
num_max_boxes: 50
# 训练数据集路径
dataset:
# 指定数据集格式
!VOCDataSet
#dataset/xxx/
#├── annotations
#│ ├── xxx1.xml
#│ ├── xxx2.xml
#│ ├── xxx3.xml
#│ | ...
#├── images
#│ ├── xxx1.png
#│ ├── xxx2.png
#│ ├── xxx3.png
#│ | ...
#├── label_list.txt (用户自定义必须提供,且文件名称必须是label_list.txt。当使用VOC数据且use_default_label=true时,可不提供 )
#├── train.txt (训练数据集文件列表, ./images/xxx1.png ./Annotations/xxx1.xml)
#└── valid.txt (测试数据集文件列表)
# 数据集相对路径
dataset_dir: dataset/roadsign_voc
# 标记文件名
anno_path: train.txt
# 对于VOC、COCO等比赛数据集,可以不指定类别标签文件,use_default_label可以是true。
# 对于用户自定义数据,如果是VOC格式数据,use_default_label必须要设置成false,且需要提供label_list.txt。如果是COCO格式数据,不需要设置这个参数。
use_default_label: false
# 是否包含背景类,若with_background=true,num_classes需要+1
# YOLO 系列with_background必须是false,FasterRCNN系列是true ###
with_background: false
# 1个GPU的batch size,默认为1。需要注意:每个iter迭代会运行batch_size * device_num张图片
batch_size: 8
# 共享内存bufsize,若内存有限,请设置小一些。
bufsize: 2
# 选择是否打乱所有样本的顺序
shuffle: true
# drop_empty 建议设置为true
drop_empty: true
# drop_last 如果最后一个batch的图片数量为奇数,选择是否丢掉这个batch不进行训练。
# 注意,在某些情况下,drop_last=false时训练过程中可能会出错,建议训练时都设置为true
drop_last: true
# mixup_epoch
mixup_epoch: -1
# 选择是否使用多进程,默认为false
use_process: false
# 若选用多进程,设置使用多进程/线程的数目,默认为4,建议与CPU核数一致
# 开启多进程后,占用内存会成倍增加,根据内存设置###
worker_num: 4
# 数据预处理和数据增强部分,此部分设置要特别注意###
# 不同算法对数据的预处理流程不同,建议使用对应算法默认的数据处理流程。
# 比如,YOLO、FPN算法,要求输入图像尺寸必须是32的整数倍
# 以下是对一个batch中的每单张图片做的数据增强
sample_transforms:
# 读取Image图像为numpy数组
# 可以选择将图片从BGR转到RGB,可以选择对一个batch中的图片做mixup增强
- !DecodeImage
to_rgb: true
with_mixup: false
# box 坐标归一化,仅仅YOLO系列算法需要
- !NormalizeBox {}
# 以prob概率随机反转
- !RandomFlipImage
is_normalized: true
prob: 0.5
# 归一化
- !NormalizeImage
mean: [0.485, 0.456, 0.406]
std: [0.229, 0.224, 0.225]
is_scale: true
is_channel_first: false
# 如果 bboxes 数量小于 num_max_boxes,填充值为0的 box,仅仅YOLO系列算法需要
- !PadBox
num_max_boxes: 50
# 坐标格式转化,从XYXY转成XYWH,仅仅YOLO系列算法需要
- !BboxXYXY2XYWH {}
# 以下是对一个batch中的所有图片同时做的数据增强
batch_transforms:
# 多尺度训练时,从list中随机选择一个尺寸,对一个batch数据同时同时resize
- !RandomShape
sizes: [608]
# channel_first
- !Permute
channel_first: true
to_bgr: false
EvalReader:
# 评估过程中模型的输入设置
# 1个GPU的batch size,默认为1。需要注意:每个iter迭代会运行batch_size * device_num张图片
batch_size: 1
# 共享内存bufsize,共享内存中训练样本数量是: bufsize * batch_size * 2 张图
bufsize: 1
# shuffle=false
shuffle: false
# 一般的评估时,batch_size=1,drop_empty可设置成 false
drop_empty: false
# 一般的评估时,batch_size=1,drop_last可设置成 false
drop_last: false
# 选择是否使用多进程,默认为false
use_process: false
# 若选用多进程,设置使用多进程/线程的数目,默认为4,建议与CPU核数一致
# 开启多进程后,占用内存会成倍增加,根据内存设置 ###
worker_num: 1
inputs_def:
# 图像尺寸与上保持一致
image_shape: [3, 608, 608]
# fields 字段
fields: ['image', 'im_size', 'im_id', 'gt_bbox', 'gt_class', 'is_difficult']
num_max_boxes: 50
# 评估数据集路径
dataset:
!VOCDataSet
dataset_dir: dataset/roadsign_voc
# 评估文件列表
anno_path: valid.txt
# 对于VOC、COCO等比赛数据集,可以不指定类别标签文件,use_default_label可以是true。
# 对于用户自定义数据,如果是VOC格式数据,use_default_label必须要设置成false,且需要提供label_list.txt。如果是COCO格式数据,不需要设置这个参数。
use_default_label: false
# 是否包含背景类,若with_background=true,num_classes需要+1
# YOLO 系列with_background必须是false,FasterRCNN系列是true ###
with_background: false
# 单张图的 transforms
sample_transforms:
# DecodeImage
- !DecodeImage
to_rgb: true
# 与上面图像尺寸保持一致 ###
- !ResizeImage
target_size: 608
interp: 2
# 图像归一化
- !NormalizeImage
mean: [0.485, 0.456, 0.406]
std: [0.229, 0.224, 0.225]
is_scale: true
is_channel_first: false
# 如果 bboxes 数量小于 num_max_boxes,填充值为0的 box
- !PadBox
num_max_boxes: 50
- !Permute
to_bgr: false
channel_first: true
TestReader:
# 测试过程中模型的输入设置
# 预测时 batch_size设置为1
batch_size: 1
# 一般的预测时,batch_size=1,drop_empty可设置成 false
drop_empty: false
# 一般的预测时,batch_size=1,drop_last可设置成 false
drop_last: false
inputs_def:
# 预测时输入图像尺寸,与上面图像尺寸保持一致
image_shape: [3, 608, 608]
# 预测时需要读取字段
# fields 字段
fields: ['image', 'im_size', 'im_id']
dataset:
# 预测数据
!ImageFolder
anno_path: dataset/roadsign_voc/label_list.txt
# 对于VOC、COCO等比赛数据集,可以不指定类别标签文件,use_default_label可以是true。
# 对于用户自定义数据,如果是VOC格式数据,use_default_label必须要设置成false,且需要提供label_list.txt。如果是COCO格式数据,不需要设置这个参数。
use_default_label: false
# 是否包含背景类,若with_background=true,num_classes需要+1
# YOLO 系列with_background必须是false,FasterRCNN系列是true ###
with_background: false
# 单张图的 transforms
sample_transforms:
# DecodeImage
- !DecodeImage
to_rgb: true
# 注意与上面图像尺寸保持一致
- !ResizeImage
target_size: 608
interp: 2
# NormalizeImage
- !NormalizeImage
mean: [0.485, 0.456, 0.406]
std: [0.229, 0.224, 0.225]
is_scale: true
is_channel_first: false
# Permute
- !Permute
to_bgr: false
channel_first: true
[English](QUICK_STARTED.md) | 简体中文
# 快速开始
为了使得用户能够在很短时间内快速产出模型,掌握PaddleDetection的使用方式,这篇教程通过一个预训练检测模型对小数据集进行finetune。在较短时间内即可产出一个效果不错的模型。实际业务中,建议用户根据需要选择合适模型配置文件进行适配。
为了使得用户能够在很短的时间内快速产出模型,掌握PaddleDetection的使用方式,这篇教程通过一个预训练检测模型对小数据集进行finetune。在P40上单卡大约20min即可产出一个效果不错的模型。
- **注:在开始前,如果有GPU设备,指定GPU设备号。**
```bash
export CUDA_VISIBLE_DEVICES=0
## 一、快速体验
```
## 数据准备
数据集参考[Kaggle数据集](https://www.kaggle.com/mbkinaci/fruit-images-for-object-detection),其中训练数据集240张图片,测试数据集60张图片,数据类别为3类:苹果,橘子,香蕉。[下载链接](https://dataset.bj.bcebos.com/PaddleDetection_demo/fruit-detection.tar)。数据下载后分别解压即可, 数据准备脚本位于[download_fruit.py](https://github.com/PaddlePaddle/PaddleDetection/tree/master/dataset/fruit/download_fruit.py)。下载数据方式如下:
```bash
python dataset/fruit/download_fruit.py
# 用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
```
结果如下图:
## 开始训练
![](../images/000000014439.jpg)
训练命令如下:
```bash
python -u tools/train.py -c configs/yolov3_mobilenet_v1_fruit.yml --eval
```
## 二、准备数据
数据集参考[Kaggle数据集](https://www.kaggle.com/andrewmvd/road-sign-detection) ,包含877张图像,数据类别4类:crosswalk,speedlimit,stop,trafficlight。
将数据划分为训练集701张图和测试集176张图,[下载链接](https://paddlemodels.bj.bcebos.com/object_detection/roadsign_voc.tar).
训练使用`yolov3_mobilenet_v1`基于COCO数据集训练好的模型进行finetune。
```
# 注意:可跳过这步下载,后面训练会自动下载
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`设置日志保存路径,但注意**VisualDL需Python>=3.5**
如果想通过VisualDL实时观察loss变化去去曲线,在训练命令种添加--use_vdl=true,以及通过--vdl_log_dir设置日志保存路径。
**但注意VisualDL需Python>=3.5**
```bash
python -u tools/train.py -c configs/yolov3_mobilenet_v1_fruit.yml \
--use_vdl=True \
--vdl_log_dir=vdl_fruit_dir/scalar \
--eval
首先安装VisualDL
```
通过`visualdl`命令实时查看变化曲线:
```bash
visualdl --logdir vdl_fruit_dir/scalar/ --host <host_IP> --port <port_num>
python -m pip install visualdl -i https://mirror.baidu.com/pypi/simple
```
VisualDL结果显示如下:
![](../images/visualdl_fruit.jpg)
训练模型[下载链接](https://paddlemodels.bj.bcebos.com/object_detection/yolov3_mobilenet_v1_fruit.tar)
```
python -u tools/train.py -c configs/yolov3_mobilenet_v1_roadsign.yml \
--use_vdl=true \
--vdl_log_dir=vdl_dir/scalar \
--eval
```
通过visualdl命令实时查看变化曲线:
## 评估预测
visualdl --logdir vdl_dir/scalar/ --host <host_IP> --port <port_num>
评估命令如下:
```bash
python -u tools/eval.py -c configs/yolov3_mobilenet_v1_fruit.yml
### 2、评估
```
预测命令如下
```bash
python -u tools/infer.py -c configs/yolov3_mobilenet_v1_fruit.yml \
-o weights=https://paddlemodels.bj.bcebos.com/object_detection/yolov3_mobilenet_v1_fruit.tar \
--infer_img=demo/orange_71.jpg
# 评估 默认使用训练过程中保存的best_model
# -c 参数表示指定使用哪个配置文件
# -o 参数表示指定配置文件种的全局变量(覆盖配置文件种的设置)
python tools/eval.py -c configs/yolov3_mobilenet_v1_roadsign.yml-o use_gpu=true
```
预测图片如下:
![](../../demo/orange_71.jpg)
![](../images/orange_71_detection.jpg)
### 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
```
结果如下图:
更多训练及评估流程,请参考[入门使用文档](GETTING_STARTED_cn.md)
![](../images/road554.png)
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册