数据增强 cutout改进imbalance

数据增强之Mosaic数据增强的优点、Mixup,Cutout,CutMix的区别 一、Mosaic data augmentation Mosaic数据增强方法是YOLOV4论文中提出来的,主要思想是将四张图片进行随机裁剪,再拼接到一张图上作为训练数据。 这样做有以下几个优点: 1、增加了数据的多样性,丰富了图片的背景。 2、增加了目标个数 3、四张图片拼接在一起变相地提高了batch_size,在进行BN操作时的时候可以更好的统计均值和方差 二、Mixup,Cutout,CutMix的区别 Mixup: 将随机的两张样本按比例混合,分类的结果按比例分配; Cutout: 随机的将样本 阅读详情

总结:

数据加载的时候会同时加载数据和数据增强方式。数据增强的时候会默认调用加载数据集时的getitem方法,去获取对应的数据和标签。

定义好普通的transformers

    transform = transforms.Compose([
        transforms.RandomCrop(32, padding=4),
        transforms.RandomHorizontalFlip(),
        transforms.ToTensor(),
        transforms.Normalize((0.4914, 0.4822, 0.4465), (0.2023, 0.1994, 0.2010)),
    ])

结合有Cutout的自定义Transformer

自定义的transformer可以接收两个参数:img,label。

传统的transformer只接受一个参数:img

class ConditionalTransform:
    def __init__(self, transform, num_per_cls_dict):
        self.transform = transform
        self.num_per_cls_dict = num_per_cls_dict
        self.n_holes_dict = {}

    def __call__(self, img, label):
        total_samples = sum(self.num_per_cls_dict.values())
        cls_num_list = list(self.num_per_cls_dict.values())
        per_cls_weights = 1.0 / np.array(cls_num_list)
        per_cls_weights = per_cls_weights / np.sum(per_cls_weights) * len(cls_num_list)
        per_cls_weights = torch.FloatTensor(per_cls_weights).to(torch.device('cpu'))  # 假设我们在 CPU 上运行

        # 计算 n_holes 的数量
        n_holes = 1 + int(per_cls_weights[label] * 3)  # 确保 n_holes 在 1 到 4 之间
        n_holes = min(4, max(1, n_holes))

        # 保存每个类别的 n_holes 数量
        self.n_holes_dict[label] = n_holes

        img = self.transform(img)
        cutout_transform = Cutout(n_holes=n_holes, length=16)
        return cutout_transform(img)

cutout

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, length):
        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

数据加载

标准的CIFAR10

部分代码:

class CIFAR10(VisionDataset):

    def __init__(
            self,
            root: str,
            train: bool = True,
            transform: Optional[Callable] = None,
            target_transform: Optional[Callable] = None,
            download: bool = False,
    ) -> None:

        super(CIFAR10, self).__init__(root, transform=transform,
                                      target_transform=target_transform)

        self.train = train  # training set or test set


        self.data: Any = []
        self.targets = []

        # now load the picked numpy arrays
        for file_name, checksum in downloaded_list:
            file_path = os.path.join(self.root, self.base_folder, file_name)
            with open(file_path, 'rb') as f:
                entry = pickle.load(f, encoding='latin1')
                self.data.append(entry['data'])
                if 'labels' in entry:
                    self.targets.extend(entry['labels'])
                else:
                    self.targets.extend(entry['fine_labels'])

        self.data = np.vstack(self.data).reshape(-1, 3, 32, 32)
        self.data = self.data.transpose((0, 2, 3, 1))  # convert to HWC

        self._load_meta()

    def __getitem__(self, index: int) -> Tuple[Any, Any]:
        """
        Args:
            index (int): Index

        Returns:
            tuple: (image, target) where target is index of the target class.
        """
        img, target = self.data[index], self.targets[index]

        # doing this so that it is consistent with all other datasets
        # to return a PIL Image
        img = Image.fromarray(img)

        if self.transform is not None:
            img = self.transform(img)

        if self.target_transform is not None:
            target = self.target_transform(target)

        return img, target

