深度学习-数据增强(keras+PIL)

背景

有朋友在进行yolo的训练过程中遇到了数量量不够的情况,毕竟标注数据是实在太困难,另外真实场景的数据也不是那么容易获得。那么该如何缓解这种窘境呢?答案就是数据增强。

数据增强方案

  • 合成增强,假如你想识别的是一个死的物体,比如煤气罐。。而你又不想自己在各种场景下去拍照制作训练数据,那么进行数据合成算是一个思路。如果是猫狗这种动物的话,最后还是老老实实的收集数据
  • 图像变换,利用keras,对图片的角度、颜色通道、透明度等进行图像变化 也能产生不同的样本。

数据增强的核心目标就是减少过拟合,使模型更容易收敛。

合成增强

合成增强可以直接使用python的PIL模块,先安装
pip install pillow

准备一下背景:
在这里插入图片描述
准备一下一个贴图:
在这里插入图片描述

# coding: utf-8

from PIL import Image


def paste(img1, img2):
    base_img = Image.open(img1)
    paste_img = Image.open(img2)

    top = 200
    left = 300
    base_img.save('image/merge1.png')  # 保存图片
    paste_img = paste_img.convert('RGBA')
    print('保存图片1')
    base_img.paste(paste_img, (top, left, top + paste_img.width, left + paste_img.height))
    print('保存图片2')
    base_img.save('image/merge2.png')  # 保存图片


paste('image/background.png', 'image/dog.png')

图像变换

# coding: utf-8

from keras.preprocessing.image import ImageDataGenerator, array_to_img, img_to_array, load_img

datagen = ImageDataGenerator(
    rotation_range=40,
    width_shift_range=0.2,
    height_shift_range=0.2,
    shear_range=0.2,
    zoom_range=0.2,
    horizontal_flip=True,
    fill_mode='nearest')

img = load_img('image/dog.png')  # 这是一个PIL图像
x = img_to_array(img)  # 把PIL图像转换成一个numpy数组,形状为(3, 150, 150)
x = x.reshape((1,) + x.shape)  # 这是一个numpy数组,形状为 (1, 3, 150, 150)

# 下面是生产图片的代码
# 生产的所有图片保存在 `preview/` 目录下
i = 0
for batch in datagen.flow(x, batch_size=1, save_to_dir='preview'):
    i += 1
    if i > 10:
        break  # 否则生成器会退出循环

参数说明:
featurewise_center=False # 将输入全部数据的均值设置为 0。一般不用
samplewise_center=False # 将每个样本的均值设置为 0。一般不用
featurewise_std_normalization=False # 将输入除以全部数据标准差。一般不用
samplewise_std_normalization=False # 将输入除以其标准差。一般不用
zca_whitening=False # 是否应用 ZCA 白化
zca_epsilon=1e-6 # ZCA 白化的 epsilon 值。常用
rotation_range=0 # 整数。随机旋转的度数范围。常用
width_shift_range=0. # 浮点数,水平平移百分比,不宜太大一般0.1,0.2
height_shift_range=0. # 浮点数,垂直平移百分比,不宜太大一般0.1,0.2
brightness_range=None # 浮点数,亮度调整
shear_range=0. # 浮点数,错切变换角度
zoom_range=0.0 # 浮点数[0,1],随机缩放。[llow,upp]:随机缩放范围。
channel_shift_range=0., # 浮点数[0.0,255.0],图像上色
fill_mode=‘nearest’ # 边界填充,一般默认
cval=0. # 一般不用
horizontal_flip=False # 水平翻转,常用
vertical_flip=False # 垂直翻转,看应用场景使用
rescale=None # 数据缩放,常用:1/255.0
preprocessing_function=None,
data_format=None,
validation_split=0.0 # 验证集划分。常用
dtype=None
注:每次变化都是随机的,暂时没有发现能返回变化参数信息
参考:https://www.jianshu.com/p/4c7795af350b

重点是ImageDataGenerator的方法:

  • flow
  • flow_from_directory
  • flow_from_dataframe

方法的使用实战未完待续

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
好的,您的问题是如何使用深度学习CNN对给定的kaggle猫狗数据集进行分类。我将逐一回答您的问题: 1)导入数据集 首先需要导入数据集,并进行数据预处理。可以使用PIL库读取图像,然后将图像转化为numpy数组,并将其归一化。 2)划分数据集 将数据集划分为训练集和验证集。一般采用80%的数据作为训练集,20%的数据作为验证集。 3)设计深度学习模型 设计一个卷积神经网络模型,包括多个卷积层、池化层和全连接层。可以采用keras框架进行模型的设计,并且设置损失函数、优化器和评估指标。 4)训练模型 使用训练集进行模型的训练,并使用验证集进行模型的调优。可以采用keras框架中的fit函数进行模型的训练,同时使用callbacks功能进行模型训练过程的可视化。 5)评估模型 使用测试集对模型进行评估,并计算模型的准确率和损失函数。可以使用keras框架中的evaluate函数进行模型的评估。 6)可视化模型 可以使用keras框架中的plot_model函数进行模型的可视化,展示模型的结构和参数。 7)调整模型参数 可以通过增加卷积层数、每层卷积核的个数、增加全连接层的个数等方式来提高模型的精度。 8)使用预训练模型 可以使用预训练模型,如VGG16、ResNet等模型,进行迁移学习,从而提高模型的精度。 9)使用数据增强 可以对训练集进行数据增强操作,如随机旋转、缩放、平移、翻转、裁剪等操作,从而扩大训练集,提高模型的泛化能力。 10)总结心得 深度学习CNN模型对于图像分类问题有很好的效果,但需要一定的训练数据和计算资源。在实验过程中,需要注重模型的调优和数据增强,从而提高模型的精度和泛化能力。同时也需要注意代码的可读性和可维护性,以便后续的开发和维护。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值