YOLO系列基础(七)从数据增强到图像线性变换

系列文章地址

YOLO系列基础(一)卷积神经网络原理详解与基础层级结构说明-CSDN博客

YOLO系列基础(二)Bottleneck瓶颈层原理详解-CSDN博客

YOLO系列基础(三)从ResNet残差网络到C3层-CSDN博客

YOLO系列基础(四)归一化层(BN层)的前世今生!-CSDN博客

YOLO系列基础(五)从神经元共适应性到模型Dropout层-CSDN博客

YOLO系列基础(六)YOLOv1原理详解原理如此清晰-CSDN博客

背景

        随着YOLOv11版本的发布,YOLO算法在视觉检测领域独领风骚,本系列旨在从小白出发,给大家讲解清楚视觉检测算法的前世今生,并讲清楚YOLOv11版本算法的所有模块功能!

        但此篇我们先讲解另外一个操作:数据增强和图像的线性变换

从数据集的多样性和过拟合开始

过拟合问题一般来说有两种因素共同影响。

  1. 神经网络设定不合理,造成神经元共适应性现象
  2. 数据集多样性不足,场景单一

有关于神经网络的设定问题以查看一下此篇博客:

YOLO系列基础(五)从神经元共适应性到模型Dropout层-CSDN博客

本篇我们详解数据集导致的过拟合问题,其实我们对于数据集的多样性不足会导致过拟合问题已经有了很深的印象,有些人也能侃侃而谈一些原因,但是都不够全面。

什么是过拟合问题?

        过拟合(Overfitting)是机器学习中的一个常见问题,指的是模型在训练数据上表现得过于出色,以至于它开始捕捉并学习训练数据中的噪声和随机波动,而不是学习数据的潜在规律或模式。这种情况发生时,模型在训练集上的性能(如准确率、召回率等指标)通常非常高,但在未见过的数据(如测试集或实际应用中的数据)上的性能却显著下降。

        过拟合的模型往往过于复杂,它们包含了大量的参数和细节,这些参数和细节对于训练数据是有效的,但对于新的、类似的数据则不再有效。这通常发生在模型具有比训练数据中的信息量更多的自由参数时,或者当训练数据不足够多样或数量不足时。

数据集的多样性不足是如何导致过拟合的?

模型记忆噪声

首先我们要知道,噪声是不可避免的,就算你的数据集再优异,都存在噪声。而且从某种意义上说,缺乏足够噪声的数据集反而是不够好的,因为现实世界是存在噪声的。

而当数据集缺乏多样性时,模型会记住训练数据中的噪声和特定模式,而不是学习到数据的普遍规律。这导致模型在训练集上表现良好,但在未见过的数据(如测试集)上表现不佳,因为测试集上没有模型记忆中相同的噪声。

特征场景覆盖不全

 多样性不足的数据集无法涵盖所有可能的特征组合和边缘情况。这导致模型在训练时无法充分学习数据的全部分布,从而在面对新数据时无法做出准确的预测。

人话说就是目标物体的所有特征信息数据集中并没有全面展示。

偏差样本问题

当数据集的多样性不足的时候,会容易造成训练数据集中某些类别的样本数量远多于其他类别,或者数据集的分布与真实世界的分布不一致,那么模型可能会学习到这种偏差。这种偏差在模型面对真实世界数据时会导致性能下降。

举个例子:如果你的数据集中北极熊出现在冰天雪地的照片远远多于动物园的照片,那么你的模型将难以检测动物园中的北极熊。

综上,我们需要多样化的数据集,而如何获取多样化的数据集呢?答案就是数据增强

数据增强

        但是数据集的采集、标注耗时耗力,很多优秀的数据集大多都是不开源的。那么我们就有了数据增强的需要

        数据增强的概念最早由Simard在1998年提出,随着2000年VRM(Vicinal Risk Minimization)准则的提出,数据增强技术被正式标准化。

数据增强的好处

数据增强是一种通过人工或自动方式对数据进行修改或变换,以增加数据集规模和多样性的技术。其主要目的是:

  • 提高模型的泛化能力:通过生成更多的训练样本,模型可以学习到更多的特征,从而提高对未见数据的预测能力。
  • 减少过拟合:数据增强可以增加数据集的多样性,使得模型不会过度依赖于某些特定的特征,从而减少过拟合的风险。
  • 降低数据收集成本:在某些情况下,收集和标记新的数据非常困难或昂贵。数据增强可以通过对已有数据进行变换来生成新的样本,从而降低数据收集的成本。