__getitem__通常是会被自动调用的?

以下是一些常见的情况:

1. 索引操作

当你使用索引操作(如 dataset[index])访问数据集对象时,__getitem__ 方法会被自动调用。例如:

dataset = CIFAR10(root='data', train=True, download=True)
image, label = dataset[0]  # 这里会自动调用 dataset.__getitem__(0)

在上面的代码中,当你尝试访问 dataset[0] 时,__getitem__ 方法会被调用,返回第一个图像和标签。

2. 与 DataLoader 一起使用

在深度学习中,__getitem__ 方法经常与 PyTorch 的 DataLoader 类一起使用。DataLoader 会在训练或测试过程中自动调用数据集的 __getitem__ 方法来获取数据。例如:

from torch.utils.data import DataLoader

dataset = CIFAR10(root='data', train=True, download=True)
dataloader = DataLoader(dataset, batch_size=32, shuffle=True)

for images, labels in dataloader:
    # 这里会自动调用 dataset.__getitem__(index) 来获取数据
    # 进行训练或测试的相关操作
    pass

在这个例子中,DataLoader 会在每次迭代时调用 __getitem__ 方法来获取数据集中的样本。

3. 自定义数据集

在创建自定义数据集时,你可以通过实现 __getitem__ 方法来定义如何访问和处理数据。例如:

from torch.utils.data import Dataset

class MyDataset(Dataset):
    def __init__(self, data, labels):
        self.data = data
        self.labels = labels
    
    def __len__(self):
        return len(self.data)
    
    def __getitem__(self, index):
        # 这里定义如何获取和处理数据
        return self.data[index], self.labels[index]

data = ...  # 数据
labels = ...  # 标签
dataset = MyDataset(data, labels)

在这个自定义数据集中,__getitem__ 方法定义了如何根据索引访问数据和标签。

总结

__getitem__ 方法是一种魔法方法(magic method),在特定场景下会被自动调用,尤其是当你使用索引操作访问对象或与某些库(如 PyTorch 的 DataLoader)一起使用时。通过实现 __getitem__ 方法,你可以自定义对象的索引行为,从而更方便地处理和访问数据。

自定义CIFAR10

class CustomCIFAR10(datasets.CIFAR10):
    cls_num = 10

    def __init__(self, root, imb_type='exp', imb_factor=0.01, train=True,
                 transform=None, target_transform=None,
                 download=False):
        super(CustomCIFAR10, self).__init__(root, train=train, transform=None, target_transform=target_transform, download=download)
        self.num_per_cls_dict = {}
        if imb_type is not None:
            img_num_list = self.get_img_num_per_cls(self.cls_num, imb_type, imb_factor)
            self.gen_imbalanced_data(img_num_list)

        # 初始化条件变换,传入类别分布
        if transform is None:
            transform = transforms.Compose([
                transforms.ToTensor()
            ])

        # 初始化条件变换,传入类别分布
        self.transform = ConditionalTransform(transform, self.num_per_cls_dict)

    def __getitem__(self, index):
        img, target = self.data[index], self.targets[index]
        img = Image.fromarray(img)

        if self.transform is not None:
            img = self.transform(img, target)

        if self.target_transform is not None:
            target = self.target_transform(target)

        return img, target

和官方的cifar10的区别在与,自定义的getitem方法里的transformer里多了一个参数target

官方的:

img = self.transform(img)

自制的:

img = self.transform(img, target)

如果不重写getitem方法,就会出现这样的报错:

  File "/opt/conda/envs/py38/lib/python3.8/site-packages/torchvision/datasets/cifar.py", line 120, in __getitem__
    img = self.transform(img)
TypeError: __call__() missing 1 required positional argument: 'label'

数据增强实测之cutout cutout是2017年提出的一种数据增强方法,想法比较简单,即在训练时随机裁剪掉图像的一部分,也可以看作是一种类似dropout的正则化方法。 Improved Regularization of Convolutional Neural Networks with Cutout paper:https://arxiv.org/pdf/1708.04552.pdf code:https://github.com/uoguelph-mlrg/Cutout cutout采用的操作是随机裁剪掉图像中.. 阅读详情

