1. 理解scale与multi-scale的基本概念
在YOLO系列模型的训练过程中,scale和multi-scale是两个经常被提及但又容易混淆的参数。简单来说,scale主要影响单张图像的尺寸变换,而multi-scale则是在批次处理阶段引入的尺寸多样性。这两个参数虽然都与图像尺寸相关,但它们的触发时机和作用机制完全不同。
scale参数通常定义在超参数配置文件中(比如hyp.scratch.yaml),它的核心作用是在数据增强阶段对图像进行随机缩放。具体来说,当代码执行到random_perspective函数时,会生成一个随机缩放系数s,这个系数决定了图像最终的缩放比例。我实测下来发现,scale的取值范围通常在0.5到1.5之间,这意味着图像可能会被放大或缩小。
multi-scale参数则是在训练脚本(train.py)中设置的布尔值开关。当开启这个选项时,模型会在每个批次加载后随机选择一个新的输入尺寸。这个尺寸会在基础尺寸的0.5倍到1.5倍之间波动。有趣的是,YOLOv8官方已经移除了这个参数,他们的解释是这种动态尺寸调整反而会影响模型的稳定性。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 代码层面的实现差异
2.1 scale的具体实现
在datasets.py文件中,scale参数主要通过random_perspective函数发挥作用。这个函数会生成一个3x3的变换矩阵M,其中包含了旋转、平移、缩放等多种几何变换。我特别注意到缩放部分是通过cv2.getRotationMatrix2D实现的,虽然函数名带有"Rotation",但它实际上也能处理缩放变换。
python复制R = np.eye(3)
s = random.uniform(1 - scale, 1.1 + scale)
R[:2] = cv2.getRotationMatrix2D(angle=a, center=(0, 0), scale=s)
这段代码的关键在于s值的计算,它决定了图像的缩放程度。在实际项目中,我发现scale值设置过大(比如超过0.5)会导致目标物体变形严重,反而影响模型性能。
2.2 multi-scale的工作机制
multi-scale的实现相对简单,它位于训练循环中,具体在加载完一个批次的数据后执行。核心代码在train.
