基于python下imgaug库的数据增广方法整理
1 常用数据增广方法
1) 镜像翻转(水平、垂直):对图像进行水平或垂直翻转。
2) 随机裁剪和缩放:随机地从图像中裁剪出不同尺寸的区域,或者随机缩放图像大小,引入了尺度和视角的变化。
3) 颜色变化:调整图像的亮度、对比度、饱和度等颜色属性,使模型更能适应不同光照条件。
4) 旋转和倾斜:对图像进行旋转或倾斜变换,增加了模型对旋转和倾斜情况下的鲁棒性。
5) 加噪声:向图像中添加随机噪声,可以使模型对噪声更具有鲁棒性。
6) 变形和弯曲:对图像进行变形、弯曲或扭曲,模拟真实场景中的形变情况。
7) 局部遮挡:随机遮挡图像的一部分,使模型能够更好地处理遮挡情况。
8) 组合多种增强方法:将多种增强方法组合起来,创造更多样化的变化。
Ps:imgaug可实现的数据增广方式还有很多,类似相机美颜中一些添加滤镜,局部特征点亮度、对比度调节都可实现,或者理解为photoshop可实现的,imgaug都可以实现。基于机械臂scooping和pouring的任务场景,可暂时选用以上列出的方法。
2 每种方法对应函数
1) 镜像翻转(水平、垂直):
- 水平翻转:
iaa.Fliplr(p)
- 垂直翻转:
iaa.Flipud(p)
参数 p 是翻转的概率,设置为 0.5 表示随机翻转。(或者理解为对于一个batch中50%的图像进行翻转)
2) 随机裁剪和缩放:
- 随机裁剪:
iaa.Crop(percent=(0.1,0.2))
(图像将被裁剪成原始尺寸的10%-20%,随机选择)或iaa.Crop(px=(0, 16))(从每边裁剪图像0到16px,随机选择)
- 随机缩放:
iaa.Affine(scale={"x": (0.8, 1.2), "y": (0.8,1.2)})
(x方向上缩放80%-120%,y方向上缩放80%-120%。Ps:变换后空白像素的默认填充方式为replicate,即采用图像的边缘像素平铺,可通过mode参数更改填充方式,一般不更改。)
3) 颜色变化:
- 亮度、对比度变化:
iaa.MultiplyAndAddToBrightness(mul=(a, b), add=(c, d))
参数 mul 控制亮度变化的范围,add 控制对比度的变化范围
4) 旋转和倾斜:
-
旋转变化
iaa.Affine(rotate=(-15, 15))
(-15度到+15度随机) -
倾斜变化
iaa.Affine(shear=(-20, 20))
(-20度到+20度随机)
5) 加噪声:
- 高斯噪声
iaa.AdditiveGaussianNoise(scale=(0, 0.05))
(可选参数loc表示高斯分布的均值,默认为0;per_channel:概率值,默认为0.0,控制是否对每个通道分别添加噪声。0.0表示所有通道共享相同的噪声, 1.0 表示每个通道都可能有不同的噪声)
6) 变形和弯曲:
- 随机变形
iaa.PiecewiseAffine(scale=(0, 0.05))
(变形强度处于0-0.05之间)
7) 局部遮挡:
- 遮挡
iaa.Cutout(nb_iterations=(1, 2), size=(1, 4))
(每次迭代随机选择 1 到 2
个区域进行遮挡,遮挡区域的边长在 1 到 4 之间)
8) 组合多种增强方法:
iaa.Sequential([augmenter1, augmenter2, ...],random_order=True)
(多种增强方法依次随机作用于图像,random_order控制是否随机,False时按照列表中的顺序依次作用于图像)
Ps:1’例子中的参数为常用参数 2’可选用其中2-4个方法组成增强序列,每种方法的强度或概率不宜过大。
3 使用方法
一般均采用以下代码模板(以采用裁剪旋转明暗变化和遮挡四种方法为例)
1. import numpy as np
2. import imgaug as ia
3. import imgaug.augmenters as iaa
4. from skimage import data
5.
6. # 用随机种子来保持可重复性
7. ia.seed(1)
8.
9. # 生成一批示例图像(这里用的是 skimage 库中的 Quokka 图像)
10. images = [data.quokka() for _ in range(8)] # 生成8张图像
11. images = np.array(images, dtype=np.uint8) # 转换图像类型为 uint8
12.
13. # 创建数据增强流水线
14. augmenter = iaa.Sequential([
15. iaa.Crop(percent=(0, 0.1)), # 随机裁剪,裁剪范围在 0% 到 10%
16. iaa.Affine(rotate=(-20, 20)), # 随机旋转角度在 -20 度到 20 度之间
17. iaa.Multiply((0.8, 1.2)), # 随机调整亮度,乘法因子范围在 0.8 到 1.2 之间
18. iaa.Cutout(nb_iterations=(1, 5), size=(8, 16)) # 随机遮挡,迭代次数在 1 到 5 之间,遮挡区域大小在 8x8 到 16x16 之间
19. ], random_order=True)
20.
21. # 应用数据增强到批量图像
22. images_aug = augmenter(images=images)
23.
24. # 显示原始图像和增强后的图像
25. for i in range(len(images)):
26. combined = np.hstack([images[i], images_aug[i]])
27. ia.imshow(combined)
4 可参考资料
- imgaug官方文档:https://imgaug.readthedocs.io/en/latest/
- API中文文档https://blog.csdn.net/qq_45723275/article/details/129276991
- 对于数据集含有标签的如分割检测问题,需要对标签采用相同的变换,可以看看
使用imgaug改进YOLO:
https://blog.csdn.net/qq1198768105/article/details/126197186
imgaug应用分割检测问题:
https://aistudio.baidu.com/aistudio/projectdetail/2386414 - Chatgpt3.5(#.#) https://chat.openai.com/