当前位置: 首页 > news >正文

目标检测从入门到精通——数据增强方法总结

以下是YOLO系列算法(从YOLOv1到YOLOv7)中使用的数据增强方法的总结,包括每种方法的数学原理、相关论文以及对应的YOLO版本。

YOLO系列数据增强方法总结

数据增强方法数学原理相关论文
图像缩放将输入图像缩放到固定大小(如448x448),以适应网络输入。Redmon et al., “You Only Look Once: Unified Real-Time Object Detection”
随机裁剪从原始图像中随机裁剪出部分区域进行训练,增加样本多样性。Redmon & Farhadi, “YOLO9000: Better, Faster, Stronger”
随机翻转对图像进行水平翻转,增强模型对目标方向变化的鲁棒性。Redmon & Farhadi, “YOLO9000: Better, Faster, Stronger”
颜色抖动随机调整图像的亮度、对比度、饱和度和色调,增加数据多样性。Redmon & Farhadi, “YOLO9000: Better, Faster, Stronger”
随机缩放在训练过程中随机缩放图像,以适应不同尺寸的目标。Redmon & Farhadi, “YOLOv3: An Incremental Improvement”
Mosaic将四张图像拼接在一起形成一张新图像,帮助模型学习不同目标之间的上下文关系。Bochkovskiy et al., “YOLOv4: Optimal Speed and Accuracy of Object Detection”
Mixup将两张图像及其标签按比例混合,生成新的训练样本。Zhang et al., “Mixup: Beyond Empirical Risk Minimization”
CutMix将一张图像的部分区域切割并替换为另一张图像的相应区域,生成新的训练样本。Yun et al., “CutMix: Regularization Strategy to Train Strong Classifiers with Localizable Features”
随机擦除在图像中随机选择一个区域并将其置为零或随机值,帮助模型学习到目标的局部特征。Devries & Taylor, “Cutout: Regularization Strategy to Train Strong Classifiers”
随机旋转将图像随机旋转一定角度,帮助模型学习到目标在不同角度下的特征。Bochkovskiy et al., “YOLOv4: Optimal Speed and Accuracy of Object Detection”
随机噪声向图像中添加高斯噪声,以增强模型的鲁棒性。Redmon & Farhadi, “YOLOv3: An Incremental Improvement”
1. 图像缩放
  • 适用版本:YOLOv1, YOLOv2, YOLOv3, YOLOv4, YOLOv5, YOLOv6, YOLOv7
  • 数学原理:将输入图像缩放到固定大小(如448x448),以适应网络输入。
  • 相关论文:Redmon et al., “You Only Look Once: Unified Real-Time Object Detection”
import cv2def resize_image(image, size=(640, 640)):return cv2.resize(image, size)
2. 随机裁剪
  • 适用版本:YOLOv2, YOLOv3, YOLOv4, YOLOv5, YOLOv6, YOLOv7
  • 数学原理:从原始图像中随机裁剪出部分区域进行训练,增加样本多样性。
  • 相关论文:Redmon & Farhadi, “YOLO9000: Better, Faster, Stronger”
import randomdef random_crop(image, crop_size=(640, 640)):h, w, _ = image.shapecrop_x = random.randint(0, w - crop_size[1])crop_y = random.randint(0, h - crop_size[0])return image[crop_y:crop_y + crop_size[0], crop_x:crop_x + crop_size[1]]
3. 随机翻转
  • 适用版本:YOLOv2, YOLOv3, YOLOv4, YOLOv5, YOLOv6, YOLOv7
  • 数学原理:对图像进行水平翻转,增强模型对目标方向变化的鲁棒性。
  • 相关论文:Redmon & Farhadi, “YOLO9000: Better, Faster, Stronger”
def random_flip(image):if random.random() > 0.5:return cv2.flip(image, 1)  # 水平翻转return image
4. 颜色抖动
  • 适用版本:YOLOv2, YOLOv3, YOLOv4, YOLOv5, YOLOv6, YOLOv7
  • 数学原理:随机调整图像的亮度、对比度、饱和度和色调,增加数据多样性。
  • 相关论文:Redmon & Farhadi, “YOLO9000: Better, Faster, Stronger”
