图像数据增强算法汇总(Python)

news2024/11/6 9:41:24

一、数据增强概述

数据增强是一种通过使用已有的训练样本数据来生成更多训练数据的方法,可以应用于解决数据不足的问题。数据增强技术可以用来提高模型的泛化能力,减少过拟合现象。比如在狗猫识别项目中,通过随机旋转、翻转和裁剪等数据增强方法,可以使模型具有对不同角度和尺寸的狗猫图像的识别能力。其主要作用包括:

  1. 增加训练样本数量:通过生成新样本,可以扩充训练集,提供更多样本供模型学习,从而减轻过拟合问题。
  2. 提升模型的泛化能力:通过引入随机性,数据增强可以帮助模型学习到更多的通用特征,使其对新样本的泛化能力更强。
  3. 增强模型的鲁棒性:经过数据增强处理的模型对于输入数据的变化、噪声等具有一定的抗干扰能力。
  4. 解决数据不平衡问题:在分类任务中,数据增强可以使各类别样本的数量更加平衡,有助于提升模型对于少数类别的识别能力

在医疗图像中,由于拍摄条件、器械位置等因素的影响,数据可能具有不同的旋转、缩放和翻转。通过数据增强,模型能够适应不同条件下的医疗图像,提高了疾病诊断的准确性。交通标志的图像可能会因为角度、光照等因素变化。数据增强可以帮助模型识别旋转或变形后的交通标志。不止是图像处理中用到了数据增强,在情感分析任务中,通过对文本进行随机替换、删除、插入等操作,可以生成多样化的训练样本,提升模型的泛化能力。

总的来说,这些项目中的数据增强技术有效地提升了模型的鲁棒性,使其能够在不同场景和条件下取得更好的性能。同时,数据增强也有助于防止模型的过拟合现象。

二、数据增强方法

在这里插入图片描述

常用的数据增强手段可以分为以下几类:

  1. 基于几何变换的数据增强,如翻转、旋转、裁剪、平移和添加噪声等,可以消除训练集和测试集的尺度、位置和视角差异。
  2. 基于颜色空间变换的数据增强,如调整亮度、对比度、饱和度、通道分离和灰度图转换等,可以消除训练集和测试集的光照、色彩和亮度差异。
  3. 其他的数据增强方法,如多样本数据增强、Cut Mix数据增强和 Mosaic 数据增强等。

常用的数据增强方法包括:

  1. 随机旋转和翻转:对图像进行随机角度的旋转和水平/垂直翻转,以增加模型对旋转和镜像变换的鲁棒性。
  2. 随机裁剪:随机选取图像中的一部分作为训练样本,使模型对不同裁剪位置的变化具有适应能力。
  3. 随机缩放:对图像进行随机大小的缩放,以增加模型对尺度变化的适应性。
  4. 颜色扭曲:对图像进行随机的色彩变换,如亮度、对比度、饱和度的调整,以增加模型对色彩变化的鲁棒性。
  5. 随机添加噪声:向图像中添加随机噪声,以增加模型对噪声的鲁棒性。
  6. 随机遮挡:随机遮挡图像的一部分,模拟遮挡情况下的目标识别。
  7. 自动增强:使用自动增强算法,如AutoAugment或Fast AutoAugment,通过搜索策略来找到一组优秀的数据增强策略。
  8. Mixup和CutMix:将两个或多个图像进行混合,以生成新的训练样本,促进模型对类别之间的平滑过渡。
  9. 样本生成对抗网络(GAN):使用生成对抗网络来生成与原始样本具有一定相似性的新样本。
  10. 局部扰动:对图像的局部区域进行微小扰动,以增加模型对小物体的识别能力。
  11. 对比度增强:调整图像的对比度,使得图像中的特征更加清晰。
  12. 图像去噪:使用去噪算法对图像进行处理,以提升模型对噪声的鲁棒性。

选择合适的数据增强算法需要根据具体任务、数据集和模型来决定,通常需要进行实验和评估以找到最适合的方法。同时,可以结合多种数据增强方法以获得更好的效果。

三、图像数据增强

