MMdetection框架速成系列 第07部分:数据增强的N种方法
MMdetection框架实现数据增强的N种方法
- 1 为什么要进行数据增强
- 2 数据增强的常见误区
- 3 常见的六种数据增强方式
- 3.1 随机翻转(RandomFlip)
- 3.2 随机裁剪(RandomCrop)
- 3.3 随机比例裁剪并缩放(RandomResizedCrop)
- 3.4 色彩抖动(ColorJitter)
- 3.5 随机灰度化(RandomGrayscale)
- 3.6 随机光照变换(Lighting)
1 为什么要进行数据增强
众所周知,即使是目前最先进的神经网络模型,其本质上也是在利用一系列线性和非线性的函数去拟合目标输出。既然是拟合,当然越多的样本就能获得越准确的结果,这也是为什么现在训练神经网络所使用的数据规模越来越大。

然而,在实际使用中,我们往往可能只有几千甚至几百份数据。面对神经网络数以 M 计的参数,很容易陷入过拟合的陷阱。因为神经网络的收敛需要一个较长的训练过程,而这个过程中网络遇到的反反复复都是训练集的那几张图片,硬背都背下来了,自然很难学到什么能够泛化的特征。一个自然的想法是,能不能用一张图片去生成一系列图片,从而成百上千倍地扩充我们的数据集?而这,也正是数据增强的目的之一。
神经网络的“取巧”——神经网络是没有常识的,因此它永远只会用最“方便”的方式区分两个类别。
假设要训练一个区分苹果和橘子的神经网络,但手上的数据只有红苹果和青橘子,那无论拍摄多少张照片,神经网络也只会简单地认为红色的就是苹果,青色的就是橘子。这在实际使用中经常出现,拍摄的灯光、拍摄的角度等等,任何一个不起眼的区分点,都会被神经网络当做分类的依据。
接下来将列举当前分类方向研究中最常用的一系列数据增强手段和效果。
2 数据增强的常见误区
一些人会认为,既然有这么多数据增强的方法,那么我一口气全堆到一起,是不是就能获得最好的增强效果?答案是否定的,数据增强的目标并不是无脑地堆数据,而是尽可能地去覆盖原始数据无法覆盖不到,但现实生活中会出现的情况。
举例说明:现在要训练一个用以区分道路上汽车种类的神经网络,那么图片的垂直翻转很大程度上就不是一个好的数据增强方法,毕竟现实中不太可能遇到汽车四轮朝上的情况。

3 常见的六种数据增强方式
3.1 随机翻转(RandomFlip)
随机翻转是一个非常常用的数据增强方法,包括水平和垂直翻转。其中,水平翻转是最常用的,但根据实际目标的不同,垂直翻转也可以使用。

在 MMClassificiation 中,大部分数据增强方法都可以通过修改 config 中的 pipeline 配置来实现。这里我们提供了一份 python 代码,用来展示如上图所示的数据增强效果:
import mmcvfrom mmcls.datasets
import PIPELINES# 数据增强配置,利用 Registry 机制创建数据增强对象
aug_cfg = dict(type='RandomFlip',flip_prob=0.5, # 按 50% 的概率随机翻转图像direction='horizontal', # 翻转方向为水平翻转
)
aug = PIPELINES.build(aug_cfg)img = mmcv.imread("./kittens.jpg")
# 为了便于信息在预处理函数之间传递,数据增强项的输入和输出都是字典
img_info = {'img': img}
img_aug = aug(img_info)['img']mmcv.imshow(img_aug)
3.2 随机裁剪(RandomCrop)
在图片的随机位置,按照指定的大小进行裁剪。这种数据增强的方式能够在保留图像比例的基础上,移动图片上各区域在图片上的位置。

