[Task 3]【#DataWhale #AI 夏令营】【kaggle — CV图像】

程序员小白222 2024-08-08 12:31:01 阅读 98

[Task 3]【#DataWhale #AI 夏令营】【kaggle — CV图像

前言:直播错过了,今天补的录播

因为基础差点,所以除了baseline,还没有上分,主要还是在补充自己的知识,学习大佬们的代码方法

这次九月大佬讲述了很多关于数据增强的方法,学到了很多!

数据增强的目的:数据增强的目的是通过人工方式增加训练数据的多样性,从而提高模型的泛化能力,使其能够在未见过的数据上表现得更好

1、九月大佬的直播,讲解了很多数据增强的方法,以前只是拘泥于前几种

(from ‌‍⁠‌‌‌‍‌‌‌‌‬⁠⁠‬‬‬‬‍⁠‌Task3手册)

图像大小调整:使用<code>transforms.Resize((256, 256))将所有图像调整到256x256像素的尺寸,这有助于确保输入数据的一致性。随机水平翻转:transforms.RandomHorizontalFlip()随机地水平翻转图像,这种变换可以模拟物体在不同方向上的观察,从而增强模型的泛化能力。随机垂直翻转:transforms.RandomVerticalFlip()随机地垂直翻转图像,这同样是为了增加数据多样性,让模型能够学习到不同视角下的特征。转换为张量:transforms.ToTensor()将图像数据转换为PyTorch的Tensor格式,这是在深度学习中处理图像数据的常用格式。归一化:transforms.Normalize([0.485, 0.456, 0.406], [0.229, 0.224, 0.225])对图像进行归一化处理,这里的均值和标准差是根据ImageNet数据集计算得出的,用于将图像像素值标准化,这有助于模型的训练稳定性和收敛速度。


2、学习

现在又学到了更多好的方法(收获满满!)

(from ‌‍⁠‌‌‌‍‌‌‌‌‬⁠⁠‬‬‬‬‍⁠‌Task3手册 kaggle–九月大佬)

2.1 自动增强

img

自动增强: <code>AutoAugment可以根据数据集自动学习数据增强策略。随机增强: RandAugment可以随机应用一系列数据增强操作。TrivialAugmentWide:提供与数据集无关的数据增强。AugMix:通过混合多个增强操作进行数据增强。

2.2 Mixup

MixUp是一种数据增强技术,其原理是通过将两个不同的图像及其标签按照一定的比例混合,从而创建一个新的训练样本。这种方法可以增加训练数据的多样性,提高模型的泛化能力,并减少过拟合的风险。MixUp方法中混合比例是一个超参数,通常称为alphaalpha是一个在0到1之间的值,表示混合的比例。例如,alpha=0.5意味着两个图像各占新图像的一半。

img

MixUp的混合过程包括以下步骤:

从训练集中随机选择两个图像和它们的标签。将这两个图像按照<code>alpha的比例混合,得到一个新的图像。将这两个标签按照相同的alpha比例混合,得到一个新的标签。

MixUp方法具有以下几个优点:

增加数据多样性:通过混合不同的图像和标签,MixUp可以创建更多样化的训练样本,帮助模型学习到更加鲁棒的特征表示。减少过拟合:MixUp可以减少模型对特定训练样本的依赖,从而降低过拟合的风险。提高泛化能力:MixUp可以帮助模型学习到更加泛化的特征表示,从而提高模型在未见过的数据上的表现。

2.3 Cutmix

CutMix是一种数据增强技术,它通过将一个图像的一部分剪切并粘贴到另一个图像上来创建新的训练样本。同时,它也会根据剪切区域的大小来调整两个图像的标签。

CutMix方法中,剪切和粘贴操作是关键步骤。具体来说,剪切和粘贴过程包括以下步骤:

从训练集中随机选择两个图像和它们的标签。随机选择一个剪切区域的大小和位置。将第一个图像的剪切区域粘贴到第二个图像上,得到一个新的图像。根据剪切区域的大小,计算两个图像的标签的加权平均值,得到一个新的标签。