一般来说收集到特定的目标会有点困难,这需要根据我们工作中识别目标的种类而定,如果是车牌、安全帽、人这种显而易见的目标就很容易收集数据集,如果是球状闪电、雪山雪豹这类目标数据收集就比较难。这时候我们可以使用图像数据增强技术去尽可能的填充目标识别数据集,接下来我们先拿到一张图片,用这张图片进行处理展示,我们需要用到OpneCV库:

import cv2
import numpy as np
import matplotlib.pyplot as plt

# 读取图片
image = cv2.imread('planck.jpg')

# 显示原始图片和增强后的图片
plt.figure(figsize=(10, 5))

plt.subplot(2, 3, 1)
plt.imshow(cv2.cvtColor(image, cv2.COLOR_BGR2RGB))
plt.title('Original Image')

在这里插入图片描述

真实场景中我们不可能仅从一个角度拍摄目标,这样收集到的数据集会造成目标识别模型过拟合,也就是只能从拍摄的角度去识别该物体,目标换个形态或者是拍摄角度更换,模型就识别不出来了。我们可以通过图片处理技术进行一定的泛化操作:

1.随机旋转和翻转

cv2.getRotationMatrix2D 是 OpenCV 中的一个函数,用于生成一个二维旋转矩阵,可以将图像围绕指定点进行旋转。

它接受三个参数:

  1. center:旋转的中心点,一个元组 (x, y) 表示图像的中心坐标。
  2. angle:旋转的角度,以度为单位,正值表示逆时针旋转。
  3. scale:缩放因子,可选参数,默认为 1。

该函数会返回一个形如:

| cos(angle)   -sin(angle)   center_x * (1 - cos(angle)) - center_y * sin(angle) |
| sin(angle)    cos(angle)   center_x * sin(angle) + center_y * (1 - cos(angle)) |

的旋转矩阵。通常情况下,我们会将旋转矩阵传递给 cv2.warpAffine 函数,来实际地应用旋转到图像上。这样可以得到一个围绕指定点旋转了一定角度的图像。

# 随机旋转
angle = np.random.randint(0, 360)
rows, cols = image.shape[:2]
M = cv2.getRotationMatrix2D((cols/2, rows/2), angle, 1)
rotated_image = cv2.warpAffine(image, M, (cols, rows))

在这里插入图片描述

cv2.flip() 函数用于翻转图片,它接受两个参数,一个是要翻转的图片,另一个是翻转的方向:

flip_direction

参数可以取以下三个值:

  • 0:垂直翻转(沿x轴翻转)
  • 1:水平翻转(沿y轴翻转)
  • -1:同时在水平和垂直方向翻转
# 随机翻转
flip_direction = np.random.randint(-1, 2)  # 随机选择水平、垂直或不翻转
flipped_image = cv2.flip(image, flip_direction)

在这里插入图片描述

2.随机裁剪

随机裁剪可以根据设定randint来随机生成裁剪的起始坐标,image.shape[1] 表示图像的宽度,image.shape[0] 表示图像的高度。

通过以下代码:

# 随机裁剪
crop_x = np.random.randint(0, image.shape[1] - 100)
crop_y = np.random.randint(0, image.shape[0] - 100)
cropped_image = image[crop_y:crop_y+100, crop_x:crop_x+100]

np.random.randint(0, image.shape[1] - 100) 会在图像的宽度范围内随机生成一个起始点横坐标,保证裁剪后剩余的宽度至少为 100 像素。同理,np.random.randint(0, image.shape[0] - 100) 会在图像的高度范围内随机生成一个起始点纵坐标,保证裁剪后剩余的高度至少为 100 像素。

image[crop_y:crop_y+100, crop_x:crop_x+100] 表示在图像上从 crop_ycrop_y+100 行,从 crop_xcrop_x+100 列的区域,即裁剪了一个 100x100 大小的区域。

在这里插入图片描述

3.随机缩放

np.random.uniform 函数,可以在指定范围内随机生成一个浮点数作为缩放因子 scale_factor

cv2.resize 函数可以用来对图像进行缩放,其参数:

  • image 是要被缩放的原始图像。
  • None 表示输出图像的大小由后面的缩放因子决定。
  • fx=scale_factor, fy=scale_factor 表示在水平和垂直方向上的缩放比例,即将图像