图片数据增强的方式大全

图片数据增强是计算机视觉和图像处理领域中的一个关键技术,主要用于改善图像的质量或者使其更适合后续的图像分析任务。以下是一些常见的图片数据增强方式:

几何变换
  • 翻转水平翻转:使图像左右对称。垂直翻转:使图像上下对称。
import cv2# 读取图像
image = cv2.imread('path_to_image.jpg')def get_flipped(image, way):'''翻转函数,way=1 水平翻转,way=0 垂直反转'''return cv2.flip(image, way)
  • 旋转:随机旋转图像一定角度,常见角度范围为0到360度,可以模拟不同角度的视图。
def get_rotated(iamge, angle):'''旋转图像angle角度'''# 获取图像尺寸(h, w) = image.shape[:2]# 计算中心center = (w // 2, h // 2)# 旋转图像(角度为45度)rotated = cv2.getRotationMatrix2D(center, angle, 1.0)rotated = cv2.warpAffine(image, rotated, (w, h))return rotated
  • 缩放:随机放大或缩小图像,以不同的比例缩放图像,使模型适应不同尺寸的物体。
def get_scaled(image, fx=0.5, fy=0.5):'''缩放图像,fx和fy为x轴和y轴的缩放系数'''scaled = cv2.resize(image, None, fx=fx, fy=fy, interpolation=cv2.INTER_AREA)return scaled
  • 裁剪:随机裁剪图像的一部分,可以是中心裁剪或随机裁剪,以增加数据多样性。
def get_cropped(image, (x1,y1), (x2, y2)):# 裁剪图像(左上角和右下角坐标)cropped = image[y1:y2, x1:x2]return cropped
  • 平移:在水平和垂直方向上移动图像的内容,帮助模型学习到物体在不同位置的特征。
def get_translated(image, dx=100,dy=50):
# 平移矩阵(默认向右平移100,向下平移50)M = np.float32([[1, 0, 100], [0, 1, 50]])return cv2.warpAffine(image, M, (w, h))
  • 透视变换:改变图像的透视角度,模拟不同的视角效果。
# 定义源点和目标点
pts1 = np.float32([[50, 50], [200, 50], [50, 200], [200, 200]])
pts2 = np.float32([[10, 100], [200, 50], [10, 250], [200, 200]])# 计算透视变换矩阵
M = cv2.getPerspectiveTransform(pts1, pts2)# 应用透视变换
warped = cv2.warpPerspective(image, M, (w, h))
颜色变换
  • 亮度调整:通过增加或减少图像的亮度值来改变图像的整体亮度,模拟不同的光照条件。
# 增加亮度(值为正数)或减少亮度(值为负数)
beta = 30  # 亮度增量
adjusted_brightness = cv2.convertScaleAbs(image, alpha=1, beta=beta)
  • 对比度调整:通过改变图像中亮度值的分布来增强图像的对比度,使得图像中的细节更加清晰。
# 对比度控制(alpha值)
alpha = 1.5  # 对比度因子
adjusted_contrast = cv2.convertScaleAbs(image, alpha=alpha, beta=0)
  • 饱和度调整:通过改变颜色的饱和程度来影响图像的色彩表现,增加饱和度可以使颜色更加鲜艳,而降低饱和度则会使颜色趋向灰色。
# 转换为HSV颜色空间
hsv = cv2.cvtColor(image, cv2.COLOR_BGR2HSV)# 调整饱和度(S通道)
h, s, v = cv2.split(hsv)
s = cv2.add(s, 50)  # 增加饱和度
s = cv2.clip(s, 0, 255).astype(hsv.dtype)  # 裁剪并转换类型# 合并通道并转换回BGR颜色空间
adjusted_saturation = cv2.merge([h, s, v])
adjusted_saturation = cv2.cvtColor(adjusted_saturation, cv2.COLOR_HSV2BGR)
  • 色相调整:通过改变颜色的色相值来改变图像的整体色调,可以用来生成不同色彩风格的图像。
# 调整色相(H通道)
h, s, v = cv2.split(hsv)
h = cv2.add(h, 30)  # 增加色相值(注意循环)
h[h >= 180] -= 180  # 处理超过180的情况# 合并通道并转换回BGR颜色空间
adjusted_hue = cv2.merge([h, s, v])
adjusted_hue = cv2.cvtColor(adjusted_hue, cv2.COLOR_HSV2BGR)
噪声添加
  • 高斯噪声:模拟传感器噪声。
