进行图像增广(数据扩充)的15种功能总结和Python代码实现(一)

简介: 进行图像增广(数据扩充)的15种功能总结和Python代码实现

python代码可以自己扩充图像数据集。

640.png

无论我们喜欢Keras还是Pytorch,我们都可以使用丰富的资料库来有效地增广我们的图像。但是如果遇到特殊情况:

  • 我们的数据集结构复杂(例如3个输入图像和1-2个分段输出)。
  • 我们需要完全的自由透明度
  • 我们希望进行这些库未提供的扩充方法。

对于这些情况以及其他特殊情况,我们必须能够掌握我们自己的图像增广函数。而且,我每次都使用自己的函数。因此,在本文中,我将介绍并提供执行图像增广的功能。

640.png

我将使用朋友的照片来提醒我在加拿大度过的美好时光作为示例。希望您喜欢这张照片,因为这是您在本文中看到的唯一一张照片。

我将增广过程细分为一个实际的案例,将我们的函数与图像和目标图像一起使用。这将使您对将要描述的方法的灵活性有所了解:

  • 翻转
  • 裁剪
  • 过滤和锐化
  • 模糊
  • 旋转,平移,剪切,缩放
  • 剪下
  • 色彩
  • 亮度
  • 对比
  • 均匀和高斯噪声
  • 渐变
  • 镜头变形

本文的目的不是为了证明增广技术是如何设计的,而是理解它们的用法。

一些有用的函数

在开始之前,我想解释每种方法具有的通用结构。它实际上是一个要初始化的对象。该对象将以我们的样本作为参数调用,并将返回我们的扩充样本。这就是全部?是的,仅此而已!然后,让我们从增广功能之前的一些有用函数开始。

Resize

640.png

第一个有用的函数允许我们使用(宽度,高度)形状调整图像大小。这个使我们看到了所有其他的初始化方式。我们实例化一个对象,该对象的大小被参数化。在我们的例子中,所有样本(图像和目标)将以相同的尺寸返回。使用此类型的功能,我们可以轻松地以所需方式处理图像和目标。

class Resize(object):
   def __init__(self, output_size):
       self.output_size = output_size
   def __call__(self, X, Y):
       _X = cv2.resize(X, self.output_size)
       w, h = self.output_size
       c = Y.shape[-1]
       _Y = np.zeros((h, w, c))
       for i in range(Y.shape[-1]):
           _Y[..., i] = cv2.resize(Y[..., i], self.output_size)
       return _X, _Y

Clip

剪辑函数是一项非常有用的函数,尤其是当您需要从一种颜色空间切换到另一种颜色空间或在0和1或0和255之间重置图像时。

640.png

默认情况下,如果仅指定一个阈值,则最小阈值为0。

class Clip(object):
   def __init__(self, mini, maxi=None):
       if maxi is None:
           self.mini, self.maxi = 0, mini
       else:
           self.mini, self.maxi = mini, maxi
   def __call__(self, X, Y):
       mini_mask = np.where(X < self.mini)
       maxi_mask = np.where(X > self.maxi)
       X[mini_mask] = self.mini
       X[maxi_mask] = self.maxi
       return X, Y

Normalize or Standardize

在传递模型中的输入之前,我们通常希望对数据进行标准化规范化。当然,这些操作可以在特定的上完成。

640.png

默认情况下,对整个图像执行标准化和规范化。

class Normalize(object):
   def __init__(self, axis=None):
       self.axis = axis
   def __call__(self, X, Y):
       mini = np.min(X, self.axis)
       maxi = np.max(X, self.axis)
       X = (X - mini) / (maxi - mini)
       return X, Y
class Standardize(object):
   def __init__(self, axis=None):
       self.axis = axis
   def __call__(self, X, Y):
       mean =  np.mean(X, self.axis)
       std = np.std(X, self.axis)
       X = (X - mean) / std
       return X, Y

ToTensor

最后,如果您使用的是Pytorch,则需要将图像转换为Torch.Tensor。唯一需要注意的是,使用Pytorch,我们的图像维度中首先是通道,而不是最后是通道。最后,我们还可以选择张量的输出类型

class ToTensor(object):
   def __init__(self, X_type=None, Y_type=None):
       # must bu torch types
       self.X_type = X_type
       self.Y_type = Y_type
   def __call__(self, X, Y):
       # swap color axis because
       # numpy img_shape: H x W x C
       # torch img_shape: C X H X W
       X = X.transpose((2, 0, 1))
       Y = Y.transpose((2, 0, 1))
       # convert to tensor
       X = torch.from_numpy(X)
       Y = torch.from_numpy(Y)
       if self.X_type is not None:
           X = X.type(self.X_type)
       if self.Y_type is not None:
           Y = Y.type(self.Y_type)
       return X, Y

