YOLOv5配置文件与超参数解析

来源:YOLOv5深度剖析之配置与初始化超参数

以yolov5s.yaml文件为例介绍网络配置文件的参数。

一、配置文件

1.1模型的深度和宽度

# parameters  
nc: 80  # number of classes  
depth_multiple: 0.33  # model depth multiple  
width_multiple: 0.50  # layer channel multiple

nc:目标的类别数量。
depth_multiple:模型深度 控制模块的数量,当模块的数量number不为1时,模块的数量 = number * depth。
width_multiple:模型的宽度 控制卷积核的数量 ,卷积核的数量 = 数量 * width。

1.2Anchors

# anchors  
anchors:  
  - [10,13, 16,30, 33,23]  # P3/8  检测小目标  10,13是一组尺寸,一共三组  
  - [30,61, 62,45, 59,119]  # P4/16     
  - [116,90, 156,198, 373,326]  # P5/32  检测大目标

yolov5已经在yaml预设好了输入图像为640*640分辨率对应的anchor尺寸,yolov5的anchor也是在大特征图上检测小目标,在小特征图上检测大目标。三个特征图,每个特征图上的格子有三种尺寸的anchor。

1.3Backbone

# YOLOv5 backbone  
backbone:  
  # from   第一列 输入来自哪一层  -1代表上一层, 4代表第4层     
  # number 第二列 卷积核的数量    最终数量需要乘上width  
  # module 第三列 模块名称 包括:Conv Focus BottleneckCSP  SPP  
  # args   第四列 模块的参数   
  # [from, number, module, args]  
  [[-1, 1, Focus, [64, 3]],  # 0-P1/2  
   [-1, 1, Conv, [128, 3, 2]],  # 1-P2/4 卷积核的数量 = 128 * wedith = 128*0.5=64        
   [-1, 3, BottleneckCSP, [128]],       模块数量 = 3 * depth =3*0.33=1  
   [-1, 1, Conv, [256, 3, 2]],  # 3-P3/8     
   [-1, 9, BottleneckCSP, [256]],       模块数量 = 9 * depth =9*0.33=3  
   [-1, 1, Conv, [512, 3, 2]],  # 5-P4/16      
   [-1, 9, BottleneckCSP, [512]],  
   [-1, 1, Conv, [1024, 3, 2]],  # 7-P5/32      
   [-1, 1, SPP, [1024, [5, 9, 13]]],  
   [-1, 3, BottleneckCSP, [1024, False]],  # 9  
  ]