# 生成高斯噪声
mean = 0
sigma = 25
gauss = np.random.normal(mean, sigma, image.shape).astype('uint8')# 将噪声添加到图像
noisy = cv2.add(image, gauss)
  • 椒盐噪声:模拟图像传输中的干扰,图像中随机出现亮点(盐)和暗点(胡椒)。
# 生成椒盐噪声
num_salt = 1000  # 盐的数量
num_pepper = 1000  # 椒的数量# 盐噪声
img = image.copy()
coords = [np.random.randint(0, i - 1, num_salt) for i in image.shape]
img[coords[0], coords[1], :] = 255# 椒噪声
coords = [np.random.randint(0, i - 1, num_pepper) for i in image.shape]
img[coords[0], coords[1], :] = 0noisy_salt_pepper = img
  • 高斯模糊:对图像应用高斯模糊,以模拟景深或模糊效果。

Mixup:通过混合两张图像及其对应的标签来生成新的训练样本。具体来说,给定两对训练样本,通过线性插值的方式将两张输入图像及其标签混合生成新的训练样本。

这些图片数据增强技术可以单独使用,也可以组合使用,以提高训练数据的多样性和模型的鲁棒性。在实际应用中,可以根据具体任务和数据集特点选择合适的数据增强方法。

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

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

相关文章

算法--解决二叉树遍历问题

第一 实现树的结构 class Node(): # 构造函数,初始化节点对象,包含数据和左右子节点 def __init__(self, dataNone): self.data data # 节点存储的数据 self.left None # 左子节点,默认为None self.rig…

Ubuntu22.04.2 k8s部署

k8s介绍 简单介绍 通俗易懂的解释: Kubernetes(也被称为 K8s)就像是一个大管家,帮你管理你的云计算服务。想象一下,你有很多个小程序(我们称之为“容器”),每个都在做不同的事情&…

游戏引擎学习第12天

视频参考:https://www.bilibili.com/video/BV1yom9YnEWY 这节没讲什么东西,主要是改了一下音频的代码 后面有介绍一些alloc 和malloc,VirtualAlloc 的东西 _alloca 函数(或 alloca)分配的是栈内存,它的特点是: 生命周…

Linux-软件管理-本地仓库和网络资源仓库配置(RHCSA)

该章节的目录如下: 认识rpm包 将设备挂载到/mnt上面 查看光驱上的相关信息 使用rpm包管理软件 仓库的配置(重要) 无相关文件 本地仓库配置(书写相关的仓库文件) 配置流程 效果测试(安装卸载) 查看仓库 清理…

【arxiv‘24】Vision-Language Navigation with Continual Learning

论文信息 题目:Vision-Language Navigation with Continual Learning 视觉-语言导航与持续学习 作者:Zhiyuan Li, Yanfeng Lv, Ziqin Tu, Di Shang, Hong Qiao 论文创新点 VLNCL范式:这是一个新颖的框架,它使得智能体能够在适…

数字化建设:指标如何驱动的企业KPI设计?

我们以KPI设定为例,简单说明在一套科学的经营分析体系的加持下,企业的经营KPI应该如何设定,如图所示。 指标驱动的企业KPI设计 每年年初企业做战略规划的同时,会启动年度业务KPI的设定。这个时候经营分析团队会主导整个过程。首先…

初级数据结构——栈题库(c++)

