YOLOv4的cfg参数及训练

时间:2024-11-19 20:45:46

cfg参数

Parameters in the [net] section
Parameters in the different layers
net层

[net]
batch=96 # 每次iteration训练的时候,输入的图片数量
subdivisions=48	# 将每一次的batch数量,分成subdivision对应数字的份数,一份一份的跑完后,在一起打包算作完成一次iteration
width=512 # 大小为32的倍数
momentum=0.9 # 动量,影响梯度下降到最优的速度,一般默认0.9
decay=0.0005 # 权重衰减正则系数,防止过拟合
angle=0 # 旋转角度,生成更多训练样本
saturation=1.5 # 调整饱和度
exposure=1.5 # 调整曝光度
hue=.1 # 调整色调
learning_rate=0.001
burn_in=1000 # 学习率控制的参数,在迭代次数大于burn_in时,采用policy的更新方式:0.001 * pow(iterations/1000, 4)
max_batches=500200 # 最大迭代次数
policy=steps
steps=400000,450000 # 学习率变动步长,Steps和scales相互对应, 这两个参数设置学习率的变化, 根据batch_num调整学习率
scales=.1,.1 # 学习率变动因子,迭代到400000次时,学习率x0.1; 450000次迭代时,学习率又会在前一个学习率的基础上x0.1

shortcut层

[shortcut] # shortcut部分是卷积的跨层连接,就像Resnet中使用的一样
from=-2 # 参数from是−2,意思是shortcut的输出是通过与先前的倒数第二层网络相加而得到, 跨越连接
activation=linear
idx=6

route层

[route]
layers=-1, -3 # 在当前层引出之前卷积所得到的特征层,这里的-1,-3代表
			  # 将前一层输出的feature和前第3层输出的feature concat
			  # 以后再作为当前层的输出,也就是作为下一个卷积的输入。所
			  # 以route输出的通道数要和下一个conv输入的通道一致

yolo层前的conv层

[convolutional]
batch_normalize=0 # BN,是否做BN操作
pad=1 # 如果pad为0,padding由padding参数指定
      # 如果pad为1,padding大小为size/2,padding应该是对输入图像左边缘拓展的像素数量
filters=42  # =num(yolo层个数)*(classes+5),5是5个坐标,<x_center> <y_center> <width> <height><object-class>

yolo层

[yolo]
mask=6,7,8 # anchors的索引值,如果mask的值是0,1,2,这意味着使用第一,第二和第三个anchor
anchors = 7, 10, 14, 24, 27, 43, 32, 97, 57, 64, 92, 109, 73, 175, 141, 178, 144, 291
classes=9 # 类别数目
focal_loss=1 # 使用focal loss
num=9 # 每个grid cell预测几个box,和anchors的数量一致
jitter=.3 # 通过抖动来防止过拟合
ignore_thresh=.7 # 当预测的检测框与ground true的IOU大于ignore_thresh的时候,参与loss的计算,否则,检测框的不参与损失计算
truth_thresh=1
random=1 # 多尺度训练:如果显存小,设置random=0,关闭多尺度训练。
         # random设置成1,可以增加检测精度precision,每次迭代图片大小随机从原尺寸的/1.4到*1.4,步长为32,如果为0,每次训练大小与输入大小一致
         # 当打开随机多尺度训练时,前面设置的网络输入尺寸width和height其实就不起作用了,尺寸会从原尺寸的0.77到1.46之间随机取值
         # 每10轮随机改变一次,一般建议可以根据自己需要修改随机尺度训练的范围,这样可以增大batch,可以自行尝试!

训练自己的数据集

  • 创建文件,将自己的类别按行输入
  • 创建文件,替换自己的训练集路径,测试集路径
classes= 2
train  = data/
valid  = data/
names = data/
backup = backup/
  • imgsannos在同一个文件夹下,且名字相同,后缀不同(.jpg,.txt)
  • 修改anchor,使用yolov4自带的K-Means聚类算法,得到9个anchor
./darknet detector calc_anchors data/ -num_of_clusters 9 -width 416 -height 416
  • 训练命令
./darknet detector train data/ data/ -gpus 0,1,2,3,4,5,6,7 -dont_show -mjpeg_port 8092 -map
  • 查看模型的训练曲线
ssh -L 127.0.0.1:8093:127.0.0.1:8093 user@IP -p (端口号)
  • 评估模型
---mAP50
./darknet detector map cfg/v4/ cfg/v4/new_sppv2car.cfg cfg/new_sppv2car_best.weights
---mAP75
./darknet detector map cfg/v4/ cfg/v4/new_sppv2car.cfg cfg/new_sppv2car_best.weights -iou_thresh 0.75
  • 检测图片并输出
./darknet detector test cfg/v4/ cfg/v4/new_sppv2car.cfg cfg/new_sppv2car_best.weights -ext_output -dont_show < data/ >  -gpus 0,1,2,3
  • 检测视频并输出
./darknet detector demo cfg/v4/ cfg/v4/new_sppv2car.cfg cfg/new_sppv2car_best.weights  -out_filename 

查看模型结构:

使用Netron,将cfg文件加载后,即可看到网络的结构。

参考博客:
yolo—参数解释之cfg文件参数
YOLOV4在linux下训练自己数据集
如何部署yolov4