-
2022-02-26 22:51:19
目录
2.1 通过ImageDataGenerator 对数据进行增强
1. 数据增强的实现方法
(1)归一化
把数据归一化到一定的区间内,使得网络更容易学习。(2)图像变换
翻转,拉伸,裁剪,变形(丰富数据)(3)色彩变换
对比度,亮度(4)多尺度裁剪
2. 数据增强在tf中的实现
通过keras.preprocessing.image.ImageDataGenerator接口来实现数据增强
rescale = 1./255, # 将所有的像素点缩放到0——1,因为所有的像素点的值在0——255之间。
rotation_range = 40, # 图像增强的一种方式,比如 ratation_range = 40, 表示将图像随机旋转的角度为-40——40度之间。
width_shift_range = 0.2, # 水平方向上的位移,小于1,表示的就是位移的比例;大于1,就是移动的像素值。width_shift_range = 0.2,表示图像随机平移0——20%
height_shift_range = 0.2, # 竖直方向上的位移
shear_range = 0.2, # 剪切强度
zoom_range = 0.2, # 缩放强度
horizontal_flip = True, # 是否在水平方向上做随机反转
fill_mode = 'nearest') # 对图片做处理时,需要填充像素时使用。比如,对图像做放大操作,有些像素点需要填充。
2.1 通过ImageDataGenerator 对数据进行增强
# 训练数据 train_datagen= keras.preprocessing.image.ImageDataGenerator( rescale = 1./255, # 将所有的像素点缩放到0——1,因为所有的像素点的值在0——255之间。 rotation_range = 40, # 图像增强的一种方式,比如 ratation_range = 40, 表示将图像随机旋转的角度为-40——40度之间。 width_shift_range = 0.2, # 水平方向上的位移,小于1,表示的就是位移的比例;大于1,就是移动的像素值。width_shift_range = 0.2,表示图像随机平移0——20% height_shift_range = 0.2, # 竖直方向上的位移 shear_range = 0.2, # 剪切强度 zoom_range = 0.2, # 缩放强度 horizontal_flip = True, # 是否在水平方向上做随机反转 fill_mode = 'nearest') # 对图片做处理时,需要填充像素时使用。比如,对图像做放大操作,有些像素点需要填充。 train_generator = train_datagen.flow_from_directory( train_dir, target_size = (height, width), batch_size = batch_size, seed = 7, shuffle = True, class_mode = "categorical") # 验证数据 valid_datagen= keras.preprocessing.image.ImageDataGenerator( rescale = 1./255 # 将所有的像素点缩放到0——1,因为所有的像素点的值在0——255之间。 ) valid_generator = train_datagen.flow_from_directory( valid_dir, target_size = (height, width), batch_size = batch_size, seed = 7, shuffle = False, class_mode = "categorical")
更多代码详见:本代码使用的是卷积神经网络作基础。
更多相关内容 -
睿智的目标检测28——YoloV4当中的Mosaic数据增强方法
2020-12-20 20:52:25睿智的目标检测28——YoloV4当中的Mosaic数据增强方法学习前言什么是Mosaic数据增强方法实现思路全部代码 学习前言 哈哈哈!我又来数据增强了! 什么是Mosaic数据增强方法 Yolov4的mosaic数据增强参考了CutMix数据... -
labelme数据增强
2018-09-08 12:12:34在终端中运行命令python a.py生成20张数据增强后的图片及其对应的json文件,包括翻转,加噪,模糊,加减曝光等图片 在终端中运行python labelme2COCO.py生成COCO格式数据集,可以进行mask-rcnn 和faster-rcnn 等的输入... -
python图像数据增强
2019-03-16 16:47:01此代码用于实现图像数据增强,对图片进行批量处理。包括图片旋转、翻转、模糊、增加噪声、亮度几种处理。运行需要安装python、opencv、numpy等。 使用时将图片统一放在img文件夹中,并将img文件夹和下载的py文件放在... -
图像批量数据增强(平移、旋转,翻转,对比度增强等)
2020-09-20 16:26:07图像的批量数据增强。程序需要python环境,使用起来方便快捷。只需修改图片来源和输出路径,并根据功能调整即可 -
数据增强方法
2019-03-03 19:38:38深度学习在数据量较小的情况下需要进行数据增强操作。本代码可以进行执行,增强数据 -
Matlab数据增强
2018-10-23 09:50:04matlab的一个小脚本,用于训练数据不够时数据增强使用 -
图片类训练集的数据增强代码
2019-10-29 10:41:57输入原始图片所在文件夹,原始图片标签,输出增强后的图片文件夹名及输出标签名,运行即可。 -
python实现图像数据增强
2018-10-29 16:35:39python实现图像数据增强,实现对数据的增强,包括调亮,调暗,裁剪,镜像等等等,操作简单,可批量处理 -
图片数据的基本预处理与数据增强
2022-02-10 09:26:46小数据集算力够,倾向于使用数据增强,帮助小数据集防止过拟合。如果数据集本身就是一些比较大的图片,复杂度比较高,反而不会去使用数据增强了。1 数据预处理
当数据顺利导入数据后,我们就可以依据图像的具体情况对图像进行预处理了。与机器学习中较为固定的预处理流程不同,图像的预处理基本完全与数据本身有关。从数据采集的瞬间开始,我们就需要考虑预处理的事项。如果我们的数据是自行从网络爬取或搜索引擎采集,我们可能需要对图像进行去重、删除无效样本等操作,如果数据是自行拍摄、实验提取,那可能也需要根据实验要求进行一些删除、增加的处理。当我们将所有有效数据导入后,至少需要确保:
1)全部样本的尺寸是一致的(同时,全部样本的通道数是一致的)
2)图像最终以Tensor形式被输入卷积网络
3)图像被恰当地归一化
其中,前两项是为了卷积神经网络能够顺利地运行起来,第三项是为了让训练过程变得更加流畅快速。在PyTorch中,所有的数据预处理都可以在导入数据的时候,通过transform参数来完成,我们通常在transform参数中填写torchvision.transforms这个模块下的类。在预处理时,我们需要使用的常规类如下所示:
Compose transforms专用的,类似于nn.Sequential的打包功能,可以将数个transforms下的类 打包,形成类似于管道的结构来统一执行。
CenterCrop 中心裁剪。需要输入最终希望得到的图像尺寸。
Resize 尺寸调整。需要输入最终希望得到的图像尺寸。注意区别于使用裁剪缩小尺寸或使 用填充放大尺寸。
Normalize 归一化(Tensor Only)。对每张图像的每个通道进行归一化,每个通道上的每个像素
会减去该通道像素值的均值,并除以该通道像素值的方差。
ToTensor (PIL Only)将任意图像转变为Tensor
无论使用怎样的卷积网络,我们都倾向于将图像调整到接近28x28或224x224的尺寸。当原图尺寸与目 标尺寸较为接近时,我们可以使用“裁剪”功能。裁剪是会按照我们输入的目标尺寸,将大于目标尺寸的 像素点丢弃的功能,因此使用裁剪必然会导致信息损失,过多的信息损失会导致卷积网络的结果变差。 当需要检测或识别的对象位于图像的中心时,可以使用中心裁剪。中心裁剪会以图像中心点为参照,按照输入的尺寸从外向内进行裁剪,被裁剪掉的像素会被直接丢弃。如果输入的尺寸大于原始图像尺寸, 则在原始图像外侧填充0,再进行中心裁剪。
当图像的尺寸与目标尺寸相差较大,我们不能接受如此多的信息被丢弃的时候,就需要使用尺寸调整的类Resize。Resize是使用像素聚类、像素插补等一定程度上对信息进行提取或选择、并按要求的尺寸重排像素点的功能。一般来说,Resize过后的图片会呈现出与原图较为相似的信息,但图片尺寸会得到缩放。如果原始图像尺寸很大,目标尺寸很小,我们一般会优先使用Resize将图像尺寸缩小到接近目标尺寸的程度,再用裁剪让图片尺寸完全等于目标尺寸。例如,对于600*800的图像,先Resize将尺寸降到 256x256,再裁剪至224x224。
from torch import nn
transform = transforms.Compose([transforms.Resize(256)
,transforms.CenterCrop(224)])
#等价于
transform = nn.Sequential(transforms.Resize(256)
,transforms.CenterCrop(224))
调整完尺寸之后,我们需要对数据进行归一化,在这里使用的类是 transforms.Normalize() 。从理论上来说,图像数据的归一化不是必须的,但历史的经验告诉我们,归一化能够非常有效地改善整体训练过程速度,并对最终模型的结果造成巨大的影响,因此各大经典架构的论文和PyTorch官方都强烈建议进行归一化。这里的归一化与BN等训练过程中存在的归一化有较大的区别,这里的归一化主要是让像素值减去一个数(默认为均值)、再除以另一个数(默认是标准差),以实现对像素值大小的改变, 让模型在一个较高的起点上训练,但并不能像BN一样改变数据的分布。
对表格数据而言,归一化是以特征为单位进行的,每个特征会单独减去自己这个特征的均值,再除以这个特征的标准差。对任意图像而言,归一化都是以通道为单位进行的,每个通道上的全部样本的全部像素点会减去通道像素的均值,再除以通道像素的标准差。为了能够对通道上的全部像素进行计算,图像在被归一化前必须被转化为Tensor。因此在实际中,我们常常将 transforms.Normalize() 常常和 transforms.ToTensor() 连用,具体如下:
transform = transforms.Compose([transforms.ToTensor()
,transforms.Normalize(0.5,0.5)])
注:类transforms.ToTensor()已经带有归一化的功能:这个类会按照最大值255,最小值0对图片数据进行归一化,将所有图像的像素值压缩到[0,1]之间。因此类transforms.Normalize()往往是在[0,1]区间执行。因此类 transforms.Normalize() 往往是在[0,1]区间上执行。唯一的例外可能是表格数据,如果输入transforms.ToTensor() 的数据原本是二维表,那其最大值可能会远远超出255,那经过归一化后数字范围也不会在[0,1]之间。为了避免这种情况的出现,我们可以提前将二维表的数据压缩到[0,255]之间。
在类 transforms.Normalize() 中有两个参数,一个是mean,另一个是std,分别代表需要减去的值和需要除以的值。比较常见的填写方式有以下三种:
对图像而言,必须完成的预处理就只有尺寸调整和归一化而已。接下来看数据增强(data augmentation)。
2 数据增强
数据增强是数据科学体系中常用的一种增加数据量的技术,它通过添加略微修改的现有数据、或从现有数据中重新合成新数据来增加数据量。使用数据增强技术可以极大程度地减弱数据量不足所带来的影响,还可以提升模型的鲁棒性、为模型提供各种“不变性”、增加模型抗过拟合的能力。常见的数据增强手段如下:
在PyTorch中,只要利用torchvision.transforms中包含的类,就能很容易地实现几乎所有常见的增强手段。torchvision.transforms下的类可以分为四大类别:尺寸变化、像素值变化、视角变化以及其他变化。
在能够让尺寸变化的类中,各类随机裁剪图像的类可以支持数据增强中的“缩放”功能(可放大,可缩小)。通常来说,如果裁剪是“随机”的,这个类一定是被用于数据增强,而不是被用于数据预处理的。这其中最常用的是transforms.RandomCrop(),常常被放在transforms.Resize()后面替代中心裁剪。
数据增强是增加数据量的技术,而上面的操作哪里增加数据量了呢?
如果我们更换不同的数据集、不同的数据增强方式,很快就会发现,除了明确标明会生成多张裁剪图片的 FiveCrop 以及 TenCrop 两个类,其他的类都不能改变数据集中的数据总量。看上去这些进行数据增 强的类只是对数据集进行了一个整体的转化而已,并没有真正实现“数据增强”。但深度学习框架在设计上总是非常巧妙的设计。虽然代码上无法直接看出来,但当我们将使用transform处理过的数据放入训练过程时,数据增强就会被实现。我们来看看具体是怎么回事。
回顾构建的CustomDstaset类:
我们在构建任意继承自Dataset类的、用于读取和构建数据的类CustomDataset时,将transform的使用流程写在了__getitem__(),而没有放在__init__()中,因此CustomDataset被运行时被不会自动对数据执行transform中的操作。相对的,由于继承自Dataset类,CustomDataset会将数据进行读取,并将源数据本身放入内存。当我们通过__getitem__()方法调用数据集中的任意数据时,CustomDataset会从已经存储好的原始数据中,复制出我们希望调用的那些样本,同时激活transform的相关流程,将调用的数据进行transform处理。在这种情况下,返回到我们面前的是从原始数据中复制出的样本经过transform处理后的样子,储存在内存中的原始数据并没有被改变。
事实上,任何torchvision.datasets下用于提取数据或处理数据的类都遵守这一原则:只保存原始数据,仅在调用数据时才对数据进行transform处理,这既有利于节省内存空间(只需要保存一份数据),也利于计算速度(只对需要使用的样本才进行处理)。一般数据被读取后,可能经过分训练集测试集的sample_split,分批次的DataLoader,但他们都不会触发transform。因此当我们读取数据、分割数据时,没有任何预处理或者数据增强的操作被执行。数据增强什么时候被执行呢?——当我们从分割好的batch_size中提取出数据进行训练时。例如:
训练时,我们会一个epoch一个epoch地进行循环,并且在每个epochs中循环所有批次。每次当 batchdata中的x和y被调用来训练时,transform就会作用于该批次中所有被提取出的样本。也就是说, 在红色箭头指向处,每个批次中的样本都会经过随机裁剪、随机旋转等图像增强操作。
在没有transform的时候,全部数据被分割为不同批次,因此一个epoch中每个批次的数据是不同的,但全部批次组成的这个epoch的数据都是一致的,分割批次只不过改变了样本的训练顺序,并没有增加新 的样本,而循环epochs只是在原有的数据上不断进行学习。在存在transform之后,尽管每个批次中的原始数据是一致的,但在每次被调用时,这些数据都被加上了随机裁剪、随机旋转、随机水平翻转等操作,因此每个批次中的样本都变成了“新样本”,这让整个被训练的epoch都与之前的epoch产生了差异。 因此在transform存在时,无论我们循环多少epochs,每个epochs都是独一无二的,这就相当于增加 了数据量,实现了“数据增强”。相对的,当transform存在时,我们的模型一次也不会见到原始的数据。
这种做法非常巧妙,并且非常节约内存。每次训练时,我们只需要保留原始数据,每个batch训练结束之后,被transform处理过的数据就可以被释放。数据增强也存在缺点,如果存在数据增强操作,模型的迭代周期会更长,毕竟数据中存在大量的随机性,模型收敛得会更慢。但这样得到的模型的鲁棒性和泛化能力都会更强。另一个显而易见的缺点是,数据增强中的随机性无法使用随机数种子进行控制。如果使用随机性种子进行控制,那每次进行的随机操作就会是一致的,每个epochs就会一致,这就和一次性对数据进行处理后再带入训练没有区别,这会让数据增强操作失去意义。
小数据集算力够,倾向于使用数据增强,帮助小数据集防止过拟合。如果数据集本身就是一些比较大的图片,复杂度比较高,反而不会去使用数据增强了。
-
Opencv-Python数据增强
2022-02-18 15:20:24Opencv-Python数据增强 常见的数据增强操作有:按比例放大或缩小图片、旋转、平移、水平翻转、改变图像通道等。 1.按比例放大和缩小 扩展缩放只是改变图像的尺寸大小。OpenCV 提供的函数 cv2.resize()可以实现这...Opencv-Python数据增强
常见的数据增强操作有:按比例放大或缩小图片、旋转、平移、水平翻转、改变图像通道等。
1.按比例放大和缩小
扩展缩放只是改变图像的尺寸大小。OpenCV 提供的函数 cv2.resize()可以实现这个功能。图像的尺寸可以自己手动设置,也可以指定缩放因子。可以选择使用不同的插值方法。在缩放时我们推荐使用 cv2.INTER_AREA,在扩展时我们推荐使用 v2.INTER_CUBIC(慢) 和 v2.INTER_LINEAR。默认情况下所有改变图像尺寸大小的操作使用的插值方法都是 cv2.INTER_LINEAR。
# 缩小 -- 宽和高都缩小为原来的scale倍 def zoom_down(img,scale): img = cv2.resize(img,None,fx= scale,fy= scale,interpolation=cv2.INTER_CUBIC) return img # 放大 -- 宽和高都放大为原来的scale倍 def zoom_up(img,scale): img = cv2.resize(img,None,fx= scale,fy= scale,interpolation=cv2.INTER_CUBIC) return img
resize库中第二个参数是目标大小,例如如果我想把图片resize成300*300大小的,可以这么写:
img = cv2.resize(img,(300,300))
2.平移图像
平移就是将对象换一个位置。如果你要沿(x,y)方向移动,移动的距离是(tx,ty),你可以以下面的方式构建移动矩阵:
可以使用 Numpy 数组构建这个矩阵(数据类型是 np.float32),然后把它传给函数cv2.warpAffine()。
mat_translation = np.float32([[1, 0, 20], [0, 1, 30]])
例如上面是的矩阵是将图像往水平方向上移动20个像素点,竖直方向上移动30个像素点。
实例:
# 平移 -- 水平平移或竖直方向平移 def translation(img,tx,ty): height = img.shape[0] width = img.shape[1] mat_translation = np.float32([[1, 0, tx], [0, 1, ty]]) # 变换矩阵:设置平移变换所需的计算矩阵:2行3列 img = cv2.warpAffine(img, mat_translation, (width + tx, height + ty)) # 变换函数 return img
我这里封装的tx和ty分别为水平和竖直方向需要移动的像素点数。
3.旋转图像
OpenCV 提供了一个函数:cv2.getRotationMatrix2D
# 旋转 def rotation(img,angle,scale): rows = img.shape[0] cols = img.shape[1] # 这里的第一个参数为旋转中心,第二个为旋转角度,第三个为旋转后的缩放因子 # 可以通过设置旋转中心,缩放因子,以及窗口大小来防止旋转后超出边界的问题 M = cv2.getRotationMatrix2D((cols / 2, rows / 2), angle, scale) # 向左旋转angle度并缩放为原来的scale倍 img = cv2.warpAffine(img, M, (cols, rows)) # 第三个参数是输出图像的尺寸中心 return img
4.镜像变换
Opencv提供了cv2.flip()函数,可以第二个参数为1时为水平翻转,为0时垂直翻转。为了后面调用方便,我还是自己封装了一下。
# 镜像变换 def mirror(img,mode): img = cv2.flip(img, mode) # mode = 1 水平翻转 mode = 0 垂直翻 return img
5.添加椒盐噪声
椒盐噪声为纯黑或纯白的像素点,随机生成。
# 添加椒盐噪声 def spiced_salt_noise(img,prob): output = np.zeros(img.shape,np.uint8) thres = 1 - prob for i in range(img.shape[0]): for j in range(img.shape[1]): rdn = random.random() if rdn < prob: output[i][j] = 0 # 椒盐噪声由纯黑和纯白的像素点随机组成 elif rdn > thres: output[i][j] = 255 else: output[i][j] = img[i][j] return output
6.添加高斯噪声
与椒盐噪声不同,高斯噪声是彩色的,方差越大时噪声越大。
# 添加高斯噪声 def gasuss_noise(image, mean = 0, var = 0.01): ''' 添加高斯噪声 mean : 均值 var : 方差,方差越大越模糊 ''' image = np.array(image/255, dtype=float) noise = np.random.normal(mean, var ** 0.5, image.shape) out = image + noise if out.min() < 0: low_clip = -1. else: low_clip = 0. out = np.clip(out, low_clip, 1.0) out = np.uint8(out*255) return out
7.模糊化
将图片模糊或平滑有多种算法,例如高斯模糊、中值模糊、均值模糊等,我这里使用一个比较普通的cv2.blur()实现。同样也是先封装方便我后面调用。
# 模糊 def blur(img,scale): img = cv2.blur(img,(scale,scale)) # scale越大越模糊 return img
这里的scale其实就是滤波器的尺寸,一般取奇数,scale越大越模糊,
8.重新组合颜色通道
在opencv中,图像的通道顺序为BGR,也就是蓝绿红,可以改变成其他顺序以得到不同的效果。
# 重新组合颜色通道 def change_channel(img): b = cv2.split(img)[0] g = cv2.split(img)[1] r = cv2.split(img)[2] brg = cv2.merge([b, r, g]) # 可以自己改变组合顺序 return brg
实例
我有以下几张测试图片:
我希望随机地对这些图片进行一些变换,最终执行结果如下:
可以看到程序对我的图片随机进行了各种变换,我这里只是一次变换,读者也可以尝试对图片同时进行多种变换。
本次程序如下:
#!/usr/bin/env python # -*- coding: utf-8 -*- # @Time : 2022/2/18 16:30 # @Author : 若谷 # @File : Data_Augumentation.py # @Software: PyCharm import numpy as np import cv2 import random import os import sys # 缩小 -- 宽和高都缩小为原来的scale倍 def zoom_down(img, scale): img = cv2.resize(img, None, fx=scale, fy=scale, interpolation=cv2.INTER_CUBIC) return img # 放大 -- 宽和高都放大为原来的scale倍 def zoom_up(img, scale): img = cv2.resize(img, None, fx=scale, fy=scale, interpolation=cv2.INTER_CUBIC) return img # 平移 -- 水平平移或竖直方向平移 def translation(img, tx, ty): height = img.shape[0] width = img.shape[1] mat_translation = np.float32([[1, 0, tx], [0, 1, ty]]) # 变换矩阵:设置平移变换所需的计算矩阵:2行3列 img = cv2.warpAffine(img, mat_translation, (width + tx, height + ty)) # 变换函数 return img # 旋转 def rotation(img, angle, scale): rows = img.shape[0] cols = img.shape[1] # 这里的第一个参数为旋转中心,第二个为旋转角度,第三个为旋转后的缩放因子 # 可以通过设置旋转中心,缩放因子,以及窗口大小来防止旋转后超出边界的问题 M = cv2.getRotationMatrix2D((cols / 2, rows / 2), angle, scale) # 向左旋转angle度并缩放为原来的scale倍 img = cv2.warpAffine(img, M, (cols, rows)) # 第三个参数是输出图像的尺寸中心 return img # 镜像变换 def mirror(img, mode): img = cv2.flip(img, mode) # mode = 1 水平翻转 mode = 0 垂直翻 return img # 添加椒盐噪声 def spiced_salt_noise(img, prob): output = np.zeros(img.shape, np.uint8) thres = 1 - prob for i in range(img.shape[0]): for j in range(img.shape[1]): rdn = random.random() if rdn < prob: output[i][j] = 0 # 椒盐噪声由纯黑和纯白的像素点随机组成 elif rdn > thres: output[i][j] = 255 else: output[i][j] = img[i][j] return output # 模糊 def blur(img, scale): img = cv2.blur(img, (scale, scale)) # scale越大越模糊 return img # 添加高斯噪声 def gasuss_noise(image, mean=0, var=0.01): ''' 添加高斯噪声 mean : 均值 var : 方差,方差越大越模糊 ''' image = np.array(image / 255, dtype=float) noise = np.random.normal(mean, var ** 0.5, image.shape) out = image + noise if out.min() < 0: low_clip = -1. else: low_clip = 0. out = np.clip(out, low_clip, 1.0) out = np.uint8(out * 255) return out # 重新组合颜色通道 def change_channel(img): b = cv2.split(img)[0] g = cv2.split(img)[1] r = cv2.split(img)[2] brg = cv2.merge([b, r, g]) # 可以自己改变组合顺序 return brg # 随机进行以上操作 def Data_Augument(): for i in images_list: img = cv2.imread(image_dir+i) # 图片路径+图片名字 cv2.imshow('img',img) functions = [('zoom_down', [img, 0.8]), # 第一个参数为函数名,后面为函数调用时的参数 ('zoom_up', [img, 1.2]), ('translation', [img, 20, 30]), ('rotation', [img, 15, 0.9]), ('mirror', [img, 1]), ('spiced_salt_noise', [img, 0.01]), ('blur', [img, 5]), ('gasuss_noise', [img, 0, 0.01]), ('change_channel', [img])] choice = random.choice(functions) # 随机选择一个函数执行 this_module = sys.modules[__name__] # 当前文件 res = getattr(this_module, choice[0])(*choice[1]) cv2.imwrite(output_dir + i, res) if __name__ == '__main__': image_dir = './test/' # 源图片路径 images_list = os.listdir(image_dir) nums = len(os.listdir(image_dir)) print('found %d pictures' % nums) output_dir = './output/' # 图像变换后的保存路径 Data_Augument() # 执行 print('finished!')
总结
还有其他很多的数据增强操作,例如随机裁剪图像、添加颜色扰动等等。另外也有其他库可以进行这些操作,例如Keras中的图片预处理process库。我这种是离线式的,希望能将变换后的图片保存下来。
参考文献
1.Opencv中文官方文档:http://woshicver.com/
2.https://www.cnblogs.com/lfri/p/10627595.html
-
【什么是数据增强】
2022-02-14 11:11:30在工业场景中,因为工艺技术现在发展都比较好,所以很难收集到大量的缺陷数据用于深度学习的学习和训练,针对这种情况,我们可以利用数据增强来帮助深度学习算法更好学习小样本中的特征 什么是数据增强呢?就是让...在工业场景中,因为工艺技术现在发展都比较好,所以很难收集到大量的缺陷数据用于深度学习的学习和训练,针对这种情况,我们可以利用数据增强来帮助深度学习算法更好学习小样本中的特征
什么是数据增强呢?就是让有限的数据产生更多的等价数据
例如这是一台电脑
如果不使用数据增强的话这个电脑就只是一个电脑,每次训练的电脑都是这样的样子的,但是我们实际生活中电脑是多样的。因此我们可以通过改变亮度,图像扭曲等方式使得图像变得更加多种多样,如下图所示,尽管亮度,形态发生了细微改变,但本质上,这些东西都依然是电脑。
对应显示生活就是白天的电脑是电脑,夜晚的电脑也是电脑,正着放的电脑是电脑,斜着放的电脑也是电脑
改变后的图片放入神经网络进行训练可以为算法提供更多的信息,提高网络的鲁棒性,降低各方面额外因素对识别的影响。
但是要注意数据增强可以模拟识别目标在不同场景下的图像,一些实际的细节特征是模拟不出来的,
例如当零件旋转时,可能会出现不同的阴影,当旋转是基于数据增强产生时,这些阴影不会被算法学习到。什么是数据增强参数的激活概率?
用户模拟某个参数在现实世界的数据分布,例如拿一台相机在24小时里面记录一颗在户外生长的树进行采图,所获得的图片有50%的概率是较亮的(发生在白天),有50%的概率是较暗的(发生在黑夜),那么用一张白天的树的图片进行训练,就可以设置亮度参数在一个较暗的亮度范围内,然后激活概率设置50%再例如拿一台相机在24小时里面记录村边一只年纪大的狗狗,发现一整天大部分时间都在晒太阳睡觉,就要去吃饭的时候会跑起来,那么所获得的图片有90%是静止睡觉的,10%是运动的,假设狗狗运动的图片因为某些原因丢失了,那么我们及可以设置运动模糊参数,然后激活概率设置为10%
什么是噪声?
噪声在图像上常表现为一引起较强视觉效果的孤立像素点或像素块。一般,噪声信号与要研究的对象不相关,它以无用的信息形式出现,扰乱图像的可观测信息。通俗的说就是噪声让图像不清楚。
原图
高斯噪声
运动模糊
椒盐噪声
-
数据增强之Mosaic数据增强的优点、Mixup,Cutout,CutMix的区别
2022-03-01 16:17:02Mosaic数据增强方法是YOLOV4论文中提出来的,主要思想是将四张图片进行随机裁剪,再拼接到一张图上作为训练数据。 这样做有以下几个优点: 1、增加了数据的多样性,丰富了图片的背景。 2、增加了目标个数 3、四张... -
拼数数据加强版
2016-06-07 13:30:51拼数数据加强版,需要各类优化 -
keras深度学习之猫狗分类二(数据增强)
2022-02-14 16:06:53在这里我们采用数据增强的方法进一步提高识别率。 数据增强是从现有的训练样本中生成更多的训练数据,其方法是利用多种能够生成可信图像的随机变换来增加(augment)样本。其目标是,模型在训练时不会两次查看完全... -
数据增强
2019-05-21 15:51:43在深度学习中数据增强的意思 深度学习往往需要大量的样本数进行训练,而实际情况中数据并没有我们想象中的那么多,这时就要用到数据增强 数据增强是用来1.增加训练的数据量,提高模型的泛化能力。2.增加噪声数据,... -
深度学习笔记:为什么(预)特征提取不能与数据增强结合使用
2022-01-06 08:45:38对F.chollet《Deep Learning with Python》#5.3.1中所提到的预特征提取不能与数据增强结合使用的原因的辅助解释 -
深度学习入门之Pytorch——数据增强
2018-12-06 23:33:14数据增强 卷积神经网络非常容易出现过拟合的问题,而数据增强的方法是对抗过拟合问题的一个重要方法。 2012 年 AlexNet 在 ImageNet 上大获全胜,图片增强方法功不可没,因为有了图片增强,使得训练的数据集比实际... -
语义分割数据增强(Data augmentation for semantic segmentation)
2022-03-19 22:45:47数据增强 深度学习模型的*鲁棒性(robustness)和泛化性(generality)*受到训练数据的多样性和数据量所影响。数据增强(data augmentation)是机器学习和深度学习中经常采用的一个方法,其目的是扩大训练样本的数量。 ... -
数据增强之随机裁剪
2022-01-28 15:41:16批量随机裁剪 import os from PIL import Image import matplotlib.pyplot as plt import random import numpy as np def random_crop(image): min_ratio = 0.4 max_ratio = 0.7 w, h = image.size ... -
tensorflow进行数据增强
2020-11-17 15:32:57tensorflow进行数据增强 我们在进行训练的时候,如果输入的样本有限,会导致网络陷入过拟合。 在tensorflow里有专门针对这个的解决方法,tf.ImageDataGenerator,它的作用是进行数据增强。在给定数据的基础上进行 ... -
深度学习学习——时间序列数据增强
2021-09-23 13:50:24数据增强的工具包:https://tsaug.readthedocs.io/en/stable/index.html What is the difference between feature extraction with or without data augmentation? -
数据增强系列(1)top10数据增强技术:综合指南
2021-11-22 14:24:20数据增强技术就是人为地生成真实数据集的不同版本以增加其数据大小。计算机视觉(CV)和自然语言处理 (NLP) 模型使用数据增强策略来处理数据稀缺和数据多样性不足的问题。 数据增强算法可以提高机器学习模型的准确性。... -
深度学习-数据增强总结
2021-12-30 11:12:00数据增强简介2. 如何进行数据增强2.1 离线增强2.2 在线增强3. 图像中的数据增强3.1 裁剪(Cropping)3.2 翻转变换(Flipping)3.3 旋转 | 反射变换(Rotation/Reflection)3.4 颜色变换(Color Space)3.5 几何变换... -
paddle框架数据增强
2021-03-12 15:07:01数据增强的方法有随机裁减,改变图像尺寸,图像随机旋转,随机改变亮度,随机混合,随机增加噪声等 paddle支持的数据处理方法可以通过以下命令查看 print("飞桨支持的数据预处理方式:" + str(paddle.vision.... -
NLP数据增强;中文数据增强包;一键中文数据增强
2020-03-07 22:35:23NLP Chinese Data Augmentation 一键中文数据增强工具 介绍 一键中文数据增强工具,支持: 随机实体替换 近义词 近义近音字替换 随机字删除 在不改变原文的情况下生成指定数量的训练语料文本 Email:425776024@qq.... -
Mosaic数据增强
2022-01-01 16:43:30YOLO-V5 代码中数据增强代码理解 对 u 版 yolo-v5 中的 load_mosaic 代码的理解。 前言 【个人学习笔记记录,如有错误,欢迎指正】 YOLO-V4 论文地址:https://arxiv.org/pdf/2004.10934.pdf YOLO-V5 代码仓库... -
【机器学习】数据增强(Data Augmentation)
2021-10-27 16:02:35文章目录一、引言 - 背景二、为什么需要数据增强?三、什么是数据增强?定义分类四、有监督的数据增强1. 单样本数据增强(1)几何变换类(2)颜色变换类2. 多样本数据增强(1) SMOTE(2) SamplePairing(3) mixup五、无... -
基于图像的数据增强方法发展现状综述
2022-03-23 17:21:35基于图像的数据增强方法发展现状综述 人工智能技术与咨询2022-03-22 20:57 点击蓝字 · 关注我们 来源:《计算机科学与应用》,作者冯晓硕等 关键词:数据增强;图像数据集;图像处理;深度...