目录 前言1.杭电oj——Bitset2.杭电oj——进制转换[3.力扣——LCR 123. 图书整理 I](https://leetcode.cn/problems/cong-wei-dao-tou-da-yin-lian-biao-lcof/description/)[4.力扣——LCR 027. 回文链表](https://leetcode.cn/problems/aMhZSa/)[5.力扣——1614. 括号的最大嵌…

数字化转型企业架构设计手册(交付版),企业数字化转型建设思路、本质、数字化架构、数字化规划蓝图(PPT原件获取)

1、企业架构现状分析 2、企业架构内容框架 3、企业架构设计方法 3.1 、业务架构设计方法 3.2 、数据架构设计方法 3.3 、应用架构设计方法 3.4 、技术架构设计方法 软件全套资料部分文档清单: 工作安排任务书,可行性分析报告,立项申请审批表&…

⾃动化运维利器Ansible-基础

Ansible基础 一、工作原理二、快速入门2.1 测试所有资产的网络连通性2.2 发布文件到被管理节点(资产) 三、资产(被管理节点)3.1 静态资产3.1.1 自定义资产3.1.2 自定义资产的使用3.1.3 资产选择器 四、Ansible Ad-Hoc 命令4.1 模块类型4.1.1 command & shell 模块4.1.2 cop…

鸿蒙NEXT自定义组件:太极Loading

【引言】(完整代码在最后面) 本文将介绍如何在鸿蒙NEXT中创建一个自定义的“太极Loading”组件,为你的应用增添独特的视觉效果。 【环境准备】 电脑系统:windows 10 开发工具:DevEco Studio NEXT Beta1 Build Vers…

AVL树了解并简单实现

这篇文章默认知道二叉搜索树,如果了解并不多可以先看看二叉搜索树了解和实现-CSDN博客 目录 1.AVL树概念 2.AVL树节点定义 3.AVL树的插入(重点) 3.1AVL树 3.2AVL树的旋转 3.3AVL树插入代码 4.AVL树的验证 5.AVL树的删除 6.AVL树的性能…

【MySQL】索引原理及操作

目录 索引原理 初识索引 磁盘原理 磁盘与系统之间的关系 MySQL、系统、磁盘之间的关系 理解索引 页目录 页目录设计的数据结构问题 聚簇索引与非聚簇索引 遗留问题 索引操作 创建索引 查询索引 删除索引 其他索引概念与操作 索引原理 索引(I…

代码随想录算法训练营第三十一天| 56. 合并区间 、738.单调递增的数字 。c++转java

56. 合并区间 class Solution {public int[][] merge(int[][] intervals) {//对区间按照右边界排序Arrays.sort(intervals,(a,b) -> Integer.compare(a[0],b[0]));List<int[]> p new LinkedList<>();int l intervals[0][0],r intervals[0][1];for(int i 1;i…

厦大南洋理工最新开源,一种面向户外场景的特征-几何一致性无监督点云配准方法

导读 本文提出了INTEGER&#xff0c;一种面向户外点云数据的无监督配准方法&#xff0c;通过整合高层上下文和低层几何特征信息来生成更可靠的伪标签。该方法基于教师-学生框架&#xff0c;创新性地引入特征-几何一致性挖掘&#xff08;FGCM&#xff09;模块以提高伪标签的准确…

模型运行速度笔记: s/epoch VS s/iter

1 概念介绍 在模型训练中&#xff1a; s/epoch 表示每个epoch所需的秒数&#xff0c;即完成一轮完整数据集训练的时间。s/iter 表示每个iteration&#xff08;迭代&#xff09;所需的秒数&#xff0c;即处理一个batch的时间。 它们的关系是&#xff1a; 2 举例 比如我tra…

k8s 中传递参数给docker容器

文章目录 docker启动时传递参数使用k8s env传递完全覆盖 ENTRYPOINT 和 CMD 在 Kubernetes 中&#xff0c;可以通过多种方式将参数传递给 Dockerfile 或其运行的容器&#xff0c;常见的方式包括使用环境变量、命令行参数、配置文件等。以下是一些常用的方法&#xff1a; docker…

Map Set

在学习TreeMap和TreeSet之前需要先学习有关搜索树的相关知识以及接口Map和Set。 1. 搜索树 1.1 概念 二叉搜索树又称二叉排序树&#xff0c;其特点是&#xff0c;该节点的左边都比其小&#xff0c;右边都比其大&#xff0c;每一棵子树都必须满足这个条件。如下图所示例子。2…

Android OpenGLES2.0开发(八):Camera预览

严以律己&#xff0c;宽以待人 引言 终于到该章节了&#xff0c;还记得Android OpenGLES2.0开发&#xff08;一&#xff09;&#xff1a;艰难的开始章节说的吗&#xff1f;写这个系列的初衷就是因为每次用到GLSurfaceViewCamera预览时&#xff0c;总是CtrlC、CtrlV从来没有研究…

基础 IO

目录 一、基本共识 二、复习C语言中的文件操作 三、与文件操作有关的系统调用接口 1. open 与 close 1.1 umask 2. write 3. read 四、如何理解文件 1. 文件描述符 fd 2. 文件fd分配规则 3. 重定向的引入 4. 重定向的本质 5. dup2 6. 理解 >、>>、…

ThriveX 博客管理系统前后端项目部署教程

前端 前端项目地址&#xff1a;https://github.com/LiuYuYang01/ThriveX-Blog 控制端项目地址&#xff1a;https://github.com/LiuYuYang01/ThriveX-Admin Vercel 首先以 Vercel 进行部署&#xff0c;两种方式部署都是一样的&#xff0c;我们以前端项目进行演示 首先我们先…