【图书推荐】《PyTorch深度学习与计算机视觉实践》-CSDN博客
基于Vision Transformer的mini_ImageNet图片分类实战_imagenet数据集-CSDN博客
Vision Transformer模型是目前图形识别领域最为前沿的和性能最好的图形分类模型,它能够对目标图像做出准确度最高的判断。但在某些情况下,图像数据还不够大。在这种情况下,需要使用一些技术来增加我们的训练数据。人为地创建训练数据,使用诸如随机旋转、位移、剪切和翻转等技术来处理给定的数据。这种人为地创建更多的数据就称为图像增强。
深度学习中的图像增强可以提高模型的准确度,因为它可以增加数据集中图像的多样性,从而提高模型的性能。此外,通过对图像进行旋转、缩放、裁剪等操作,可以增加数据集的大小,从而减少过拟合的风险,提高模型的泛化能力。
主要的图像增强技术包括:
- 调整大小。
- 标准化。
- 高斯模糊。
- 随机裁剪。
- 中心剪切。
- 随机旋转。
- 亮度、对比度和饱和度调节。
- 水平翻转。
- 垂直翻转。
- 随机添加mask块。
- 中心区域添加补丁。
- 高斯噪声。
- 灰度变换。
传统的图像增强方法需要我们使用不同的类库进行处理,而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官方提供的图像变换方面的函数,读者可以在后续的学习中有目的地使用变换函数,从而增强模型的泛化能力,从而提高准确度。
文章评论