在 MMClassification 中,可使用以下配置:
# 此处只提供 cfg 选项,只需替换 RandomFlip 示例中对应部分,即可预览效果
aug_cfg = dict(type='RandomCrop',size=(384, 384), # 裁剪大小padding = None, # 边缘填充宽度(None 为不填充)pad_if_needed=True, # 如果图片过小,是否自动填充边缘pad_val=(128, 128, 128), # 边缘填充像素padding_mode='constant', # 边缘填充模式
)
3.3 随机比例裁剪并缩放(RandomResizedCrop)
这一方法目前几乎是 ImageNet 等通用图像数据集在进行分类网络训练时的标准增强手段。相较于 RandomCrop 死板地裁剪下固定尺寸的图片,RandomResizedCrop 会在一定的范围内,在随机位置按照随机比例裁剪图像,之后再缩放至统一的大小。
因此,图像会在比例上存在一定程度的失真。 但这对分类来说不一定是件坏事,毕竟你并不会把一个稍扁一点的猫认成狗,而网络也能够通过这种增强学到更加接近本质的特征。另外,因为是按比例的裁剪,这种增强手段也就对不同分辨率的图片输入更加友好。

在 MMClassification 中,可使用以下配置:
# 此处只提供 cfg 选项,只需替换 RandomFlip 示例中对应部分,即可预览效果
aug_cfg = dict(type='RandomResizedCrop',size=(384, 384), # 目标大小scale=(0.08, 1.0), # 裁剪图片面积占比限制(不得小于原始面积的 8%)ratio=(3. / 4., 4. / 3.), # 裁剪图片长宽比例限制,防止过度失真max_attempts=10, # 当长宽比和面积限制无法同时满足时,最大重试次数interpolation='bilinear', # 图像缩放算法backend='cv2', # 缩放后端,有时 'cv2'(OpenCV) 和 'pillow' 有微小差别
)
3.4 色彩抖动(ColorJitter)
对图像的色彩进行数据增强的方法,其中最常用的莫过于 ColorJitter,这种方法会在一定范围内,对图像的亮度(Brightness)、对比度(Contrast)、饱和度(Saturation)和色相(Hue)进行随机变换,从而模拟真实拍摄中不同灯光环境等条件的变化。

在 MMClassification 中,可使用以下配置:
# 此处只提供 cfg 选项,只需替换 RandomFlip 示例中对应部分,即可预览效果
aug_cfg = dict(type='ColorJitter',brightness=0.5, # 亮度变化范围(0.5 ~ 1.5)contrast=0.5, # 对比度变化范围(0.5 ~ 1.5)saturation=0.5, # 饱和度变化范围(0.5 ~ 1.5)# 色相变换应用较少,目前 MMClassification 暂不支持 Hue 的增强
)
3.5 随机灰度化(RandomGrayscale)
按照一定概率,将图片转变为灰度图。这种增强方法消除了颜色的影响,在特定场景有所应用。

在 MMClassification 中,可使用以下配置:
# 此处只提供 cfg 选项,只需替换 RandomFlip 示例中对应部分,即可预览效果
aug_cfg = dict(type='RandomGrayscale',gray_prob=0.5, # 按 50% 的概率随机灰度化图像
)
3.6 随机光照变换(Lighting)
论文提出的一种针对图片光照的数据增强方法,其来源:https://dl.acm.org/doi/pdf/10.1145/3065386
在这种方法中,首先在训练数据集中对所有图像的像素进行 PCA(主成分分析),从而获得 RGB 空间中的特征值和特征向量。那么这个特征向量代表了什么呢?此处,论文作者认为它代表了光照强度对图片像素的影响。毕竟虽然图像内容各种各样,但不管哪张图片的哪个位置,都不可避免地受到光照条件的影响。
既然特征向量代表了光照强度的影响,那么只要沿着特征向量的方向对图片的像素值做一些随机的加减,就能模拟不同光照的图像。

