PaddleDetection训练参数配置详解(已验证)

东郭远航
2023-12-01

PaddleDetection为目标检测库,提供了多种预训练模型和模型配置文件,根据任务需求选择现有的配置文件调整参数即可:

YoloV3的优势 , 

1.YOLO网络:单步的目标检测算法,适合目标的实时检测,推算速度较快。丧失部分精度,将图片端到端的进行目标检测,也引入了rcnn的Anchor框体系大幅提升mAP。因为没有进行区域采样,所以对全局信息有较好的表现,前两代网络在小目标检测上表现稍差(一般定义为像素尺寸小于32 * 32的目标或是长宽远小于原图像尺寸的0.1的目标)。但不妨碍成熟的YOLOv3经过种种改进可以适应绝大部分目标检测任务(不同的改进增强版都已收录到PaddleDetection中)
——PaddleDetection中提供了相当多的YOLOv3增强版算法,适合作为最初的尝试

2.SSD网络:单步的目标检测算法,调试过程非常依赖经验,设计之初是为了结合YOLO的速度和RCNN的精度,相比于RCNN消除了边界框候选以及特征上采样的过程,相比于YOLO取消了全连接层,采用了全卷积网络结构。但是由于其优点已经被YOLOv3后来赶上,而小目标检测不力也被YOLOv3中新增的上采样所加强,所以个人感觉使用起来效果不如YOLOv3

3.RCNN网络:多步的目标检测算法,追求更高的精度,在小目标检测方面表现更好,但缺点就是速度较慢

  • mobilenet(不是一类单独的网络结构):适合将模型部署在移动端,推演速度较快、模型较小

下面已模型参数为例详解:

  • PaddleDetection提供一键式训练、评估、预测等脚本tools/train.py tools/eval.py tools/infer.py,可通过-c参数指定配置文件进行一键式训练,yolov3_darknet模型的训练权重默认存储于/home/aistudio/output/yolov3_darknet目录,下面以一个适用于VOC和一个适用于COCO数据集的模型配置来介绍PaddleDetection的参数设置和相应意义
    Example1:
  • 以yolov3_darknet.yml为例介绍最基础的yolov3网络的PaddleDetection配置(为方便学习,已将本项目中需要用到的三个配置文件放到了根目录下),此配置文件链接最基础的YOLOv3网络结构,适用的数据集格式为COCO格式(适用于VOC数据集的配置文件后面带_voc)

architecture: YOLOv3		# 网络主体【首先确认自己选取的网络的大框架】
use_gpu: true			# 是否使用GPU【建议使用,训练速度大幅提升(使用高级版)】
max_iters: 100000		# 最大训练batch数【根据需求和模型收敛、稳定的速度更改】
log_smooth_window: 20
save_dir: output
snapshot_iter: 2000		# 每多少个batch进行一次模型存储(如果是在eval模式下会同时保存mAP最优模型)【过小会导致保存的模型占据较多空间、项目加载启动时间变长甚至卡死;过大会导致模型保存不及时,错失最优模型。建议设置为最大训练batch数除以50,即总共保存50个模型】
metric: COCO			# 数据集格式
pretrain_weights: https://paddle-imagenet-models-name.bj.bcebos.com/DarkNet53_pretrained.tar		# 预训练模型
weights: output/yolov3_darknet/model_final		# 模型权重文件地址(预测的时候的模型文件)
num_classes: 80			# 目标种类数【务必要改!如果背景需要认为是单独的标签则要在目标种类数的基础上加1,与后面的“with_background”同步设置!!!】
use_fine_grained_loss: false	# 细粒度损失,在目标类别非常相近(例如任务为分辨狗的种类)的时候设为True

YOLOv3:				# 网络配置部分【模块化设计方便用户进行主干特征提取网络与头网络的各种组合尝试】
  backbone: DarkNet		# 主干特征提取网络:(存放地址:PaddleDetection/ppdet/modeling/backbones/darknet.py)
  yolo_head: YOLOv3Head		# yolo_head函数:(存放地址:PaddleDetection/ppdet/modeling/anchor_heads/yolo_head.py)

DarkNet:			# 主干特征提取网络的配置【不建议修改!】
  norm_type: sync_bn
  norm_decay: 0.
  depth: 53

YOLOv3Head:			# yolo_head的配置【不建议修改!】
  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]]
  norm_decay: 0.
  yolo_loss: YOLOv3Loss
  nms:				# 非极大抑制相关设置
    background_label: -1
    keep_top_k: 100
    nms_threshold: 0.45
    nms_top_k: 1000
    normalized: false
    score_threshold: 0.01

YOLOv3Loss:			# 损失函数的计算
  # batch_size here is only used for fine grained loss, not used
  # for training batch_size setting, training batch_size setting
  # is in configs/yolov3_reader.yml TrainReader.batch_size, batch
  # size here should be set as same value as TrainReader.batch_size
  batch_size: 8			# batchsize大小【根据自己的需求更改,需要和 'yolov3_reader.yml'中保持一致!】
  ignore_thresh: 0.7		# 忽略iou小于多少的候选框
  label_smooth: true