img


3、实践

(from ‌‍⁠‌‌‌‍‌‌‌‌‬⁠⁠‬‬‬‬‍⁠‌Task3手册 kaggle–九月大佬)

Geometric Transforms(几何变换)

<code>padded_imgs = [v2.Pad(padding=padding)(orig_img) for padding in (3, 10, 30, 50)]

plot([orig_img] + padded_imgs)

padding是什么?

Padding 就是给图片加“边框”,不过这个“边框”是空白的。

为什么要加padding?

① 保护图片内容:在一些操作中,比如卷积操作,加上 padding 可以保护图片的边缘不被丢失。

② 调整图片尺寸:有时候我们需要把不同尺寸的图片调整到同样的尺寸,这时可以用 padding 来填充。

为什么要(3, 10, 30, 50)这么多次填充, 而不是一次填充好?

① 有时候我们需要看看不同填充大小对图像的影响,通过对比不同大小的填充效果,能帮助我们选择最佳的填充大小。

② 在图像处理和机器学习中,实验和调试是很重要的。我们可能需要尝试不同的填充大小来观察结果,找到最佳参数。

③ 一次性填充好意味着我们已经确定了填充大小,但在实际应用中,我们可能需要灵活调整填充大小。

效果如下:

image-20240720135849753

Resize

<code>resized_imgs = [v2.Resize(size=size)(orig_img) for size in (30, 50, 100, orig_img.size)]

plot([orig_img] + resized_imgs)

就是普通的缩放,模糊,马赛克等操作

CenterCrop(中心裁剪)

(top_left, top_right, bottom_left, bottom_right, center) = v2.FiveCrop(size=(100, 100))(orig_img)

plot([orig_img] + [top_left, top_right, bottom_left, bottom_right, center])

使用 FiveCrop 操作后,会裁剪成五个部分,这些部分和原始图片一起展示,方便进行比较和分析。

效果如下:

image-20240720135809889

RandomPerspective(透视变换)

<code>perspective_transformer = v2.RandomPerspective(distortion_scale=0.6, p=1.0)

perspective_imgs = [perspective_transformer(orig_img) for _ in range(4)]

plot([orig_img] + perspective_imgs)

为什么要进行透视变换?

透视变换可以模拟从不同角度观察同一物体的效果,帮助模型应对实际应用中 的变化。

这个不太了解,我从参数上进行分析了一下子

① v2.RandomPerspective:一个用于随机透视变换的操作

② distortion_scale=0.6: 0.6 表示中等程度的扭曲,值越大,变换的效果越明显。

③ p=1.0:表示应用透视变换的概率。1.0 表示总是应用透视变换,如果是 0.5 则表示有 50% 的概率会应用变换。

效果如下:

image-20240720135750259

RandomRotation(随机旋转)

<code>rotater = v2.RandomRotation(degrees=(0, 180))

rotated_imgs = [rotater(orig_img) for _ in range(4)]

plot([orig_img] + rotated_imgs)

生成4张随机旋转0 ~ 180°的图片

效果如下:

image-20240720135721955

RandomAffine(随机仿射变换)

可以简单理解为旋转缩放平移的组合

<code>affine_transfomer = v2.RandomAffine(degrees=(30, 70), translate=(0.1, 0.3), scale=(0.5, 0.75))

affine_imgs = [affine_transfomer(orig_img) for _ in range(4)]

plot([orig_img] + affine_imgs)

参数分析:

degrees=(30, 70):指定旋转角度的范围。(30, 70) 表示在 30 到 70 度之间随机选择一个角度进行旋转。

translate=(0.1, 0.3):指定平移的范围。(0.1, 0.3) 表示在水平和垂直方向上分别平移最多 10% 到 30% 的距离。

scale=(0.5, 0.75):指定缩放比例的范围。(0.5, 0.75) 表示将图片缩放到 50% 到 75% 之间。

