配置文件学习

YOLOv6 采用模块化设计,用户可以通过配置文件的参数配置进行功能模块的切换和实验。 以 yolov6s_finetune.py 为例,我们将根据不同的功能模块分别介绍配置文件中的各个字段的定义及使用指南。

模型配置

我们使用model的相关字段来完成检测网络的模型结构定义,包括backbone,neck,head,loss等类型的配置。

model = dict(
    type='YOLOv6s', #网络类型
    pretrained='./weights/yolov6s.pt', #指定COCO预训练模型权重的路径
    depth_multiple=0.33, #控制网络结构深度的缩放因子
    width_multiple=0.50, #控制网络结构宽度的缩放因子
    backbone=dict(
        type='EfficientRep', #主干网络的类别,目前可支持'EfficientRep', 'CSPBepBackbone','EfficientRep6','CSPBepBackbone_P6' 4种
        num_repeats=[1, 6, 12, 18, 6], #主干网络每个stage中基础模块的重复个数
        out_channels=[64, 128, 256, 512, 1024], #主干网络每个stage中输出的通道数
        fuse_P2=True, #是否融合骨干网络P2层特征
        cspsppf=True, #是否使用CSPSPPF模块以替换SPPF模块
        ),
    neck=dict(
        type='RepPANNeck', #检测器 Neck 的类别,目前可选用'RepPANNeck', 'CSPRepPANNeck','RepBiFPANNeck','CSPRepBiFPANNeck','RepBiFPANNeck6','CSPRepBiFPANNeck_P6' 6种
        num_repeats=[12, 12, 12, 12], # Neck网络连接每个特征层基础模块的重复个数
        out_channels=[256, 128, 128, 256, 256, 512],# Neck网络连接每个特征层的上采样/下采样模块通道数
        ),
    head=dict(
        type='EffiDeHead', #检测头类型,目前暂时仅支持此类型
        in_channels=[128, 256, 512], #检测头每个特征层的输入通道数
        num_layers=3, #检测头的特征层数量, P6模型此值为4
        begin_indices=24, #检测头的起始层数
        anchors=1, #每个预测特征图单位网格对应的anchor数
        out_indices=[17, 20, 23], #检测头的输出索引号
        anchors=3, #fuse_ab模式下,每个特征点设置3个anchors
        anchors_init=[[10,13, 19,19, 33,23], 
                      [30,61, 59,59, 59,119], 
                      [116,90, 185,185, 373,326]],#fuse_ab模式下,anchors初始值
        strides=[8, 16, 32], #检测头每个特征层的下采样步长
        atss_warmup_epoch=0, #标签分配策略使用ATSS热身轮数,fuse_ab模式下设为0
        iou_type='giou', #iou损失的类型,目前可支持 'giou','diou','ciou','siou' 4种
        use_dfl=False, #是否使用distributed focal loss,若后续想继续蒸馏,需要设为True以保留DFL分支
        reg_max=0, #若 use_dfl 为 False, 则 reg_max 设为 0;若 use_dfl 为 True, 则reg_max 设为 16
        distill_weight={
            'class': 1.0, #蒸馏训练分类loss的初始权重
            'dfl': 1.0, #蒸馏训练回归loss的初始权重
        },
    )
)

优化相关配置

这里可以通过修改相关字段的值来完成训练时优化相关的配置。

solver = dict(
    optim='SGD', #优化器类型,目前支持'SGD','Adam' 2种
    lr_scheduler='Cosine', #学习率衰减策略,目前支持'Cosine','Constant' 2种
    lr0=0.0032, #初始学习率
    lrf=0.12, #最终学习率
    momentum=0.843, #动量
    weight_decay=0.00036, #权重衰减
    warmup_epochs=2.0, #warmup轮数
    warmup_momentum=0.5, #warmup动量
    warmup_bias_lr=0.05 #warmup时偏置的初始学习率
)

数据增强超参配置

这里可以通过修改相关字段的值来修改训练时数据增强的策略。

data_aug = dict(
    hsv_h=0.0138, #hsv中h通道随机增强
    hsv_s=0.664, #hsv中s通道随机增强
    hsv_v=0.464, #hsv中v通道随机增强
    degrees=0.373, # 最大旋转角度
    translate=0.245, #最大平移比例(0.5+translate)
    scale=0.898, #随机尺度缩放(1+scale)
    shear=0.602, #最大错切角度
    flipud=0.00856, #上下翻转概率
    fliplr=0.5, #左右翻转概率
    mosaic=1.0, # Mosaic 数据增强概率
    mixup=0.243, # Mixup 数据增强概率
)

评估参数配置

除了在运行评估脚本时通过命令参数指定评估方式之外,我们还支持通过配置文件对相关参数进行配置。 其中,img_size,pading and scale coordmetric 相关的字段可支持 string 类型或 list 类型。

如果是 string 类型(示例一),表示指定模型评估时的配置(包括训练时评估和训练完成后单独评估);如果是 list 类型(示例二),需要包含两个值,前者表示训练过程中模型评估的参数配置,后者表示训练完成后单独进行模型评估时的配置。

示例一:

eval_params = dict(
    img_size=640, #评估时图像尺寸大小
    conf_thres=0.03, #评估时置信度阈值
    iou_thres=0.65, #评估时IoU阈值

    #pading and scale coord #灰边填充以及坐标转换相关处理,能提升模型精度指标
    test_load_size=634, #评估时加载图片后对图片进行resize到此像素大小
    letterbox_return_int=True, #letterbox填充时偏移量返回int值
    force_no_pad=True, #矩形推理时不对图像进行额外填充(以32像素为步长进行灰边填充)
    not_infer_on_rect=True, #评估时是否使用矩形推理还是方形推理,True表示方形推理(如640*640),False表示矩形推理(如640*384)可加速推理过程
    scale_exact=True, #letterbox图片坐标转换原图时长宽缩放分开处理,坐标更精确

    #metric
    verbose=False, #是否需要输出每个类别的指标
    do_coco_metric=True, #是否采用 Pycocotool 进行指标评估
    do_pr_metric=True, #是否需要输出 Precision/ Recall/ F1等指标
    plot_curve=False, #是否需要画 PR曲线,若为True,可以在评估保存目录`runs/val/xxx`下找到对应的曲线,需要在 do_pr_metric=True 前提下使用
    plot_confusion_matrix=False #是否需要输出混淆矩阵,若为True,可以在评估保存目录`runs/val/xxx`下找到对应的混淆矩阵可视化结果,需要在 do_pr_metric=True 前提下使用
)

示例二:

# list类型参数说明:前者表示训练过程中模型评估的参数配置,后者表示单独进行模型评估时的配置。
# 每个字段的参数含义及使用请参考示例一的说明。

eval_params = dict(
    img_size=[None, 640],  #前者 None表示采用默认值,默认为640.
    conf_thres=0.03,
    iou_thres=0.65,

    #pading and scale coord 
    test_load_size=[None, 638], #前者 None 表示采用默认值,默认为640.
    letterbox_return_int=[False, True],
    force_no_pad=[False, True],
    not_infer_on_rect=[False, True],
    scale_exact=[False, True],

    #metric
    verbose=False,
    do_coco_metric=[True, True],
    do_pr_metric=[False, True],
    plot_curve=[False, False],
    plot_confusion_matrix=[False, False]
)