# 随机缩放
scale_factor = np.random.uniform(0.7, 1.3)
scaled_image = cv2.resize(image, None, fx=scale_factor, fy=scale_factor)

np.random.uniform(0.7, 1.3) 会在 0.7 到 1.3 之间随机生成一个浮点数,这个数就是缩放因子。

在这里插入图片描述

和原图像相比图像的刻度会有明显变化:

在这里插入图片描述

4.添加噪声

4.1高斯噪声

一般来说噪声是模拟实际数据采集情况,比如随机环境因素影响,大雾、水雾、大雨情况导致的摄像头传感器的不完美性、光照变化等。高斯噪声是一种常见的图像噪声类型,在图像数据增强中,通过添加高斯噪声,可以使模型更具鲁棒性,提高其对噪声环境的适应能力。

# 生成高斯噪声
mean = 0
var = 0.5
sigma = var ** 0.5
gaussian = np.random.normal(mean, sigma, image.shape).astype('uint8')
noisy_image = cv2.add(image, gaussian)

# 显示带噪声的图像
cv2.imshow('Noisy Image', noisy_image)
cv2.waitKey(0)
cv2.destroyAllWindows()

在这里插入图片描述

4.2椒盐噪声

椒盐噪声是一种常见的图像噪声类型,它主要体现为图像中出现了随机的黑白像素点,这些像素点模拟了背景中的颗粒物或损坏的像素。

def salt_pepper_noise(image, salt_prob, pepper_prob):
    noisy_image = np.copy(image)
    total_pixels = image.shape[0] * image.shape[1] #计算图像的总像素数
    
    num_salt = int(total_pixels * salt_prob) #通过将总像素数与指定的椒盐噪声比例相乘,得到要添加的椒盐噪声的数量。
    salt_coords = [np.random.randint(0, i-1, num_salt) for i in image.shape]
    noisy_image[salt_coords[0], salt_coords[1]] = 255

    num_pepper = int(total_pixels * pepper_prob)
    pepper_coords = [np.random.randint(0, i-1, num_pepper) for i in image.shape]
    noisy_image[pepper_coords[0], pepper_coords[1]] = 0

    return noisy_image

在这里插入图片描述

5.颜色扭曲

对图像进行随机的色彩变换,需要将图像从BGR颜色空间转换为HSV颜色空间,再对Hue通道进行扭曲,然后从HSV颜色空间转换回BGR颜色空间就可以完成:

# 读取图片
image = cv2.imread('clickhouse-logo.jpg')
# 转换为HSV颜色空间
hsv_image = cv2.cvtColor(image, cv2.COLOR_BGR2HSV)

# 扭曲Hue通道
hsv_image[:,:,0] = (hsv_image[:,:,0] + 30) % 180  # 在Hue通道上增加30

# 转回BGR颜色空间
result_image = cv2.cvtColor(hsv_image, cv2.COLOR_HSV2BGR)

# 显示原始图像和扭曲后的图像
cv2.imshow('Original Image', image)
cv2.imshow('Distorted Image', result_image)
cv2.waitKey(0)
cv2.destroyAllWindows()

这里我们用一张彩色图片更好展示:

在这里插入图片描述

下面那张是原图片,上面那张是颜色扭曲后的图片,通过对Hue通道进行扭曲,将Hue通道的值增加30,同时使用模运算确保值在0到180之间,再将图像从HSV颜色空间转换回BGR颜色空间。

6.随机遮挡

在图像上随机生成一个矩形遮挡,遮挡的位置和大小都是随机生成的。遮挡的颜色也是随机选择的。

# 生成随机遮挡位置和大小
mask_x = np.random.randint(0, image.shape[1] - 100)
mask_y = np.random.randint(0, image.shape[0] - 100)
mask_width = np.random.randint(50, 100)
mask_height = np.random.randint(50, 100)

# 生成随机颜色的遮挡
mask_color = np.random.randint(0, 256, (1, 1, 3))
image[mask_y:mask_y+mask_height, mask_x:mask_x+mask_width] = mask_color

# 显示带遮挡的图像
cv2.imshow('Image with Random Mask', image)
cv2.waitKey(0)
cv2.destroyAllWindows()

在这里插入图片描述

代码将随机生成的颜色mask_color应用到图像的指定位置上,形成一个矩形遮挡,实际操作过程中一般有限定规则,比如GridMask:

在这里插入图片描述

7.多样本数据增强方法

Mosaic 数据增强是一种通过将多张图像拼接在一起来创建新的训练样本的方法。以具体实例来看, mosaic数据增强利用了四张图片,对四张图片进行拼接,每一张图片都有其对应的框框,将四张图片拼接之后就获得一张新的图片,同时也获得这张图片对应的框框,然后我们将这样一张新的图片传入到神经网络当中去学习,相当于一下子传入四张图片进行学习了。其中我们熟悉的目标识别算法Yolo就是mosaic数据增强方式。

在这里插入图片描述

实现过程主要分为3步:

1)从数据集中每次随机取出四张图片

在这里插入图片描述

2)分别对四张图片进行翻转(对原始图片进行左右的翻转)、缩放(对原始图片进行大小的缩放)、色域变化(对原始图片的明亮度、饱和度、色调进行改变)等操作。

​ 操作完成之后然后再将原始图片按照 第一张图片摆放在左上,第二张图片摆放在左下,第三张图片摆放在右下,第四张图片摆放在右上四个方向位置摆好。

3)进行图片的组合和框的组合。

​ 完成四张图片的摆放之后,我们利用矩阵的方式将四张图片它固定的区域截取下来,然后将它们拼接起来,拼接成一张新的图片,新的图片上含有框框等一系列的内容。

在这里插入图片描述
这些方法可以单独或结合使用,具体选择取决于应用场景和数据集特点。通过数据增强,可以提升模型的性能,尤其在训练样本有限的情况下,它是一个非常有效的策略。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1129076.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

什么是CDN?

目录 1.什么是CDN? 2.CDN工作原理 3.为什么要使用CDN? 4.CDN与传统网站访问的区别 5.CDN的应用场景 6.术语解释 1.什么是CDN? CDN英文全称Content Delivery Network,中文翻译即为内容分发网络。它是建立并覆盖在承载网之上…

【带头学C++】 ----- 1.基础知识 ---- 1.20 Typedef 为已有的类型取别名

1.20 Typedef 为已有的类型取别名 1.typedef语法格式 在 C 中,可以使用 typedef 关键字来为已有的类型创建一个别名。这对于提高代码可读性、简化类型声明以及增加代码的可维护性非常有用。 下面是 typedef 的语法格式: typedef 旧类型名 别名; 2.使…

Unity的碰撞检测

(一)测试前准备工作 1.创建两个游戏对象,分别取名为”Player”和”Enemy”,并且为名为”Player”的游戏对象设置Tag也为”Player”,二者在场景中如图1所示: 图1 绿为Enemy,红为Player 2.编写脚本…

《Linux从练气到飞升》No.22 Linux 进程间通信

🕺作者: 主页 我的专栏C语言从0到1探秘C数据结构从0到1探秘Linux菜鸟刷题集 😘欢迎关注:👍点赞🙌收藏✍️留言 🏇码字不易,你的👍点赞🙌收藏❤️关注对我真的…

kafka入门03——简单实战

目录 安装Java 安装Zookeeper 安装Kafka 生产与消费 主要是记录下Kafka的安装配置过程,前置条件需要安装jdk和zookeeper。 安装Java 1.Oracle官网下载对应jdk安装包 官网地址:Java Downloads | Oracle 好人分享了下载需要的oracle账号&#xff0c…

linux基本指令(Chapter 2)

linux基本指令(二) 1.date指令 语法:date [option] [format] date命令的作用是显示时间:使用date %Y:%m:%d可以指定格式显示时间.例如:(注意这里的和%之后不要有任何间隔)并且这里是加号,并不是减号 1.在显示方面,使用者可以设定欲显示的格式,格式设…

NeRF综述

文章目录 《Nerf: Neural radiance field in 3d vision, a comprehensive review 》一、数据集:二、基于方法的分类(Method-based Taxonomy)三、基于应用的分类(Application-based Taxonomy)四、未来展望 《Nerf: Neur…

盘点网安最好入手的10大岗位,最高月薪30K!

前段时间,知名机构麦可思研究院发布了《2022年中国本科生就业报告》,其中详细列出近五年的本科绿牌专业,信息安全位列第一。 对于网络安全的发展与就业前景已经说过很多,它是收入较高的岗位之一,在转行领域也占据着热…

