目标检测常见数据增强算法汇总讲解(Mixup,Cutout,CutMix,Mosaic)

news2024/11/15 13:53:57

       在学习目标检测算法的过程中,发现了一些有趣的目标检测算法,打算简单写个笔记,不足之处还望谅解,可以在评论中指出来。

        目标检测作为需要大量数据的算法,在实际情况中经常面临数据不足的情况,事实上很多时候数据确实对于开发者来说非常难搞,因此大佬们开发了各式各样的通过软件的方式将我们的数据变的多样化的方法。(Mixup,Cutout,CutMix,Mosaic)就是四种最为经典的算法,下面我们逐一进行讲解。

Mixup数据增强算法:

         随机混合图像:将两个图像按一定比例混合生成新的图像,(与其他数据增强方式不同的是这里还会生成新标签),然后使用新的图像和标签参与训练,整个过程中原始图像不参与训练。 

  图1

图2

   

混合后的图像

 图像混合的数学方法(mixup数学公式)如下:

(xᵢ , yᵢ),(xⱼ , yⱼ)是随机选择的两个样本及对应标签。其中,图像xᵢ(标签为yᵢ)和图像xⱼ(标签为yⱼ),λ为从beta分布中随机采样的数。

个人感觉他这个算法思想还是很easy的就是根据从beta中采样的随机数,然后根据随机数的比例对图像进行混合,同时标签也是按照相应的比例混合,从何得到混合后的新图像和新标签。

mixup源代码:

import matplotlib.pyplot as plt
import matplotlib.image as Image
import cv2
im1 = Image.imread("cat1.jpg") #输入图片1的路径
im1 = im1/255.
im2 = Image.imread("cat2.jpg") #输入图片2的路径
im2 = im2/255.

lam= 4*0.1  #融合比例
im_mixup = (im1*lam+im2*(1-lam))
cv2.imwrite('mixup.jpg', im_mixup) #把融合之后的图片保存到当前文件夹
plt.imshow(im_mixup)
plt.show()

Cutout数据增强算法: 

       随机裁剪图像的一块区域,并在图像中对裁剪后的区域进行补0,与mixup不同的是,它不改变label。如下图所示,很简单和容易理解的方法,这个有点类似神经网络的dropout,我们随时扔掉一些神经元,可缓解神经网络的过拟合达到更好的效果。

        

Cutout源代码: 

