• 数据增强相关实现总结如下: import cv2 import numpy as np import tensorflow as tf import imutils import skimage import pillow path = '/home/zhangwei/workfiles/deeplearning/dogVScat/data/cat_1.jpg' img...

    前言: 主要总结了数据增强(Data augmentation)常用的一些方法,包括了翻转(flip)、旋转(rotation)、缩放(scale)、裁剪(crop)、移位(translation)和其他一些方法,列出了使用opencv、numpy、tensorflow和其他一些库进行实现的函数。还有展示了keras中的实现数据增强的工具。
    数据增强可以有效提高数据量,可以扩充训练数据集。但也并非万能的,有时过度信任数据增强会带来负面效果,还会增加网络训练时间。需酌情使用。

    相关总结如下:

    import cv2
    import numpy as np
    import tensorflow as tf
    import imutils
    import skimage
    import pillow
    
    path = '/home/zhangwei/workfiles/deeplearning/dogVScat/data/cat_1.jpg'
    img = cv2.imread(path)
    # tensorflow加载图片
    # img = tf.gfile.FastGFile(path).read()
    # img_data = tf.image.decode_jpeg(img)
    
    
    #-----> 翻转(flip)<--------------#
    # 用opencv实现
    flip_11 = cv2.flip(img, 1, dst = None) # 1:水平,0:垂直,-1:对角
    
    # 用numpy实现
    flip_21 = np.fliplr(img) # 水平翻转
    flip_22 = np.transpose	# 转置
    
    # 用tensorfolw实现
    flip_31 = tf.image.flip_up_down(img) 
    flip_32 = tf.image.flip_left_right	
    flip_33 = tf.image.random_flip_up_down # 随机翻转,50%概率
    flip_34 = tf.image.random_flip_left_right
    flip_35 = tf.image.transpose_image	# 转置图像
    
    
    #----> 旋转(rotation)<-----------#
    # 用opencv实现
    M = cv2.getRotationMatrix2D(center, 45, 1.0)
    rotation_11 = cv2.warpAffine(img, M, (w,h))
    rotation_12 = imutils.rotate(img, angles)
    
    # 用numpy实现
    rotation_21 = np.rot90(img, k, axes)
    
    # 用tensorflow实现
    rotation_31 = tf.image.rot90(img, k = 1) # k:旋转次数
    rotation_32 = tf.contrib.image.rotate(img, angles = 3.14) # 旋转任意角度
    
    # 用其他方式
    rotation_41 = skimage.transform.rotate(img, angles = 45, mode = 'reflect')
    
    
    #----> 缩放(scale)<-------------#
    # 用opencv实现
    scale_11 = cv2.resize(img, dsize, fx, fy, interpolation)
    
    # 用numpy实现
    reshape() x
    resize() x
    
    # 用tensorflow实现
    tf.image.resize_images(img, [M,N], method)
    tf.image.resize_image_with_crop_or_pad(img, M, N)
    tf.image.central_crop(img, factor)
    
    # 用其他方式
    scale_41 = skimage.transform.rescale(img, scale, mode)
    
    
    #---->裁剪(crop)<-------------#
    # 用切片即可实现
    
    # 用tensorflow实现
    crop_31 = tf.random_crop(img, size, seed)
    crop_32 = tf.image.crop_to_bounding_box()
    
    
    #---->移位(translation)<------------#
    # 用opencv实现
    M = np.float32([[x1,y1,z1],[x2,y2,z2]])
    translation_11 = cv2.warpAffine(img, M, (w,h))
    
    # 用numpy实现
    None
    
    # 用tensorflow实现
    translation_31 = tf.image.pad_to_bounding_box(img, pad_bottom, pad_right,height, width)
    
    
    #----->其他一些方法<----------------#
    # 光照对比度
    tf.image.adjust_brightness
    tf.image.random_brightness
    tf.iamge.adjust_constrast
    tf.image.random_constrast
    # 增加噪声
    # 其他有创造性的想法
    
    
    # !!!keras中有提供了批量数据增强的函数ImageDataGenerator!!!#
    from keras.preprocessing.image import ImageDataGenerator
    # 图像增强
    train_datagen = ImageDataGenerator(
    	featurewise_center=False,	# 去中心化
        samplewise_center=False,	# 样本均值为0
        featurewise_std_normalization = False,	# 样本值/数据集标准差
        samplewise_std_normalization = False,	# 样本值/自身标准差
        zca_whitening = False,	# ZCA白化
        rotation_range = 0.,	# 随机旋转角度*
        width_shift_range = 0.,	# 宽度比例0-1*
        height_shift_range = 0.,	# 高度比例0-1*
        shear_range = 0.,	# 剪切强度*
        zoom_range = 0.,	# 随机缩放幅度*
        channel_shift_range = 0., # 随机通道偏移幅度,颜色变化
        fill_mode = 'nearest',	# 当变换处理超出边界时,处理方式:constant,nearest,reflect,wrap
        cval = 0.0,	# 超出边界时,填充的值
        horizontal_flip = False,	# 随机水平翻转*
        vertical_flip = False,	# 随机垂直翻转*
        rescale = None,	# 比例系数
        preprocessing_function = None,	# 预处理函数*
        data_format = K.image_data_format()
    	)
    
    # 生成(x,y)元组的目标迭代器,x:图像numpy数组,y:标签numpy数组
    train_generator = train_datagen.flow_from_directory(
    	directory: Any, # 寻找该目录下的图像
        target_size: Tuple[int, int] = (256, 256), # 调整找到的所有图像尺寸
        color_mode: str = 'rgb', # 图像颜色模式
        classes: Any = None, # 子目录,类列表
        class_mode: str = 'categorical', # 类模式
        batch_size: int = 32, # 批次大小
        shuffle: bool = True, # 随机数据,否则按照字母排序
        seed: Any = None, # 种子,用于洗牌和切换
        save_to_dir: Any = None, # 保存路径
        save_prefix: str = '', # 保存前缀
        save_format: str = 'png', # 保存格式:png,jpeg
        follow_links: bool = False, # 跟随链接
        subset: Any = None, # 子集(验证集)
        interpolation: str = 'nearest' # 插值方式
    	)
    
    # 使用其训练模型,返回值为一个对象
    model.fit_generator(
    	generator = train_generator,  # 生成器 
    	steps_per_epoch, # 次数
    	epochs=1, # 迭代轮数
    	verbose=1, # 日志显示,0:不输出,1:输出进度条信息,2:每个epoch出一行记录
    	callbacks=None, # 回调 
    	validation_data=None, # 生成验证集生成器:tuple
    	validation_steps=None, # 当validation为生成器,指定返回次数
    	class_weight=None, # 类别权重字典
    	max_q_size=10, # 生成器队列最大容量
    	workers=1, # 最大进程数
    	pickle_safe=False, # 基于进程的线程
    	initial_epoch=0 # 从该参数指定的epoch开始训练
    	)
    
    展开全文
  • @[TOC]深度学习中以原始数据为基础扩充数据集时,如何方便快捷的为扩充数据打label 在我们为深度学习做数据集的过程中,如果原始图片比较少,往往需要通过我们模仿外界条件为原始图像添加噪声、调整亮度等操作扩充...

    @[TOC]深度学习中以原始数据为基础扩充数据集时,如何方便快捷的为扩充数据打label

    在我们为深度学习做数据集的过程中,如果原始图片比较少,往往需要通过我们模仿外界条件为原始图像添加噪声、调整亮度等操作扩充数据集。但对于扩充的数据我们又不想再进行一个一个的去打label,那么我们可以根据标定好的原始数据,通过python代码自动实现为扩充的数据部分打label。

    下面的代码实现了对原始图片的添加噪声、改变亮度,并对其进行打label。

    源码如下:

    import matplotlib.pyplot as plt
    import os
    import skimage
    import random
    from skimage import data_dir, io, img_as_float, exposure, filters
    from skimage.morphology import disk
    import skimage.filters.rank as sfr
    from PIL import Image, ImageEnhance
    import xml.dom.minidom
    
    def gaussion(image,image_name, output_image_path):
    
    	image = io.imread(image)
    	name = os.path.splitext(image_name)[0]
    	try:
    		'''gaussian noise'''
    		variance = round(random.uniform(0.001,0.005),4)
    		image_noise = skimage.util.random_noise(image, mode='gaussian', seed=None, clip=True, var = variance)
    		io.imsave(output_image_path+name+'_gaunoise.jpg', image_noise)
    
    		dom1 = xml.dom.minidom.parse(xml_path + name +'.xml')
    		xmlfile1 = open(output_xml_path+name+'_gaunoise.xml','w')
    		xmlfile1.write(dom1.toprettyxml(encoding='utf-8'))
    		'''gaussian filter'''
    		sigma = round(random.uniform(0.1,1),3)
    		image_filter = filters.gaussian(image, sigma)
    		io.imsave(output_image_path+name+'_gaufilter.jpg', image_filter)
    
    		dom2 = xml.dom.minidom.parse(xml_path + name +'.xml')
    		xmlfile2 = open(output_xml_path+name+'_gaufilter.xml','w')
    		xmlfile2.write(dom2.toprettyxml(encoding='utf-8'))
    	except ValueError:
    		print('cannot save')
    
    def add_noise(image,image_name, index, output_image_path):
    
    	image = io.imread(image)
    	name = os.path.splitext(image_name)[0]
    
    	if index == 1:
    		'''salt noise'''
    		variable = round(random.uniform(0.01,0.05),4)
    		image_noise = skimage.util.random_noise(image, mode='salt', seed=None, clip=True, amount=variable)
    
    	elif index == 2:
    		'''pepper noise'''
    		variable = round(random.uniform(0.005,0.01),4)
    		image_noise = skimage.util.random_noise(image, mode='pepper', seed=None, clip=True, amount=variable)
    	elif index == 3:
    		'''salt + pepper noise'''
    		variable = round(random.uniform(0.01,0.03),4)
    		image_noise = skimage.util.random_noise(image, mode='s&p', seed=None, clip=True, amount=variable)
    	elif index == 4:
    		'''poisson noise'''
    		image_noise = skimage.util.random_noise(image, mode='poisson', seed=None, clip=True)
    
    	io.imsave(output_image_path+name+'_noise.jpg', image_noise)
    	dom = xml.dom.minidom.parse(xml_path + name +'.xml')
    	xmlfile = open(output_xml_path+name+'_noise.xml','w')
    	xmlfile.write(dom.toprettyxml(encoding='utf-8'))
    
    def add_filter(image, image_name, index, output_image_path):
    	image = io.imread(image)
    	name = os.path.splitext(image_name)[0]
    	if index == 1:
    		'''median filter'''
    		image_filter = image
    		sigma = round(random.uniform(0.3,0.6),3)
    		for i in range(3):
    			image_filter[:,:,i] = filters.median(image[:,:,i], disk(sigma))
    	elif index == 2:
    		'''minimum filter'''
    		image_filter = image
    		sigma = round(random.uniform(0.3,0.6),3)
    		for i in range(3):
    			image_filter[:,:,i] = sfr.minimum(image[:,:,i],disk(sigma))
    	if exposure.is_low_contrast(image_filter) == False:
    		io.imsave(output_image_path+name+'_filter.jpg', image_filter)
    		dom = xml.dom.minidom.parse(xml_path + name +'.xml')
    		xmlfile = open(output_xml_path+name+'_filter.xml','w')
    		xmlfile.write(dom.toprettyxml(encoding='utf-8'))
    
    def enh_gamma(image,image_name, output_image_path):
    	'''lighter'''
    	image = io.imread(image)
    	name = os.path.splitext(image_name)[0]
    	image = img_as_float(image)
    	gam_factor = round(random.uniform(0.6,2),1)
    	gam = exposure.adjust_gamma(image,gam_factor)
    	io.imsave(output_image_path+name+'_gam.jpg', gam)
    	dom = xml.dom.minidom.parse(xml_path + name +'.xml')
    	xmlfile = open(output_xml_path+name+'_gam.xml','w')
    	xmlfile.write(dom.toprettyxml(encoding='utf-8'))
    
    def hist_unif(image, image_name, output_image_path):
    	'''uniform histgram'''
    	image = io.imread(image)
    	name = os.path.splitext(image_name)[0]
    	image_hist = exposure.equalize_hist(image)
    	io.imsave(output_image_path+ name +'_hist.jpg', image_hist)
    	dom = xml.dom.minidom.parse(xml_path + name +'.xml')
    	xmlfile = open(output_xml_path+name+'_hist.xml','w')
    	xmlfile.write(dom.toprettyxml(encoding='utf-8'))
    	return image_hist
    
    def img_sharpness(image, image_name, output_image_path):
    	'''enhance image sharpness'''
    	image = Image.open(image)
    	name = os.path.splitext(image_name)[0]
    	sharpness = round(random.uniform(5,10),2)
    	enh_sha = ImageEnhance.Sharpness(image)
    	image_sharped = enh_sha.enhance(sharpness)
    	image_sharped.save(output_image_path+ name +'_sharp.jpg')
    
    	dom = xml.dom.minidom.parse(xml_path + name +'.xml')
    	xmlfile = open(output_xml_path+name+'_sharp.xml','w')
    	xmlfile.write(dom.toprettyxml(encoding='utf-8'))
    	return image_sharped
    
    
    image_path = "/home/zwb/桌面/img/"
    output_image_path = "/home/zwb/桌面/img/"
    xml_path = "/home/zwb/桌面/ano/"
    output_xml_path = "/home/zwb/桌面/ano/"
    
    filelist = os.listdir(image_path)
    for files in filelist:
    	image = image_path + files
    	temp_noise = random.randint(1,4)
    	temp_filter = random.randint(1,2)
    	gaussion(image,files, output_image_path)
    	add_noise(image,files, temp_noise, output_image_path)
    	add_filter(image, files, temp_filter, output_image_path)
    	enh_gamma(image,files, output_image_path)
    	#hist_unif(image, files, output_image_path)
    	img_sharpness(image, files, output_image_path)
    
    
    展开全文
  • 数据是深度学习的输入,很重要而又容易被人忽视,而且缺乏系统性的介绍资料,从这个板块开始,我们来给大家系统性的介绍深度学习中的数据集。 从最常用的数据集开始到各个子任务领域中使用的数据集,对于轻视数据的...

    https://www.toutiao.com/i6695876104390967820/

     

    数据是深度学习的输入,很重要而又容易被人忽视,而且缺乏系统性的介绍资料,从这个板块开始,我们来给大家系统性的介绍深度学习中的数据集。

    从最常用的数据集开始到各个子任务领域中使用的数据集,对于轻视数据的朋友,请关注大佬们早期都在做什么。

    今天说5个最常用的,他们对于深度学习网络的发展,通用的分类/分割/检测任务的评测具有其他数据集不可比拟的作用。

    01 mnist【1】

    数据集链接:http://yann.lecun.com/exdb/mnist/,发布于1998年。

    如果说LeNet-5是深度学习的hello world,那么mnist就是深度学习数据集里的“hello world”,看看文【1】的作者,Yann Lecun,Y.Bengio,Patrick Haffner就知道了。

    如果你想了解早期学者们对gradient-based learning(基于梯度的学习方法)方法的一点努力,想了解为什么卷积神经网络需要local reception field(局部感受野),需要sub-sample(下采样),需要shared weights(共享权重)不妨细读这篇40多页的论文,不只是LeNet-5这个网络,更是一个完整的系统的描述。

    mnist是一个手写数字的数据集,来自美国国家标准与技术研究所(National Institute of Standards and Technology),简称 NIST。样本来自250个不同人的手写数字, 其中50%是高中学生,50%是人口普查局的工作人员。数字从0~9,图片大小是28*28,训练数据集包含 60000个样本,测试数据集包含10000个样本,示例图如下。

    「数据集」深度学习从“数据集”开始

     

    数据集由Chris Burges和Corinna Cortes搜集,他们裁剪出数字,将其放在20x20像素的框中,并保持了长宽比率,然后放在28*28的背景中,这也是Lecun提供给我们的数据集版本,数字的重心在图的正中间。

    原来20*20的数字是二值图,在经过插值后放在28*28的背景下成了灰度图。在LeNet5中使用的输入是32*32,远大于数字本身尺度最大值,也就是20*20。这是因为对于分类来说潜在的重要的笔触信息,需要在最高层的检测子的感受野中心,而LeNet-5经历了两个5*5的卷积,并且没有padding操作,最后卷积层的featuremap大小10*10正好能够覆盖原图正中间20*20的区域。

    02 cifar10和cifar100【2】

    数据集链接:http://www.cs.toronto.edu/~kriz/cifar.html,发布于2009年。

    cifar数据集由Alex Krizhevsky, Vinod Nair, and Geoffrey Hinton等人收集。这里的Alex Krizhevsky正是alexnet那个“alex”,这个hinton就不用说了,你看大牛们谁还没倒过数据,而现在很多学生还不愿意整理数据。

    cifar数据集包含两个,一个是cifar10,一个是cifar100。

    mnist数据集有几个缺陷(1)只是灰度图像(2)类别少,只是手写数字(3)并非真实数据,没有真实数据的局部统计特性

    所以将mnist用于评估越来越深的神经网络当然不再恰当,因此需要更大的真实的彩色数据集,需要更好的多样性。

    cifar10被适时地整理出来,这也是一个只用于分类的数据集,是tiny数据集的子集。后者是通过选取wordnet中的关键词,从google,flick等搜索引擎中爬取,去重得来。

    数据集共有60000张彩色图像,图像大小是32*32,共10个类,每类6000张图。其中50000张组成训练集合,每一类均等,都是5000张图。另外10000为测试集合,每一类也是均等,各1000张。

    cifar10里的图片满足一些基本的要求(1)都是真实图片而不是手稿等(2)图中只有一个主体目标(3)可以有部分遮挡,但是必须可辨识,这可以成为我们以后整理数据集的参考。

    可以看出,cifar10有点类似于类别多样性得到了扩充的mnist的彩色增强版,图像大小差不多,数据集大小也一样,类别也相等。

    「数据集」深度学习从“数据集”开始

     

    如上图,10个类别分别是airplane,automobile,bird,cat,deer,dog,frog,horse,ship,truck,其中airplane,automobile,ship,truck都是交通工具,bird,cat,deer,dog,frog,horse都是动物,可以认为是两个大的品类。而交通工具内部,动物内部,都是完全不同的物种,这些都是语义上完全可以区分的对象,所以cifar10的分类任务,可以看作是一个跨物种语义级别的图像分类问题。类间方差大,类内方差小。

    cifar100数据集则包含100小类,每小类包含600个图像,其中有500个训练图像和100个测试图像。与cifar10不同的是,100类被分组为20个大类,而每一个大类,又可以细分为子类,所以每个图像带有1个小类的“fine”标签和1个大类“coarse”标签。

    「数据集」深度学习从“数据集”开始

     

    大类之间,没有重叠容易区分,但是小类之间,会有一定的相似性,以第一个大类为例;aquatic mammals,就是水生哺乳动物,它包括beaver河狸, dolphin海豚, otter水獭, seal海豹, whale 鲸鱼,感受一下差别。

    「数据集」深度学习从“数据集”开始

     

    03 PASCAL【3】

    数据集链接:http://host.robots.ox.ac.uk/pascal/VOC/,初始发布于2005年,至2012年止。

    The PASCAL Visual Object Classes (VOC)项目是由Mark Everingham等人牵头举办的比赛,这是一个时间跨度很大的比赛,从2005年到2012年,起初主要用于object detection(目标检测),最后包含了5个比赛,classification,detection,segmentation,action classification,person layout

    PASCAL是什么呢?即Pattern Analysis, Statistical Modelling and Computational learning,不要用了这么久都不知道这是什么意思。顾名思义,这是一个用于模式分析和统计建模的数据集,包括图像分类,目标检测,分割等任务。

    2005年,数据集还只有4类,即bicycles, cars, motorbikes, people,共1578张图片,现在已经没有人用05年的数据集了。

    2007年增加到了20类,如下

    「数据集」深度学习从“数据集”开始

     

    图都是来源于图片社交网站flickr,总共9,963 张图,24,640个标注目标。

    12年最后一届比赛将数据增加到11,530张图,27,450个目标框标注,6,929个分割标注,07年和12年的数据集,各自仍然被广泛使用。

    「数据集」深度学习从“数据集”开始

     

    从07年开始引进了图像分割的标注和人体布局的标注。

    「数据集」深度学习从“数据集”开始

     

    「数据集」深度学习从“数据集”开始

     

    从10年开始引进了行为分类标注。

    「数据集」深度学习从“数据集”开始

     

    从07年开始,使用average precision替换掉了ROC曲线下面的AUC(area under curve),提高了评估算子的敏感性,因为在VOC2006很多方法的AUC超过了95%,不好进一步区分算法的能力。此后要想获得高的指标,必须要在各种recall级别下保证精度,这也就意味着仅以很高精度召回部分样本的算法评测指标下降,这对于样本数量不均衡的数据集评测效果更好。

    更多详细评测方法可以精读手册和参考文【6】,此处不再详述。

    04 imagenet【4】

    数据集链接:http://www.image-net.org/,09年李飞飞实验室发布。

    ImageNet是李飞飞实验室主导的一个项目,目标是构建一个计算机视觉研究的大型数据库,关键词从WordNet中选取。完整的Imagenet数据集有1400多万幅图片,涵盖2万多个类别的标注与超过百万的边界框的标注,每一个类别大概是500~1000张图片,标注采用了亚马逊的众包平台,这个平台之后被用于构建各种数据集。

    09年cvpr正式发布了imagenet,此后从10年到17年共举办了8届Large Scale Visual Recognition Challenge(ILSVRC)比赛,包括图像分类,目标检测,目标定位单元。

    「数据集」深度学习从“数据集”开始

     

    开始的开始,imagenet是一个连经费都申请不到的整理数据的项目,为很多研究者们不耻,但科技公司的竞赛热情以及数据集史无前例的多样性,让陷身于过拟合的算法,从数据集本身看到了新的出路,之后的故事大家也就都知道了。

    由于类别多,imagenet不可能像mnist那样简单的将所有图片分成互不相干的10类,而是采用了wordnet中树形结构的组织方式。

    下面展示了从哺乳动物到有胎盘哺乳动物到肉食动物到犬科的到狗到工作中的狗到哈士奇的这样的不断精细分的类。

    「数据集」深度学习从“数据集”开始

     

    imagenet竞赛中使用的是imagenet的一个子类,包括1000类,其中大部分是动物,所以我们常常看到拿动物说事的例子,不是猫就是狗,事实上李飞飞等在整理出imagenet之前,确实有过一些dogs vs cats的数据集,猫狗大战,不亦乐乎。

    「数据集」深度学习从“数据集”开始

     

    虽然我们经常用着imagenet调试出来的模型,不过大部分人未必真的知道imagenet的构建过程和历史,有兴趣的同学应该去了解一下,此处我们也没法过于详述了。

    05 mircosoft coco【5】

    数据集链接:http://cocodataset.org/,发布于2014年,MSRA出品必属精品了。

    microsoft coco数据集,可以说就是对标pascal,imagenet数据集出现的,同样可以用于图像分类,分割,目标检测等任务,共30多万的数据。COCO数据集有91类,以人类4岁小孩能够辨识为基准。其中82个有超过5000个instance(instance即同一个类不同的个体,比如图像中不同的人)。

    从coco的全称Common Objects in Context可以看出,这个数据集以场景理解为目标,特别选取比较复杂的日常场景,相比于pascal的建立是为了推进目标检测任务,coco的建立则是为了推进自然背景下的定位与分割任务,所以图像中的目标通过非常精确的segmentation掩模进行位置的标定。

    数据集的建立动机是研究3个问题(1)non-iconic views(2)

    contextual reasoning between objects(3)precise 2D localization。

    第一个问题,要求数据集中的图像,尽量不要只是包括一个大的目标或者一个空的场景的图像,而是都有,如下图中的c而不是a,b。

    「数据集」深度学习从“数据集”开始

     

    第二个问题就是场景的覆盖性,需要广而且足够复杂。数据集总共有328,000图像和2,500,000个label。与ImageNet和sun相比,类别数目更少,但是每一个类别的instance更多,这其实是有利于目标定位任务的,因为多样性更好。对比PASCAL VOC,COCO则要大的多,有更多类和instance。

    「数据集」深度学习从“数据集”开始

     

    第三个问题精确定位,我们可以看下面的instance segmention的标注结果,非常精确,而定位的边框也是从该掩膜生成,非常准确。

    「数据集」深度学习从“数据集”开始

     

    总的来说,coco相对于imagenet和pascal是一个更难的数据集,因此在相关任务上我们也需要多关注比较。

    06 总结

    好了,这篇作为这个系列的总纲,我们往后会进行任务的分类单独介绍。很多人天天在用数据集但是从没有认真看过数据集的构建和背后的动机,希望这个系列能给大家带来更多理解。

     

    [1] LeCun Y, Bottou L, Bengio Y, et al. Gradient-based learning applied to document recognition[J]. Proceedings of the IEEE, 1998, 86(11): 2278-2324.

    [2] Krizhevsky A, Hinton G. Learning multiple layers of features from tiny images[R]. Technical report, University of Toronto, 2009.

    [3] Everingham M, Van Gool L, Williams C K I, et al. The pascal visual object classes (voc) challenge[J]. International journal of computer vision, 2010, 88(2): 303-338.

    [4] Deng J, Dong W, Socher R, et al. Imagenet: A large-scale hierarchical image database[C]//Computer Vision and Pattern Recognition, 2009. CVPR 2009. IEEE Conference on. Ieee, 2009: 248-255.

    [5] Lin T Y, Maire M, Belongie S, et al. Microsoft coco: Common objects in context[C]//European conference on computer vision. Springer, Cham, 2014: 740-755.

    [6] Davis J, Goadrich M. The relationship between Precision-Recall and ROC curves[C]//Proceedings of the 23rd international conference on Machine learning. ACM, 2006: 233-240.

    展开全文
  • 我学习深度学习写代码的时候,数据集...这里是我找到的扩充数据集的方法,对图像进行亮度增强、对比度增强、水平翻转和随机方向旋转,我的1406张图扩充到了7030张。 变换程序 from PIL import ImageEnhance import...

    我学习深度学习写代码的时候,数据集图像太少只有1406张还分4个类别,一个类别只有300来张,再分为train、valid和test,图像就更少了,训练的图像少,深度学习的准确度就会不高。
    这里是我找到的扩充数据集的方法,对图像进行亮度增强、对比度增强、水平翻转和随机方向旋转,我的1406张图扩充到了7030张。

    • 变换程序
    from PIL import ImageEnhance
    import os
    import numpy as np
    from PIL import Image
    
    def brightnessEnhancement(root_path,img_name):#亮度增强
        image = Image.open(os.path.join(root_path, img_name))
        enh_bri = ImageEnhance.Brightness(image)
        # brightness = 1.1+0.4*np.random.random()#取值范围1.1-1.5
        brightness = 1.5
        image_brightened = enh_bri.enhance(brightness)
        return image_brightened
    
    
    def contrastEnhancement(root_path, img_name):  # 对比度增强
        image = Image.open(os.path.join(root_path, img_name))
        enh_con = ImageEnhance.Contrast(image)
        # contrast = 1.1+0.4*np.random.random()#取值范围1.1-1.5
        contrast = 1.5
        image_contrasted = enh_con.enhance(contrast)
        return image_contrasted
    
    def rotation(root_path, img_name):
        img = Image.open(os.path.join(root_path, img_name))
        random_angle = np.random.randint(-2, 2)*90
        if random_angle==0:
         rotation_img = img.rotate(-90) #旋转角度
        else:
            rotation_img = img.rotate( random_angle)  # 旋转角度
        # rotation_img.save(os.path.join(root_path,img_name.split('.')[0] + '_rotation.jpg'))
        return rotation_img
    
    def flip(root_path,img_name):   #翻转图像
        img = Image.open(os.path.join(root_path, img_name))
        filp_img = img.transpose(Image.FLIP_LEFT_RIGHT)
        # filp_img.save(os.path.join(root_path,img_name.split('.')[0] + '_flip.jpg'))
        return filp_img
    
    
    def createImage(imageDir,saveDir):
       i=0
       for name in os.listdir(imageDir):
          i=i+1
          saveName="cesun"+str(i)+".jpg"
          saveImage=contrastEnhancement(imageDir,name)
          saveImage.save(os.path.join(saveDir,saveName))
          saveName1 = "flip" + str(i) + ".jpg"
          saveImage1 = flip(imageDir,name)
          saveImage1.save(os.path.join(saveDir, saveName1))
          saveName2 = "brightnessE" + str(i) + ".jpg"
          saveImage2 = brightnessEnhancement(imageDir, name)
          saveImage2.save(os.path.join(saveDir, saveName2))
          saveName3 = "rotate" + str(i) + ".jpg"
          saveImage = rotation(imageDir, name)
          saveImage.save(os.path.join(saveDir, saveName3))
    
    • 调用程序
    from test3 import createImage
    
    imageDir="C:/Users/lenovo/Desktop/maize/3" #要改变的图片的路径文件夹
    saveDir="C:/Users/lenovo/Desktop/maize/3"   #数据增强生成图片的路径文件夹
    createImage(imageDir,saveDir)
    

    这里的test3就是上一段程序(变换程序)的文件名,你的变换程序取什么名字就用什么名。createImage就是变换程序中的最后一个函数,只需要调用这个就行了,这里生成的图你可以和原图放在一起,也可以放到别的文件夹里。

    希望对你有帮助!

    参考博客

    展开全文
  • 最近在自学深度学习图像识别,在进行深度学习数据训练的时候,发现自己的数据量太少,就参考网上代码进行数据集扩充,这里把代码放出来,并给出遇到的错误和解决方案,供大家交流学习。 import cv2 import os ...

    最近在自学深度学习图像识别,在进行深度学习数据训练的时候,发现自己的数据量太少,就参考网上代码进行数据集扩充,这里把代码放出来,并给出遇到的错误和解决方案,供大家交流学习。

    import cv2
    import os
    import numpy as np
    from imgaug import augmenters as iaa
    
    sometimes = lambda aug: iaa.Sometimes(0.5, aug) #建立lambda表达式,
                                                    #这里定义sometimes意味有时候做的操作
                                                    # 实际上在深度学习的模型训练中,数据增强不能喧宾夺主,
                                                    # 如果对每一张图片都加入高斯模糊的话实际上是毁坏了原来数据的特征,
                                                    # 因此,我们需要“有时候”做,给这个操作加一个概率。
    
    # 定义一组变换方法.
    seq = iaa.Sequential([
        # 选择0到5种方法做变换
        iaa.SomeOf((0, 5),[
            iaa.Fliplr(0.5),  # 对50%的图片进行水平镜像翻转
            iaa.Flipud(0.5),  # 对50%的图片进行垂直镜像翻转
    
            #将一些图像转换为它们的超像素表示,每幅图像采样20到200个超像素,
            # 但是不要用它们的平均值替换所有的超像素,
            # 只替换其中的一些(p_replace)。
            sometimes(
                        iaa.Superpixels(
                            p_replace=(0, 1.0),
                            n_segments=(20, 200)
                                        )
                     ),
            #用高斯模糊,均值模糊,中值模糊中的一种增强。注意OneOf的用法
            iaa.OneOf([
                        iaa.GaussianBlur((0, 3.0)),
                        iaa.AverageBlur(k=(2, 7)), # 核大小2~7之间,k=((5, 7), (1, 3))时,核高度5~7,宽度1~3
                        iaa.MedianBlur(k=(3, 11)),
                    ]),
    
            sometimes(iaa.Affine(                          #对一部分图像做仿射变换
                scale={"x": (0.8, 1.2), "y": (0.8, 1.2)},#图像缩放为80%到120%之间
                translate_percent={"x": (-0.2, 0.2), "y": (-0.2, 0.2)}, #平移±20%之间
                rotate=(-45, 45),   #旋转±45度之间
                shear=(-16, 16),    #剪切变换±16度,(矩形变平行四边形)
            )),
                        ]  ,  random_order=True)
                        ]  ,  random_order=True)
    # 图片文件相关路径
    path = 'D:\\火狐\\火狐下载\\test_pic\\'
    y = os.path.exists('D:\\火狐\\火狐下载\\exp_pic\\')
    if y == 1:
        savedpath = 'D:\\火狐\\火狐下载\\exp_pic\\'
    else:
        os.mkdir('D:\\火狐\\火狐下载\\exp_pic\\')
        savedpath = 'D:\\火狐\\火狐下载\\exp_pic\\'
    imglist=[]
    filelist = os.listdir(path)  #os.listdir() 方法用于返回指定的文件夹包含的文件或文件夹的名字的列表。这个列表以字母顺序。
    # 遍历要增强的文件夹,把所有的图片保存在imglist中
    for item in filelist:
        img = cv2.imdecode(np.fromfile(path+item,dtype=np.uint8),-1)
    
        # print('item is ', item)
        # print('img is ',img.shape)
        imglist.append(img)
        # print('imglist is ' ,imglist)
    print('all the picture have been appent to imglist')
    
    #对文件夹中的图片进行增强操作,循环5次
    for count in range(5):
        images_aug = seq.augment_images(imglist)
        for index in range(len(images_aug)):
            filename = str(count) + str(index) + '.jpg'
            # 保存图片
            # cv2.imwrite(savedpath + filename, images_aug[index])
            cv2.imencode(".jpg", images_aug[index])[1].tofile(savedpath+filename)
            # '.jpg'表示把当前图片img按照jpg格式编码,按照不同格式编码的结果不一样
            print('image of count%s index%s has been writen' % (count, index))
    
    1. 遇到的问题
      在读取图片和保存图片的时候,会有这样几个错误

    1.1 路径的问题:

    windows系统下路径使用双斜线“\”分割,Linux系统使用但斜线“\”。

    1.2 cv2不支持中文路径

    如果是中文路径的话,OpenCV 函数cv2.imread()、cv2.imwrite()在读取含有中文路径及以中文命名的文件时,会报错,主要原因是因为cv2.imread()、cv2.imwrite()不支持中文。.
    在这里插入图片描述此时不会报错但是只返回None
    解决方法就是先用先用np.fromfile()读取为np.uint8格式,再使用cv2.imdecode()解码在这里插入图片描述
    保存的时候也要修改
    在这里插入图片描述

    第一次修改

    后面在操作的过程出现了这样的错误:
    Corrupt JPEG data: 131072 extraneous bytes before marker 0xe2
    AttributeError: ‘NoneType’ object has no attribute ‘ndim’
    这两个其实属于共同的原因,都是因为这里

    img = cv2.imdecode(np.fromfile(path+item,dtype=np.uint8),-1)
    

    返回值为None,因为图片格式出错或者图片有损失导致。 因此在下面加上判断语句,将这样的图片给删除了就好了。其他的不用变

    if img is None:
        os.remove(path+item)
        continue
    
    展开全文
  • 深度学习模型需要足够的数据支撑才能进行更好地训练,但实际生活中,作为开发者往往无法获取大量的数据,而专业的数据采集和标注公司提供的数据服务也并不便宜,因此,解决此问题有一个较为不错的初级方案,那就是...
  • 俺上个程序说的是在深度学习的趋势下扩充数据集的问题,并附了代码和demo,这次的博客就是上个代码的升级版,提取目标的数据扩充   话不多说,直接上代码和demo   代码如下:   #include &lt;cv.h&...
  • 进行深度学习,需要准备自己的数据集进行测试,为了避免写程序统一处理,一些简单的图像预处理操作可以使用photoshop完成: 1、创建、记录动作 2、根据动作对数据集进行批处理 ===================== 1、创建和记录...
  • 用tensorflow扩充数据集

    2018-07-12 15:44:26
    它可以对train数据进行变形处理,起到数据增广的作用,在数据集比较小,数据量远远不够的情况下,可以对图片进行翻转、随机剪裁等操作以增加数据,制造出更加多的样本,提高度图片的利用率。核心功能代码在cifar10_...
  • 原地址:https://blog.csdn.net/weixin_41803874/article/details/81201699
  • 深度学习常用的数据集,包括各种数据跟图像数据。 免费数据集下载(持续更新中…)
  • 先放出链接吧,后续跑得时候补充 论文传送门: https://arxiv.org/abs/1906.11172 代码传送门: https://github.com/tensorflow/tpu/tree/master/models/official/detection
  • 1、为何要增广数据集呢? 因为我们平时自己用来训练的数据集需要自己制作。公共数据集无法满足自己的针对性需求。 2、增广的方法有哪些? 水平翻转增强,垂直翻转增强,镜像对称增强,仿射变化,旋转,高斯加噪...
  • 深度学习之图像扩充

    2018-06-04 22:32:36
    1.图像旋转from PIL import Image import numpy as np from skimage import data, exposure, img_as_float import matplotlib.pyplot as plt # 读取图像 im = Image.open("17.jpg") im.show() ...
  • 在机器学习项目中,如果使用的是比较小的数据集数据集的处理上可以非常简单:加载每个单独的图像,对其进行预处理,然后输送给神经网络。但是,对于大规模数据集(例如ImageNet),我们需要创建一次只访问一部分数据...
  • 前言 最近在做钢筋检测的比赛,因为比赛提供的数据只有200多张,而要使用神经网络...离线增强 : 直接对数据集进行处理,数据的数目会变成增强因子 x 原数据集的数目 ,这种方法常常用于数据集很小的时候 在线增强 ...
  • keras小数据集扩充

    2018-10-24 14:14:05
    @  原文地址:http://blog.keras.io/building-powerful-image-classification-models-using-very-little-data.html 参考译文地址:...
  • 深度学习AI美颜系列---人脸数据增强 在深度学习的训练中,我们经常会对较少的数据进行数据增强,一般而言,常用的数据增强包括如下几种: 1,旋转; 2,缩放; 3,镜像; 4,平移; 5,调色; 6,噪声; 而...
  • 本文从生产层面强调了深度学习项目开发中需要更加重视数据集的构建,并以作者本人的亲身开发经验为例子,分享了几个简单实用的建议,涉及了数据集特性、迁移学习、指标以及可视化分析等层面。无论是对于研究者还是...
  • 25个用于深度学习的开放数据集每个数据科学家必须使用 PRANAV DAR, 2018年3月29日 转载自:...
1 2 3 4 5 ... 20
收藏数 9,123
精华内容 3,649