首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >关于yolo的一些优化方法(小白写着给自己以后看,也是多多交流)

关于yolo的一些优化方法(小白写着给自己以后看,也是多多交流)

作者头像
用户11770632
发布2025-11-15 10:55:42
发布2025-11-15 10:55:42
6760
举报

前言

写这个主演是突然想起来,yolo模型只是打标签然后训练,尽量多增加训练轮数,就在想有没有别的方法。所以搜了一下,还真不少,那就在这里简单归类一下吧。

数据优化

旋转、缩放、平移、翻转

这个数据就是指我们训练的数据无论是数据集还是训练集。

首先就是数据增强,yolo是目标检测模型,目标检测想要更精确更快就需要数据的特征更加明显,更加有差异化,数据的特征更加完整,这样最后的模型会更好。

方法有对图像的旋转、缩放、平移、翻转,例如,假设你正在进行人脸检测,数据集中有很多正面照片。你可以对照片进行旋转、缩放和翻转,这样就能模拟不同角度、不同距离的面部图像。

当然也有使用 albumentationstorchvision.transforms 进行数据增强:Albumentations 和 torchvision.transforms 是用于 计算机视觉任务的数据增强工具库。下面我们详细介绍他的使用方法以及简单示范代码,还有两者的区别。

torchvision.transforms
  • 所属框架:PyTorch 的官方库(torchvision 的一部分)。
  • 适用场景:与 PyTorch 深度集成,适合标准的图像分类任务
  • 特点
    • 简单易用:直接与 PyTorch 的 Dataset 和 DataLoader 结合使用。
    • 基础增强提供常见的变换,如裁剪、翻转、旋转、颜色调整(亮度、对比度)等
    • 轻量级适合简单任务,但对复杂任务(如目标检测、分割)的标注处理支持较弱。

 下面是简单代码

代码语言:javascript
复制
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+ 种增强方法(如 GridDropoutMotionBlurOpticalDistortion 等)。
    • 标注感知:自动处理图像变换后的标注(如边界框、掩码、关键点),无需手动调整。
    • 多框架兼容:支持 PyTorch、TensorFlow 等框架。

代码实例

代码语言:javascript
复制
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

独立库,与框架无关

颜色抖动

调整亮度、对比度和饱和度来模拟不同的光照条件。

代码语言:javascript
复制
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 参数来选择学习率策略。常见的学习率调度策略包括 cosinestepone_cycle
代码语言:javascript
复制
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))
  • 优势
    • 避免训练后期学习率过低导致停滞。
    • 相比固定学习率或阶梯下降,更易跳出局部最优。
代码语言:javascript
复制
输入图像 (640x640)
  ↓
Backbone(CSPDarknet)提取特征
  ↓
Neck(PANet)多尺度特征融合
  ↓
Head(检测层)输出边界框和类别
  ↓
损失计算(GIoU + obj_loss + cls_loss)
  ↓
反向传播 + 优化器(SGD)更新权重
  ↓
学习率调度器(cosine)调整 lr

常见问题与解决方案

问题

可能原因

解决方法

显存不足 (OOM)

--batch 过大或 --img 过大

减小 batch,降低 img 尺寸,使用梯度累积

训练损失不下降

学习率过高/过低

调整 --lr,检查数据标注是否正确

验证集 mAP 低

过拟合或欠拟合

增加数据增强,调整 --epochs,使用早停法

训练速度慢

硬件性能不足

使用更小模型(如 yolov5n),启用混合精度训练

优化器选择

使用 AdamW 优化器来提高训练稳定性,尤其在面对较小的数据集时。

代码语言:javascript
复制
optimizer = torch.optim.AdamW(model.parameters(), lr=0.001)

功能:初始化一个 AdamW 优化器,用于更新模型参数。

参数说明

  • model.parameters():待优化的模型参数(如权重、偏置)。
  • lr=0.001:初始学习率(learning rate),控制参数更新的步长。
预训练模型
  • Fine-tuning 使用预训练模型
    • 假设你有一个目标检测任务(例如车辆检测),你可以从 COCO 数据集上训练好的 YOLOv5 模型开始微调:
代码语言:javascript
复制
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(微调)
  • 定义:微调是指在预训练模型的基础上,针对特定任务(如车辆检测)进行进一步训练。
  • 步骤
    1. 加载预训练权重:从预训练模型(如 yolov5s.pt)初始化模型参数。
    2. 调整模型结构(可选):根据任务需求修改模型输出层(如修改类别数)。
    3. 训练:在目标数据集(如车辆检测数据集)上继续训练,更新模型参数。
  • 优势
    • 快速收敛:预训练模型已经具备良好的特征提取能力,微调只需少量数据即可达到较好效果。
    • 高性能:相比从头训练,微调通常能获得更高的精度。

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 模型进行量化,以提高推理速度。

代码语言:javascript
复制
# 转换为 TensorRT
python export.py --weights yolov5s.pt --img-size 640 --batch-size 1 --dynamic --optimize --include engine

剪枝:通过剪枝减少网络层,减小计算量并加快推理速度:

代码语言:javascript
复制
from torch.nn.utils import prune
prune.random_unstructured(model.conv1, name="weight", amount=0.2)

当然还有别的,我也是刚接触,就先分享到这。有撒不合适的可以讨论一下

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2025-11-14,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 前言
  • 数据优化
    • 旋转、缩放、平移、翻转
      • torchvision.transforms
      • Albumentations
      • 对比 
    • 颜色抖动
    •  数据质量
  • 训练策略优化 
    • 调整超参数
    • 参数详解
    • 优化器选择
    • 预训练模型
    • 1. 预训练模型
    • 2. Fine-tuning(微调)
    • 3. 应用到车辆检测任务
  • 模型优化 
    • 使用最新的 YOLO 版本
    • 量化和剪枝
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档