import cv2
from torchvision import transforms
import matplotlib.pyplot as plt
import numpy as np
import torch
class Cutout(object):
    """Randomly mask out one or more patches from an image.
    Args:
        n_holes (int): Number of patches to cut out of each image.
        length (int): The length (in pixels) of each square patch.
    """

    def __init__(self, n_holes=1, length=16):
        self.n_holes = n_holes
        self.length = length

    def __call__(self, img):
        """
        Args:
            img (Tensor): Tensor image of size (C, H, W).
        Returns:
            Tensor: Image with n_holes of dimension length x length cut out of it.
        """
        h = img.size(1)
        w = img.size(2)

        mask = np.ones((h, w), np.float32)

        for n in range(self.n_holes):
            y = np.random.randint(h)
            x = np.random.randint(w)

            y1 = np.clip(y - self.length // 2, 0, h)
            y2 = np.clip(y + self.length // 2, 0, h)
            x1 = np.clip(x - self.length // 2, 0, w)
            x2 = np.clip(x + self.length // 2, 0, w)

            mask[y1: y2, x1: x2] = 0.

        mask = torch.from_numpy(mask)
        mask = mask.expand_as(img)
        img = img * mask

        return img
# 执行cutout
img = cv2.imread('cat.1.jpg')#图片路径
img = transforms.ToTensor()(img)

cut = Cutout(length=100)
img = cut(img)

# cutout图像写入本地
img = img.mul(255).byte()
img = img.numpy().transpose((1, 2, 0))
cv2.imwrite('cutout.jpg', img)  #把随机裁剪之后的图片保存到当前文件夹
plt.imshow(img)
plt.show()

        

CutMix数据增强算法: 

      CutMix算法其实也可以顾名思义理解,Cutout和Mixup的结合体,思想很简单,我们首先使用Cutout对图像随机选择一块儿区域进行裁剪,然后使用Mixup图像跟裁剪后的图像进行混合。

数学上实现方法如下:

Cutmix代码:

代码懒得自己写了,参考这位

数据增强---CutMix - hikari_1994 - 博客园大佬的修改了一下。可以自动将输入的图片resize成同样大小的,这样可以随意输入两个不同大小的图片,和效果图可以自动保存到本地。

import matplotlib.pyplot as plt
import numpy as np

plt.rcParams['figure.figsize'] = [10, 10]

import cv2


def rand_bbox(size, lamb):
    """
    生成随机的bounding box
    :param size:
    :param lamb:
    :return:
    """
    W = size[0]
    H = size[1]

    # 得到一个bbox和原图的比例
    cut_ratio = np.sqrt(1.0 - lamb)
    cut_w = int(W * cut_ratio)
    cut_h = int(H * cut_ratio)

    # 得到bbox的中心点
    cx = np.random.randint(W)
    cy = np.random.randint(H)

    bbx1 = np.clip(cx - cut_w // 2, 0, W)
    bby1 = np.clip(cy - cut_h // 2, 0, H)
    bbx2 = np.clip(cx + cut_w // 2, 0, W)
    bby2 = np.clip(cy + cut_h // 2, 0, H)#随机生成遮挡框



    return bbx1, bby1, bbx2, bby2


def cutmix(image_batch, image_batch_labels, alpha=1.0):
    # 决定bbox的大小,服从beta分布
    lam = np.random.beta(alpha, alpha)

    #  permutation: 如果输入x是一个整数,那么输出相当于打乱的range(x)
    rand_index = np.random.permutation(len(image_batch))

    # 对应公式中的y_a,y_b
    target_a = image_batch_labels
    target_b = image_batch_labels[rand_index]

    # 根据图像大小随机生成bbox
    bbx1, bby1, bbx2, bby2 = rand_bbox(image_batch[0].shape, lam)

    image_batch_updated = image_batch.copy()

    # image_batch的维度分别是 batch x 宽 x 高 x 通道
    # 将所有图的bbox对应位置, 替换为其他任意一张图像
    # 第一个参数rand_index是一个list,可以根据这个list里索引去获得image_batch的图像,也就是将图片乱序的对应起来
    image_batch_updated[:, bbx1: bbx2, bby1:bby2, :] = image_batch[rand_index, bbx1:bbx2, bby1:bby2, :]

    # 计算 1 - bbox占整张图像面积的比例
    lam = 1 - ((bbx2 - bbx1) * (bby2 - bby1)) / (image_batch.shape[1] * image_batch.shape[2])
    # 根据公式计算label
    label = target_a * lam + target_b * (1. - lam)

    return image_batch_updated, label


if __name__ == '__main__':
    cat = cv2.cvtColor(cv2.imread("cat.1.jpg"), cv2.COLOR_BGR2RGB)
    dog = cv2.cvtColor(cv2.imread("cat.2.jpg"), cv2.COLOR_BGR2RGB)
    data = [cat , dog]
    a = 0

    H, W = cat.shape[0], cat.shape[1]
    width = 400  # 需要缩放成多大,这里直接修改就行,我这里是缩放成400*400,根据自己的需要修改成响应的数值即可
    height = 400  #博主源代码只能输入大小相同两张图片进行cutmix,我这里可以自动将两张图片调整成相同大小,避免了还需要手动调节图片大小输入的尴尬
    cat= cv2.resize(cat, (width, height), interpolation=cv2.INTER_AREA)

    H, W = dog.shape[0], dog.shape[1]
    width = 400  # 需要缩放成多大,这里直接修改就行,我这里是缩放成400*400,根据自己的需要修改成响应的数值即可
    height = 400
    dog= cv2.resize(dog, (width, height), interpolation=cv2.INTER_AREA)



    updated_img, label = cutmix(np.array([cat, dog]), np.array([[0, 1], [1, 0]]), 0.5)
    print(label)#输出融合后的标签

    fig, axs = plt.subplots(nrows=1, ncols=2, squeeze=False)
    ax1 = axs[0, 0]
    ax2 = axs[0, 1]
    ax1.imshow(updated_img[0])
    cv2.imwrite('cutmix_1.jpg', updated_img[0])
    ax2.imshow(updated_img[1])
    cv2.imwrite('cutmix_2.jpg', updated_img[1])
    plt.show()

Mosaic数据增强算法: 

更像是Cutmix的改进,四张图片拼接到一起,这样使得在训练的时候可以一次性训练四张图,

据说是在BN层计算的时候效果更好,到底好不好咱也不知道,作者说好就是好把。不过极大的丰富了目标背景这个倒是真的,毕竟一个目标有了四个背景不是?

 我这效果图不好可能是因为选的图片尺寸有点问题,懒得调了,知道啥意思就行。

一句话看懂思路的就是这位大佬的

目标检测: 一文读懂 Mosaic 数据增强_大林兄的博客-CSDN博客_mosaic数据增强

的这部分

 好的,我想这里已经表达的很清楚了。当然细节的地方得注意一下,图像拼接的时候,是需要分别对图片进行增光操作的。

        1、翻转(对原始图片进行左右的翻转);

        2、缩放(对原始图片进行大小的缩放);

        3、色域变化(对原始图片的明亮度、饱和度、色调进行改变)等操作。这也是为了丰富一下数据多样性

并且按照四个方向位置摆好

代码看B导的:睿智的目标检测28——YoloV4当中的Mosaic数据增强方法_Bubbliiiing的博客-CSDN博客_睿智yolov4

b导已经写的很好了,我就不写了

好的 目标检测数据增强篇就到这里了,兄弟们觉得有用的麻烦点个赞!感谢!

          

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

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

相关文章

JavaScript同步与异步

JavaScript采用单线程模式工作的原因:JavaScript设计之初是为了能够运行在浏览器实现页面交互,而实现页面交互的核心是操作DOM,这种模式就决定了它使用单线程模式,否则就需要解决复杂的多线程同步的问题。 这种模式的优点就是更安…

Vue3中 子组件内v-model绑定props接收到参数时报错update:modelValue

开发过程中二次封装了一个搜索的组件,子组件内使用了el-select和el-input 参数分别对应父组件传入的selectValue和selectText参数 子组件内部change和input事件来同步触发组件中数据的修改 最终本地开发环境一切正常,部署到测试环境和生产环境后出现下…

[附源码]JAVA毕业设计仁爱公益网站(系统+LW)

[附源码]JAVA毕业设计仁爱公益网站(系统LW) 项目运行 环境项配置: Jdk1.8 Tomcat8.5 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。 项目技术&…

判断一份好的问卷有哪些标准?

问卷的主要由三个部分组成:问卷说明、问卷主题、问卷结束。而这三个部分又包含了很多因素,比如问卷主题、问卷标题、问卷题目、问卷调查对象等。制作问卷不仅仅是简单的问题罗列,然后进行发放。不同质量的调查问卷会反馈出不一样的效果&#…

Spring Cloud微服务之eureka+client入门

Spring Cloud微服务之eurekaclient入门 谈到服务,想到一种“懒人思维”。家政服务为懒人收拾家务提供一种便利,快餐服务为不爱做饭的懒人提供一种方便.....等等。 说到微服务,顾名思义,就是把服务再细微化。比如需要送女友一束花…

FastReport Desktop 2023Microsoft SQL存储过程的支持

FastReport Desktop 2023Microsoft SQL存储过程的支持 添加了用于从JasperReports转换报告的模板。 添加了对连接到Microsoft SQL存储过程的支持。 在RTF中,添加了一项设置,以提高打印时的图像质量。 添加了导出到Microsoft Excel 2007时从“货币”转换为…

Landsat数据下载

Landsat数据下载步骤0 Landsat数据介绍1 下载地址2 下载步骤2.1 检索数据2.1.1 设置地点,有多种方法2.1.2 选择时间范围2.1.3 在Data Sets界面选择传感器(卫星或者传感器的名称)2.2 限定云量2.3 下载数据这是个老生常谈的话题了,我…

[附源码]Python计算机毕业设计Django校园快递柜存取件系统

项目运行 环境配置: Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术: django python Vue 等等组成,B/S模式 pychram管理等等。 环境需要 1.运行环境:最好是python3.7.7,…

ubuntu上msquic带根证书的测试使用

ubuntu上msquic带根证书的测试使用 1.证书1.1 根证书的生成1.2 根证书的导入1.4 openssl验证书1.5 修改/etc/hosts2. msquic编译2.1 quic协议编译2.2 示例程序编3.本地测试1.证书 1.1 根证书的生成 假设我们的域名为: www.contoso.com 创建CA私钥 openssl ecparam -out cont…

java Object类 包装类

目录 Object 类的使用 操作符与equals方法  : equals() 重写equals()方法的原则 面试题 toString() 方法 包装类(Wrapper)的使用 基本类型、包装类与String类间的转换 包装类用法举例 总结 Object 类的使用  Object类是所有Java类的根父类  如果…

最新出炉的U-Net研究性综述:Medical Image Segmentation Review: The Success of U-Net

热乎的Medical Segmentation 综述1 文章介绍2 前言3 U-Net变型4 Skip Connection Enhancements4.1 Increasing the Number of Skip Connections4.2 Processing Feature Maps within the Skip Connections4.3 Combination of Encoder and Decoder Feature Maps5 Backbone Design…

每天一个面试题:四种引用,弱引用防止内存泄漏(12.7.2022)

每天一个面试题:四种引用四种引用基本介绍实例Demo- 虚引用弱引用防止内存泄漏弱引用Debug分析源码开始全新的学习,沉淀才会有产出,一步一脚印! 面试题系列搞起来,这个专栏并非单纯的八股文,我会在技术底层…

配对交易之统计套利配对:协整(cointegration)

Engle和Granger观察到了一个相当有趣的现象。尽管两个时间序列是非平稳的,但在某些情况下,两者的特定线性组合实际上是平稳的;也就是说,这两个序列在某种程度上是步调一致的。Engle和Granger创造了“协整”(cointegrat…

【Tensorflow+自然语言处理+LSTM】搭建智能聊天客服机器人实战(附源码、数据集和演示 超详细)

需要源码和数据集请点赞关注收藏后评论区留言私信~~~ 一、自然语言处理与智能 自然语言处理技术是智能客服应用的基础,在自然语言处理过程中,首先需要进行分词处理,这个过程通常基于统计学理论,分词的精细化可以提升智能客服的语…

小白课程,前端入门新手,必须了解的回调函数概念和应用实例

******内容预警******新手内容,大佬请绕道 做为一个纯纯的小白,我相信很多人是没有回掉函数这个概念的,虽然很多文档和教程中都有提到,但是很多人看完文档也不会用。因为菜鸟的开发任务,都是简单画一下html页面&#x…

分布式定时调度:xxl-job 最佳实践详解

文章目录一、定时任务概述1.1. 什么是定时任务1.2. 常见定时任务方案1.3. 分布式定时任务面临的问题1.4. 分布式定时任务xxl-job二、xxl-job架构设计2.1. 设计思想2.2. 架构设计图三、xxl-job安装3.1.下载源码3.2. 导入数据库3.3. 启动调度中心3.4. 配置部署“执行器项目3.5. 案…

护眼灯有用吗?双十二买什么样的护眼灯真的有效果

对于很多人来说,健康是一个越来越重视的话题,特别是现代社会生活节奏很快,很多人的眼睛都吃不消,所以不管是为了好看,还是为了能够看得足够远,都会注意保护眼睛,所以越来越多的人开始考虑护眼台…

网站变灰,6行代码,通通变灰

人狠话不多,直接上代码 -webkit-filter: grayscale(100%); -moz-filter: grayscale(100%); -ms-filter: grayscale(100%); -o-filter: grayscale(100%); filter: grayscale(100%); filter: progid:DXImageTransform.Microsoft.BasicImage(grayscale1); 通通变灰&…

Java中Map集合体系的基本使用和常用API

文章目录Map集合体系Map集合概述和使用Map集合体系的特点Map集合常用的APIMap集合体系 Map集合概述和使用 Map集合是一种双列集合,每个元素包含两个数据。 Map集合的每个元素的格式:keyvalue(键值对元素)。 Map集合也被称为“键值对集合”。 Map集合整体…

本地代码上传到gitlab

1、在本地代码目录中,鼠标右键Git Bash Here,会打开一个git命令操作窗口; 2、执行git init命令,此命令会在当前目录下创建一个.git文件夹, git init 3、将项目的所有文件添加到仓库中, git add -A 4、将add的文件…