a、Focus:对特征图的切片操作,模块参数args分析: [[-1, 1, Focus, [64, 3]] 中的 [64, 3] 解析得到[3, 32, 3] ,输入为3(RGB),输出为640.5 = 32,3是卷积核 33
b、Conv:这里的Conv由conv+Bn+Leaky_relu激活函数三者组成,模块参数args分析:[-1, 1, Conv, [128, 3, 2]]中的128 是卷积核数量,最终数量需要乘上width = 128 0.5 = 64,3是卷积核 33,2是步长。
c、BottleneckCSP:借鉴CSPNet网络结构,由三个卷积层和X个Res unint模块Concate组成,如果带有False参数就是没有使用Res unint模块,而是采用conv+Bn+Leaky_relu
d、SPP:采用1×1,5×5,9×9,13×13的最大池化的方式,进行多尺度融合。

1.4Head

# YOLOv5 head  
head:  
  [[-1, 1, Conv, [512, 1, 1]],  
   [-1, 1, nn.Upsample, [None, 2, 'nearest']],     上采样  
   [[-1, 6], 1, Concat, [1]],#cat backbone P4 [-1, 6]代表cat上一层和第6层  
   [-1, 3, BottleneckCSP, [512, False]],  # 13 第13层        
     
   [-1, 1, Conv, [256, 1, 1]],  
   [-1, 1, nn.Upsample, [None, 2, 'nearest']],     上采样  
   [[-1, 4], 1, Concat, [1]],#cat backbone P3 [-1,4]代表cat上一层和第4层  
   [-1, 3, BottleneckCSP, [256, False]], # 17 (P3/8-small)    第17层  
  
   [-1, 1, Conv, [256, 3, 2]],  
   [[-1, 14], 1, Concat, [1]], #cat head P4 [-1,14]代表cat上一层和第14层  
   [-1, 3, BottleneckCSP, [512, False]],  # 20 (P4/16-medium)  第20层  
  
   [-1, 1, Conv, [512, 3, 2]],                       
   [[-1, 10], 1, Concat, [1]], #cat head P5 [-1,10]代表cat上一层和第10层  
   [-1, 3, BottleneckCSP, [1024, False]],  # 23 (P5/32-large)  第23层  
     
   [[17, 20, 23], 1, Detect, [nc, anchors]], # Detect(P3, P4, P5)  
  ]#Detect [17, 20, 23] 代表输入的层数17和20和23

Yolov5 Head 包括 Neck 和 Detector head 两部分,Neck部分使用了PANet的结构, Detector head使用和yolov3一样的head。其中,BottleneckCSP带有False参数说明没有使用Res unit结构而是采用了conv+Bn+Leaky_relu。

二、初始化超参数

2.1hpy超参数

hpy超参数包括:lr、weight_decay、momentum和图像处理的参数等,Yolov5已经设置好了训练Coco和 Voc数据集的超参数,分别data文件夹下的hyp.finetune.yaml和hyp.scratch.yaml。

# Hyperparameters for VOC finetuning  
# ython train.py --batch 64 --weights yolov5m.pt --data voc.yaml --img 512 --epochs 50  
lr0: 0.0032  #学习率  
lrf: 0.12    # 余弦退火超参数  
momentum: 0.843  # 学习率动量  
weight_decay: 0.00036  # 权重衰减系数  
warmup_epochs: 2.0  #预热学习epoch  
warmup_momentum: 0.5 #预热学习率动量  
warmup_bias_lr: 0.05 #预热学习率  
box: 0.0296  # giou损失的系数  
cls: 0.243  # 分类损失的系数  
cls_pw: 0.631 #分类BCELoss中正样本的权重  
obj: 0.301  # 有无物体损失的系数  
obj_pw: 0.911  # 有无物体BCELoss中正样本的权重  
iou_t: 0.2    # 标签与anchors的iou阈值iou training threshold  
anchor_t: 2.91  # 标签的长h宽w/anchor的长h_a宽w_a阈值, 即h/h_a, w/w_a都要在(1/2.91, 2.91)之间anchor-multiple threshold  
# anchors: 3.63  
# 下面是一些数据增强的系数, 包括颜色空间和图片空间  
fl_gamma: 0.0  
hsv_h: 0.0138  # 色调  
hsv_s: 0.664   # 饱和度  
hsv_v: 0.464   # 明度  
degrees: 0.373 #旋转角度  
translate: 0.245  # 水平和垂直平移  
scale: 0.898   # 缩放  
shear: 0.602  # 剪切  
perspective: 0.0  # 透视变换参数  
flipud: 0.00856  # 上下翻转  
fliplr: 0.5   # 左右翻转  
mosaic: 1.0   #进行mosaic的概率  
mixup: 0.243  #进行mixup的概率

训练别的数据集可以自定义超参数在train.py的meta字典里面修改具体的超参数也可以自己添加hpy.yaml的超参数配置文件,在训练参数的—hpy设置好超参数配置文件的路径就行。

2.2训练超参数

训练超参数包括配置文件yaml的选择,和训练图片的大小,预训练,batch,epoch等。可以直接在train.py代码中修改也可以在命令行执行时修改,如:$ python train.py --data coco.yaml --cfg yolov5s.yaml --weights ‘’ --batch-size 64

–data 设置数据的配置文件 --cfg 设置网络结构的配置文件 –weihts 加载预训练模型的路径

    parser = argparse.ArgumentParser()
    parser.add_argument('--cfg', type=str, default='models/yolov5x.yaml',
                        help='opt.cfg 模型配置和网络结构的yaml文件路径')
    parser.add_argument('--data', type=str, default='data/test.yaml',
                        help='opt.data 数据集配置的yaml文件路径,包括数据集的路径,类名等关键信息')
    parser.add_argument('--hyp', type=str, default='',
                        help='opt.hyp 超参数配置的yaml文件路径')
    parser.add_argument('--epochs', type=int, default=3,
                        help='opt.epochs 训练总轮次')
    parser.add_argument('--batch-size', type=int, default=4,
                        help='opt.batch_size 每个轮次下图片训练的批次大小')
    parser.add_argument('--img-size', nargs='+', type=int, default=[608, 608],
                        help='opt.img_size 输入图像的分辨率大小,注意这里是训练和mAP测试的图像尺寸,而不是一个图像的宽高')
    parser.add_argument('--rect', action='store_true',
                        help='opt.rect 是否采用矩形图像训练,默认是False')
    parser.add_argument('--resume', nargs='?', const='get_last', default=False,
                        help='opt.resume 从给定的path/last.pt恢复训练,如果为空,则从最近保存的path/last.pt恢复训练')
    parser.add_argument('--nosave', action='store_true',
                        help='opt.nosave 保存模型,只保存最后的检查点,默认为False')
    parser.add_argument('--notest', action='store_true',
                        help='opt.notest 训练中不进行test,只测试最后一个轮次,默认为False')
    parser.add_argument('--noautoanchor', action='store_true',
                        help='opt.noautoanchor 不自动调整anchor,默认为False')
    parser.add_argument('--evolve', action='store_true',
                        help='opt.evolve 是否进行超参数进化,默认为False')
    parser.add_argument('--bucket', type=str, default='',
                        help='opt.bucket 未研究清楚')
    parser.add_argument('--cache-images', action='store_true',
                        help='opt.cache_images 是否提前缓存图片到内存,以加快训练速度,默认为False')
    parser.add_argument('--weights', type=str, default='runs/yolov5x.pt',
                        help='opt.weights 加载与训练的权重文件')
    parser.add_argument('--name', default='',
                        help='opt.name 数据集名字,如果设置:results.txt to results_name.txt,默认无')
    parser.add_argument('--device', default='0',
                        help='opt.device 训练的设备设置 , i.e. 0 or 0,1,2,3 or cpu')
    parser.add_argument('--multi-scale', action='store_true',
                        help='opt.multi_scale 是否进行多尺度训练,默认为False +/- 50%%')
    parser.add_argument('--single-cls', action='store_true',
                        help='opt.single_cls 将所有数据按照一个类别进行训练')
    parser.add_argument('--adam', action='store_true',
                        help='opt.adam 是否使用 torch.optim.Adam() 优化器,默认是False')
    parser.add_argument('--sync-bn', action='store_true',
                        help='opt.sync_bn 是否使用跨卡同步BN,仅在DDP模式下有效')
    parser.add_argument('--local_rank', type=int, default=-1,
                        help='DDP参数,不要修改')
    opt = parser.parse_args()

猜你喜欢

转载自blog.csdn.net/weixin_45768644/article/details/128052428