计算机视觉入门 6) 数据集增强(Data Augmentation)

系列文章目录

  1. 计算机视觉入门 1)卷积分类器
  2. 计算机视觉入门 2)卷积和ReLU
  3. 计算机视觉入门 3)最大池化
  4. 计算机视觉入门 4)滑动窗口
  5. 计算机视觉入门 5)自定义卷积网络
  6. 计算机视觉入门 6) 数据集增强(Data Augmentation)

提示:仅为个人学习笔记分享,若有错漏请各位老师同学指出,Thanks♪(・ω・)ノ


目录


一、数据集增强(Data Augmentation)

伪造数据

提高机器学习模型性能的最佳方法是在更多数据上进行训练。模型有更多的示例可供学习,它将能够更好地识别图像中的哪些差异是重要的,哪些是不重要的。更多的数据有助于模型更好地泛化

但是在实践中,我们拥有的数据量是有限的。

获取更多数据的一种简单方法是(使用已经拥有的数据)创建假数据。如果我们能够以保持类别不变的方式转换数据集中的图像,我们可以教会分类器忽略这些类型的变换。例如,照片中的汽车是面向左还是面向右,并不会改变它是汽车 而不是卡车 的事实。因此,如果我们使用翻转图像来增强我们的训练数据,我们的分类器将学会忽略"左或右"是它应该忽略的差异。

这就是数据增强背后的整个思想:添加一些看起来合理像真实数据的额外伪造数据,从而提高分类器的性能。

使用数据增强

通常,在增强数据集时会使用许多种类型的转换。这些可能包括旋转图像、调整颜色或对比度、扭曲图像或许多其他事情,通常以组合方式应用。以下是一张图像可能经过的不同转换的示例。

数据增强通常是在线进行的,意味着在图像被馈送到网络进行训练时进行。回想一下,训练通常是在小批量数据上进行的。当使用数据增强时,以下是批量包含16个图像的示例。

每次在训练期间使用图像时,都会应用一种新的随机变换。这样,模型始终会看到与以前略有不同的内容。训练数据中的这种额外变化有助于模型适应新数据。

然而,需要记住,使用的任何变换都不应该混淆类别。例如,旋转图像会混淆 '9' 和 '6';'b'和'd' 也并不适合水平翻转。不是每种变换都对特定问题有用。

二、【代码实现】

Keras 预处理层类型

Keras提供了两种方式对数据进行增强。

  • 第一种方法是在数据流水线中使用类似于ImageDataGenerator的函数包含增强功能。
  • 第二种方法是通过使用Keras的预处理层将其包含在模型定义中。这就是我们将采取的方法。对我们来说,主要优点是图像变换将在GPU上计算,而不是在CPU上计算,这可能加快训练过程。
python 复制代码
# 所有的 "factor" 参数表示百分比变化
augment = keras.Sequential([
    # preprocessing.RandomContrast(factor=0.5),
    preprocessing.RandomFlip(mode='horizontal'), # 水平翻转
    # preprocessing.RandomFlip(mode='vertical'), # 垂直翻转
    # preprocessing.RandomWidth(factor=0.15), # 水平拉伸
    # preprocessing.RandomRotation(factor=0.20), # 随机旋转
    # preprocessing.RandomTranslation(height_factor=0.1, width_factor=0.1), # 随机平移
])

将预处理层添加到模型中

这里我们跳过步骤1:导入数据,直接在定义模型中添加一些简单的变换,展示如何使用数据集增强这个工具。

python 复制代码
from tensorflow import keras
from tensorflow.keras import layers
from tensorflow.keras.layers.experimental import preprocessing

# 导入预训练模型
pretrained_base = tf.keras.models.load_model(
    '../input/cv-course-models/cv-course-models/vgg16-pretrained-base',
)
pretrained_base.trainable = False

model = keras.Sequential([
    # 预处理
    preprocessing.RandomFlip('horizontal'), # 左右翻转
    preprocessing.RandomContrast(0.5), # 对比度最多变化50%
    # 基础
    pretrained_base,
    # 头部
    layers.Flatten(),
    layers.Dense(6, activation='relu'),
    layers.Dense(1, activation='sigmoid'),
])
相关推荐
The_Ticker3 分钟前
CFD平台如何接入实时行情源
java·大数据·数据库·人工智能·算法·区块链·软件工程
Elastic 中国社区官方博客9 分钟前
Elasticsearch 开放推理 API 增加了对 IBM watsonx.ai Slate 嵌入模型的支持
大数据·数据库·人工智能·elasticsearch·搜索引擎·ai·全文检索
jwolf210 分钟前
摸一下elasticsearch8的AI能力:语义搜索/vector向量搜索案例
人工智能·搜索引擎
有Li18 分钟前
跨视角差异-依赖网络用于体积医学图像分割|文献速递-生成式模型与transformer在医学影像中的应用
人工智能·计算机视觉
新加坡内哥谈技术39 分钟前
Mistral推出“Le Chat”,对标ChatGPT
人工智能·chatgpt
GOTXX1 小时前
基于Opencv的图像处理软件
图像处理·人工智能·深度学习·opencv·卷积神经网络
IT古董1 小时前
【人工智能】Python在机器学习与人工智能中的应用
开发语言·人工智能·python·机器学习
CV学术叫叫兽1 小时前
快速图像识别:落叶植物叶片分类
人工智能·分类·数据挖掘
xrgs_shz1 小时前
MATLAB读入不同类型图像并显示图像和相关信息
图像处理·计算机视觉·matlab
WeeJot嵌入式2 小时前
卷积神经网络:深度学习中的图像识别利器
人工智能