深度学习之批量图片数据增强

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/zong596568821xp/article/details/83111124

在之前的文章中,分别对数据增强的方法以及库函数进行了介绍,本文将结合实际应用进行批量图片的数据增强。

背景:项目采集的是灰度图,原数据只有不到20张图片,因此,选择数据增强的方法,通过不同变换方法的组合,实现数据增加的百张以上,这样才可以放入深度学习模型进行训练(利用迁移学习)。

话不多说,直接上代码,在代码中解释用到的变换操作。

#!usr/bin/python
# -*- coding: utf-8 -*-
import cv2
from imgaug import augmenters as iaa
import os

# Sometimes(0.5, ...) applies the given augmenter in 50% of all cases,
# e.g. Sometimes(0.5, GaussianBlur(0.3)) would blur roughly every second image.
sometimes = lambda aug: iaa.Sometimes(0.5, aug)

# 定义一组变换方法.
seq = iaa.Sequential([

    # 选择0到5种方法做变换
    iaa.SomeOf((0, 5),
        [
                iaa.Fliplr(0.5), # 对50%的图片进行水平镜像翻转
                iaa.Flipud(0.5), # 对50%的图片进行垂直镜像翻转	
																
                # Convert some images into their superpixel representation,
                # sample between 20 and 200 superpixels per image, but do
                # not replace all superpixels with their average, only
                # some of them (p_replace).
                sometimes(
                    iaa.Superpixels(
                        p_replace=(0, 1.0),
                        n_segments=(20, 200)
                    )
                ),

                # Blur each image with varying strength using
                # gaussian blur (sigma between 0 and 3.0),
                # average/uniform blur (kernel size between 2x2 and 7x7)
                # median blur (kernel size between 3x3 and 11x11).
                iaa.OneOf([
                    iaa.GaussianBlur((0, 3.0)),
                    iaa.AverageBlur(k=(2, 7)),
                    iaa.MedianBlur(k=(3, 11)),
                ]),

                # Sharpen each image, overlay the result with the original
                # image using an alpha between 0 (no sharpening) and 1
                # (full sharpening effect).
                iaa.Sharpen(alpha=(0, 1.0), lightness=(0.75, 1.5)),

                # Same as sharpen, but for an embossing effect.
                iaa.Emboss(alpha=(0, 1.0), strength=(0, 2.0)),


                # Add gaussian noise to some images.
                # In 50% of these cases, the noise is randomly sampled per
                # channel and pixel.
                # In the other 50% of all cases it is sampled once per
                # pixel (i.e. brightness change).
                iaa.AdditiveGaussianNoise(
                    loc=0, scale=(0.0, 0.05*255)
                ),

                # Invert each image's chanell with 5% probability.
                # This sets each pixel value v to 255-v.
                iaa.Invert(0.05, per_channel=True), # invert color channels

                # Add a value of -10 to 10 to each pixel.
                iaa.Add((-10, 10), per_channel=0.5),

                # Add random values between -40 and 40 to images, with each value being sampled per pixel:
                iaa.AddElementwise((-40, 40)),

                # Change brightness of images (50-150% of original value).
                iaa.Multiply((0.5, 1.5)),

                # Multiply each pixel with a random value between 0.5 and 1.5.
                iaa.MultiplyElementwise((0.5, 1.5)),

                # Improve or worsen the contrast of images.
                iaa.ContrastNormalization((0.5, 2.0)),


        ],
        # do all of the above augmentations in random order
        random_order=True
    )

],random_order=True) #apply augmenters in random order

# 图片文件相关路径
path = 'yingdaqi0/'
savedpath = 'yingdaqi_aug/'

imglist=[]
filelist = os.listdir(path)

# 遍历要增强的文件夹,把所有的图片保存在imglist中
for item in filelist:
	img = cv2.imread(path + item)
	#print('item is ',item)
	#print('img is ',img)
	#images = load_batch(batch_idx)
	imglist.append(img)
	#print('imglist is ' ,imglist)
print('all the picture have been appent to imglist')

#对文件夹中的图片进行增强操作,循环100次
for count in range(100):
	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])
		print('image of count%s index%s has been writen'%(count,index))	

通过以上代码的操作,可将目标文件夹中的原始图片进行随机变化,选择变化方法组中的0到5种操作,当然,也可以在方法组中添加其它需要的操作,由于我的原图是灰度图,没有涉及到颜色空间的变化,如果是彩色图,可以增加相对应的变化,这样更全面一些。

经过100次循环,相当于对每张图片进行100次随机变化,每次变化可能涉及到多种方法,这样操作完之后,原始数据就扩大了100倍,并且没有重复的数据在里边,达到数据增强的效果。

猜你喜欢

转载自blog.csdn.net/zong596568821xp/article/details/83111124