相关推荐

CutOut数据增强:空间遮挡正则化的核心技术

CutOut是一种提升模型遮挡鲁棒性的图像增强技术,通过随机屏蔽图像区域迫使模型关注全局特征。文章系统解析了CutOut的核心原理、目标检测改进方案(如GridMask变体)、参数优化策略及工程实现技巧。关键发现包括:30%-40%遮挡比例效果最佳;与Mosaic增强结合可提升21.8%遮挡场景性能;工业部署建议采用35%启用概率、1-2个遮挡区域。研究提出了自适应遮挡算法和边缘软化等优化方法,同时针对医疗等敏感领域给出风险控制方案。

浩瀚之水的专栏 312

数据增强方法--Cutout实现及结果分析

数据增强 Cutout Resnet

caiji00001的博客 3725

FDTD远场分析实战:从monitor数据到3D远场可视化的完整流程

本文详细介绍了FDTD远场分析的完整流程,从monitor采集的近场数据出发,通过近场-远场变换(NFFFT)生成3D远场可视化结果。文章重点解析了远场转换的物理原理、关键参数设置,并提供了构建稳健数据处理流水线及高级可视化(如3D辐射方向图)的实战脚本与技巧,适用于天线设计与光学器件分析。

weixin_29063035的博客 228

半监督语义分割笔记(1)-数据增强方法Mixup、Cutout、CutMix、ClassMix

本文为笔者在半监督语义分割方面的数据增强方法笔记,若有错误,欢迎批评指正。

weixin_54025883的博客 7917

【VisualStdio】手把手教你做一个上位机(1)控件设计布局

网上有很多形形色色的制作上位机教程,有些写的挺好的,但是过于单调。

m0_73409202的博客 5435

使用ONNX Runtime在Java Web应用中部署深度学习模型

当应用场景需要集成深度学习模型进行推理时,直接在Java Web应用中集成深度学习框架可能会面临性能、兼容性等问题。为了将深度学习模型无缝集成到Java Web应用中,是一项广受认可且实用的方法。本篇文档将介绍如何将模型转换为ONNX格式,并通过ONNX Runtime Server进行部署,并通过Java Web应用调用以进行回归或预测任务。本方案的主要目标是实现以下功能:将PyTorch模型转换为ONNX格式。部署ONNX Runtime Server,加载ONNX模型并提供推理服务。

shysea2019的博客 8857

【目标检测实战学习】数据增强的几种方法:cutout,mixup,mosaic,rotate,HSV,随机抖动实战

最近在学习数据增强方面的东西,简单做个记录首先需要强调的是,数据增强是目标检测流程中的一个过程,通常是在对数据集完成打标签之后,在划分数据集之前,为了增大数据集的数量,获取更多的特征,采用的一种方式。所以,在实战的过程中,不仅仅要对图像进行操作,还要对已经打好的标签(VOC数据集的xml文件)进行同样的对应操作下面开始正题首先需要准备好需要数据加强的原图(我使用的是jpeg格式)以及与原图一一对应的标签文件,命名必须一样如何使用labelimg制作VOC数据集可以看我之前的贴子。.........

debby233的博客 6512

芯片标称具备8kVESD能力却在8kV测试中失效?

芯片级ESD(HBM模型)与系统级ESD(IEC 61000-4-2)存在本质差异:

硬核科技 644

数据增强:对bboxes之外的背景进行CutOut

提供一个Python脚本:对目标检测原始的VOC格式的标注文件进行CutOut数据增强,且仅对背景Cut,保留完整的Bbox。

AI数据工厂 1602

开源项目-智能算法中台管理系统

智能算法中台管理系统,系统主要有样本中心,算法中心,模型中心等模块

u010479989的博客 2997

优秀的 Verilog/FPGA开源项目介绍(二十七)- 小型CPU

