当前位置: 首页 > news >正文

深度学习 PyTorch 中 18 种数据增强策略与实现

深度学习pytorch之简单方法自定义9类卷积即插即用

数据增强通过对训练数据进行多种变换,增加数据的多样性,它帮助我们提高模型的鲁棒性,并减少过拟合的风险。PyTorch 提供torchvision.transforms 模块丰富的数据增强操作,我们可以通过组合多种策略来实现复杂的增强效果。本文将介绍 18 种常用的图像数据增强策略,并展示如何使用 PyTorch 中的 torchvision.transforms 来实现这些策略。

文章目录

  • 综合应用:创建一个数据增强流程
  • 1. 随机水平翻转(Random Horizontal Flip)
  • 2. 随机垂直翻转(Random Vertical Flip)
  • 3. 随机旋转(Random Rotation)
  • 4. 随机裁剪(Random Crop)
  • 5. 随机缩放(Random Resized Crop)
  • 6. 颜色抖动(Color Jitter)
  • 7. 亮度调整(Brightness Adjust)
  • 8. 对比度调整(Contrast Adjust)
  • 9. 饱和度调整(Saturation Adjust)
  • 10. 色相调整(Hue Adjust)
  • 11. 随机灰度转换(Random Grayscale)
  • 12. 高斯模糊(Gaussian Blur)
  • 13. 切变变换(Shear Transform)
  • 14. 仿射变换(Affine Transform)
  • 15. 随机噪声添加(Random Noise)
  • 16. 随机剪切(Random Erasing)
  • 17. 图像平移(Translation)
  • 18. 图像归一化(Normalization)

综合应用:创建一个数据增强流程

我们可以将下述增强策略结合起来,创建一个数据增强流程(transform)。以下是流程示例:

transform = transforms.Compose([
    transforms.RandomHorizontalFlip(p=0.5),
    transforms.RandomRotation(30),
    transforms.RandomResizedCrop(224, scale=(0.8, 1.0)),
    transforms.ColorJitter(brightness=0.5, contrast=0.5, saturation=0.5, hue=0.5),
    transforms.RandomGrayscale(p=0.2),
    transforms.ToTensor(),
    transforms.Normalize(mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225]),
])

1. 随机水平翻转(Random Horizontal Flip)

水平翻转是最常见的图像数据增强技术之一。它通过以一定的概率(通常是 50%)对图像进行水平翻转,增加图像的多样性,尤其在对称性较强的物体(如人脸、动物等)中效果显著。

transform = transforms.RandomHorizontalFlip(p=0.5)

2. 随机垂直翻转(Random Vertical Flip)

垂直翻转与水平翻转类似,但适用于那些具有垂直对称性的图像。

transform = transforms.RandomVerticalFlip(p=0.5)

3. 随机旋转(Random Rotation)

随机旋转可以使模型适应不同的物体方向。旋转角度通常在一定范围内随机选择。

transform = transforms.RandomRotation(degrees=30)

4. 随机裁剪(Random Crop)

裁剪操作通过从图像中裁剪出一个随机区域,可以改变图像的视角,模拟拍摄角度的变化。

transform = transforms.RandomCrop(size=(224, 224))

5. 随机缩放(Random Resized Crop)

随机缩放操作首先从图像中随机裁剪出一部分,然后将其缩放到指定的大小。这有助于增强图像的尺度变化。

transform = transforms.RandomResizedCrop(224, scale=(0.8, 1.0))

6. 颜色抖动(Color Jitter)

颜色抖动是通过随机改变图像的亮度、对比度、饱和度和色相来增加图像的多样性。它特别适用于颜色变化较大的场景。

transform = transforms.ColorJitter(brightness=0.5, contrast=0.5, saturation=0.5, hue=0.5)

7. 亮度调整(Brightness Adjust)

通过改变图像的亮度来模拟不同的光照条件,使模型在低光或强光环境下具有更好的鲁棒性。

transform = transforms.ColorJitter(brightness=0.5)

8. 对比度调整(Contrast Adjust)

通过随机调整图像的对比度,帮助模型适应高对比和低对比的图像。

transform = transforms.ColorJitter(contrast=0.5)

9. 饱和度调整(Saturation Adjust)

通过随机调整图像的饱和度,模拟不同的颜色鲜艳度,可以帮助模型适应不同的色彩环境。

