问题:目前许多深度领域由于数据难采集、难标注等问题造成了数据量不够多的情况,这就导致深度学习模型的性能和泛化能力较差。
解决方案:因此数据增强主能够增加训练数据的多样性和丰富性,以提高模型的性能和泛化能力。
因此imgaug库就是针对以上问题提出的,简化了个人编写数据增强方法的过程,极大提高了编码速度
imgaug简介
imgaug库是一个基于torchvision的数据增强工具包,可用于增加图像数据的多样性、改善模型性能、克服数据稀缺问题,以及为机器学习和计算机视觉任务提供更丰富的数据。
imgaug库能够在图片包含了对图片的几何变换、颜色变换、对比度和亮度调整、模糊和锐化、噪声、模拟雨/雾效果、关键点(Keypoints)等。并可以将多个增强方法组合在一起,以获得更丰富的数据增强效果。
数据增强的示例(含标签label)
图片示例
以下是一个使用imgaug库进行图像增强的示例代码。这个示例将应用几种典型的图像增强操作,包括旋转、翻转、亮度和对比度调整以及高斯噪声。请确保您已经安装了imgaug库。
iaa.Sequential类似于nn.Sequential,里边顺序执行增强操作,代码示例如下:
import imgaug.augmenters as iaa
import imageio
import matplotlib.pyplot as plt
# 读取图像
image = imageio.imread("path_to_your_image.jpg")
# 创建增强序列
seq = iaa.Sequential([
iaa.Affine(rotate=(-45, 45)), # 随机旋转角度
iaa.Fliplr(0.5), # 随机水平翻转
iaa.Flipud(0.2), # 随机垂直翻转
iaa.Multiply((0.8, 1.2), per_channel=0.2), # 随机调整亮度
iaa.ContrastNormalization((0.8, 1.2)), # 随机调整对比度
iaa.AdditiveGaussianNoise(scale=(0, 0.1*255)) # 添加高斯噪声
])
# 应用图像增强
augmented_image = seq.augment_image(image)
# 显示原始图像和增强后的图像
plt.subplot(1, 2, 1)
plt.imshow(image)
plt.title("Original Image")
plt.subplot(1, 2, 2)
plt.imshow(augmented_image)
plt.title("Augmented Image")
plt.show()
实验结果:
点标签
除了对图片增强外,imgaug还提供对点标签增强的方法
不过对于点标签增强需要将np.array数据或list数据转换为KeypointsOnImage,才能进行相应操作,之后需要再将KeypointsOnImage转换为对应的np.array数据或list数据,代码如下:
import scipy.io,imgaug
import imgaug.augmenters as iaa
from imgaug.augmentables.kps import KeypointsOnImage
import numpy as np
import imageio
import matplotlib.pyplot as plt
def read_mat(path='GT_IMG_286.mat'):
# 使用scipy.io.loadmat()加载MATLAB文件
mat_data = scipy.io.loadmat(path)
# mat_data是一个字典,包含了MATLAB文件中的各个变量和数据
# print(mat_data)
# 从字典中获取特定变量的值
point_data = mat_data['image_info'][0][0][0][0]
return point_data
def return_process_point(path="IMG_286.jpg"):
# 读取图像与标签
image = imageio.imread("IMG_286.jpg")
label_array = read_mat()[0]
# 从label_array中提取关键点坐标
# 假设label_array是一个Nx2的numpy数组,每行包含一个关键点的(x, y)坐标
# for point in label_array:
# print(point)
keypoints = [imgaug.Keypoint(x=point[0], y=point[1]) for point in label_array]
# 创建KeypointsOnImage对象
keypoints_on_image = KeypointsOnImage(keypoints, shape=image.shape)
# 创建增强序列
seq = iaa.Sequential([
iaa.Affine(rotate=(-45, 45)), # 随机旋转
iaa.Affine(translate_px={"x": (-20, 20), "y": (-20, 20)}), # 随机平移
])
# 应用图像增强
augmented_image, augmented_keypoints = seq(image=image, keypoints=keypoints_on_image)
# 提取增强后的关键点坐标
augmented_keypoint_coords = augmented_keypoints.keypoints
# 显示增强前后的图像和关键点
image_before = keypoints_on_image.draw_on_image(image, color=(0, 255, 0), size=7)
image_after = augmented_keypoints.draw_on_image(augmented_image, color=(0, 255, 0), size=7)
plt.subplot(1, 2, 1)
plt.imshow(image_before)
plt.title("Original Image with Keypoints")
plt.subplot(1, 2, 2)
plt.imshow(image_after)
plt.title("Augmented Image with Keypoints")
plt.show()
# 提取增强后的关键点坐标为numpy数组
augmented_keypoint_coords = augmented_keypoints.to_xy_array()
# augmented_keypoint_coords 是一个包含增强后关键点坐标的numpy数组
return augmented_keypoint_coords
if __name__ == '__main__':
augmented_keypoint_coords=return_process_point()
print(np.array(augmented_keypoint_coords))
运行结果图片:
框标签
最后是框标签,与点标签的方法类似,给出相应的代码:
import imgaug.augmenters as iaa
from imgaug.augmentables.bbs import BoundingBox, BoundingBoxesOnImage
import numpy as np
# 创建示例的框标签数据
bbs = BoundingBoxesOnImage([
BoundingBox(x1=100, y1=100, x2=200, y2=200),
BoundingBox(x1=250, y1=250, x2=350, y2=350)
], shape=(500, 500)) # 假设图像大小为500x500
# 创建增强序列
seq = iaa.Sequential([
iaa.Affine(rotate=(-45, 45)),
iaa.Affine(translate_px={"x": (-20, 20), "y": (-20, 20)})
])
# 应用框标签增强
augmented_bbs = seq.augment(bbs)
# 提取增强后的框标签数据为numpy数组
augmented_bbs_coords = augmented_bbs.to_xyxy_array()
# augmented_bbs_coords 是一个包含增强后框标签数据的numpy数组
print(augmented_bbs_coords)
在示例代码中,我们首先创建了一个BoundingBoxesOnImage对象,其中包含了示例的框标签数据。然后,我们创建了一个增强序列并应用框标签增强。最后,使用augmented_bbs.to_xyxy_array()将增强后的框标签数据转换为numpy数组。
数据增强的方法
- Geometric Augmentations(几何变换):
- iaa.Affine:进行仿射变换,如旋转、缩放、平移。
- iaa.Crop:裁剪图像的一部分。
- iaa.PerspectiveTransform:进行透视变换。
- Color Augmentations(颜色变换):
- iaa.AdditiveGaussianNoise:添加高斯噪声。
- iaa.Multiply:对像素进行乘法操作,调整亮度。
- iaa.Add:对像素进行加法操作,调整亮度。
- iaa.Grayscale:将图像转换为灰度图像。
- iaa.Sometimes:有一定概率应用其他增强。
- Contrast and Brightness Adjustments(对比度和亮度调整):
- iaa.GammaContrast:进行伽马对比度调整。
- iaa.LogContrast:进行对数对比度调整。
- iaa.LinearContrast:进行线性对比度调整。
- Blurring and Sharpening(模糊和锐化):
- iaa.GaussianBlur:应用高斯模糊。
- iaa.Sharpen:进行图像锐化。
- Noise(噪声):
- iaa.SaltAndPepper:添加椒盐噪声。
- iaa.CoarseSaltAndPepper:添加粗粒度椒盐噪声。
- Segmentation Maps and Superpixels(分割图和超像素):
- iaa.Superpixels:生成超像素。
- iaa.SegmentationMapOnImage:将分割图应用到图像上。
- Custom Augmentations(自定义增强):
- iaa.Lambda:应用自定义函数进行增强。
- 特殊效果(Special Effects):
- iaa.Rain:模拟雨效果。
- iaa.Fog:模拟雾效果。
- 关键点(Keypoints):
- iaa.Keypoint:对关键点进行增强。
- iaa.KeypointsOnImage:对一组关键点进行增强。