配置¶
MindYOLO套件同时支持yaml文件参数和命令行参数解析,并将相对固定、与模型强相关、较为复杂或者含有嵌套结构的参数编写成yaml文件,需根据实际应用场景更改或者较为简单的参数则通过命令行传入。
下面以yolov3为例,解释如何配置相应的参数。
参数继承关系¶
参数优先级由高到低如下,出现同名参数时,低优先级参数会被高优先级参数覆盖
- 用户命令行传入参数
- python执行py文件中parser的默认参数
- 命令行传入config参数对应的yaml文件参数
- 命令行传入config参数对应的yaml文件中__BASE__参数中包含的yaml文件参数,例如yolov3.yaml含有如下参数:
__BASE__: [ '../coco.yaml', './hyp.scratch.yaml', ]
基础参数¶
参数说明¶
- device_target: 所用设备,Ascend/GPU/CPU
- save_dir: 运行结果保存路径,默认为./runs
- log_interval: 打印日志step间隔,默认为100
- is_parallel: 是否分布式训练,默认为False
- ms_mode: 使用静态图模式(0)或动态图模式(1),默认为0。
- config: yaml配置文件路径
- per_batch_size: 每张卡batch size,默认为32
- epochs: 训练epoch数,默认为300
- ...
parse参数设置¶
该部分参数通常由命令行传入,示例如下:
msrun --worker_num=8 --local_worker_num=8 --bind_core=True --log_dir=./yolov7_log python train.py --config ./configs/yolov7/yolov7.yaml --is_parallel True --log_interval 50
数据集¶
参数说明¶
- dataset_name: 数据集名称
- train_set: 训练集所在路径
- val_set: 验证集所在路径
- test_set: 测试集所在路径
- nc: 数据集类别数
- names: 类别名称
- ...
yaml文件样例¶
该部分参数在configs/coco.yaml中定义,通常需修改其中的数据集路径
data:
dataset_name: coco
train_set: ./coco/train2017.txt # 118287 images
val_set: ./coco/val2017.txt # 5000 images
test_set: ./coco/test-dev2017.txt # 20288 of 40670 images, submit to https://competitions.codalab.org/competitions/20794
nc: 80
# class names
names: [ 'person', 'bicycle', 'car', 'motorcycle', 'airplane', 'bus', 'train', 'truck', 'boat', 'traffic light',
'fire hydrant', 'stop sign', 'parking meter', 'bench', 'bird', 'cat', 'dog', 'horse', 'sheep', 'cow',
'elephant', 'bear', 'zebra', 'giraffe', 'backpack', 'umbrella', 'handbag', 'tie', 'suitcase', 'frisbee',
'skis', 'snowboard', 'sports ball', 'kite', 'baseball bat', 'baseball glove', 'skateboard', 'surfboard',
'tennis racket', 'bottle', 'wine glass', 'cup', 'fork', 'knife', 'spoon', 'bowl', 'banana', 'apple',
'sandwich', 'orange', 'broccoli', 'carrot', 'hot dog', 'pizza', 'donut', 'cake', 'chair', 'couch',
'potted plant', 'bed', 'dining table', 'toilet', 'tv', 'laptop', 'mouse', 'remote', 'keyboard', 'cell phone',
'microwave', 'oven', 'toaster', 'sink', 'refrigerator', 'book', 'clock', 'vase', 'scissors', 'teddy bear',
'hair drier', 'toothbrush' ]
数据增强¶
参数说明¶
- num_parallel_workers: 读取数据的工作进程数
- train_transformers: 训练过程数据增强
- test_transformers: 验证过程数据增强
- ...
yaml文件样例¶
该部分参数在configs/yolov3/hyp.scratch.yaml中定义,其中train_transformers和test_transformers均为由字典组成的列表,各字典包含数据增强操作名称、发生概率及该增强方法相关的参数
data:
num_parallel_workers: 4
train_transforms:
- { func_name: mosaic, prob: 1.0, mosaic9_prob: 0.0, translate: 0.1, scale: 0.9 }
- { func_name: mixup, prob: 0.1, alpha: 8.0, beta: 8.0, needed_mosaic: True }
- { func_name: hsv_augment, prob: 1.0, hgain: 0.015, sgain: 0.7, vgain: 0.4 }
- { func_name: label_norm, xyxy2xywh_: True }
- { func_name: albumentations }
- { func_name: fliplr, prob: 0.5 }
- { func_name: label_pad, padding_size: 160, padding_value: -1 }
- { func_name: image_norm, scale: 255. }
- { func_name: image_transpose, bgr2rgb: True, hwc2chw: True }
test_transforms:
- { func_name: letterbox, scaleup: False }
- { func_name: label_norm, xyxy2xywh_: True }
- { func_name: label_pad, padding_size: 160, padding_value: -1 }
- { func_name: image_norm, scale: 255. }
- { func_name: image_transpose, bgr2rgb: True, hwc2chw: True }
模型¶
参数说明¶
- model_name: 模型名称
- depth_multiple: 模型深度因子
- width_multiple: 模型宽度因子
- stride: 特征图下采样倍数
- anchors: 预设锚框
- backbone: 模型骨干网络
- head: 模型检测头
yaml文件样例¶
该部分参数在configs/yolov3/yolov3.yaml中定义,根据backbon和head参数进行网络构建,参数以嵌套列表的形式呈现,每行代表一层模块,包含4个参数,分别是 输入层编号(-1代表上一层)、模块重复次数、模块名称和模块相应参数。用户也可以不借助yaml文件而直接在py文件中定义和注册网络。
network:
model_name: yolov3
depth_multiple: 1.0 # model depth multiple
width_multiple: 1.0 # layer channel multiple
stride: [8, 16, 32]
anchors:
- [10,13, 16,30, 33,23] # P3/8
- [30,61, 62,45, 59,119] # P4/16
- [116,90, 156,198, 373,326] # P5/32
# darknet53 backbone
backbone:
# [from, number, module, args]
[[-1, 1, ConvNormAct, [32, 3, 1]], # 0
[-1, 1, ConvNormAct, [64, 3, 2]], # 1-P1/2
[-1, 1, Bottleneck, [64]],
[-1, 1, ConvNormAct, [128, 3, 2]], # 3-P2/4
[-1, 2, Bottleneck, [128]],
[-1, 1, ConvNormAct, [256, 3, 2]], # 5-P3/8
[-1, 8, Bottleneck, [256]],
[-1, 1, ConvNormAct, [512, 3, 2]], # 7-P4/16
[-1, 8, Bottleneck, [512]],
[-1, 1, ConvNormAct, [1024, 3, 2]], # 9-P5/32
[-1, 4, Bottleneck, [1024]], # 10
]
# YOLOv3 head
head:
[[-1, 1, Bottleneck, [1024, False]],
[-1, 1, ConvNormAct, [512, 1, 1]],
[-1, 1, ConvNormAct, [1024, 3, 1]],
[-1, 1, ConvNormAct, [512, 1, 1]],
[-1, 1, ConvNormAct, [1024, 3, 1]], # 15 (P5/32-large)
[-2, 1, ConvNormAct, [256, 1, 1]],
[-1, 1, Upsample, [None, 2, 'nearest']],
[[-1, 8], 1, Concat, [1]], # cat backbone P4
[-1, 1, Bottleneck, [512, False]],
[-1, 1, Bottleneck, [512, False]],
[-1, 1, ConvNormAct, [256, 1, 1]],
[-1, 1, ConvNormAct, [512, 3, 1]], # 22 (P4/16-medium)
[-2, 1, ConvNormAct, [128, 1, 1]],
[-1, 1, Upsample, [None, 2, 'nearest']],
[[-1, 6], 1, Concat, [1]], # cat backbone P3
[-1, 1, Bottleneck, [256, False]],
[-1, 2, Bottleneck, [256, False]], # 27 (P3/8-small)
[[27, 22, 15], 1, YOLOv3Head, [nc, anchors, stride]], # Detect(P3, P4, P5)
]
损失函数¶
参数说明¶
- name: 损失函数名称
- box: box损失权重
- cls: class损失权重
- cls_pw: class损失正样本权重
- obj: object损失权重
- obj_pw: object损失正样本权重
- fl_gamma: focal loss gamma
- anchor_t: anchor shape比例阈值
- label_smoothing: 标签平滑值
yaml文件样例¶
该部分参数在configs/yolov3/hyp.scratch.yaml中定义
loss:
name: YOLOv7Loss
box: 0.05 # box loss gain
cls: 0.5 # cls loss gain
cls_pw: 1.0 # cls BCELoss positive_weight
obj: 1.0 # obj loss gain (scale with pixels)
obj_pw: 1.0 # obj BCELoss positive_weight
fl_gamma: 0.0 # focal loss gamma (efficientDet default gamma=1.5)
anchor_t: 4.0 # anchor-multiple threshold
label_smoothing: 0.0 # label smoothing epsilon
优化器¶
参数说明¶
- optimizer: 优化器名称。
- lr_init: 学习率初始值
- warmup_epochs: warmup epoch数
- warmup_momentum: warmup momentum初始值
- warmup_bias_lr: warmup bias学习率初始值
- min_warmup_step: 最小warmup step数
- group_param: 参数分组策略
- gp_weight_decay: 分组参数权重衰减系数
- start_factor: 初始学习率因数
- end_factor: 结束学习率因数
- momentum:移动平均的动量
- loss_scale:loss缩放系数
- nesterov:是否使用Nesterov Accelerated Gradient (NAG)算法更新梯度。
yaml文件样例¶
该部分参数在configs/yolov3/hyp.scratch.yaml中定义,如下示例中经过warmup阶段后的初始学习率为lr_init * start_factor = 0.01 * 1.0 = 0.01, 最终学习率为lr_init * end_factor = 0.01 * 0.01 = 0.0001
optimizer:
optimizer: momentum
lr_init: 0.01 # initial learning rate (SGD=1E-2, Adam=1E-3)
momentum: 0.937 # SGD momentum/Adam beta1
nesterov: True # update gradients with NAG(Nesterov Accelerated Gradient) algorithm
loss_scale: 1.0 # loss scale for optimizer
warmup_epochs: 3 # warmup epochs (fractions ok)
warmup_momentum: 0.8 # warmup initial momentum
warmup_bias_lr: 0.1 # warmup initial bias lr
min_warmup_step: 1000 # minimum warmup step
group_param: yolov7 # group param strategy
gp_weight_decay: 0.0005 # group param weight decay 5e-4
start_factor: 1.0
end_factor: 0.01