transform = transforms.ColorJitter(saturation=0.5)

10. 色相调整(Hue Adjust)

色相调整改变图像的整体色调,通过随机变化色相值来模拟不同的环境色彩。

transform = transforms.ColorJitter(hue=0.5)

11. 随机灰度转换(Random Grayscale)

随机将图像转换为灰度图像,通常通过一定的概率来进行。它有助于减少颜色信息对模型的影响。

transform = transforms.RandomGrayscale(p=0.2)

12. 高斯模糊(Gaussian Blur)

高斯模糊是一种图像模糊技术,可以模拟图像在不同焦距下的效果,增加数据集的多样性。

transform = transforms.GaussianBlur(kernel_size=(5, 5), sigma=(0.1, 2.0))

13. 切变变换(Shear Transform)

切变变换可以对图像进行倾斜,增加图像的几何形状变化,模拟视角变化。

transform = transforms.RandomAffine(degrees=0, shear=20)

14. 仿射变换(Affine Transform)

仿射变换可以通过平移、旋转、缩放等方式对图像进行变换,保持图像的几何形状不变。

transform = transforms.RandomAffine(degrees=0, translate=(0.1, 0.1), scale=(0.8, 1.2))

15. 随机噪声添加(Random Noise)

在图像中添加随机噪声可以帮助模型更好地适应低质量的输入。虽然 PyTorch 中没有内置的噪声添加操作,但可以通过自定义变换来实现。

import numpy as np
import torch

class AddNoise(object):
    def __init__(self, mean=0., std=1.):
        self.mean = mean
        self.std = std

    def __call__(self, img):
        img = np.array(img)
        noise = np.random.normal(self.mean, self.std, img.shape)
        img = img + noise
        img = np.clip(img, 0, 255)
        return Image.fromarray(img.astype(np.uint8))

transform = AddNoise(mean=0., std=25.)

16. 随机剪切(Random Erasing)

随机剪切是通过随机选择图像中的一部分并将其替换为随机颜色,增强模型对遮挡和噪声的鲁棒性。

transform = transforms.RandomErasing(p=0.5)

17. 图像平移(Translation)

平移操作对图像进行平移,模拟物体在图像中的移动。可以帮助模型适应不同的定位变化。

transform = transforms.RandomAffine(degrees=0, translate=(0.1, 0.1))

18. 图像归一化(Normalization)

归一化操作将图像的像素值调整到一定范围内,通常是 [0, 1] 或 [-1, 1],通过减去均值并除以标准差来实现。

transform = transforms.Normalize(mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225])

相关文章:

  • 40岁开始学Java:如何实现依赖注入?
  • vue+element-plus简洁完美实现古诗文网
  • VSCode配置优化指南:构建高效工程级开发环境
  • Linux操作系统6- 线程1(线程基础,调用接口,线程优缺点)
  • 学习笔记:利用OpenAI实现阅卷智能体
  • AcWing 5438. 密接牛追踪2 区间覆盖问题的详细解释
  • 关闭Windows安全中心,解析与实操指南
  • Git基础之工作原理
  • Spark 3.0核心新特性解析与行业应用展望
  • Docker部署Ragflow(完美解决502 bad gateway)
  • 【RocketMQ 存储】- 异常退出恢复逻辑 recoverAbnormally
  • 机器学习数学基础:44.多元线性回归
  • VTK笔记- 3D Widget类 vtkSplineWidget 样条部件
  • Hadoop项目中的问题(1)——NetworkManager 和 network 服务冲突
  • mysql经典试题共34题
  • fastjson漏洞#不出网#原理#流量特征
  • CD10.【C++ Dev】类和对象(1)
  • 用户仿真任务调度管理平台数据库设计
  • 使用Qt调用HslCommunication(C++调用C#库)
  • 微服务拆分-远程调用
  • 开局良好,我国第一季度广告业务收入保持较快增速
  • 欧盟公布对美关税反制清单,瞄准美国飞机等产品
  • 从上海首个到成片复制,闵行零工市场如何优化劳动就业服务?
  • 绿城房地产集团:近半年累计花费20.6亿元购买旗下债券
  • 国家发改委副主任谈民营经济促进法:以法治的稳定性增强发展的确定性
  • 化学家、台湾地区“中研院”原学术副院长陈长谦逝世