番外8.1 Task

---------系统中有两个账号,分别是alex与arod,这两个账号除了支持自己的组,还共同支持一个名为project的组。如这两个账号需要共同拥有/srv/ahome/目录的开发权,且该目录不允许其他账号进入查阅,请问该目录的权限应如何…

动手学深度学习—含并行连结的网络GoogLeNet(代码详解)

目录 1. Inception块3. GoogLeNet模型3. 训练模型 GoogLeNet吸收了NiN中串联网络的思想,并在此基础上做了改进,并且在2014年的ImageNet图像识别挑战赛中获得了不错的效果。 1. Inception块 GoogLeNet论文解决了多大的卷积核最合适的问题。 Inception块…

yolo数据增强,同时旋转txt标签文件

github https://github.com/vkdx/vkdx_cnn-.git YOLO格式txt文件分析 标注好的txt文件中有对应每个标注框的信息,从左到有分别是: class:类别 x_center:标注框中心相对于图像的x坐标 y_center:标注框中心相对于图像的y坐标 w:标…

Day09字符流缓冲流序列化流IO框架

字符流 FileReader(文件字符输入流) 使用文件字符输入流,有啥好处? 读取中文不会出现乱码问题 FileWriter(文件字符输出流) 利用字符流将一个文本文件复制到E:盘下,例如:D:/1.txt复制到E:/2.txt 请使用…

C语言每日一题(17)数组匹配

牛客网 BC156 牛牛的数组匹配 题目描述 描述 牛牛刚学会数组不久,他拿到两个数组 a 和 b,询问 b 的哪一段连续子数组之和与数组 a 之和最接近。 如果有多个子数组之和同样接近,输出起始点最靠左的数组。 输入描述: 第一行输…

如何在不损失质量的情况下调整图像大小

如何在不损失质量的情况下调整图像大小 如果您在线工作,就会知道图像质量对于呈现干净专业的外观有多么重要。 库存图像和免版税图像很容易找到,但是如何在不损失质量的情况下调整图像大小以使其适合您的目的? 无论您是想将图片用于博客文…

【Java变量】 局部变量、成员变量(类变量,实例变量)、方法参数传递机制

个人简介:Java领域新星创作者;阿里云技术博主、星级博主、专家博主;正在Java学习的路上摸爬滚打,记录学习的过程~ 个人主页:.29.的博客 学习社区:进去逛一逛~ 变量 1. 局部变量与成员变量的区别&#xff1a…

小白必看,手把手教你安装Python

目录 一,Python介绍 二,安装 Python 三,各种疑难杂症: 一,Python介绍 Python 是这两年来比较流行的一门编程语言,主要卖点是其相对简单的语法以及丰富的第三方库,下面我来带大家安装、配置 P…

【七】SpringBoot为什么可以打成 jar包启动

SpringBoot为什么可以打成 jar包启动 简介:庆幸的是夜跑的习惯一直都在坚持,正如现在坚持写博客一样。最开始刚接触springboot的时候就觉得很神奇,当时也去研究了一番,今晚夜跑又想起来了这茬事,于是想着应该可以记录一…

Redis数据类型——list类型介绍及基本操作

1.list类型介绍 redis中的list就是一个双向链表的结构 2.list类型数据基本操作

己知一棵有 2011 个结点的树,其叶结点个数为 116,该树对应的二叉树无右孩子的结点个数是

前言 树转二叉树的规则:每个结点左指针指向它的第一个孩子,右指针指向它在树中相邻的右兄弟,即“左孩子右兄弟“。 拓展:树中一个叶子节点在转化为二叉树的时候,如果它有右兄弟,那么它右指针会指向其兄弟节…

【软件安装】Linux系统中安装MySQL数据库服务

这篇文章,主要介绍如何在Linux系统中安装MySQL数据库服务。 目录 一、Linux安装MySQL 1.1、下载MySQL安装包 1.2、解压MySQL安装包 1.3、更改存放目录 1.4、创建用户组和用户 1.5、创建数据目录data 1.6、创建my.cnf配置文件 1.7、初始化数据库 1.8、添加m…