PyTorch 2.0中图像增强方法详解

【图书推荐】《PyTorch深度学习与计算机视觉实践》-CSDN博客

基于Vision Transformer的mini_ImageNet图片分类实战_imagenet数据集-CSDN博客

Vision Transformer模型是目前图形识别领域最为前沿的和性能最好的图形分类模型,它能够对目标图像做出准确度最高的判断。但在某些情况下,图像数据还不够大。在这种情况下,需要使用一些技术来增加我们的训练数据。人为地创建训练数据,使用诸如随机旋转、位移、剪切和翻转等技术来处理给定的数据。这种人为地创建更多的数据就称为图像增强。

深度学习中的图像增强可以提高模型的准确度,因为它可以增加数据集中图像的多样性,从而提高模型的性能。此外,通过对图像进行旋转、缩放、裁剪等操作,可以增加数据集的大小,从而减少过拟合的风险,提高模型的泛化能力。

主要的图像增强技术包括:

  1. 调整大小。
  2. 标准化。
  3. 高斯模糊。
  4. 随机裁剪。
  5. 中心剪切。
  6. 随机旋转。
  7. 亮度、对比度和饱和度调节。
  8. 水平翻转。
  9. 垂直翻转。
  10. 随机添加mask块。
  11. 中心区域添加补丁。
  12. 高斯噪声。
  13. 灰度变换。

传统的图像增强方法需要我们使用不同的类库进行处理,而PyTorch 2.0官方提供的API中有已经定义好的处理类库,我们可以直接安装对应的类然后使用即可。安装代码如下:

pip install torchvision

下面基于torchvision完成了几条图像增强方法。

1. 调整大小

首先需要导入数据,这里使用前面章节保存的鸟类图片image_1.png。在使用上可以直接导入即可,代码如下:

import cv2
from PIL import Image
from pathlib import Path
import matplotlib.pyplot as plt
import numpy as np
import sys
import torch
import numpy as np
import torchvision.transforms as T

plt.rcParams["savefig.bbox"] = 'tight'
orig_img = Image.open(Path('image_1.png'))
torch.manual_seed(0) #设置 CPU 生成随机数的种子,方便下次复现实验结果
print(np.asarray(orig_img).shape) #(800, 800, 3)

#图像大小的调整,核心处理部分
resized_imgs = [T.Resize(size=size)(orig_img) for size in [128,256]]

#plt.figure('resize:128*128')
ax1 = plt.subplot(131)
ax1.set_title('original')
ax1.imshow(orig_img)

ax2 = plt.subplot(132)
ax2.set_title('resize:128*128')
ax2.imshow(resized_imgs[0])

ax3 = plt.subplot(133)
ax3.set_title('resize:256*256')
ax3.imshow(resized_imgs[1])

plt.show()

resized_imgs_128 = np.asarray(resized_imgs[0])
resized_imgs_256 = np.asarray(resized_imgs[1])
print(resized_imgs_128.shape) #(800, 800, 3)
print(resized_imgs_256.shape) #(800, 800, 3)
cv2.imwrite("image_128.png",resized_imgs_128[:,:,::-1])	#对最后一个维度进行调整
cv2.imwrite("image_256.png",resized_imgs_256[:,:,::-1])	#对最后一个维度进行调整

这里有两个内容需要读者注意,一个是resized_imgs = [T.Resize(size=size)(orig_img) for size in [128,256]],它完成了对维度大小的调整。另一个是当使用CV2进行图形读取或者保存的时候,其通道为BGR(blue,green,red三原色),而在matplot中为RGB,因此需要对维度进行调整。调整结果如图11-10所示。

图11-10  调整图像大小

2. 标准化

标准化可以加快基于神经网络结构的模型的计算速度,从而加快学习速度。标准化方式主要有两种:一是从每个输入通道中减去通道平均值,二是除于通道标准差。代码如下:

normalized_img = T.Normalize(mean=(0.5, 0.5, 0.5), std=(0.5, 0.5, 0.5))(T.ToTensor()(orig_img))
normalized_img = [T.ToPILImage()(normalized_img)]
#plt.figure('resize:128*128')
ax1 = plt.subplot(121)
ax1.set_title('original')
ax1.imshow(orig_img)

