面向深度学习的图像数据增强综述A survey on Image Data Augmentation for Deep Learning
这篇论文探讨了图像数据增强技术在深度学习中的应用,强调了数据增强在解决大数据不足问题中的重要性。论文介绍了多种数据增强方法,包括几何变换(如平移、旋转、缩放)、颜色空间操作、随机裁剪、翻转、噪声添加、色彩空间转换等,并讨论了基于GAN的方法。此外,还提到了数据增强的其他特性,如测试时间增强、分辨率影响等。这些方法在提升模型性能和应对遮挡等方面具有显著效果。
论文笔记:A survey on Image Data Augmentation for Deep Learning
摘要:
该研究探讨了深度学习在计算机视觉领域的广泛应用,尤其是其在医学图像分析中的局限性。尽管现有的深度学习网络依赖于大量数据以避免过拟合,但这一前提在许多实际应用中难以满足,例如缺乏大量标注数据的医学领域。本研究聚焦于数据扩充技术,作为一种解决数据不足问题的解决方案。通过数据增强方法,可以有效提升训练数据集的规模和质量,从而构建性能更优的深度学习模型。论文中介绍的图像增强算法涵盖了几何变换、颜色空间调整、核函数应用、混合图像处理、随机删除策略、特征空间优化、对抗训练方法、生成对抗网络、神经风格迁移技术以及元学习策略等多种方法。此外,还详细探讨了基于GANS的增强方法及其应用前景。除了传统的数据增强技术外,本文还对数据增强的其他特性进行了简要分析,包括测试时间增强、分辨率调整等方面的影响。
图像数据增强技术
*Data Augmentations based on basic image manipulations
Geometric transformations 几何变换
Flipping 翻转
Color space 色彩空间
Cropping 裁剪
Rotation 旋转
Translation 平移
Noise injection 噪声
Color space transformations 色彩空间转换
Geometric transformations 几何变换
图像的空间变换又被称为图像空间变换,它通过将图像中的坐标点位置映射到目标位置,实现了图像的空间位置调整。这种变换操作不会影响图像的像素值,其主要作用是通过重新排列像素位置来完成图像的空间调整。一个完整的几何变换过程通常包含两个主要运算部分:首先,涉及的运算包括平移、镜像、缩放、旋转、仿射 等操作,这些运算共同描述了输出图像与输入图像像素之间的映射关系;其次,还需要采用灰度差值计算方法,因为这种变换关系在计算输出图像像素值时,往往会将像素位置映射到非整数坐标位置上。
Flipping 翻转
对于图像而言,水平翻转比垂直翻转更常见。
Color space 色彩空间
数字图像数据通常以一个三维张量的形式表示,其维度为高度×宽度×颜色通道数。在颜色通道空间中进行增强操作,这是数据增强中常用的一种方法。较为基础的图像增强方法包括分别处理单色通道(如R、G、B通道)以及调整直方图分布,这些方法应用较为广泛。方法:亮度调节、对比度调整、饱和度调整、直方图均衡化、白平衡校正、clahe处理等。
Cropping 裁剪
改变图片center的大小。(对于商品识别,识别目标多的图片用的少)
Rotation 旋转
图像能够被旋转0至360度,无论是顺时针还是逆时针方向,微小角度的旋转通常在±20度范围内。特别注意,对于带标签的数据,旋转后的XML文件也需要相应调整。
Translation 平移
左右移动图像或上下移动图像是一种非常有用的转换方式,以防止数据位置偏移。
Noise injection 噪声
图片通过添加噪声来增强模型的抗噪声能力,常见的噪声类型包括高斯模糊、椒盐噪声和均值滤波等。
Color space transformations 色彩空间转换
实现图像在RGB、HSV、LAB等色彩空间之间的转换。在某些任务中,色彩特征具有重要意义。
import tensorlayer as tl
image = tl.vis.read_image(r"2.jpg")
#缩放,缩小0.8倍
xx = tl.prepro.zoom(image, zoom_range=0.8)
#axis=1,水平翻转,axis=0,垂直翻转
xx = tl.prepro.flip_axis(image, axis=1, is_random=False)
# 调整亮度 gamma小于1,变亮,越小越亮
xx =tl.prepro.brightness(image, gamma=1.2, is_random=False)
#裁剪
xx=tl.prepro.crop(image, 400,400, is_random=False, row_index=0, col_index=1)
#调整亮度,饱和度,对比度
xx=tl.prepro.illumination(image, gamma=0.7, contrast=1.0 , saturation=1, is_random=False)
#随机调整亮度,饱和度,对比度
xx = tl.prepro.illumination(image, gamma=(0.5, 5.0), contrast=(0.3, 1.0), saturation=(0.7, 1.0), is_random=True)
#平移
xx = tl.prepro.shift(xx, wrg=-0.1, hrg=0, is_random=False)
#噪声
xx=tl.prepro.drop(image, keep=0.5)
#色彩空间转化rgb->hsv
xx=tl.prepro.rgb_to_hsv(image)
tl.vis.save_image(xx, r"img_result.jpg")
#对图像文件夹里的图像随机高斯模糊
import cv2,os
import random
def blur_img(imgName):
ori_img = cv2.imread(imgName)
size= random.choice((9,11,13,17))#高斯核
kernel_size = (size, size)
image = cv2.GaussianBlur(ori_img, ksize=kernel_size, sigmaX=0, sigmaY=0)
cv2.imwrite(imgName, image)
def random_blur(fileDir):
pathDir = os.listdir(fileDir)
filenumber = len(pathDir)
rate = 0.7 # 自定义抽取图片的比例
picknumber = int(filenumber * rate)
sample = random.sample(pathDir, picknumber)
count=0
for name in sample:
namepath=os.path.join(fileDir,name)
blur_img(namepath)
count+=1
print(name+":"+str(count)+"/"+str(picknumber))
*Geometric versus photometric transformations
Kernel flters 滤波器
Mixing images 混合图像
Random erasing 随机擦除
Kernel flters 滤波器
核滤波器作为一种广受欢迎的图像处理技术,其核心功能包括图像锐化和模糊处理。该种滤波器的工作原理是通过滑动n×n的高斯模糊滤波器在图像上,实现图像模糊效果。同时,采用高对比度垂直或水平边缘滤波器,能够显著提升边缘图像的清晰度。在数据增强过程中,模糊图像可能导致更高的运动模糊阻力,从而影响图像质量。此外,锐化图像不仅能够增强数据细节,还能为感兴趣对象提供更多关键信息。
Mixing images 混合图像