在 MMClassification 中,可使用以下配置。需要注意的是其中特征值和特征向量的设置,如果你的任务是在通用场景下的分类,那么可以直接沿用 ImageNet 的值;而如果你的任务是在特殊光照环境下的,那么则需要采集不同光照强度下的图像,在自己的数据集上进行 PCA 来替代这里的设置。
import mmcvfrom mmcls.datasets
import PIPELINESaug_cfg = dict(type='Lighting',eigval=[55.4625, 4.7940, 1.1475], # 在 ImageNet 训练集 PCA 获得的特征值eigvec=[[-0.5675, 0.7192, 0.4009], # 在 ImageNet 训练集 PCA 获得的特征向量[-0.5808, -0.0045, -0.8140],[-0.5836, -0.6948, 0.4203]],alphastd=2.0, # 随机变换幅度,为了展示效果,这里设置较大,通常设置为 0.1to_rgb=True, # 是否将图像转换为 RGB,mmcv 读取图像为 BGR 格式,为了与特征向量对应,此处转为 RGB
)
aug = PIPELINES.build(aug_cfg)img = mmcv.imread("./kittens.jpg")
img_info = {'img': img}
img_aug = aug(img_info)['img']
# Lighting 变换得到的图像为 float32 类型,且超出 0~255 范围,为了可视化,此处进行限制
img_aug[img_aug < 0] = 0
img_aug[img_aug > 255] = 255
img_aug = img_aug.astype('uint8')[:, :, ::-1] # 转回 BGR 格式mmcv.imshow(img_aug)
以上介绍的数据增强方法只是常用方法的一部分,更多的数据增强方法,如多种方法的随机组合(AutoAugment、RandAugment)、多张图片的混合增强(MixUp、CutMix)等。
相关文章:
MMdetection框架速成系列 第07部分:数据增强的N种方法
MMdetection框架实现数据增强的N种方法 1 为什么要进行数据增强2 数据增强的常见误区3 常见的六种数据增强方式3.1 随机翻转(RandomFlip)3.2 随机裁剪(RandomCrop)3.3 随机比例裁剪并缩放(RandomResizedCrop࿰…...
基于Kitti数据集的智能驾驶目标检测系统(PyTorch+Pyside6+YOLOv5模型)
摘要:基于Kitti数据集的智能驾驶目标检测系统可用于日常生活中检测与定位行人(Pedestrian)、面包车(Van)、坐着的人(Person Sitting)、汽车(Car)、卡车(Truck…...
4.4. 深拷贝 vs 浅拷贝
文章目录 浅拷贝:对基本数据类型进行值传递,对引用数据类型进行引用传递般的拷贝,此为浅拷贝。深拷贝:对基本数据类型进行值传递,对引用数据类型,创建一个新的对象,并复制其内容,此为…...
网络安全(黑客)自学建议笔记
前言 网络安全,顾名思义,无安全,不网络。现如今,安全行业飞速发展,我们呼吁专业化的 就职人员与大学生 ,而你,认为自己有资格当黑客吗? 本文面向所有信息安全领域的初学者和从业人员…...
Linux CentOS快速安装VNC并开启服务
以下是在 CentOS 上安装并开启 VNC 服务的步骤: 安装 VNC 服务器软件包。运行以下命令: sudo yum install tigervnc-server 输出 $ sudo yum install tigervnc-server Loaded plugins: fastestmirror, langpacks Repository epel is missing name i…...
redis到底几个线程?
通常我们说redis是单线程指的是从接收客户端请求->解析请求->读写->响应客户端这整个过程是由一个线程来完成的。这并不意味着redis在任何场景、任何版本下都只有一个线程 为何用单线程处理数据读写? 内存数据储存已经很快了 redis相比于mysql等数据库是…...
mysql修改UUID
mysql修改UUID 问题描述:集群搭建时克隆主服务的镜像导致所有节点的服务UUID都一致,此时在集群中添加节点时会提示UUID冲突报错。 解决方案 1、利用uuid函数生成新的uuid mysql> select uuid(); -------------------------------------- | uuid() …...
NoSQL之redis配置与优化
NoSQL之redis配置与优化 高可用持久化功能Redis提供两种方式进行持久化1.触发条件手动触发自动触发 执行流程优缺点缺点:优势AOF出发规则: AOF流程AOF缺陷和优点 NoSQL之redis配置与优化 mysql优化 1线程池优化 2硬件优化 3索引优化 4慢查询优化 5内…...
Python单例模式介绍、使用
一、单例模式介绍 概念:单例模式是一种创建型设计模式,它确保一个类只有一个实例,并提供访问该实例的全局访问点。 功能:单例模式的主要功能是确保在应用程序中只有一个实例存在。 优势: 节省系统资源:由…...
1334179-85-9,BTTAA,是各种化学生物学实验中生物偶联所需
资料编辑|陕西新研博美生物科技有限公司小编MISSwu BTTAA试剂 | 基础知识概述(部分): 中文名称:2-[4-({双[(1-叔丁基-1H-1,2,3-三唑-4-基)甲基]氨基}甲基)-1H-1,2,3-三唑-1-基]乙酸 英文名称:BTTAA CAS号:1334179-8…...
Linux系统中的SQL语句
本节主要学习,SQL语句的语句类型,数据库操作,数据表操作,和数据操作等。 文章目录 一、SQL语句类型 DDL DML DCL DQL 二、数据库操作 1.查看 2.创建 默认字符集 指定字符集 3.进入 4.删除 5.更改 库名称 字符集 6…...
力扣27 26 283 844 977 移除数组
给你一个数组 nums 和一个值 val,你需要 原地 移除所有数值等于 val 的元素,并返回移除后数组的新长度。 不要使用额外的数组空间,你必须仅使用 O(1) 额外空间并原地修改输入数组。 元素的顺序可以改变。你不需要考虑数组中超出新长度后面的…...
【沐风老师】3DMAX自动材质插件使用方法教程
3DMAX自动材质插件使用方法教程 3DMAX自动材质工具用于在将纹理加载到3dsax中时快速创建简单的材质,并具有一些很酷的材质功能。 这个插件可以根据真正制造商的纹理(通常比例为2:1)快速创建简单的木材材质,并根据板材的长度自动对…...
让你 React 组件水平暴增的 5 个技巧
目录 透传 className、style 通过 forwardRef 暴露一些方法 useCallback、useMemo 用 Context 来跨组件传递值 React.Children、React.cloneElement 总结 最近看了一些 Ant Design 的组件源码,学到一些很实用的技巧,这篇文章来分享一下。 首先&am…...
阿里云部署 ChatGLM2-6B 与 langchain+ChatGLM
1.ChatGLM2-6B 部署 更新系统 apt-get update 安装git apt-get install git-lfs git init git lfs install 克隆 ChatGLM2-6B 源码 git clone https://github.com/THUDM/ChatGLM2-6B.git 克隆 chatglm2-6b 模型 #进入目录 cd ChatGLM2-6B #创建目录 mkdir model #进入目录 cd m…...
F12开发者工具的简单应用
目录 elements 元素 1、元素的定位和修改 2、UI自动化应用 console 控制台 sources 源代码 network 网络 1、定位问题 2、接口测试 3、弱网测试 performance 性能 memory 存储 application 应用 recorder 记录器 界面展示如下(设置中可以切换中英文&am…...
【 Python 全栈开发 - 人工智能篇 - 45 】决策树与随机森林
文章目录 一、概念与原理1.1 决策树1.1.1 概念1.1.2 原理特征选择分割方法 1.1.3 优点与缺点1.1.4 Python常用决策树算法 1.2 随机森林1.2.1 概念1.2.2 原理1.2.3 优点与缺点1.2.4 Python常用随机森林算法 1.3 决策树与随机森林的比较1.3.1 相同之处1.3.2 不同之处 二、决策树算…...
SpringBoot集成kafka全面实战
本文是SpringBootKafka的实战讲解,如果对kafka的架构原理还不了解的读者,建议先看一下《大白话kafka架构原理》、《秒懂kafka HA(高可用)》两篇文章。 一、生产者实践 普通生产者 带回调的生产者 自定义分区器 kafka事务提交…...
新建Git仓库,将本地文件上传至仓库
1、新建仓库,勾选初始化仓库 2、复制仓库链接 3、打开本地文件目录 右键选择 Git Bash Here 打开命令窗口 4、依次按照下面的步骤(*如果报错,看原目录下是否存在 .git 需要删除) // 生成git文件 git init // 把文件加入暂存区 g…...
算法练习——力扣随笔【LeetCode】【C++】
文章目录 LeetCode 练习随笔力扣上的题目和 OJ题目相比不同之处?定义问题排序问题统计问题其他 LeetCode 练习随笔 做题环境 C 中等题很值,收获挺多的 不会的题看题解,一道题卡1 h ,多来几道,时间上耗不起。 力扣上的题…...
硬件答辩问题总结
一、电源纹波是什么,为什么LDO的小,DCDC的大1.电源纹波电源纹波 是指直流电源输出电压上叠加的 交流波动成分,表现为电压在理想直流值附近上下波动。2.LDO 纹波小原理LDO 内部是一个 调整管(可变电阻) 串联在输入和输出…...
【紧急预警】92%的DeepSeek测试用例生成失败源于这4个隐性配置缺陷——资深SDET连夜整理修复清单
更多请点击: https://codechina.net 第一章:DeepSeek测试用例生成的现状与危机本质 当前,DeepSeek系列大模型(如DeepSeek-Coder、DeepSeek-VL)在代码生成与理解任务中展现出强大能力,但其测试用例自动生成…...
Jupyter Notebook里跑argparse脚本总报错?一个空列表参数搞定ipykernel_launcher.py error
Jupyter Notebook中argparse报错的终极解决方案:空列表参数实战解析在数据科学和机器学习的工作流中,Jupyter Notebook因其交互式特性成为众多研究者的首选工具。然而,当我们尝试在Notebook中运行那些原本为命令行设计的Python脚本时…...
INT8量化下TVA注意力对齐精度保障方案
重磅预告:本专栏将独家连载系列丛书《智能体视觉技术与应用》部分精华内容,该书是世界首套系统阐述“因式智能体”视觉理论与实践的专著,特邀美国 TypeOne 公司首席科学家、斯坦福大学博士 Bohan 担任技术顾问。Bohan先生师从美国三院院士、“…...
高精度光照检测
光线检测仪,kotlin开发,调用手机感光模块检测室内外光照强度,用途多多,我主要用途孩子写作业检测光照保护视力。 食用方法∶打开即测,速度快,无广告,手机平视即可,无须直视光线。 买…...
别再只用鼠标了!用Leap Motion手势控制Unity游戏,保姆级配置避坑指南(2024版)
2024年Unity手势交互开发实战:Leap Motion从配置到游戏逻辑全解析在游戏开发领域,交互方式的创新往往能带来全新的体验。想象一下,玩家不再需要键盘鼠标,仅凭自然的手部动作就能操控游戏角色——这正是Leap Motion手势识别技术为U…...
DAIR-V2X-V数据集深度评测:与KITTI、nuScenes比,它到底强在哪?
DAIR-V2X-V数据集深度评测:与KITTI、nuScenes比,它到底强在哪? 当技术团队着手开发面向中国道路的自动驾驶系统时,数据集的选择往往成为第一个关键决策点。过去十年间,KITTI和nuScenes等国际数据集一直是行业标杆&…...
从NLP到RAG:AI标书生成系统的技术架构与落地路径深度剖析
引言2026年2月,国家发改委等八部门联合印发《关于加快招标投标领域人工智能推广应用的实施意见》,明确到2026年底招标文件检测、智能辅助评标、围串标识别等重点场景在部分省市实现全覆盖。同一时期,《招标投标法》修订草案经国务院常务会议原…...
如何快速掌握MPC视频渲染器:面向初学者的完整教程
如何快速掌握MPC视频渲染器:面向初学者的完整教程 【免费下载链接】VideoRenderer Внешний видео-рендерер 项目地址: https://gitcode.com/gh_mirrors/vi/VideoRenderer 想要在Windows系统上获得影院级的视频播放体验吗?MPC…...
别让依赖毁了你的实验:记一次Vision Mamba复现中causal_conv1d与mamba-ssm的版本“打架”事件
Vision Mamba复现实战:破解依赖冲突的工程化解决方案在深度学习项目的复现过程中,依赖管理往往是最容易被忽视却又最常导致问题的环节。最近在复现Vision Mamba模型时,我遭遇了一场典型的Python依赖"战争"——causal_conv1d与mamba…...