效果如下:

image-20240720135950538

ElasticTransform(弹性变换)–本次比赛不推荐用

对原始图片进行形变操作,可以模拟图像像橡皮一样被拉伸或压缩的效果。

<code>elastic_transformer = v2.ElasticTransform(alpha=250.0)

transformed_imgs = [elastic_transformer(orig_img) for _ in range(2)]

plot([orig_img] + transformed_imgs)

参数:

alpha=250.0:表示形变程度

效果如下:

image-20240720140758183

RandomCrop(随机裁剪)

从原图中随机选取一个区域,并将该区域提取出来作为新的图片。

<code>cropper = v2.RandomCrop(size=(128, 128))

crops = [cropper(orig_img) for _ in range(4)]

plot([orig_img] + crops)

参数分析:

size=(128, 128):指定了裁剪后图像的尺寸。(128, 128) 表示裁剪后的图片将具有 128 像素宽和 128 像素高。

效果如下:

image-20240720141139804

Photometric Transforms(光度变换)

主要涉及图像的颜色、亮度、对比度等方面

– ColorJitter(颜色抖动)

为什么要进行颜色抖动?

通过对图像进行随机的亮度和色相调整,模型可以学习到更多不同的颜色变化,从而提高在实际应用中的表现。

<code>jitter = v2.ColorJitter(brightness=.5, hue=.3)

jittered_imgs = [jitter(orig_img) for _ in range(4)]

plot([orig_img] + jittered_imgs)

参数分析:

brightness=.5:指定亮度的调整范围。0.5 表示亮度可以在原始亮度的 50%150% 之间随机变化。亮度值越高,图像越亮;值越低,图像越暗。

hue=.3:指定色相的调整范围。0.3 表示色相可以在 -0.30.3 的范围内随机变化。色相调整可以改变图像的整体颜色。

效果如下:

image-20240720145352067

– GaussianBlur(高斯模糊)

高斯模糊的目的:

① 通过对图像进行模糊处理,模型可以学习到在模糊情况下如何识别和处理图像内容。

② 去噪:高斯模糊可以用于去除图像中的噪声,平滑图像。对于图像预处理,减少噪声可以提高后续处理的效果。

<code>blurrer = v2.GaussianBlur(kernel_size=(5, 9), sigma=(0.1, 5.))

blurred_imgs = [blurrer(orig_img) for _ in range(4)]

plot([orig_img] + blurred_imgs)

参数解读:

kernel_size=(5, 9):指定高斯模糊核的大小范围。(5, 9) 表示模糊核的高度和宽度可以在 5 到 9 像素之间随机选择。模糊核的大小决定了模糊的程度,核越大,模糊效果越明显。

sigma=(0.1, 5.):指定了高斯函数的标准差范围。(0.1, 5.) 表示标准差可以在 0.1 到 5.0 之间随机选择。标准差控制了高斯函数的宽度,标准差越大,模糊效果越明显。

效果如下:

image-20240720163530165

– RandomInvert(随机反色)

目的:

① 通过对图像进行反色处理,模型可以学习到在颜色反转情况下如何识别和处理图像内容。

② 在实际应用中,图像的颜色可能会因为一些特殊情况(如扫描错误、图像处理问题)发生反转。反色处理可以模拟这些特殊情况,使模型能够适应各种情况。

③ 提高模型鲁棒性

<code>inverter = v2.RandomInvert()

invertered_imgs = [inverter(orig_img) for _ in range(4)]

plot([orig_img] + invertered_imgs)

参数分析:

v2.RandomInvert:将图像的每个像素的颜色值进行取反,使得图像的颜色完全相反。例如,黑色变成白色,红色变成青色等。

效果如下:

image-20240720163647271

– RandomPosterize (随机图像色彩减少)

目的:模拟图像质量下降的情况,提高鲁棒性

<code>posterizer = v2.RandomPosterize(bits=2)