LearningRate:			#【根据自己的需求更改】
  base_lr: 0.001		# 初始学习率【根据自己的需求更改】
  schedulers:
  - !PiecewiseDecay
    gamma: 0.1			# 衰减率
    milestones:			# 里程碑(每到一个里程碑学习率会在原有基础上乘以衰减率gamma)
    - 55000
    - 80000
  - !LinearWarmup		# 学习率预热
    start_factor: 0.		# 起始学习率
    steps: 1000			# 多少个batch后到达base_lr(初始学习率)

OptimizerBuilder:		# 优化器配置【不建议修改!】
  optimizer:
    momentum: 0.9
    type: Momentum
  regularizer:
    factor: 0.0005
    type: L2

_READER_: 'yolov3_reader.yml'	# 数据读取配置文件【!!!与Example2中不同,必须要到'yolov3_reader.yml'中更改相应配置以确保模型能正确推算!!!】
TrainReader:							# 训练集读取器定义
  inputs_def:
    fields: ['image', 'gt_bbox', 'gt_class', 'gt_score']	# 输入项类别,不用动
    num_max_boxes: 50						# 输入最多目标框数
  dataset:
    !COCODataSet
      image_dir: images						# 图片文件夹地址(相对于下面的'dataset_dir'的地址)
      anno_path: annotations/train2017.json 			# 训练集描述文件地址(相对于下面的'dataset_dir'的地址!!!)
      dataset_dir: /home/aistudio/PaddleDetection/dataset/redgreen_COCO		# 数据集绝对地址
      with_background: false	# 背景是否算作一个标签【需要与网络配置文件中的“num_classes”是否加1同步设置(不算单独标签的话就不加1)!!!】
  sample_transforms:						# 设置各种图像增强方法!!!
    - !DecodeImage						# 解码图像设置
      to_rgb: True						# 是否训练前转换为RGB格式【不用改】
      with_mixup: True						# 是否使用图像增强'mix_up'(具体增强方式可自行百度,很好理解)
    - !MixupImage
      alpha: 1.5
      beta: 1.5
    - !ColorDistort {}						# 颜色失真图像增强
    - !RandomExpand						# 随机扩展图像增强
      fill_value: [123.675, 116.28, 103.53]
    - !RandomCrop {}						# 随机裁剪
    - !RandomFlipImage
      is_normalized: false
    - !NormalizeBox {}
    - !PadBox
      num_max_boxes: 50
    - !BboxXYXY2XYWH {}						# 标志框标注格式转换(由XYXY格式转为XYWH格式)
  batch_transforms:
  - !RandomShape
    sizes: [320, 352, 384, 416, 448, 480, 512, 544, 576, 608]	# 随机改变图像分辨率
    random_inter: True
  - !NormalizeImage
    mean: [0.485, 0.456, 0.406]					# 图像归一化,这个参数和下面那行参数均为
    std: [0.229, 0.224, 0.225]					# ImageNet(百万张图片统计得出)的均值和标准差,可根据自己的训练集修改
    is_scale: True
    is_channel_first: false
  - !Permute
    to_bgr: false
    channel_first: True
  # Gt2YoloTarget is only used when use_fine_grained_loss set as true,
  # this operator will be deleted automatically if use_fine_grained_loss
  # is set as false
  - !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: 8							# batchsize大小【根据自己的需求更改,需要和 'yolov3_darknet.yml'中保持一致!】
  shuffle: true
  mixup_epoch: 250						# 使用mixup的轮数
  drop_last: true						# 如何处理数据集长度除于batch_size余下的数据:True就抛弃,否则保留。
  worker_num: 8							# 【在AiStudio上用GPU运行不修改!】
  bufsize: 16							# 缓冲区设置【在性能允许的前提下设置大一点】
  use_process: true


EvalReader:							# 基本同上,不再注释
  inputs_def:
    fields: ['image', 'im_size', 'im_id']
    num_max_boxes: 50
  dataset:
    !COCODataSet
      image_dir: val2017
      anno_path: annotations/instances_val2017.json
      dataset_dir: dataset/coco
      with_background: false
  sample_transforms:
    - !DecodeImage
      to_rgb: True
    - !ResizeImage
      target_size: 608						# 将图像压缩到608*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
    - !PadBox
      num_max_boxes: 50
    - !Permute
      to_bgr: false
      channel_first: True
  batch_size: 8
  drop_empty: false
  worker_num: 8
  bufsize: 16

TestReader:
  inputs_def:
    image_shape: [3, 608, 608]					# 图像为三通道,尺寸为608*608
    fields: ['image', 'im_size', 'im_id']
  dataset:
    !ImageFolder
      anno_path: annotations/instances_val2017.json
      with_background: false
  sample_transforms:
    - !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
    - !Permute
      to_bgr: false
      channel_first: True
  batch_size: 1							# test的时候batchsize要设置为1