介绍在FPGA上实现一个CPU是一个令人兴奋的事情,但是太复杂的CPU实现起来太难,而且不适合去了解计算机的架构,所以今天介绍一些小型的CPU,比如8051、MIPS、MSP430等~关于RISC-V的项目,请查看《优秀的 Verilog/FPGA开源项目介绍(二)-RISC-V》ZipCPUhttp://zipcpu.com/about/zipcpu.html项目介绍Z...

OpenFPGA的博客 2574

cut out数据增强_数据增强:Mixup,Cutout,CutMix | Mosaic

1.几种数据增强的比较Mixup:将随机的两张样本按比例混合,分类的结果按比例分配;Cutout:随机的将样本中的部分区域cut掉,并且填充0像素值,分类的结果不变;CutMix:就是将一部分区域cut掉但不填充0像素而是随机填充训练集中的其他数据的区域像素值,分类结果按一定的比例分配区别上述三种数据增强的区别:cutout和cutmix就是填充区域像素值的区别;mixup和cutmix是混合两种...

weixin_36331429的博客 1996

springboot整合sharding-jdbc实现分库分表详解

springboot整合sharding-jdbc实现分库分表详解

congge 9090

Paddle 实现Cutout数据增强操作

Cutout 可以理解为 Dropout 的一种扩展操作,不同的是 Dropout 是对图像经过网络后生成的特征进行遮挡,而 Cutout 是直接对输入的图像进行遮挡,它在图像上生成一个大小为 cutout_size 的矩形区域,并将该区域内的像素值置零,相对于Dropout对噪声的鲁棒性更好。在实际使用中,可以根据需求调整 cutout_size 的大小。

weixin_43900395的博客 508

嵌入式RTOS实战:uC/OS-III最新版移植指南(附项目源码)

本文提供uC/OS-III实时操作系统的完整移植指南,涵盖源码配置、工程搭建到任务调度的全流程。针对移植中的常见编译错误,给出关键修改方案(如中断重定义、配置使能等),附已验证的工程源码,通过LED任务实验验证稳定性,帮助开发者高效完成移植。适合嵌入式工程师及RTOS学习者参考。

Bit_Dong的博客 2471

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

数据增强 - Cutout、Random Erasing、Mixup、Cutmix

文章目录0. 前言1. Cutout1.1. 要解决什么问题1.2. 用了什么方法1.3. 效果如何1.4. 还存在什么问题&可借鉴之处2. Rand Erasing2.1. 要解决什么问题2.2. 用了什么方法2.3. 效果如何2.4. 还存在什么问题&可借鉴之处3. Mixup3.1. 要解决什么问题3.2. 用了什么方法3.3. 效果如何3.4. 还存在什么问题&可借鉴之处4. Cutmix4.1. 要解决什么问题4.2. 用了什么方法4.3. 效果如何4.4. 还存在什么问题

清欢 1万+

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

PyTorch填坑攻略

RuntimeError: invalid argument 0: Sizes of tensors must match except in dimension 0 RuntimeError: invalid argument 0: Sizes of tensors must match except in dimension 0. Got 337 and 336 in dimension 3 ...

mingo_敏 2455

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

卷积神经网络(CNN)中的数据增强技术:原理、方法与PyTorch实现

从简单开始:先尝试基础增强方法领域适配:根据任务特点选择增强方法避免过度增强:确保变换后的图像仍然合理监控效果:验证增强确实提升了泛化能力结合其他技术:与正则化、迁移学习等配合使用通过本文介绍的方法,您应该能够为您的CNN项目设计出有效的数据增强策略。记住,没有"一刀切"的最佳方案,需要通过实验找到最适合您数据和任务的增强组合。

weixin_68114439的博客 505

数据增广-随机擦除Cutout

根据yolov4文献中提到的cutout数据增广方式,进行扩展阅读。Cutout & Random Erasing 1、Cutout 论文地址:https://arxiv.org/pdf/1708.04552.pdf 代码地址:https://github.com/Dingzixiang/cutout/blob/master/cutout.py 出发点: 文章的出发点除了解决遮挡问题外,还有从dropout上得到启发。众所周知...