posterized_imgs = [posterizer(orig_img) for _ in range(4)]

plot([orig_img] + posterized_imgs)

参数分析

bits=2:这个参数指定了 posterization 的位数。bits=2 表示将图像的颜色深度减少到 2 位,即每个颜色通道只有 4 种可能的颜色值(2^2 = 4)。减少颜色深度会使图像的颜色更加单一和明显的色块化。

效果展示:

image-20240720165926865

肉眼看起来变化不明显的原因?

可能是色彩变化不明显,也要可能是图像处理细节的随机性导致

尝试了一下改一下参数

改大参数:(好像变化也不大???)

image-20240720170756496

改小参数:(好像变化也不大???)

image-20240720170901027

得出结论:图片色彩变化不明显

– RandomSolarize (随机太阳化)

一种图像处理技术,用于创建独特的视觉效果。

目的:

① 让模型可以学习到在色彩反转情况下如何识别和处理图像内容。

② 可以模拟图像在不同光照条件下的效果,比如强光照或阴影。通过这种方式,模型可以提高对光照变化的鲁棒性。

③ 太阳化处理可以创建出独特的视觉效果,用于艺术创作或特定的视觉设计。它可以使图像看起来更具戏剧性或引人注目。

<code>solarizer = v2.RandomSolarize(threshold=192.0)

solarized_imgs = [solarizer(orig_img) for _ in range(4)]

plot([orig_img] + solarized_imgs)

参数分析:

threshold=192.0:指定了太阳化处理的阈值。阈值是指像素值的界限,只有那些像素值高于这个阈值的区域会被反转。192.0 表示只有像素值高于 192 的部分才会被太阳化处理。

效果展示:

image-20240720171459180

改一下参数看看效果?

改小:

image-20240720171710258

改大:

image-20240720171724929

– RandomAdjustSharpness(随机锐化)

目的:

① 让模型可以学习到在不同锐度条件下如何识别和处理图像内容。

②可以增强图像的边缘和细节,使得图像在视觉上更加清晰和突出。这对于需要识别细节的任务(如物体检测)非常重要。

③ 可以模拟图像在不同处理条件下的效果,例如相机镜头的锐化或后期图像处理。通过这种方式,模型可以提高对图像质量变化的鲁棒性。

<code>sharpness_adjuster = v2.RandomAdjustSharpness(sharpness_factor=2)

sharpened_imgs = [sharpness_adjuster(orig_img) for _ in range(4)]

plot([orig_img] + sharpened_imgs)

参数分析:

sharpness_factor=2:指定锐化的因子。sharpness_factor 是一个控制锐化强度的值。2 表示将图像锐化到原始图像锐度的两倍。如果你使用的因子大于 1,图像将会变得更加锐利;如果小于 1,则图像会变得更柔和。

效果展示:

image-20240720172530578

– RandomAutocontrast (随机自动对比度调整)

目的:

① 模型可以学习到在不同对比度条件下如何识别和处理图像内容。

② 可以提升图像的对比度,使得图像中的细节更加明显。这对于需要识别细节的任务(如物体检测)特别有用。

③ 可以模拟图像在不同光照条件下的效果,例如低光照条件下的图像对比度变化。通过这种方式,模型可以提高对光照变化的鲁棒性。

<code>autocontraster = v2.RandomAutocontrast()

autocontrasted_imgs = [autocontraster(orig_img) for _ in range(4)]

plot([orig_img] + autocontrasted_imgs)

参数分析:

v2.RandomAutocontrast:用于对图像进行自动对比度调整的操作。自动对比度调整会自动调整图像的对比度,使得图像中的最暗像素变为黑色,最亮像素变为白色,从而扩大图像的亮度范围。

效果展示:

image-20240720172743839

变化不大的原因:

原始图像对比度已经很高

处理效果细微

显示器或查看工具的问题:可以尝试固定的对比度调整

– RandomEqualize(随机均衡化)

目的:

