前言
写这个主演是突然想起来,yolo模型只是打标签然后训练,尽量多增加训练轮数,就在想有没有别的方法。所以搜了一下,还真不少,那就在这里简单归类一下吧。
数据优化
旋转、缩放、平移、翻转
这个数据就是指我们训练的数据无论是数据集还是训练集。
首先就是数据增强,yolo是目标检测模型,目标检测想要更精确更快就需要数据的特征更加明显,更加有差异化,数据的特征更加完整,这样最后的模型会更好。
方法有对图像的旋转、缩放、平移、翻转,例如,假设你正在进行人脸检测,数据集中有很多正面照片。你可以对照片进行旋转、缩放和翻转,这样就能模拟不同角度、不同距离的面部图像。
当然也有使用 albumentations
或 torchvision.transforms
进行数据增强:Albumentations 和 torchvision.transforms
是用于 计算机视觉任务的数据增强工具库。下面我们详细介绍他的使用方法以及简单示范代码,还有两者的区别。
torchvision.transforms
-
所属框架:PyTorch 的官方库(
torchvision
的一部分)。 -
适用场景:与 PyTorch 深度集成,适合标准的图像分类任务。
-
特点:
-
简单易用:直接与 PyTorch 的
Dataset
和DataLoader
结合使用。 -
基础增强:提供常见的变换,如裁剪、翻转、旋转、颜色调整(亮度、对比度)等。
-
轻量级:适合简单任务,但对复杂任务(如目标检测、分割)的标注处理支持较弱。
-
下面是简单代码
from torchvision import transforms # 导入PyTorch的transforms模块
# 定义一个组合变换操作(按顺序执行)
transform = transforms.Compose([
transforms.RandomResizedCrop(224), # 随机裁剪并缩放到224x224
transforms.RandomHorizontalFlip(), # 以50%概率水平翻转图像
transforms.ColorJitter(brightness=0.2, contrast=0.2), # 随机调整亮度和对比度
transforms.ToTensor(), # 将图像转换为Tensor格式(并归一化到[0,1])
])
# 应用到数据集
dataset = MyDataset(transform=transform) # 将增强逻辑绑定到自定义数据集
1. transforms.Compose
-
作用:将多个数据增强操作按顺序组合成一个流水线。
-
顺序重要性:某些操作需要特定顺序(例如,
ToTensor
通常放在最后,因为PyTorch模型需要输入为Tensor格式)。
都是小白,所以我会尽量写的繁琐一点
2. transforms.RandomResizedCrop(224)
-
功能:
-
随机选择一个区域裁剪图像,然后将该区域缩放到
224x224
像素。 -
通过随机缩放(默认范围
[0.08, 1.0]
)和随机宽高比(默认比例[3/4, 4/3]
)增加数据多样性。
-
-
适用场景:分类任务中模拟不同视角或物体比例的变化。
3. transforms.RandomHorizontalFlip()
-
功能:以 50%概率 水平翻转图像。
-
作用:增加镜像对称性的数据多样性(例如,对猫、狗等对称物体有效)。
-
注意:对文字类图像(如“STOP”标志)可能不适用。
4. transforms.ColorJitter(brightness=0.2, contrast=0.2)
-
功能:
-
随机调整图像亮度(
brightness
参数,变化幅度为原始值的[0.8, 1.2]
倍)。 -
随机调整图像对比度(
contrast
参数,变化幅度为原始值的[0.8, 1.2]
倍)。
-
-
作用:模拟光照条件变化,防止模型过度依赖颜色特征。
5. transforms.ToTensor()
-
功能:
-
将图像从
PIL.Image
或numpy.ndarray
转换为torch.Tensor
格式。 -
自动归一化:将像素值从
[0, 255]
缩放到[0.0, 1.0]
。 -
维度转换:将图像格式从
(H, W, C)
(Height, Width, Channel)转换为(C, H, W)
(PyTorch标准格式)。
-
6. dataset = MyDataset(transform=transform)
-
含义:假设
MyDataset
是一个自定义数据集类,需要在其构造函数中接收transform
参数。 -
内部逻辑:在数据加载时,每个图像会依次应用
transform
流水线中的操作。
Albumentations
-
定位:第三方库,专为高效数据增强设计,支持多种计算机视觉任务。
-
适用场景:目标检测、图像分割、关键点检测等需要处理复杂标注的任务。
-
特点:
-
高性能:基于 OpenCV 实现,速度比
torchvision
更快。 -
丰富变换:提供 70+ 种增强方法(如
GridDropout
、MotionBlur
、OpticalDistortion
等)。 -
标注感知:自动处理图像变换后的标注(如边界框、掩码、关键点),无需手动调整。
-
多框架兼容:支持 PyTorch、TensorFlow 等框架。
-
代码实例
import albumentations as A # 导入Albumentations库
# 定义数据增强流水线(支持边界框自动变换)
transform = A.Compose([
A.RandomResizedCrop(224, 224), # 随机裁剪并缩放到224x224
A.HorizontalFlip(p=0.5), # 50%概率水平翻转
A.RGBShift(r_shift_limit=20, g_shift_limit=20, b_shift_limit=20), # RGB通道随机偏移
A.Normalize(), # 标准化图像数据
], bbox_params=A.BboxParams(format='coco')) # 声明边界框格式为COCO
# 应用增强(同时处理图像和边界框)
augmented = transform(image=image, bboxes=bboxes)
new_image, new_bboxes = augmented['image'], augmented['bboxes']
1. A.Compose
-
作用:将多个增强操作组合成一个流水线,按顺序执行。
-
关键参数
bbox_params
:
指定边界框的格式和处理规则(此处使用 COCO 格式[x_min, y_min, width, height]
),Albumentations 会自动处理几何变换后的边界框坐标。
2. 增强操作解析
操作 | 功能 | 参数说明 |
---|---|---|
A.RandomResizedCrop(224, 224) | 随机选择区域裁剪图像,并缩放到指定尺寸。支持保持宽高比或随机宽高比。 | - 默认缩放比例范围 [0.08, 1.0] ,宽高比范围 [3/4, 4/3] 。 |
A.HorizontalFlip(p=0.5) | 以 p=0.5 的概率水平翻转图像。边界框坐标会同步翻转。 | - p 控制触发概率(默认 0.5 )。 |
A.RGBShift(...) | 随机对图像的 R/G/B 通道值进行偏移,模拟光照或传感器差异。 | - *_shift_limit=20 表示每个通道的偏移范围是 [-20, 20] 。 |
A.Normalize() | 标准化图像数据(默认使用 ImageNet 均值和标准差:mean=(0.485, 0.456, 0.406), std=(0.229, 0.224, 0.225) )。 | - 可通过 mean 和 std 参数自定义。 |
3. 边界框处理 (bbox_params
)
-
作用:确保几何变换(如裁剪、翻转)后,边界框坐标正确更新。
-
格式支持:
-
format='coco'
:边界框格式为[x_min, y_min, width, height]
(绝对坐标)。 -
其他格式:
pascal_voc
([x_min, y_min, x_max, y_max]
)、yolo
(归一化的[x_center, y_center, width, height]
)等。
-
-
自动处理逻辑:
当图像被裁剪或翻转时,Albumentations 会计算新图像中边界框的位置,并过滤掉完全越界的框(可通过min_area
和min_visibility
参数控制保留条件)。
4. 应用增强 transform(image=image, bboxes=bboxes)
-
输入要求:
-
image
:NumPy 数组格式(HWC 维度,RGB 通道顺序)。 -
bboxes
:边界框列表,每个框为[x_min, y_min, width, height]
(与format='coco'
对应)。
-
-
输出结果:
-
augmented['image']
:增强后的图像(NumPy 数组)。 -
augmented['bboxes']
:更新后的边界框列表(可能已过滤无效框)。
-
对比
核心区别
特性 | torchvision.transforms | Albumentations |
---|---|---|
任务支持 | 图像分类为主 | 分类、检测、分割、关键点等 |
增强方法数量 | 基础(约 20+ 种) | 丰富(70+ 种) |
标注处理 | 需手动处理 | 自动处理边界框、掩码、关键点 |
速度 | 较慢 | 更快(基于 OpenCV 优化) |
依赖关系 | 依赖 PyTorch | 独立库,与框架无关 |
颜色抖动
调整亮度、对比度和饱和度来模拟不同的光照条件。
import torchvision.transforms as T # 导入PyTorch的transforms模块
# 定义一个数据增强流水线(仅包含颜色抖动)
transform = T.Compose([
T.ColorJitter(brightness=0.2, contrast=0.2, saturation=0.2)
])
# 应用增强到输入图像
augmented_image = transform(image)
1. T.ColorJitter
-
作用:对输入图像进行 随机颜色调整,包括亮度(brightness)、对比度(contrast)、饱和度(saturation)和色调(hue)。
-
参数说明:
-
brightness=0.2
:亮度调整幅度。实际亮度变化范围为[max(0, 1 - 0.2), 1 + 0.2]
,即[0.8, 1.2]
。 -
contrast=0.2
:对比度调整幅度,计算方式与亮度相同。 -
saturation=0.2
:饱和度调整幅度。 -
hue
:未显式设置(默认hue=0
,表示不调整色调)。
-
-
随机性:每次调用会从均匀分布中随机采样一个系数,应用到对应属性上。
2. T.Compose
-
作用:将多个变换操作组合成流水线(此处仅包含一个操作)。
-
必要性:即使只有一个变换,使用
Compose
也能保持接口统一,方便后续扩展。
3. 输入和输出格式
-
输入要求:
-
image
应为 PIL.Image 对象(常见)或 Tensor(需配合其他变换,如ToTensor
)。 -
如果输入是 Tensor,需确保值范围在
[0, 1]
或[0, 255]
(根据训练习惯)。
-
-
输出结果:
-
增强后的图像与输入类型一致(PIL.Image 或 Tensor)。
-
参数 | 设置值 | 效果示例 |
---|---|---|
brightness | 0.2 | 亮度随机变化(如变暗20%或变亮20%) |
contrast | 0.2 | 对比度随机变化(低对比度或高对比度) |
saturation | 0.2 | 饱和度随机变化(黑白化20%或色彩增强20%) |
hue | 0.1 | 色调在 [-0.1, 0.1] 范围内偏移(需Tensor输入) |
数据质量
- 清理数据
- 通过可视化标注,去除标注不准确或图片质量较差的样本。
- 平衡类别
- 假设你有一个不平衡的类别,如有 1000 张猫的图片和只有 50 张狗的图片,你可以进行数据扩增或者过采样(upsampling)来平衡数据集。
训练策略优化
调整超参数
-
学习率调度
- 在 YOLOv5 中,你可以使用
--lr-scheduler
参数来选择学习率策略。常见的学习率调度策略包括cosine
、step
和one_cycle
:
- 在 YOLOv5 中,你可以使用
python train.py \
--img 640 \ # 输入图像尺寸
--batch 16 \ # 批次大小
--epochs 50 \ # 训练轮次
--data coco.yaml \ # 数据集配置文件
--weights yolov5s.pt \# 预训练权重
--lr 0.01 \ # 初始学习率
--lr-scheduler cosine # 学习率调度策略
参数详解
1. --img 640
-
作用:设定输入图像的尺寸为
640x640
像素。 -
影响:
-
检测精度:较大的尺寸(如
1280
)可能提升小目标检测能力,但会显著增加显存占用。 -
推理速度:尺寸越大,计算量越高,FPS 越低。
-
-
注意:YOLOv5 会自动调整图像长宽比为
32 的倍数
(如 640 是 32 的 20 倍)。
2. --batch 16
-
作用:每个批次的样本数为 16。
-
硬件要求:
-
显存需求与批次大小成正比。若显存不足,可减小
batch
或启用--multi-scale
多尺度训练。
-
-
优化建议:
-
若使用
batch=16
出现显存不足(OOM),可尝试batch=8
并配合--accumulate 2
(梯度累积)等效保持总更新量。
-
3. --epochs 50
-
作用:完整遍历数据集的次数为 50 轮。
-
调整策略:
-
小数据集(如自定义数据集):可能需要更多轮次(如 100+)。
-
大数据集(如 COCO):50-100 轮通常足够。
-
-
监控指标:通过训练日志中的
mAP@0.5
和val_loss
判断是否收敛。
4. --data coco.yaml
-
作用:指定数据集配置文件路径。
-
自定义数据集:需按此格式创建 YAML 文件,并确保路径正确。
5. --weights yolov5s.pt
-
作用:加载预训练权重
yolov5s.pt
(YOLOv5s 模型的官方权重)。 -
优势:
-
加速收敛:相比从头训练(
--weights ''
),迁移学习大幅减少训练时间。 -
提升精度:利用大规模数据集(如 ImageNet + COCO)预训练的特征提取能力。
-
-
模型选择:可选
yolov5n/s/m/l/x.pt
,模型复杂度依次递增。
6. --lr 0.01
-
作用:设置初始学习率为
0.01
。 -
学习率范围:
-
典型值:YOLOv5 默认使用
0.01
(SGD)或0.001
(Adam)。 -
调整依据:若训练不稳定(损失震荡),可尝试降低至
0.001
;若收敛慢,可适当增大。
-
-
与优化器的关系:YOLOv5 默认使用
SGD
,若切换为Adam
,建议初始学习率设为0.001
。
7. --lr-scheduler cosine
-
作用:使用余弦退火学习率调度策略。
-
工作原理:
-
学习率从初始值(
0.01
)开始,按余弦曲线逐渐下降至0
。 -
公式:
lr = 0.5 * initial_lr * (1 + cos(π * epoch / total_epochs))
。
-
-
优势:
-
避免训练后期学习率过低导致停滞。
-
相比固定学习率或阶梯下降,更易跳出局部最优。
-
输入图像 (640x640)
↓
Backbone(CSPDarknet)提取特征
↓
Neck(PANet)多尺度特征融合
↓
Head(检测层)输出边界框和类别
↓
损失计算(GIoU + obj_loss + cls_loss)
↓
反向传播 + 优化器(SGD)更新权重
↓
学习率调度器(cosine)调整 lr
常见问题与解决方案
问题 | 可能原因 | 解决方法 |
---|---|---|
显存不足 (OOM) | --batch 过大或 --img 过大 | 减小 batch ,降低 img 尺寸,使用梯度累积 |
训练损失不下降 | 学习率过高/过低 | 调整 --lr ,检查数据标注是否正确 |
验证集 mAP 低 | 过拟合或欠拟合 | 增加数据增强,调整 --epochs ,使用早停法 |
训练速度慢 | 硬件性能不足 | 使用更小模型(如 yolov5n ),启用混合精度训练 |
优化器选择
- 使用
AdamW
优化器来提高训练稳定性,尤其在面对较小的数据集时。optimizer = torch.optim.AdamW(model.parameters(), lr=0.001)
-
功能:初始化一个 AdamW 优化器,用于更新模型参数。
-
参数说明:
-
model.parameters()
:待优化的模型参数(如权重、偏置)。 -
lr=0.001
:初始学习率(learning rate),控制参数更新的步长。
-
预训练模型
- Fine-tuning 使用预训练模型
- 假设你有一个目标检测任务(例如车辆检测),你可以从 COCO 数据集上训练好的 YOLOv5 模型开始微调:
python train.py --img 640 --batch 16 --epochs 50 --data vehicle.yaml --weights yolov5s.pt
预训练模型 和 Fine-tuning(微调) 是深度学习中非常重要的概念,尤其是在目标检测任务中。以下是对这些概念的解释,以及如何将它们应用到车辆检测任务中的具体说明:
1. 预训练模型
-
定义:预训练模型是在大规模数据集(如 COCO、ImageNet)上训练好的模型,已经学习到了通用的特征表示(例如边缘、纹理、形状等)。
-
作用:
-
特征提取:预训练模型的前几层通常能够提取低级特征(如边缘、角点),这些特征对大多数视觉任务都是通用的。
-
加速训练:直接使用预训练模型可以避免从头训练,节省大量时间和计算资源。
-
-
示例:
-
YOLOv5 在 COCO 数据集上预训练的模型(如
yolov5s.pt
)已经能够检测 80 类常见物体(如人、车、动物等)。
-
2. Fine-tuning(微调)
-
定义:微调是指在预训练模型的基础上,针对特定任务(如车辆检测)进行进一步训练。
-
步骤:
-
加载预训练权重:从预训练模型(如
yolov5s.pt
)初始化模型参数。 -
调整模型结构(可选):根据任务需求修改模型输出层(如修改类别数)。
-
训练:在目标数据集(如车辆检测数据集)上继续训练,更新模型参数。
-
-
优势:
-
快速收敛:预训练模型已经具备良好的特征提取能力,微调只需少量数据即可达到较好效果。
-
高性能:相比从头训练,微调通常能获得更高的精度。
-
3. 应用到车辆检测任务
假设你有一个车辆检测任务,以下是具体步骤:
步骤 1:加载预训练模型
-
使用 YOLOv5 在 COCO 数据集上预训练的模型(如
yolov5s.pt
)。
步骤 2:调整模型结构
-
如果目标任务的类别数与 COCO 不同(例如 COCO 有 80 类,而车辆检测任务只有 3 类:汽车、卡车、摩托车),需要修改输出层。
步骤 3:准备数据集
-
准备车辆检测数据集,格式通常为:
-
图像文件(如
.jpg
)。 -
标注文件(如
.txt
,每行表示一个边界框,格式为class_id x_center y_center width height
)。
-
-
数据集配置文件(如
vehicle.yaml
)
步骤 4:微调模型
-
使用目标数据集训练模型,加载预训练权重并更新参数。
步骤 5:验证和测试
-
在验证集上评估模型性能(如 mAP@0.5)。
4. 微调的优势
-
数据效率:微调需要的训练数据远少于从头训练。
-
时间效率:训练时间大幅缩短。
-
性能提升:预训练模型已经具备良好的特征提取能力,微调后性能通常优于从头训练。
模型优化
使用最新的 YOLO 版本
- YOLOv8
- YOLOv8 在精度和推理速度方面有所改进,特别是对小目标检测更加友好。如果你使用的是 YOLOv5,可以考虑升级到 YOLOv8。
量化和剪枝
量化:使用 TensorRT 对 YOLO 模型进行量化,以提高推理速度。
# 转换为 TensorRT
python export.py --weights yolov5s.pt --img-size 640 --batch-size 1 --dynamic --optimize --include engine
剪枝:通过剪枝减少网络层,减小计算量并加快推理速度:
from torch.nn.utils import prune
prune.random_unstructured(model.conv1, name="weight", amount=0.2)
当然还有别的,我也是刚接触,就先分享到这。有撒不合适的可以讨论一下