ax2 = plt.subplot(122)
ax2.set_title('normalize')
ax2.imshow(normalized_img[0])

plt.show()

结果如图11-11所示。

图11-11  标准化

3. 高斯模糊

高斯模糊的作用是对图形进行模糊变换,核心代码如下:

blurred_imgs = [T.GaussianBlur(kernel_size=(3, 3), sigma=sigma)(orig_img) for sigma in (3,7)]

4. 随机裁剪

随机剪切图像的某一部分,核心代码如下:

random_crops = [T.RandomCrop(size=size)(orig_img) for size in (400,300)]

5. 中心剪切

剪切图像的中心区域,核心代码如下:

center_crops = [T.CenterCrop(size=size)(orig_img) for size in (128,64)]

6. 随机旋转

设计角度旋转图像,核心代码如下:

rotated_imgs = [T.RandomRotation(degrees=90)(orig_img)]

7. 亮度、对比度和饱和度调节

对图像的亮度、对比度和饱和度进行调节,核心代码如下:

colorjitter_img = [T.ColorJitter(brightness=(2,2), contrast=(0.5,0.5), saturation=(0.5,0.5))(orig_img)]

8. 水平翻转

此操作将图像转进行水平翻转,核心代码如下:

HorizontalFlip_img = [T.RandomHorizontalFlip(p=1)(orig_img)]

9. 垂直翻转

此操作将图像转进行垂直翻转,核心代码如下:

VerticalFlip_img = [T.RandomVerticalFlip(p=1)(orig_img)]

10. 随机添加mask块

正方形补丁(mask)随机应用在图像中。这些补丁的数量越多,神经网络解决问题的难度就越大。核心代码如下:

plt.rcParams["savefig.bbox"] = 'tight'
orig_img = Image.open(Path('image_128.png'))	#导入128大小的图片

def add_random_boxes(img,n_k,size=9):  #这里的size是添加的随机块的多少
    h,w = size,size
    img = np.asarray(img).copy()
    img_size = img.shape[1]
    boxes = []
    for k in range(n_k):
        y,x = np.random.randint(0,img_size-w,(2,))
        img[y:y+h,x:x+w] = 0
        boxes.append((x,y,h,w))
    img = Image.fromarray(img.astype('uint8'), 'RGB')
    return img

blocks_imgs = [add_random_boxes(orig_img,n_k=10)]

结果如图11-12所示。

图11-12  添加mask后的图片

add_random_boxes用于随机添加mask,其中的参数n_k是添加的mask块的个数,而size则是mask块的大小。

顺便说一句,当模型的要求是对mask块进行补全时,则是另一种专门的训练模型MAE,这点在后续的内容中会讲解。

11. 中心区域添加补丁

和随机添加mask块类似,这里只不过在图像的中心加入mask块,核心代码如下:

def add_central_region(img, size=9):
    h, w = size, size
    img = np.asarray(img).copy()
    img_size = img.shape[1]
    img[int(img_size / 2 - h):int(img_size / 2 + h), int(img_size / 2 - w):int(img_size / 2 + w)] = 0
    img = Image.fromarray(img.astype('uint8'), 'RGB')
    return img

central_imgs = [add_central_region(orig_img, size=12)]

12. 高斯噪声

通过设置噪声因子,向图像中加入高斯噪声。噪声因子越高,图像的噪声越大。核心代码如下:

def add_noise(inputs, noise_factor=0.3):
    noisy = inputs + torch.randn_like(inputs) * noise_factor
    noisy = torch.clip(noisy, 0., 1.)
    return noisy

#这里的0.3和0.6分别是添加的高斯噪音的系数
noise_imgs = [add_noise(T.ToTensor()(orig_img), noise_factor) for noise_factor in (0.3, 0.6)]
noise_imgs = [T.ToPILImage()(noise_img) for noise_img in noise_imgs]

13. 灰度变换

此操作将RGB图像转换为灰度图像,核心代码如下:

gray_img = T.Grayscale()(orig_img)

以上是PyTorch 2.0官方提供的图像变换方面的函数,读者可以在后续的学习中有目的地使用变换函数,从而增强模型的泛化能力,从而提高准确度。

  • 11
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值