① 对图像进行均衡化处理,模型可以学习到在不同亮度分布条件下如何识别和处理图像内容。

② 均衡化处理可以提升图像的对比度,使得图像中的细节更加明显。这对于需要识别细节的任务(如物体检测)特别有用。感觉跟锐化差不多

③ 均衡化处理可以模拟图像在不同光照条件下的效果,例如低光照或高光照条件下的图像亮度变化。通过这种方式,模型可以提高对光照变化的鲁棒性。这个感觉跟<code>RandomSolarize差不多

equalizer = v2.RandomEqualize()

equalized_imgs = [equalizer(orig_img) for _ in range(4)]

plot([orig_img] + equalized_imgs)

参数分析:

v2.RandomEqualize:用于对图像进行均衡化处理的操作。均衡化会调整图像的亮度分布,使得图像中的亮度更加均匀,增强图像的对比度,操作是“随机”的,意味着在每次处理时,均衡化的程度可能会有所不同,以增加数据的多样性。

效果展示:

我的感觉是锐化 + RandomSolarize

image-20240720200852232

Augmentation Transforms(扩充变换)

– AutoAugment(自动增强)

原理:

一种自动数据增强策略搜索方法,用于优化数据增强管道,以提高模型在图像分类任务中的性能。其主要原理是通过强化学习或其他优化算法,自动搜索出最优的图像增强策略组合。

<code>policies = [v2.AutoAugmentPolicy.CIFAR10, v2.AutoAugmentPolicy.IMAGENET, v2.AutoAugmentPolicy.SVHN]

augmenters = [v2.AutoAugment(policy) for policy in policies]

imgs = [

[augmenter(orig_img) for _ in range(4)]

for augmenter in augmenters

]

row_title = [str(policy).split('.')[-1] for policy in policies]

plot([[orig_img] + row for row in imgs], row_title=row_title)

参数分析:

v2.AutoAugmentPolicy:包含不同数据增强策略的类,每种策略都包含了一系列预定义的图像增强操作。CIFAR10IMAGENETSVHN 是三种不同的增强策略,它们分别针对 CIFAR-10 数据集、ImageNet 数据集和 SVHN 数据集设计。

v2.AutoAugment(policy)v2.AutoAugment 是一个自动数据增强器,它会根据指定的策略 policy 对图像进行增强。对每一个策略 policy,我们创建一个增强器 augmenter

数据增强策略:

每种策略包含一系列预定义的增强操作,它们旨在生成更多样化的训练样本,增强模型的泛化能力。

CIFAR10:针对 CIFAR-10 数据集设计,包含一系列适合小尺寸图像的增强操作。IMAGENET:针对 ImageNet 数据集设计,包含一系列适合大尺寸图像的增强操作。SVHN:针对 SVHN 数据集设计,包含一系列适合街景数字图像的增强操作。

上面三个数据集解释:

CIFAR-10

图片数量:60,000 张图片大小:32x32 像素颜色:彩色类别数:10 类(如飞机、汽车、猫、狗等)用途:常用于图像分类任务的研究和测试。

ImageNet

图片数量:超过 1400 万张图片大小:不同大小,通常较大颜色:彩色类别数:超过 1000 类(如动植物、日常用品等)用途:大规模图像分类、物体检测和图像分割任务的基准数据集。

SVHN

图片数量:超过 600,000 张图片大小:32x32 像素颜色:彩色类别数:10 类(数字 0 到 9)用途:专注于街景中房屋号码的识别任务。

效果展示:

image-20240720210123013

– RandAugment(随机增强)

**目的:**减少复杂的策略搜索步骤

主要操作:

​ 几何变换:旋转、平移、缩放、剪切等

​ 颜色变换:亮度、对比度、饱和度、色调等调整

​ 噪声添加:高斯噪声、随机擦除等

<code>augmenter = v2.RandAugment()

imgs = [augmenter(orig_img) for _ in range(4)]

plot([orig_img] + imgs)

参数分析:

