训练优化
训练集增强
通过增强数据集,可以提高模型的泛化能力,使得模型能够识别更准确地识别更多变的结果
# 定义一个
augment = A.Compose([
A.RandomBrightnessContrast(brightness_limit=0.4, contrast_limit=0.4, p=0.8), # 大范围调整亮度和对比度
A.HueSaturationValue(hue_shift_limit=40, sat_shift_limit=50, val_shift_limit=40, p=0.8), # 调整色调、饱和度、明度
A.RGBShift(r_shift_limit=20, g_shift_limit=20, b_shift_limit=20, p=0.7), # RGB通道随机偏移
A.ToSepia(p=0.2), # 随机应用怀旧色调
A.ChannelShuffle(p=0.3), # 随机交换颜色通道
A.RandomGamma(gamma_limit=(80, 120), p=0.7), # 随机调整Gamma值
A.CLAHE(clip_limit=4.0, tile_grid_size=(8, 8), p=0.3), # 直方图均衡化
A.RandomToneCurve(scale=0.1, p=0.5), # 随机色调曲线调整
A.Equalize(p=0.2), # 随机直方图均衡化
A.FancyPCA(alpha=0.1, p=0.4), # 颜色抖动
],
p=1.0, # 设置总概率为1,确保每次应用增强
bbox_params=A.BboxParams(format='pascal_voc', label_fields=['category_ids']))
# ...
bboxes = []
categories = []
for category, bbox in zip(frame_anno['category'].values, frame_anno['bbox'].values):
bboxes.append(bbox)
categories.append(category_labels.index(category))
# 应用增强
if len(bboxes) > 0:
augmented = augment(image=frame, bboxes=bboxes, category_ids=categories)
frame = augmented['image']
bboxes = augmented['bboxes']
categories = augmented['category_ids']
超参数调整
通过训练前的参数调整,可以达到防止过拟合和调整权重变化速度等效果
results = model.train(
data="yolo-dataset/yolo.yaml",
epochs=40,
patience=10, # 限制无意义的训练轮数
imgsz=640,
batch=32,
lr0=0.001, # 开始训练时的学习率
lrf=0.0005, # 训练后期的学习率
mosaic=0.5, # 训练前期降低Mosaic的混杂度,后期又提高到0.7左右增加训练样本的复杂性
momentum=0.95, # 提高动量,以更强的动量来平滑优化过程
weight_decay=0.001, # 权重衰减,增加模型的正则化力度,抑制模型复杂度
dropout=0.1, # 随机丢弃部分神经元的输出,减少模型的依赖性,提高泛化能力
label_smoothing=0.05, # 标签平滑,减少模型对训练数据的置信程度,从而帮助提高泛化性能
conf=0.3, # 设置置信度,低于此标准判定为识别失败
warmup_epochs=5.0, # 设置热身阶段轮数
warmup_bias_lr=0.01, # 设置热身阶段偏置学习率
workers=12, # 增加加载数据的线程数,提高加载速率
cos_lr=True # 余弦退火,平滑地调整学习率,有助于稳定训练过程
)