【深度学习】数据增强(Data Augmentation)numpy、opencv实现

  • 深度学习是以数据推动的学科,深层神经网络一般都需要大量的训练数据才能获得比较理想的结果。在数据量有限的情况下,可以通过数据增强(Data Augmentation)来, 提高模型鲁棒性,避免过拟合。
  • 数据增强的方法有很多种,比如旋转、水平翻转、垂直翻转、随机裁剪、色彩扰动、加入噪声、随机缩放等等。本文只讨论和实现两种最常用和最基本的方法:随机裁剪和水平翻转。

一、随机裁剪

 以cifar-10数据集为例,这个数据集的图像大小为32x32x3,按照大多数论文中的随机裁剪方法,将图像每边填充4个像素,添加的像素值为0,也就是说填充后的图像大小为40x40x3,然后随机裁剪为32x32x3的图像。

填充⬇

import matplotlib.pyplot as plt
import cv2

#读入图像的部分省略,图片变量img
#利用cv2.copyMakeBorder函数将原图片填充
img_padding = cv2.copyMakeBorder(img, 4, 4, 4, 4, cv2.BORDER_CONSTANT, value=0)
plt.subplot(121)
plt.imshow(img)
plt.subplot(122)
plt.imshow(img_padding)

输出⬇

左侧为原始图像,右侧为填充后的图像

 裁剪⬇

import numpy as np

#我们要将图片裁剪为32*32,所以初始化两个随机变量,np.random.randint函数为左闭右开,也就是说取值范围是0到8,不包含8
h = np.random.randint(0,8)
w = np.random.randint(0,8)
img_crop = img_padding[h:h+32,w:w+32,:]
plt.imshow(img_crop)

输出⬇

二、水平翻转

水平翻转我们用到是np.fliplr函数,直接上代码

#随机生成0-1之间的小数
random_flip = np.random.random()
#因为是随机翻转,所以翻转和不反转概率应该各占50%
if random_flip > 0.5:
    img_flip = np.fliplr(img_crop)
plt.imshow(img_flip)

输出⬇

三、完整代码

def data_augment(x):
    '''
    输入x为minibatch,大小比如(64,32,32,3)
    '''
    for i in range(x.shape[0]):
        temp = cv2.copyMakeBorder(x[i,:,:,:], 4, 4, 4, 4, cv2.BORDER_CONSTANT, value=0)
        h = np.random.randint(0,8)
        w = np.random.randint(0,8)
        temp = temp[h:h+32,w:w+32,:]
        random_flip = np.random.random()
        if random_flip > 0.5:
            temp = np.fliplr(temp)
        x[i,:,:,:] = temp
    return x

 

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值