RandAugment:与 AutoAugment 类似, 也是一种自动数据增强方法,更简单,不需要复杂的策略搜索过程。

效果展示:

image-20240720211444346

– TrivialAugmentWide

<code>augmenter = v2.TrivialAugmentWide()

imgs = [augmenter(orig_img) for _ in range(4)]

plot([orig_img] + imgs)

参数分析:

TrivialAugmentWide :一种数据增强策略,它通过随机选择和应用一系列数据增强操作来增加数据集的多样性。

效果展示:

image-20240720211742619

– AugMix

一种增强策略

<code>augmenter = v2.AugMix()

imgs = [augmenter(orig_img) for _ in range(4)]

plot([orig_img] + imgs)

参数分析:

AugMix :组合多个数据增强操作,生成新的训练样本,同时保持输入图像的主要特征。

效果展示

image-20240720212446454

三种方法的比较:

技术点 AutoAugment RandAugment TrivialAugmentWide
策略和方法 自动化策略搜索,优化增强操作 随机选择增强操作,简化增强过程 固定基础增强操作,快速生成样本
参数配置 复杂,通过策略搜索确定最佳操作 两个主要参数 <code>N 和 M,配置简单 无复杂参数配置,增强操作固定
计算开销 高,需要大量计算资源 中等,计算开销较低 低,计算开销小
增强操作 广泛的操作组合,通过策略优化 从预定义的操作集中随机选择 基础操作,效果可能有限
适用场景 高性能任务,计算资源充足的环境 快速实施数据增强,中等规模数据集 资源有限,初步实验或简单任务

Randomly-applied Transforms

– RandomHorizontalFlip( 随机水平翻转)

hflipper = v2.RandomHorizontalFlip(p=0.5)

transformed_imgs = [hflipper(orig_img) for _ in range(4)]

plot([orig_img] + transformed_imgs)

参数分析:

p=0.5:以 50% 的概率对图像进行水平翻转。

效果展示:

image-20240720213852198

– RandomVerticalFlip(随机垂直翻转)

<code>vflipper = v2.RandomVerticalFlip(p=0.5)

transformed_imgs = [vflipper(orig_img) for _ in range(4)]

plot([orig_img] + transformed_imgs)

p=0.5:以 50% 的概率对图像进行垂直翻转。

效果展示:

image-20240720222834049

– RandomApply(随机裁剪)

<code>applier = v2.RandomApply(transforms=[v2.RandomCrop(size=(64, 64))], p=0.5)

transformed_imgs = [applier(orig_img) for _ in range(4)]

plot([orig_img] + transformed_imgs)

size=(64, 64)p=0.5:以 50% 的概率应用一个 64x64 大小的随机裁剪变换。

效果展示:

image-20240720223319745

三种方式的对比:

技术点 随机水平翻转 (Random Horizontal Flip) 随机垂直翻转 (Random Vertical Flip) 随机裁剪 (Random Crop)
变换方式 水平方向翻转 垂直方向翻转 随机裁剪出指定大小的区域
适用数据类型 对象无明确左右方向的图像 对象无明确上下方向的图像 对象位置不固定的图像
数据增强效果 增加数据集多样性,避免模型方向偏见 增加数据集多样性,但需注意图像合理性 提取局部信息,增加数据集多样性,提升模型识别能力
参数设置 翻转概率 <code>p(通常设为0.5) 翻转概率 p(通常设为0.5) 裁剪区域大小 size 和概率 p
应用场景 人脸识别、动物识别等左右对称对象 特定对称物体识别,避免重力相关图像 物体检测、分类任务,提取局部信息
注意事项 通常无明显缺点,广泛使用 谨慎使用,避免重力方向明显的图像 根据任务调整裁剪大小,避免信息丢失或噪音增加


声明

本文内容仅代表作者观点,或转载于其他网站,本站不以此文作为商业用途
如有涉及侵权,请联系本站进行删除
转载本站原创文章,请注明来源及作者。