Random erasing 随机擦除
Random Erasing(亦可视为一种添加噪声的技术)。该方法已被证明在多种CNN架构和多个领域中能显著提升模型性能并增强对遮挡的鲁棒性。此外,它与随机裁剪、随机水平翻转(以及正则化方法)具有一定的互补性。综合运用这些方法,可以显著提升模型的性能,尤其是在对噪声和遮挡的鲁棒性方面表现更为突出。该方法可以较为容易地整合到现有大部分CNN模型中,用于训练具有更好泛化性能的模型。
随机擦除算法:

import cv2 as cv
import numpy as np
#模糊
def blur_demo(image):
dst = cv2.blur(image, (15, 1))
cv2.imshow("blur_demo", dst)
#锐化
def sharpen_demo(image):
kernel = np.array([[0, -1, 0], [-1, 5, -1], [0, -1, 0]], np.float32)
dst = cv.filter2D(image, -1, kernel=kernel)
cv.imshow("custom_blur_demo", dst)
src = cv2.imread("3.jpg")
cv2.namedWindow("input image", cv.WINDOW_AUTOSIZE)
cv2.imshow("input image", src)
blur_demo(src)
cv2.waitKey(0)
cv2.destroyAllWindows()
#图像融合
import cv2
import numpy as np
import PIL.Image as Image
# 统一图像大小
im= cv2.imread(r"1.jpg")
obj= cv2.imread(r"2.jpg")
w=int(im.shape[0])
h=int(im.shape[1])
obj=cv2.resize(obj,(h,w),interpolation=cv2.INTER_CUBIC)
# 生成全白的mask
mask = 255 * np.ones(obj.shape, obj.dtype)
width, height, channels = im.shape
center = (height//2, width//2)
# cv2.NORMAL_CLONE代表融合的模式,可以比较 cv2.NORMAL_CLONE和cv2.MIXED_CLONE的差别
normal_clone = cv2.seamlessClone(obj, im, mask, center, cv2.NORMAL_CLONE)
mixed_clone = cv2.seamlessClone(obj, im, mask, center, cv2.MIXED_CLONE)
# Write results
cv2.imwrite(r"C:\Users\An\Desktop\imgtest\2normal-clone.jpg", normal_clone)
cv2.imwrite(r"C:\Users\An\Desktop\imgtest\2mixed-clone.jpg", mixed_clone)
#图像随机擦除
def transfrom(img,probability=1,sl=0.01, sh=0.03, r1=0.2, mean=(255,255,255)):
if random.uniform(0, 1) > probability:
return img
area = img.shape[0] * img.shape[1]
#面积
target_area = random.uniform(sl, sh) * area
#长宽比
aspect_ratio = random.uniform(0.1,r1)
h = int(round(math.sqrt(target_area * aspect_ratio)))
w = int(round(math.sqrt(target_area /aspect_ratio)))
if w < img.shape[1] and h < img.shape[0]:
x1 = random.randint(0, img.shape[0] - h)
y1 = random.randint(0, img.shape[1] - w)
if img.shape[2] == 3:
for i in range(x1,x1 + h):
for j in range(y1,y1+w):
img[i,j,:]=mean
return img
相关文献:
- 图像融合相关内容:
<> - 论文链接地址:
https://www.researchgate.net/publication/334279066_A_survey_on_Image_Data_Augmentation_for_Deep_Learning - tensorlayer使用说明:
https://tensorlayercn.readthedocs.io/zh/latest/modules/prepro.html - 随机擦除论文链接地址:
https://arxiv.org/pdf/1708.04896v2.pdf
