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 ,多来几道,时间上耗不起。 力扣上的题…...
华为云AI开发平台ModelArts
华为云ModelArts:重塑AI开发流程的“智能引擎”与“创新加速器”! 在人工智能浪潮席卷全球的2025年,企业拥抱AI的意愿空前高涨,但技术门槛高、流程复杂、资源投入巨大的现实,却让许多创新构想止步于实验室。数据科学家…...
Objective-C常用命名规范总结
【OC】常用命名规范总结 文章目录 【OC】常用命名规范总结1.类名(Class Name)2.协议名(Protocol Name)3.方法名(Method Name)4.属性名(Property Name)5.局部变量/实例变量(Local / Instance Variables&…...
HTML前端开发:JavaScript 常用事件详解
作为前端开发的核心,JavaScript 事件是用户与网页交互的基础。以下是常见事件的详细说明和用法示例: 1. onclick - 点击事件 当元素被单击时触发(左键点击) button.onclick function() {alert("按钮被点击了!&…...
用docker来安装部署freeswitch记录
今天刚才测试一个callcenter的项目,所以尝试安装freeswitch 1、使用轩辕镜像 - 中国开发者首选的专业 Docker 镜像加速服务平台 编辑下面/etc/docker/daemon.json文件为 {"registry-mirrors": ["https://docker.xuanyuan.me"] }同时可以进入轩…...
实现弹窗随键盘上移居中
实现弹窗随键盘上移的核心思路 在Android中,可以通过监听键盘的显示和隐藏事件,动态调整弹窗的位置。关键点在于获取键盘高度,并计算剩余屏幕空间以重新定位弹窗。 // 在Activity或Fragment中设置键盘监听 val rootView findViewById<V…...
自然语言处理——循环神经网络
自然语言处理——循环神经网络 循环神经网络应用到基于机器学习的自然语言处理任务序列到类别同步的序列到序列模式异步的序列到序列模式 参数学习和长程依赖问题基于门控的循环神经网络门控循环单元(GRU)长短期记忆神经网络(LSTM)…...
DeepSeek 技术赋能无人农场协同作业:用 AI 重构农田管理 “神经网”
目录 一、引言二、DeepSeek 技术大揭秘2.1 核心架构解析2.2 关键技术剖析 三、智能农业无人农场协同作业现状3.1 发展现状概述3.2 协同作业模式介绍 四、DeepSeek 的 “农场奇妙游”4.1 数据处理与分析4.2 作物生长监测与预测4.3 病虫害防治4.4 农机协同作业调度 五、实际案例大…...
Spring是如何解决Bean的循环依赖:三级缓存机制
1、什么是 Bean 的循环依赖 在 Spring框架中,Bean 的循环依赖是指多个 Bean 之间互相持有对方引用,形成闭环依赖关系的现象。 多个 Bean 的依赖关系构成环形链路,例如: 双向依赖:Bean A 依赖 Bean B,同时 Bean B 也依赖 Bean A(A↔B)。链条循环: Bean A → Bean…...
群晖NAS如何在虚拟机创建飞牛NAS
套件中心下载安装Virtual Machine Manager 创建虚拟机 配置虚拟机 飞牛官网下载 https://iso.liveupdate.fnnas.com/x86_64/trim/fnos-0.9.2-863.iso 群晖NAS如何在虚拟机创建飞牛NAS - 个人信息分享...
【Linux系统】Linux环境变量:系统配置的隐形指挥官
。# Linux系列 文章目录 前言一、环境变量的概念二、常见的环境变量三、环境变量特点及其相关指令3.1 环境变量的全局性3.2、环境变量的生命周期 四、环境变量的组织方式五、C语言对环境变量的操作5.1 设置环境变量:setenv5.2 删除环境变量:unsetenv5.3 遍历所有环境…...