Example2:

  • 以yolov3_r34_voc.yml为例介绍配置文件中的参数含义(为方便学习,已将本项目中需要用到的三个配置文件放到了根目录下),从名字可以看出,其使用了yolov3网络,同时将yolov3自带的darknet53主干特征提取网络替换为了resnet34,适用的数据集格式为VOC格式

architecture: YOLOv3		# 网络主体
use_gpu: true			# 是否使用GPU训练
max_iters: 80000		# 最大训练batch数
log_smooth_window: 20
save_dir: output
snapshot_iter: 2000		# 每多少个batch进行一次模型存储(如果是在eval模式下会同时保存mAP最优模型)
metric: VOC			# 数据集格式
map_type: 11point		# mAP的评判标准
pretrain_weights: https://paddle-imagenet-models-name.bj.bcebos.com/ResNet34_pretrained.tar		# 预训练模型
weights: output/yolov3_r34_voc/model_final		# 模型权重文件地址(预测的时候的模型文件)
num_classes: 20			# 目标种类数【务必要改!如果背景需要认为是单独的标签则要在目标种类数的基础上加1,与后面的“with_background”同步设置!!!】
use_fine_grained_loss: false	

YOLOv3:
  backbone: ResNet		# 主干特征提取网络:(存放地址:PaddleDetection/ppdet/modeling/backbones/resnet.py)
  yolo_head: YOLOv3Head		# yolo_head函数:(存放地址:PaddleDetection/ppdet/modeling/anchor_heads/yolo_head.py)

ResNet:				# 主干特征提取网络的配置【不建议修改!】
  norm_type: sync_bn
  freeze_at: 0
  freeze_norm: false
  norm_decay: 0.
  depth: 34
  feature_maps: [3, 4, 5]

YOLOv3Head:			# yolo_head的配置【不建议修改!】
  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]]
  norm_decay: 0.
  yolo_loss: YOLOv3Loss
  nms:
    background_label: -1
    keep_top_k: 100
    nms_threshold: 0.45
    nms_top_k: 1000
    normalized: false
    score_threshold: 0.01

YOLOv3Loss:			# 损失函数的计算
  # batch_size here is only used for fine grained loss, not used
  # for training batch_size setting, training batch_size setting
  # is in configs/yolov3_reader.yml TrainReader.batch_size, batch
  # size here should be set as same value as TrainReader.batch_size
  batch_size: 8			# batchsize大小【根据自己的需求更改,需要和 'yolov3_reader.yml'中保持一致!】
  ignore_thresh: 0.7		# 忽略iou小于多少的候选框
  label_smooth: false

LearningRate:			#【根据自己的需求更改】
  base_lr: 0.001		# 初始学习率【根据自己的需求更改】
  schedulers:
  - !PiecewiseDecay
    gamma: 0.1			# 衰减率
    milestones:			# 里程碑(每到一个里程碑学习率会在原有基础上乘以衰减率gamma)
    - 55000
    - 62000
  - !LinearWarmup		# 学习率预热
    start_factor: 0.		# 起始学习率
    steps: 1000			# 多少个batch后到达base_lr(初始学习率)

OptimizerBuilder:		# 优化器配置【不建议修改!】
  optimizer:
    momentum: 0.9
    type: Momentum
  regularizer:
    factor: 0.0005
    type: L2

_READER_: 'yolov3_reader.yml'	# 数据读取配置文件【需要到'yolov3_reader.yml'中修改batch_size和bufsize】
TrainReader:			# 训练集信息
  dataset:
    !VOCDataSet
    dataset_dir: dataset/voc	# 数据集存放目录【务必要改!建议使用绝对路径(以"/home/aistudio/"开头)】
    anno_path: trainval.txt	# 索引文件【务必要改!一定要改成相对"dataset_dir"的路径!!!】
    use_default_label: true	# 是否使用默认标签【务必要改!训练自己的数据集一定要改成false!!!】
    with_background: false	# 背景是否算作一个标签【需要与前面的“num_classes”是否加1同步设置!!!】

EvalReader:			# 验证集信息
  inputs_def:
    fields: ['image', 'im_size', 'im_id', 'gt_bbox', 'gt_class', 'is_difficult']
    num_max_boxes: 50		# 一幅图上最多有多少个目标
  dataset:
    !VOCDataSet
    dataset_dir: dataset/voc	# 数据集存放目录【务必要改!建议使用绝对路径(以"/home/aistudio/"开头)】
    anno_path: test.txt		# 索引文件【务必要改!一定要改成相对"dataset_dir"的路径!!!】
    use_default_label: true	# 是否使用默认标签【务必要改!训练自己的数据集一定要改成false!!!】
    with_background: false	# 背景是否算作一个标签【需要与前面的“num_classes”是否加1同步设置!!!】

TestReader:
  dataset:
    !ImageFolder
    use_default_label: true	# 是否使用默认标签【务必要改!训练自己的数据集一定要改成false!!!】
    with_background: false	# 背景是否算作一个标签【需要与前面的“num_classes”是否加1同步设置!!!】

 类似资料: