目标检测实战教程03-PaddleDetection配置文件详细介绍
去B站看全集教程
paddledetection配置文件详细介绍
# 数据评估类型
metric: COCO
# 类别信息,不包含背景类
num_classes: 1
# 训练集
TrainDataset:
!COCODataSet
# 数据图像路径
image_dir: /home/aistudio/data/JPEGImages
# 标注文件位置
anno_path: /home/aistudio/data/bigtrain.json
dataset_dir: /home/aistudio/data
data_fields: ['image', 'gt_bbox', 'gt_class', 'is_crowd']
EvalDataset:
!COCODataSet
image_dir: /home/aistudio/data/JPEGImages
anno_path: /home/aistudio/data/bigtest.json
dataset_dir: /home/aistudio/data
TestDataset:
!ImageFolder
anno_path: /home/aistudio/data/bigtest.json
# 总训练轮数
epoch: 12
# 学习率设置
LearningRate:
# 默认为8卡训学习率
base_lr: 0.00125
# 学习率调整策略
schedulers:
- !PiecewiseDecay
gamma: 0.1
# 学习率变化位置(轮数)
milestones: [8, 11]
- !LinearWarmup
start_factor: 0.1
steps: 1000
# 优化器
OptimizerBuilder:
# 优化器
optimizer:
momentum: 0.9
type: Momentum
# 正则化
regularizer:
factor: 0.0001
type: L2
主要包括训练轮数、学习率的策略与大小、优化器配置等内容。
# 每张GPU reader进程个数
worker_num: 2
# 训练数据
TrainReader:
# 训练数据transforms
sample_transforms:
- Decode: {}
- RandomResize: {target_size: [[640, 1333], [672, 1333], [704, 1333], [736, 1333], [768, 1333], [800, 1333]], interp: 2, keep_ratio: True}
- RandomFlip: {prob: 0.5}
- NormalizeImage: {is_scale: true, mean: [0.485,0.456,0.406], std: [0.229, 0.224,0.225]}
- Permute: {}
batch_transforms:
# 由于模型存在FPN结构,输入图片需要padding为32的倍数
- PadBatch: {pad_to_stride: 32}
# 训练时batch_size
batch_size: 1
# 读取数据是是否乱序
shuffle: true
# 是否丢弃最后不能完整组成batch的数据
drop_last: true
# 表示reader是否对gt进行组batch的操作,在rcnn系列算法中设置为false,得到的gt格式为list[Tensor]
collate_batch: false
# 评估数据
EvalReader:
# 评估数据transforms
sample_transforms:
- Decode: {}
- Resize: {interp: 2, target_size: [800, 1333], keep_ratio: True}
- NormalizeImage: {is_scale: true, mean: [0.485,0.456,0.406], std: [0.229, 0.224,0.225]}
- Permute: {}
batch_transforms:
# 由于模型存在FPN结构,输入图片需要padding为32的倍数
- PadBatch: {pad_to_stride: 32}
# 评估时batch_size
batch_size: 1
# 读取数据是是否乱序
shuffle: false
# 是否丢弃最后不能完整组成batch的数据
drop_last: false
# 是否丢弃没有标注的数据
drop_empty: false
# 测试数据
TestReader:
# 测试数据transforms
sample_transforms:
- Decode: {}
- Resize: {interp: 2, target_size: [800, 1333], keep_ratio: True}
- NormalizeImage: {is_scale: true, mean: [0.485,0.456,0.406], std: [0.229, 0.224,0.225]}
- Permute: {}
batch_transforms:
# 由于模型存在FPN结构,输入图片需要padding为32的倍数
- PadBatch: {pad_to_stride: 32}
# 测试时batch_size
batch_size: 1
# 读取数据是是否乱序
shuffle: false
# 是否丢弃最后不能完整组成batch的数据
drop_last: false
此处涉及到数据增强模块,单独介绍一下。
在线增强不会成倍增加数据集的大小,而是在训练的时候进行概率变换,只要训练的epoch数足够多,就可以实现与离线增强同样的效果。而离线数据增强由于成倍扩充数据集,所以不适合数据规模较大的情况。
常用的数据增强方法有颜色亮度对比度扰动、resize、裁剪、填充、翻转等。
数据增强具体实现的源码位置PaddleDetection/ppdet/data/transform/operators.py
可以通过一个选项来将输入模型训练的图像保存到文件夹中查看,需要在配置文件中增加
- DebugVisibleImage: {}
除了单样本数据增强,还有一些多样本的数据增强,此处介绍mixup的使用方法,除了设置mixup的参数外,还需要设置这一策略的训练轮数。如果为-1表示不使用,大于训练epoch则为全程使用,小于训练epoch则为训练到指定轮数后停用这一策略。下面是ppyolo的数据读取配置文件,可以看到mixup的使用方法。
# 每张GPU reader进程个数
worker_num: 2
# 训练数据
TrainReader:
inputs_def:
num_max_boxes: 50
# 训练数据transforms
sample_transforms:
- Decode: {}
- Mixup: {alpha: 1.5, beta: 1.5}
- RandomDistort: {}
- RandomExpand: {fill_value: [123.675, 116.28, 103.53]}
- RandomCrop: {}
- RandomFlip: {}
# batch_transforms
batch_transforms:
- BatchRandomResize: {target_size: [320, 352, 384, 416, 448, 480, 512, 544, 576, 608], random_size: True, random_interp: True, keep_ratio: False}
- NormalizeBox: {}
- PadBox: {num_max_boxes: 50}
- BboxXYXY2XYWH: {}
- NormalizeImage: {mean: [0.485, 0.456, 0.406], std: [0.229, 0.224, 0.225], is_scale: True}
- Permute: {}
- Gt2YoloTarget: {anchor_masks: [[6, 7, 8], [3, 4, 5], [0, 1, 2]], anchors: [[10, 13], [16, 30], [33, 23], [30, 61], [62, 45], [59, 119], [116, 90], [156, 198], [373, 326]], downsample_ratios: [32, 16, 8]}
# 训练时batch_size
batch_size: 24
# 读取数据是是否乱序
shuffle: true
# 是否丢弃最后不能完整组成batch的数据
drop_last: true
# mixup_epoch,大于最大epoch,表示训练过程一直使用mixup数据增广
mixup_epoch: 25000
# 是否通过共享内存进行数据读取加速,需要保证共享内存大小(如/dev/shm)满足大于1G
use_shared_memory: true
# 模型结构类型
architecture: FasterRCNN
# 预训练模型地址
pretrain_weights: https://paddledet.bj.bcebos.com/models/pretrained/ResNet50_cos_pretrained.pdparams
# FasterRCNN
FasterRCNN:
# backbone
backbone: ResNet
# neck
neck: FPN
# rpn_head
rpn_head: RPNHead
# bbox_head
bbox_head: BBoxHead
# post process
bbox_post_process: BBoxPostProcess
# backbone
ResNet:
# index 0 stands for res2
depth: 50
# norm_type,可设置参数:bn 或 sync_bn
norm_type: bn
# freeze_at index, 0 represent res2
freeze_at: 0
# return_idx
return_idx: [0,1,2,3]
# num_stages
num_stages: 4
# FPN
FPN:
# channel of FPN
out_channel: 256
# RPNHead
RPNHead:
# anchor generator
anchor_generator:
aspect_ratios: [0.5, 1.0, 2.0]
anchor_sizes: [[32], [64], [128], [256], [512]]
strides: [4, 8, 16, 32, 64]
# rpn_target_assign
rpn_target_assign:
batch_size_per_im: 256
fg_fraction: 0.5
negative_overlap: 0.3
positive_overlap: 0.7
use_random: True
# 训练时生成proposal的参数
train_proposal:
min_size: 0.0
nms_thresh: 0.7
pre_nms_top_n: 2000
post_nms_top_n: 1000
topk_after_collect: True
# 评估时生成proposal的参数
test_proposal:
min_size: 0.0
nms_thresh: 0.7
pre_nms_top_n: 1000
post_nms_top_n: 1000
# BBoxHead
BBoxHead:
# TwoFCHead as BBoxHead
head: TwoFCHead
# roi align
roi_extractor:
resolution: 7
sampling_ratio: 0
aligned: True
# bbox_assigner
bbox_assigner: BBoxAssigner
# BBoxAssigner
BBoxAssigner:
# batch_size_per_im
batch_size_per_im: 512
# 背景阈值
bg_thresh: 0.5
# 前景阈值
fg_thresh: 0.5
# 前景比例
fg_fraction: 0.25
# 是否随机采样
use_random: True
# TwoFCHead
TwoFCHead:
# TwoFCHead特征维度
out_channel: 1024
# BBoxPostProcess
BBoxPostProcess:
# 解码
decode: RCNNBox
# nms
nms:
# 使用MultiClassNMS
name: MultiClassNMS
keep_top_k: 100
score_threshold: 0.05
nms_threshold: 0.5
# 是否使用gpu
use_gpu: true
# 日志打印间隔
log_iter: 20
# save_dir
save_dir: output
# 模型保存间隔轮数
snapshot_epoch: 1