alex1801 3080

【数据增强】Cutout

论文: Improved Regularization of Convolutional Neural Networks with Cutout. Github: https://github.com/uoguelph-mlrg/Cutout. Cutout的出发点和随机擦除一样,也是模拟遮挡,目的是提高泛化能力,实现上比Random Erasing简单,随机选择一个固定大小的正方形区域,然后采用全0填充就OK了,当然为了避免填充0值对训练的影响,应该要对数据进行中心归一化操作,norm到0。(如果你还不了

dekiang 1万+

计算机视觉基础 | 数据增强黑科技——CutMix

在深度学习的领域中,数据就如同模型的 “燃料”,优质且丰富的数据能够让模型学习到更广泛的特征,从而提升模型的性能和泛化能力。然而,在实际项目里,获取大量高质量的数据往往面临着诸多挑战,比如高昂的成本、时间的限制以及数据标注的复杂性等。这时,数据增强技术就如同一位神奇的 “魔法师”,能够在有限的数据基础上创造出更多样化的训练样本,成为了解决数据不足问题的关键手段。

紫雾凌寒 2376

FinalBurn Neo街机仿真引擎架构解密与开发实践

FinalBurn Neo(FBNeo)作为一款专注于复古街机游戏仿真的开源引擎,为技术开发者和模拟器爱好者提供了专业级的硬件仿真解决方案。该项目基于经典的FinalBurn和MAME代码库,专注于MC68000/Z80架构的街机系统仿真,在保持高度准确性的同时实现了卓越的性能表现。FBNeo不仅支持Capcom CPS系列、Neo Geo、Sega System 16等主流街机平台,还通过模块化

gitblog_00014的博客 866

yolov5启用数据增强、tensorboard可视化及cutout增强

yolov5启用数据增强与tensorboard可视化 一,yolov5启用数据增强 1.data目录下,有两个hyp的文件:data/hyp.scratch.yaml和data/hyp.finetune.yaml具体内容如下: # Hyperparameters for VOC fine-tuning # python train.py --batch 64 --cfg '' --weights yolov5m.pt --data voc.yaml --img 512 --epochs 50 # See

小俊俊的博客 1万+

Pytorch实现数据集的加载和数据增强

在这里介绍几种常用的的数据增强方法: 标准数据增强 以CIFAR10为例: 论文中如下是对数据集的标准增强操作。对于训练集,padding=4为上下左右均填充 4 个 pixel,由32×32的尺寸变为40×40,之后进行任意的裁剪;接着以0.5的概率进行水平翻转。将图像转化为tensor对象,并进行正态分布标准化。 对于测试集,不进行增强操作,仅仅对图像转化为tensor对象,并进行正态分布标准...

winycg的博客 2万+

数据增强之Mosaic (Mixup,Cutout,CutMix)

1、简介和比较 Mosaic数据增强方法是YOLOV4论文中提出来的,主要思想是将四张图片进行随机裁剪,再拼接到一张图上作为训练数据。这样做的好处是丰富了图片的背景,并且四张图片拼接在一起变相地提高了batch_size,在进行batch normalization的时候也会计算四张图片,所以对本身batch_size不是很依赖,单块GPU就可以训练YOLOV4。 https://github.com/Tianxiaomo/pytorch-YOLOv4​github.com/Tianxiaomo/pyt

taoqick的专栏 1万+

Cutout一种新的正则化方法

COUT Cutout[1]是一种新的正则化方法。原理是在训练时随机把图片的一部分减掉,这样能提高模型的鲁棒性。它的来源是计算机视觉任务中经常遇到的物体遮挡问题。通过cutout生成一些类似被遮挡的物体,不仅可以让模型在遇到遮挡问题时表现更好,还能让模型在做决定时更多地考虑环境(context)。 The implementation of cout 1.自己码 import torch impo...

如果想成为中心,那么就到中心去吧。 3199
上一篇: Linux 服务器 CUDA两版本
下一篇: eval的用法
pythonSuperman
博客等级 码龄6年 7763粉丝 499原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值