前言
本文的Task3对Task1的baseline代码继续进行优化的过程。
一、数据集增强
数据增强是机器学习和深度学习中常用的技术,用于通过从现有数据集中生成新的训练样本来提高模型的泛化能力。
常见的增强技术包括翻转、旋转、缩放和颜色调整。例如 Albumentations、Imgaug 和 TensorFlow的 ImageDataGenerator等多个库可以生成这些增强。
数据增强方法 | 描述 |
---|---|
Mosaic Augmentation | 将四张训练图像组合成一张,增加物体尺度和位置的多样性。 |
Copy-Paste Augmentation | 复制一个图像的随机区域并粘贴到另一个图像上,生成新的训练样本。 |
Random Affine Transformations | 包括图像的随机旋转、缩放、平移和剪切,增加对几何变换的鲁棒性。 |
MixUp Augmentation | 通过线性组合两张图像及其标签创造合成图像,增加特征空间的泛化。 |
Albumentations | 一个支持多种增强技术的图像增强库,提供灵活的增强管道定义。 |
HSV Augmentation | 对图像的色相、饱和度和亮度进行随机变化,改变颜色属性。 |
Random Horizontal Flip | 沿水平轴随机翻转图像,增加对镜像变化的不变性。 |
如下图所示就是数据增强的例子:
参数名 | 类型 | 默认值 | 取值范围 | 描述 |
---|---|---|---|---|
hsv_h | float | 0.015 | 0.0 - 1.0 | 调整图像色调,引入颜色变异性,提高不同光照下的泛化能力。 |
hsv_s | float | 0.7 | 0.0 - 1.0 | 调整图像饱和度,改变颜色强度,模拟不同环境条件。 |
hsv_v | float | 0.4 | 0.0 - 1.0 | 调整图像亮度,帮助模型在不同光照下表现良好。 |
degrees | float | 0 | -180 - +180 | 随机旋转图像,提高识别不同方向物体的能力。 |
translate | float | 0.1 | 0.0 - 1.0 | 平移图像,帮助模型学习检测部分可见物体。 |
scale | float | 0.5 | >=0.0 | 缩放图像,模拟物体与相机之间的不同距离。 |
shear | float | 0 | -180 - +180 | 剪切图像,模拟从不同角度观察物体的效果。 |
perspective | float | 0 | 0.0 - 0.001 | 应用随机透视变换,增强模型对3D空间物体的理解能力。 |
flipud | float | 0 | 0.0 - 1.0 | 上下翻转图像,增加数据变异性,不影响物体特征。 |
fliplr | float | 0.5 | 0.0 - 1.0 | 左右翻转图像,有助于学习对称物体和增加数据集多样性。 |
bgr | float | 0 | 0.0 - 1.0 | 翻转图像通道从RGB到BGR,提高对通道顺序错误的鲁棒性。 |
mosaic | float | 1 | 0.0 - 1.0 | 合成四张图像,模拟不同场景组合和物体交互,增强复杂场景理解。 |
mixup | float | 0 | 0.0 - 1.0 | 混合两张图像及标签,创建合成图像,增强泛化能力。 |
copy_paste | float | 0 | 0.0 - 1.0 | 复制物体并粘贴到另一图像,增加实例和学习遮挡。 |
auto_augment | str | randaugment | - | 自动应用预定义增强策略,优化分类任务。 |
erasing | float | 0.4 | 0.0 - 0.9 | 随机擦除图像部分,鼓励模型关注不明显特征。 |
二、设置 YOLO 模型训练参数
YOLO 模型的训练设置包括多种超参数和配置,这些设置会影响模型的性能、速度和准确性。
微调涉及采用预先训练的模型并调整其参数以提高特定任务或数据集的性能。该过程也称为模型再训练,使模型能够更好地理解和预测在实际应用中将遇到的特定数据的结果。
通常,在初始训练时期,学习率从低开始,逐渐增加以稳定训练过程。但是,由于预训练模型已经从以前的数据集中学习了一些特征,因此立即从更高的学习率开始可能更有益。在 YOLO 中绝大部分参数都可以使用默认值。
参数 | 描述 |
---|---|
imgsz | 训练时的目标图像尺寸,所有图像在此尺寸下缩放。 |
save_period | 保存模型检查点的频率(周期数),-1 表示禁用。 |
device | 用于训练的计算设备,可以是单个或多个 GPU,CPU 或苹果硅的 MPS。 |
optimizer | 训练中使用的优化器,如 SGD、Adam 等,或 ‘auto’ 以根据模型配置自动选择。 |
momentum | SGD 的动量因子或 Adam 优化器的 beta1。 |
weight_decay | L2 正则化项。 |
warmup_epochs | 学习率预热的周期数。 |
warmup_momentum | 预热阶段的初始动量。 |
warmup_bias_lr | 预热阶段偏置参数的学习率。 |
box | 边界框损失在损失函数中的权重。 |
cls | 分类损失在总损失函数中的权重。 |
dfl | 分布焦点损失的权重。 |
三、模型微调
在Task2的基础上,我仍然使用8张4090显卡进行yolov8x更多epoch的训练,同时修改了一些超参数。
results = model.train(data="/mnt/sdb1/yolo-dataset/yolo.yaml", epochs=10, imgsz=1280, batch=32, device="0,1,2,3,4,5,6,7", mixup=0.4, copy_paste=0.5, mosaic=0)
results = model(path, conf=0.25, imgsz=1280, verbose=False, augment=True)
但是令人遗憾的是,可能mosaic不能设置成0,因为可能需要增加物体位置和尺度的多样性。导致最后的提升比较微小,从0.132提升到了0.137。
类别 | 目标数量 | 检测数量 | 精度(Precision) | 召回率(Recall) | F1 分数 | mAP@0.5 |
---|---|---|---|---|---|---|
all | 2595 | 19658 | 0.707 | 0.237 | 0.33 | 0.233 |
非机动车违停 | 2591 | 12666 | 0.829 | 0.635 | 0.744 | 0.447 |
机动车违停 | 2591 | 5737 | 0.999 | 0.314 | 0.564 | 0.484 |
垃圾桶满溢 | 791 | 791 | 1.0 | 0.0 | 0.0 | 0.0 |
违法经营 | 232 | 464 | 0.0 | 0.0 | 0.0134 | 0.00136 |
而且从训练来看,训练10个epoch过程中差别不是很大,说明可能存在过拟合的问题。
最后我查看群友们的建议,发现比赛的数据存在严重的数据集不均衡的问题,所以我重新使用一张4090,换用了另一种训练集:验证集为4:1比例的数据划分。
类别 | 目标数量 | 检测数量 | 精度(Precision) | 召回率(Recall) | F1 分数 | mAP@0.5 |
---|---|---|---|---|---|---|
all | 9307 | 35561 | 0.634 | 0.644 | 0.651 | 0.485 |
非机动车违停 | 9306 | 24128 | 0.904 | 0.931 | 0.957 | 0.681 |
机动车违停 | 9211 | 11222 | 1.0 | 1.0 | 0.995 | 0.774 |
垃圾桶满溢 | 211 | 211 | 0.0 | 0.0 | 0.0 | 0.0 |
此时的成绩提升到了0.175,提升比较大,说明数据集的标签均衡是非常重要的影响因素。
总结
本次城市治理的违规行为识别的比赛到此就完成所有步骤了,以后有机会还会在此基础上继续深入研究,挑战更多可能!