怎么使用?

我们要做的就是定义我们要在样本中进行的转换的列表,仅此而已。之后我们什么也别碰。请注意,转换顺序很重要。而且由你决定

X, Y = get_next_sample()
   for t in transform: # data augmentation
       X, Y = t(X, Y)
   pred = model.predict(X, Y)

现在,我们可以深入研究本文的目的,并查看图像增广技术。

旋转

640.gif

第一个,也是最简单的一个,包括在图像的水平垂直轴上随机执行翻转。换句话说,执行垂直翻转的机会为50/100,执行水平翻转的机会为50/100。

class Flip(object):
   def __call__(self, X, Y):
       for axis in [0, 1]:
           if np.random.rand(1) < 0.5:
               X = np.flip(X, axis)
               Y = np.flip(Y, axis)
       return X, Y

裁剪

要进行图像增广,通常会随机裁剪图像。换句话说,我们在随机区域上裁剪了一部分随机大小的图像。

640.gif

可以从尺寸的比例(高度,宽度)中选择裁剪图像的尺寸。如果未指定裁剪的比例最大大小,则默认情况下,我们将认为它是图像的大小。

class Crop(object):
   def __init__(self, min_size_ratio, max_size_ratio=(1, 1)):
       self.min_size_ratio = np.array(list(min_size_ratio))
       self.max_size_ratio = np.array(list(max_size_ratio))
   def __call__(self, X, Y):
       size = np.array(X.shape[:2])
       mini = self.min_size_ratio * size
       maxi = self.max_size_ratio * size
       # random size
       h = np.random.randint(mini[0], maxi[0])
       w = np.random.randint(mini[1], maxi[1])
       # random place
       shift_h = np.random.randint(0, size[0] - h)
       shift_w = np.random.randint(0, size[1] - w)
       X = X[shift_h:shift_h+h, shift_w:shift_w+w]
       Y = Y[shift_h:shift_h+h, shift_w:shift_w+w]
       return X, Y