from PIL import ImageEnhance, Imagedef color_jitter(image):image = Image.fromarray(image)brightness = ImageEnhance.Brightness(image).enhance(random.uniform(0.5, 1.5))contrast = ImageEnhance.Contrast(brightness).enhance(random.uniform(0.5, 1.5))saturation = ImageEnhance.Color(contrast).enhance(random.uniform(0.5, 1.5    return np.array(saturation)
5. 随机缩放
  • 适用版本:YOLOv3, YOLOv4, YOLOv5, YOLOv6, YOLOv7
  • 数学原理:在训练过程中随机缩放图像,以适应不同尺寸的目标。
  • 相关论文:Redmon & Farhadi, “YOLOv3: An Incremental Improvement”
6. Mosaic
  • 适用版本:YOLOv4, YOLOv5, YOLOv6, YOLOv7
  • 数学原理:将四张图像拼接在一起形成一张新图像,帮助模型学习不同目标之间的上下文关系。
  • 相关论文:Bochkovskiy et al., “YOLOv4: Optimal Speed and Accuracy of Object Detection”
def mosaic(images, size=(640, 640)):h, w = sizemosaic_image = np.zeros((h, w, 3), dtype=np.uint8)for i in range(2):for j in range(2):img = images[random.randint(0, len(images) - 1)]img = cv2.resize(img, (w // 2, h // 2))mosaic_image[i * (h // 2):(i + 1) * (h // 2), j * (w // 2):(j + 1) * (w // 2)] = imgreturn mosaic_image
7. Mixup
  • 适用版本:YOLOv3, YOLOv4, YOLOv5, YOLOv6, YOLOv7
  • 数学原理:将两张图像及其标签按比例混合,生成新的训练样本。公式为:
    x ~ = λ x 1 + ( 1 − λ ) x 2 \tilde{x} = \lambda x_1 + (1 - \lambda) x_2 x~=λx1+(1λ)x2
    y ~ = λ y 1 + ( 1 − λ ) y 2 \tilde{y} = \lambda y_1 + (1 - \lambda) y_2 y~=λy1+(1λ)y2
    其中, λ \lambda λ 是从Beta分布中采样的值。
  • 相关论文:Zhang et al., “Mixup: Beyond Empirical Risk Minimization”
def mixup(image1, image2, alpha=0.2):lambda_ = np.random.beta(alpha, alpha)mixed_image = lambda_ * image1 + (1 - lambda_) * image2return mixed_image.astype(np.uint8)
8. CutMix
  • 适用版本:YOLOv4, YOLOv5, YOLOv6, YOLOv7
  • 数学原理:将一张图像的部分区域切割并替换为另一张图像的相应区域,生成新的训练样本。公式为:
    x ~ = M ⊙ x 1 + ( 1 − M ) ⊙ x 2 \tilde{x} = M \odot x_1 + (1 - M) \odot x_2 x~=Mx1+(1M)x2
    y ~ = λ y 1 + ( 1 − λ ) y 2 \tilde{y} = \lambda y_1 + (1 - \lambda) y_2 y~=λy1+(1λ)y2
    其中, M M M 是二进制掩码, λ \lambda λ 是切割区域的面积与原始图像面积的比值。
  • 相关论文:Yun et al., “CutMix: Regularization Strategy to Train Strong Classifiers with Localizable Features”
def cutmix(image1, image2, alpha=0.2):h, w, _ = image1.shapelambda_ = np.random.beta(alpha, alpha)target_area = np.random.uniform(0.1 * h * w, 0.5 * h * w)aspect_ratio = np.random.uniform(0.5, 2.0)h_cut = int(np.sqrt(target_area * aspect_ratio))w_cut = int(np.sqrt(target_area / aspect_ratio))if h_cut > h:h_cut = hif w_cut > w:w_cut = wx = np.random.randint(0, h - h_cut)y = np.random.randint(0, w - w_cut)mixed_image = image1.copy()mixed_image[x:x + h_cut, y:y + w_cut] = image2[x:x + h_cut, y:y + w_cut]return mixed_image
9. 随机擦除
  • 适用版本:YOLOv4, YOLOv5, YOLOv6, YOLOv7
  • 数学原理:在图像中随机选择一个区域并将其置为零或随机值,帮助模型学习到目标的局部特征。公式为:
    Erase ( x ) = { 0 if  ( x , y ) in erased area x otherwise \text{Erase}(x) = \begin{cases} 0 & \text{if } (x,y) \text{ in erased area} \\ x & \text{otherwise} \end{cases} Erase(x)={0xif (x,y) in erased areaotherwise
  • 相关论文:Devries & Taylor, “Cutout: Regularization Strategy to Train Strong Classifiers”
def random_erasing(image, probability=0.5):if random.random() > probability:return imageh, w, _ = image.shapearea = h * wtarget_area = np.random.randint(0.02 * area, 0.33 * area)aspect_ratio = np.random.uniform(0.3, 3.3)h_erased = int(np.sqrt(target_area * aspect_ratio))w_erased = int(np.sqrt(target_area / aspect_ratio))if h_erased > h:h_erased = hif w_erased > w:w_erased = wx = np.random.randint(0, h - h_erased)y = np.random.randint(0, w - w_erased)image[x:x + h_erased, y:y + w_erased, :] = 0  # 或者随机值return image
10. 随机旋转
  • 适用版本:YOLOv5, YOLOv6, YOLOv7
  • 数学原理:将图像随机旋转一定角度,帮助模型学习到目标在不同角度下的特征。旋转矩阵为:
    R ( θ ) = [ cos ⁡ ( θ ) − sin ⁡ ( θ ) sin ⁡ ( θ ) cos ⁡ ( θ ) ] R(\theta) = \begin{bmatrix} \cos(\theta) & -\sin(\theta) \\ \sin(\theta) & \cos(\theta) \end{bmatrix} R(θ)=[cos(θ)sin(θ)sin(θ)cos(θ)]
  • 相关论文:Bochkovskiy et al., “YOLOv4: Optimal Speed and Accuracy of Object Detection”
def random_rotate(image, angle_range=(-30, 30)):angle = random.uniform(angle_range[0], angle_range[1])h, w = image.shape[:2]M = cv2.getRotationMatrix2D((w // 2, h // 2), angle, 1.0)return cv2.warpAffine(image, M, (w, h))
11. 随机噪声
  • 适用版本:YOLOv4, YOLOv5, YOLOv6, YOLOv7
  • 数学原理:向图像中添加高斯噪声,以增强模型的鲁棒性。高斯噪声的公式为:
    I ′ ( x , y ) = I ( x , y ) + N ( 0 , σ 2 ) I'(x,y) = I(x,y) + N(0, \sigma^2) I(x,y)=I(x,y)+N(0,σ2)
    其中, I I I 是原始图像, N ( 0 , σ 2 ) N(0, \sigma^2) N(0,σ2) 是高斯噪声。
  • 相关论文:Redmon & Farhadi, “YOLOv3: An Incremental Improvement”
def add_gaussian_noise(image, mean=0, var=0.1):sigma = var**0.5gauss = np.random.normal(mean, sigma, image.shape)noisy_image = np.clip(image + gauss, 0, 255).astype(np.uint8)return noisy_image

YOLO系列算法在不同版本中逐步引入了多种数据增强方法,从最初的简单缩放和翻转,到后来的Mixup、CutMix等复杂方法。这些数据增强技术不仅提高了模型的性能,还增强了其对不同场景和条件的适应能力。随着YOLO算法的不断发展,数据增强方法也在不断演进,为目标检测任务提供了更强大的支持。

相关文章:

目标检测从入门到精通——数据增强方法总结

以下是YOLO系列算法(从YOLOv1到YOLOv7)中使用的数据增强方法的总结,包括每种方法的数学原理、相关论文以及对应的YOLO版本。 YOLO系列数据增强方法总结 数据增强方法数学原理相关论文图像缩放将输入图像缩放到固定大小(如448x44…...

SQL server 的异常处理 一个SQL异常 如何不影响其他SQL执行

在 SQL Server 中,存储过程中的 SQL 语句是顺序执行的。如果其中任何一个 SQL 语句遇到了错误或异常,那么默认情况下,这个错误会导致整个事务(如果有的话)回滚,并且存储过程会立即停止执行,不会…...

STM32——看门狗通俗解析

笔者在学习看门狗的视频后,对看门狗仍然是一知半解,后面在实际应用中发现它是一个很好用的检测或者调试工具。所以总结一下笔者作为初学小白对看门狗的理解。 主函数初始化阶段、循环阶段和复位 众所周知,程序的运行一般是这样的&#xff1…...

点亮第一盏LED灯 5): stm32CubeMX生成Keil代码

嵌入式入门,继续点亮第一盏LED灯,前面文章已经配置了GPIO引脚和时钟,那么基本上stm32CubeMX的配置就完成了,还有一点就是可以对PC13这个引脚起个别名, 这里起的别名是 LED_PC13,还有注意地方就是GPIO mode…...

ollama语言大模型部署使用

ollama语言大模型部署使用 前言一、下载安装maxkb1、下载解压赋权2、安装 二、安装ollamadocker运行 三、无需获取api_keymaxkb安装ollama模型对,就是这,你选好基础模型后,只需要给他地址,添加完成后自行调用ollama安装你选择好的…...

redis 基本数据类型—string类型

一、介绍 Redis 中的字符串,直接就是按照二进制数据的方式存储的,不会做任何的编码转换。 Redis对于 string 类型,限制了大小最大是512M 二、命令 SET 将 string 类型的 value 设置到 key 中。如果 key 之前存在,则覆盖&#…...

Git 使用教程:从入门到精通

Git 是一个开源的分布式版本控制系统,由 Linus Torvalds 创建,用于有效、高速地处理从小到大的项目版本管理。本教程将带你从 Git 的安装开始,逐步学习到如何使用 Git 进行日常的版本控制操作。 安装 Git Windows 访问 Git 官方网站 下载 …...

ES查询的一些优化方式

ES查询的一些优化方式 filter和query Query会计算得分,filte不是, 整体上query会更耗时 字段方式: KEYWORD 和 text, Text检索的方式往往会占用更多性能,它往往需要伴随着模糊匹配和分词 分页的大小 From 和size的大小合理设置…...

计算左边(比自己小的元素)的最长距离

前言:一般做的题目都是使用单调栈来求出距离这个点最近的那个比这个数大或小的元素,但是如果是需要找到最远的那个元素呢?我们可以用到类似逆序对的思路,我们先进行排序从小到大,接着我们先处理左边,每次维…...

【C++算法】二分查找

二分查找 题目链接 二分查找https://leetcode.cn/problems/binary-search/ 算法原理 代码步骤 代码展示 class Solution { public:int search(vector<int>& nums, int target) {int left 0, right nums.size() - 1;while(left < right){// 防止溢出int mid …...

红日靶场通关

初始准备 首先是网络配置&#xff0c;看教程来的&#xff0c;我配置完的效果如下 windows7&#xff1a;(内&#xff1a;192.168.52.143 / 外&#xff1a;192.168.154.136) windows2003&#xff1a;(内&#xff1a;192.168.52.141)windows2008:&#xff08;内&#xff1a;192.…...

用Python爬虫制作一个简易翻译器

我们通常是通过requestsBS4的方法来获取网页内容&#xff0c;这种方法导入模块较多&#xff0c;速度相对有点儿慢&#xff0c;此时我们可以用requests的post方法向指定服务器发送请求&#xff0c;获取数据后格式化为json&#xff0c;然后获取相关键值。这种方法用到了requests和…...

Shader Graph Create Node

一、Artistic 1、Adjustment 1)、Channel Mixer(通道混合) 根据权重对每个通道进行混合。 Contrast(对比度) 可调整对比度 调整对比度可以改变图像的鲜明度和层次感。增加对比度会使图像中的明暗差异更加显著&#xff0c;使图像看起来更加清晰、明亮&#xff1b;减少对比…...

共模干扰的形成和滤除

1、共模就是共同对地的干扰&#xff1a; 如图&#xff0c;我们可以看到共模的原理图。UPQ就是共模电压&#xff0c;ICM1 ICM2 就是共模电流。 ICM1 ICM2 大小不一定相同&#xff0c;方向相同。 2、共模信号和差模信号的区别&#xff1a; 通常电源线有三根线&#xff1a;火线L、…...

(计算机网络)运输层

一.运输层的作用 运输层&#xff1a;负责将数据统一的交给网络层 实质&#xff1a;进程在通信 TCP&#xff08;有反馈&#xff09;UDP&#xff08;无反馈&#xff09; 二.复用和分用 三. TCP和UDP的特点和区别 进程号--不是固定的 端口号固定--mysql--3306 端口--通信的终点 …...

基于深度学习的信号滤波:创新技术与应用挑战

一、引言 1.1 研究背景 随着科技的不断发展&#xff0c;信号处理领域面临着越来越复杂的挑战。在众多信号处理技术中&#xff0c;基于深度学习的信号滤波技术逐渐崭露头角&#xff0c;成为研究的热点。 基于深度学习的信号滤波在信号处理领域具有至关重要的地位。如今&#…...

MFC工控项目实例之十一板卡测试信号输入界面

承接专栏《MFC工控项目实例之十添加系统测试对话框》 相关代码 1、在BoardTest.h文件中添加代码 class CBoardTest : public CDialog { // Construction public:CBoardTest(CWnd* pParent NULL); // standard constructorCButtonST m_btnStart[16];CWinThread* pThread…...

sql中索引查看是否生效

在pg数据库中有多种索引存在&#xff0c;在一般情况下我们取使用普通索引 以下是一些常见导致索引未命中的原因和优化策略 1.如果查询中的条件与索引字段的顺序不匹配&#xff0c;或者索引字段没有完全包含在查询条件中&#xff0c;索引可能不会被使用。 2.在查询中使用函数…...

SpringBoot常见面试题

1.请说一说Spring Boot的自动装配原理&#xff1f; SpringBootApplication EnableAutoConfiguration AutoConfigurationImportSelector组件 SpringFactoriesLoader读取 &#xff08;1&#xff09;META-INF/spring.factories 或者 &#xff08;2&#xff09;org.springframework…...

springboot优雅停机无法关闭进程,kill无法停止springboot必须kill -9,springboot线程池使用

背景最近项目在jenkins部署的时候发现部署很慢&#xff0c;查看部署日志发现kill命令执行后应用pid还存在&#xff0c;导致必须在60秒等待期后kill -9杀死springboot进程 应用环境 springboot <dependency><groupId>org.springframework.boot</groupId>&l…...

synchronized 学习

学习源&#xff1a; https://www.bilibili.com/video/BV1aJ411V763?spm_id_from333.788.videopod.episodes&vd_source32e1c41a9370911ab06d12fbc36c4ebc 1.应用场景 不超卖&#xff0c;也要考虑性能问题&#xff08;场景&#xff09; 2.常见面试问题&#xff1a; sync出…...

spring:实例工厂方法获取bean

spring处理使用静态工厂方法获取bean实例&#xff0c;也可以通过实例工厂方法获取bean实例。 实例工厂方法步骤如下&#xff1a; 定义实例工厂类&#xff08;Java代码&#xff09;&#xff0c;定义实例工厂&#xff08;xml&#xff09;&#xff0c;定义调用实例工厂&#xff…...

VTK如何让部分单位不可见

最近遇到一个需求&#xff0c;需要让一个vtkDataSet中的部分单元不可见&#xff0c;查阅了一些资料大概有以下几种方式 1.通过颜色映射表来进行&#xff0c;是最正规的做法 vtkNew<vtkLookupTable> lut; //值为0不显示&#xff0c;主要是最后一个参数&#xff0c;透明度…...

Java入门学习详细版(一)

大家好&#xff0c;Java 学习是一个系统学习的过程&#xff0c;核心原则就是“理论 实践 坚持”&#xff0c;并且需循序渐进&#xff0c;不可过于着急&#xff0c;本篇文章推出的这份详细入门学习资料将带大家从零基础开始&#xff0c;逐步掌握 Java 的核心概念和编程技能。 …...

2023赣州旅游投资集团

单选题 1.“不登高山&#xff0c;不知天之高也&#xff1b;不临深溪&#xff0c;不知地之厚也。”这句话说明_____。 A、人的意识具有创造性 B、人的认识是独立于实践之外的 C、实践在认识过程中具有决定作用 D、人的一切知识都是从直接经验中获得的 参考答案: C 本题解…...

laravel8+vue3.0+element-plus搭建方法

创建 laravel8 项目 composer create-project --prefer-dist laravel/laravel laravel8 8.* 安装 laravel/ui composer require laravel/ui 修改 package.json 文件 "devDependencies": {"vue/compiler-sfc": "^3.0.7","axios": …...

深度学习习题2

1.如果增加神经网络的宽度&#xff0c;精确度会增加到一个特定阈值后&#xff0c;便开始降低。造成这一现象的可能原因是什么&#xff1f; A、即使增加卷积核的数量&#xff0c;只有少部分的核会被用作预测 B、当卷积核数量增加时&#xff0c;神经网络的预测能力会降低 C、当卷…...

纯 Java 项目(非 SpringBoot)集成 Mybatis-Plus 和 Mybatis-Plus-Join

纯 Java 项目&#xff08;非 SpringBoot&#xff09;集成 Mybatis-Plus 和 Mybatis-Plus-Join 1、依赖1.1、依赖版本1.2、pom.xml 2、代码2.1、SqlSession 构造器2.2、MybatisPlus代码生成器2.3、获取 config.yml 配置2.3.1、config.yml2.3.2、项目配置类 2.4、ftl 模板2.4.1、…...

力扣热题100 k个一组反转链表题解

题目: 代码: func reverseKGroup(head *ListNode, k int) *ListNode {cur : headfor i : 0; i < k; i {if cur nil {return head}cur cur.Next}newHead : reverse(head, cur)head.Next reverseKGroup(cur, k)return newHead }func reverse(start, end *ListNode) *ListN…...

逻辑回归暴力训练预测金融欺诈

简述 「使用逻辑回归暴力预测金融欺诈&#xff0c;并不断增加特征维度持续测试」的做法&#xff0c;体现了一种逐步建模与迭代验证的实验思路&#xff0c;在金融欺诈检测中非常有价值&#xff0c;本文作为一篇回顾性记录了早年间公司给某行做反欺诈预测用到的技术和思路。百度…...