目录
相关文章
|
1天前
|
数据采集 JSON 测试技术
如何在Python中高效实现CSV到JSON的数据转换
在实际项目中,数据格式转换是常见问题,尤其从CSV到JSON的转换。本文深入探讨了多种转换方法,涵盖Python基础实现、数据预处理、错误处理、性能优化及调试验证技巧。通过分块处理、并行处理等手段提升大文件转换效率,并介绍如何封装为命令行工具或Web API,实现自动化批量处理。关键点包括基础实现、数据清洗、异常捕获、性能优化和单元测试,确保转换流程稳定高效。
102 82
|
8天前
|
机器学习/深度学习 人工智能 算法
基于Python深度学习的【蘑菇识别】系统~卷积神经网络+TensorFlow+图像识别+人工智能
蘑菇识别系统,本系统使用Python作为主要开发语言,基于TensorFlow搭建卷积神经网络算法,并收集了9种常见的蘑菇种类数据集【"香菇(Agaricus)", "毒鹅膏菌(Amanita)", "牛肝菌(Boletus)", "网状菌(Cortinarius)", "毒镰孢(Entoloma)", "湿孢菌(Hygrocybe)", "乳菇(Lactarius)", "红菇(Russula)", "松茸(Suillus)"】 再使用通过搭建的算法模型对数据集进行训练得到一个识别精度较高的模型,然后保存为为本地h5格式文件。最后使用Django框架搭建了一个Web网页平台可视化操作界面,
52 11
基于Python深度学习的【蘑菇识别】系统~卷积神经网络+TensorFlow+图像识别+人工智能
|
7天前
|
数据采集 数据安全/隐私保护 Python
从零开始:用Python爬取网站的汽车品牌和价格数据
在现代化办公室中,工程师小李和产品经理小张讨论如何获取懂车帝网站的汽车品牌和价格数据。小李提出使用Python编写爬虫,并通过亿牛云爬虫代理避免被封禁。代码实现包括设置代理、请求头、解析网页内容、多线程爬取等步骤,确保高效且稳定地抓取数据。小张表示理解并准备按照指导操作。
从零开始:用Python爬取网站的汽车品牌和价格数据
|
2天前
|
算法 Serverless 数据处理
从集思录可转债数据探秘:Python与C++实现的移动平均算法应用
本文探讨了如何利用移动平均算法分析集思录提供的可转债数据,帮助投资者把握价格趋势。通过Python和C++两种编程语言实现简单移动平均(SMA),展示了数据处理的具体方法。Python代码借助`pandas`库轻松计算5日SMA,而C++代码则通过高效的数据处理展示了SMA的计算过程。集思录平台提供了详尽且及时的可转债数据,助力投资者结合算法与社区讨论,做出更明智的投资决策。掌握这些工具和技术,有助于在复杂多变的金融市场中挖掘更多价值。
24 12
|
1天前
|
数据采集 存储 前端开发
用Python抓取亚马逊动态加载数据,一文读懂
用Python抓取亚马逊动态加载数据,一文读懂
|
24天前
|
存储 缓存 Java
Python高性能编程:五种核心优化技术的原理与Python代码
Python在高性能应用场景中常因执行速度不及C、C++等编译型语言而受质疑,但通过合理利用标准库的优化特性,如`__slots__`机制、列表推导式、`@lru_cache`装饰器和生成器等,可以显著提升代码效率。本文详细介绍了这些实用的性能优化技术,帮助开发者在不牺牲代码质量的前提下提高程序性能。实验数据表明,这些优化方法能在内存使用和计算效率方面带来显著改进,适用于大规模数据处理、递归计算等场景。
58 5
Python高性能编程:五种核心优化技术的原理与Python代码
|
2月前
|
Python
课程设计项目之基于Python实现围棋游戏代码
游戏进去默认为九路玩法,当然也可以选择十三路或是十九路玩法 使用pycharam打开项目,pip安装模块并引用,然后运行即可, 代码每行都有详细的注释,可以做课程设计或者毕业设计项目参考
78 33
|
1月前
|
数据采集 Web App开发 数据可视化
Python用代理IP获取抖音电商达人主播数据
在当今数字化时代,电商直播成为重要的销售模式,抖音电商汇聚了众多达人主播。了解这些主播的数据对于品牌和商家至关重要。然而,直接从平台获取数据并非易事。本文介绍如何使用Python和代理IP高效抓取抖音电商达人主播的关键数据,包括主播昵称、ID、直播间链接、观看人数、点赞数和商品列表等。通过环境准备、代码实战及数据处理与可视化,最终实现定时任务自动化抓取,为企业决策提供有力支持。
|
8月前
|
机器学习/深度学习 人工智能 算法
海洋生物识别系统+图像识别+Python+人工智能课设+深度学习+卷积神经网络算法+TensorFlow
海洋生物识别系统。以Python作为主要编程语言,通过TensorFlow搭建ResNet50卷积神经网络算法,通过对22种常见的海洋生物('蛤蜊', '珊瑚', '螃蟹', '海豚', '鳗鱼', '水母', '龙虾', '海蛞蝓', '章鱼', '水獭', '企鹅', '河豚', '魔鬼鱼', '海胆', '海马', '海豹', '鲨鱼', '虾', '鱿鱼', '海星', '海龟', '鲸鱼')数据集进行训练,得到一个识别精度较高的模型文件,然后使用Django开发一个Web网页平台操作界面,实现用户上传一张海洋生物图片识别其名称。
257 7
海洋生物识别系统+图像识别+Python+人工智能课设+深度学习+卷积神经网络算法+TensorFlow
|
8月前
|
机器学习/深度学习 人工智能 算法
【乐器识别系统】图像识别+人工智能+深度学习+Python+TensorFlow+卷积神经网络+模型训练
乐器识别系统。使用Python为主要编程语言,基于人工智能框架库TensorFlow搭建ResNet50卷积神经网络算法,通过对30种乐器('迪吉里杜管', '铃鼓', '木琴', '手风琴', '阿尔卑斯号角', '风笛', '班卓琴', '邦戈鼓', '卡萨巴', '响板', '单簧管', '古钢琴', '手风琴(六角形)', '鼓', '扬琴', '长笛', '刮瓜', '吉他', '口琴', '竖琴', '沙槌', '陶笛', '钢琴', '萨克斯管', '锡塔尔琴', '钢鼓', '长号', '小号', '大号', '小提琴')的图像数据集进行训练,得到一个训练精度较高的模型,并将其
133 0
【乐器识别系统】图像识别+人工智能+深度学习+Python+TensorFlow+卷积神经网络+模型训练

热门文章

最新文章