首页 > 其他分享 >昇思MindSpore进阶教程--自动数据增强

昇思MindSpore进阶教程--自动数据增强

时间:2024-10-10 19:22:40浏览次数:10  
标签:MindSpore 进阶 level -- dataset num transforms vision impl

大家好,我是刘明,明志科技创始人,华为昇思MindSpore布道师。
技术上主攻前端开发、鸿蒙开发和AI算法研究。
努力为大家带来持续的技术分享,如果你也喜欢我的文章,就点个关注吧

正文开始

MindSpore除了可以让用户自定义数据增强的使用,还提供了一种自动数据增强方式,可以基于特定策略自动对图像进行数据增强处理。

下面分为基于概率和基于回调参数两种不同的自动数据增强方式进行介绍。

基于概率的数据增强

MindSpore提供了一系列基于概率的自动数据增强API,用户可以对各种数据增强操作进行随机选择与组合,使数据增强更加灵活。

RandomApply操作

RandomApply操作接收一个数据增强操作列表,以一定的概率顺序执行列表中各数据增强操作,默认概率为0.5,否则都不执行。

在下面的代码示例中,通过调用RandomApply接口来以0.5的概率来顺序执行RandomCrop和RandomColorAdjust操作。

import mindspore.dataset.vision as vision
from mindspore.dataset.transforms import RandomApply

transforms_list = [vision.RandomCrop(512), vision.RandomColorAdjust()]
rand_apply = RandomApply(transforms_list)

RandomChoice

RandomChoice操作接收一个数据增强操作列表transforms,从中随机选择一个数据增强操作执行。

在下面的代码示例中,通过调用RandomChoice操作等概率地在CenterCrop和RandomCrop中选择一个操作执行。

import mindspore.dataset.vision as vision
from mindspore.dataset.transforms import RandomChoice

transforms_list = [vision.CenterCrop(512), vision.RandomCrop(512)]
rand_choice = RandomChoice(transforms_list)

RandomSelectSubpolicy

RandomSelectSubpolicy操作接收一个预置策略列表,包含一系列子策略组合,每一子策略由若干个顺序执行的数据增强操作及其执行概率组成。

对各图像先等概率随机选择一种子策略,再依照子策略中的概率顺序执行各个操作。

在下面的代码示例中,预置了两条子策略:

  • 子策略1中包含RandomRotation、RandomVerticalFlip两个操作,概率分别为0.5、1.0。

  • 子策略2中包含RandomRotation和RandomColorAdjust两个操作,概率分别为1.0和0.2。

import mindspore.dataset.vision as vision
from mindspore.dataset.vision import RandomSelectSubpolicy

policy_list = [
    # policy 1: (transforms, probability)
    [(vision.RandomRotation((45, 45)), 0.5),
     (vision.RandomVerticalFlip(), 1.0)],
    # policy 2: (transforms, probability)
    [(vision.RandomRotation((90, 90)), 1.0),
     (vision.RandomColorAdjust(), 0.2)]
]

policy = RandomSelectSubpolicy(policy_list)

基于回调参数的数据增强

MindSpore的sync_wait接口支持按训练数据的batch或epoch粒度,在训练过程中动态调整数据增强策略,用户可以设定阻塞条件来触发特定的数据增强操作。

sync_wait将阻塞整个数据处理pipeline,直到sync_update触发用户预先定义的callback函数,两者需配合使用,对应说明如下:

  • sync_wait(condition_name, num_batch=1, callback=None):为数据集添加一个阻塞条件condition_name,当sync_update调用时执行指定的callback函数。

  • sync_update(condition_name, num_batch=None, data=None):用于释放对应condition_name的阻塞,并对data触发指定的callback函数。

下面将演示基于回调参数的自动数据增强的用法。

  1. 用户预先定义Augment类,其中preprocess为自定义的数据增强函数,update为更新数据增强策略的回调函数。
import numpy as np

class Augment:
    def __init__(self):
        self.ep_num = 0
        self.step_num = 0

    def preprocess(self, input_):
        return np.array((input_ + self.step_num ** self.ep_num - 1),)

    def update(self, data):
        self.ep_num = data['ep_num']
        self.step_num = data['step_num']

  1. 数据处理pipeline先回调自定义的增强策略更新函数update,然后在map操作中按更新后的策略来执行preprocess中定义的数据增强操作。
import mindspore.dataset as ds

arr = list(range(1, 4))
dataset = ds.NumpySlicesDataset(arr, shuffle=False)

aug = Augment()
dataset = dataset.sync_wait(condition_name="policy", callback=aug.update)
dataset = dataset.map(operations=[aug.preprocess])

  1. 在每个step中调用sync_update进行数据增强策略的更新。
epochs = 5
itr = dataset.create_tuple_iterator(num_epochs=epochs)

step_num = 0
for ep_num in range(epochs):
    for data in itr:
        print("epcoh: {}, step:{}, data :{}".format(ep_num, step_num, data))
        step_num += 1
        dataset.sync_update(condition_name="policy",
                            data={'ep_num': ep_num, 'step_num': step_num})

ImageNet自动数据增强

针对ImageNet数据集的数据增强策略包含25条子策略,每条子策略中包含两种变换,针对一个batch中的每张图像随机挑选一个子策略的组合,以预定的概率来决定是否执行子策略中的每种变换。

用户可以使用MindSpore中mindspore.dataset.vision模块的RandomSelectSubpolicy接口来实现AutoAugment,在ImageNet分类训练中标准的数据增强方式分以下几个步骤:

  • RandomCropDecodeResize:随机裁剪后进行解码。

  • RandomHorizontalFlip:水平方向上随机翻转。

  • Normalize:归一化。

  • HWC2CHW:图片通道变化。

  1. 定义MindSpore操作到AutoAugment操作的映射:
import mindspore.dataset.vision as vision
import mindspore.dataset.transforms as transforms

# define Auto Augmentation operations
PARAMETER_MAX = 10

def float_parameter(level, maxval):
    return float(level) * maxval /  PARAMETER_MAX

def int_parameter(level, maxval):
    return int(level * maxval / PARAMETER_MAX)

def shear_x(level):
    transforms_list = []
    v = float_parameter(level, 0.3)

    transforms_list.append(vision.RandomAffine(degrees=0, shear=(-v, -v)))
    transforms_list.append(vision.RandomAffine(degrees=0, shear=(v, v)))
    return transforms.RandomChoice(transforms_list)

def shear_y(level):
    transforms_list = []
    v = float_parameter(level, 0.3)

    transforms_list.append(vision.RandomAffine(degrees=0, shear=(0, 0, -v, -v)))
    transforms_list.append(vision.RandomAffine(degrees=0, shear=(0, 0, v, v)))
    return transforms.RandomChoice(transforms_list)

def translate_x(level):
    transforms_list = []
    v = float_parameter(level, 150 / 331)

    transforms_list.append(vision.RandomAffine(degrees=0, translate=(-v, -v)))
    transforms_list.append(vision.RandomAffine(degrees=0, translate=(v, v)))
    return transforms.RandomChoice(transforms_list)

def translate_y(level):
    transforms_list = []
    v = float_parameter(level, 150 / 331)

    transforms_list.append(vision.RandomAffine(degrees=0, translate=(0, 0, -v, -v)))
    transforms_list.append(vision.RandomAffine(degrees=0, translate=(0, 0, v, v)))
    return transforms.RandomChoice(transforms_list)

def color_impl(level):
    v = float_parameter(level, 1.8) + 0.1
    return vision.RandomColor(degrees=(v, v))

def rotate_impl(level):
    transforms_list = []
    v = int_parameter(level, 30)

    transforms_list.append(vision.RandomRotation(degrees=(-v, -v)))
    transforms_list.append(vision.RandomRotation(degrees=(v, v)))
    return transforms.RandomChoice(transforms_list)

def solarize_impl(level):
    level = int_parameter(level, 256)
    v = 256 - level
    return vision.RandomSolarize(threshold=(0, v))

def posterize_impl(level):
    level = int_parameter(level, 4)
    v = 4 - level
    return vision.RandomPosterize(bits=(v, v))

def contrast_impl(level):
    v = float_parameter(level, 1.8) + 0.1
    return vision.RandomColorAdjust(contrast=(v, v))

def autocontrast_impl(level):
    return vision.AutoContrast()

def sharpness_impl(level):
    v = float_parameter(level, 1.8) + 0.1
    return vision.RandomSharpness(degrees=(v, v))

def brightness_impl(level):
    v = float_parameter(level, 1.8) + 0.1
    return vision.RandomColorAdjust(brightness=(v, v))

  1. 定义ImageNet数据集的AutoAugment策略:
# define the Auto Augmentation policy
imagenet_policy = [
    [(posterize_impl(8), 0.4), (rotate_impl(9), 0.6)],
    [(solarize_impl(5), 0.6), (autocontrast_impl(5), 0.6)],
    [(vision.Equalize(), 0.8), (vision.Equalize(), 0.6)],
    [(posterize_impl(7), 0.6), (posterize_impl(6), 0.6)],

    [(vision.Equalize(), 0.4), (solarize_impl(4), 0.2)],
    [(vision.Equalize(), 0.4), (rotate_impl(8), 0.8)],
    [(solarize_impl(3), 0.6), (vision.Equalize(), 0.6)],
    [(posterize_impl(5), 0.8), (vision.Equalize(), 1.0)],
    [(rotate_impl(3), 0.2), (solarize_impl(8), 0.6)],
    [(vision.Equalize(), 0.6), (posterize_impl(6), 0.4)],

    [(rotate_impl(8), 0.8), (color_impl(0), 0.4)],
    [(rotate_impl(9), 0.4), (vision.Equalize(), 0.6)],
    [(vision.Equalize(), 0.0), (vision.Equalize(), 0.8)],
    [(vision.Invert(), 0.6), (vision.Equalize(), 1.0)],
    [(color_impl(4), 0.6), (contrast_impl(8), 1.0)],

    [(rotate_impl(8), 0.8), (color_impl(2), 1.0)],
    [(color_impl(8), 0.8), (solarize_impl(7), 0.8)],
    [(sharpness_impl(7), 0.4), (vision.Invert(), 0.6)],
    [(shear_x(5), 0.6), (vision.Equalize(), 1.0)],
    [(color_impl(0), 0.4), (vision.Equalize(), 0.6)],

    [(vision.Equalize(), 0.4), (solarize_impl(4), 0.2)],
    [(solarize_impl(5), 0.6), (autocontrast_impl(5), 0.6)],
    [(vision.Invert(), 0.6), (vision.Equalize(), 1.0)],
    [(color_impl(4), 0.6), (contrast_impl(8), 1.0)],
    [(vision.Equalize(), 0.8), (vision.Equalize(), 0.6)],
]

  1. 在RandomCropDecodeResize操作后插入AutoAugment变换。
import mindspore.dataset as ds
import mindspore as ms


def create_dataset(dataset_path, train, repeat_num=1,
                   batch_size=32, shuffle=False, num_samples=5):
    # create a train or eval imagenet2012 dataset for ResNet-50
    dataset = ds.ImageFolderDataset(dataset_path, num_parallel_workers=8,
                                    shuffle=shuffle, decode=True)

    image_size = 224

    # define map operations
    if train:
        trans = RandomSelectSubpolicy(imagenet_policy)
    else:
        trans = [vision.Resize(256),
                 vision.CenterCrop(image_size)]
    type_cast_op = transforms.TypeCast(ms.int32)

    # map images and labes
    dataset = dataset.map(operations=[vision.Resize(256), vision.CenterCrop(image_size)], input_columns="image")
    dataset = dataset.map(operations=trans, input_columns="image")
    dataset = dataset.map(operations=type_cast_op, input_columns="label")

    # apply the batch and repeat operation
    dataset = dataset.batch(batch_size, drop_remainder=True)
    dataset = dataset.repeat(repeat_num)

    return dataset

  1. 验证自动数据增强效果:
import matplotlib.pyplot as plt
from download import download

# Define the path to image folder directory.
url = "https://mindspore-website.obs.cn-north-4.myhuaweicloud.com/notebook/datasets/ImageNetSimilar.tar.gz"
download(url, "./", kind="tar.gz", replace=True)
dataset = create_dataset(dataset_path="ImageNetSimilar",
                         train=True,
                         batch_size=5,
                         shuffle=False)

epochs = 5
columns = 5
rows = 5
fig = plt.figure(figsize=(8, 8))
itr = dataset.create_dict_iterator(num_epochs=epochs)

for ep_num in range(epochs):
    step_num = 0
    for data in itr:
        for index in range(rows):
            fig.add_subplot(rows, columns, step_num * rows + index + 1)
            plt.imshow(data['image'].asnumpy()[index])
        step_num += 1
plt.show()

在这里插入图片描述
运行结果可以看到,batch中每张图像的增强效果,垂直方向表示1个batch的5张图像,水平方向表示5个batch。

标签:MindSpore,进阶,level,--,dataset,num,transforms,vision,impl
From: https://blog.csdn.net/weixin_42553583/article/details/142736363

相关文章

  • 玩玩虚拟化-KVM
    1、讲在前面(玩这个的心历路程)最近一段时间想玩一些集群之类的东西,学习搞一下K8s,集群啥的,但是我没有多台服务器,如果购买云服务器成本太高,后来想到了买台台式机弄点虚拟机来玩,于是我就在某鱼上淘了台二手台式机(24核+32G+512G+4G显卡),价格1280。后来想到要装虚拟机,我就想到了现在经......
  • STM32中实现下降沿捕获(HAL库)
    配置步骤:1、配置时基工作参数HAL_TIM_IC_Init();主要配置其中的instanceinitautorelaodpreloadcountermodeperiodprescaler2、msp初始化HAL_TIM_IC_MspInit(TIM_HandleTypeDef*htim) __HAL_RCC_TIM2_CLK_ENABLE(); __HAL_RCC_GPIOA_CLK_ENABLE();  HAL_NV......
  • STM32f103c8t6中PWM的配置
    1、PWM简介    PWM波形(PulseWidthModulation,脉冲宽度调制波形)是一种占空比可变的脉冲波形。这种调制方式通过改变脉冲的宽度来控制电路中的信号强度和频率。具体来说,PWM波形中的高电平持续时间和低电平持续时间可以根据需要进行调整,从而实现对模拟信号电平的数字......
  • Open X-Embodiment: Robotic Learning Datasets and RT-X Models
    OpenX-Embodiment:RoboticLearningDatasetsandRT-XModels启发:在不同数据集上训练大规模、高容量模型以处理下游应用方面取得显著成功。是否能将所有数据整合在高容量机器人操作模型上使其有效适应新的机器人、任务、环境?贡献:提供了标准化数据格式和模型的数据集,收......
  • 概率论基础1
    事件概率1.事件事件是指在某个试验或观察中可能发生的结果或结果的集合。是样本空间的一个子集,可以包含一个或多个样本点,也可以是整个样本空间。事件用大写字母,如A,B,C等表示。例子事件A={1,2,3}1.1概念1.1基本事件基本事件是指试验中不可再分的最简单的事件。每个基......
  • #数学基础-概率论day1-1 事件与概率
    1.事件事件是指在某个试验或观察中可能发生的结果或结果的集合。用大写字母,如A,B,C等表示。1.1概念1.1.1基本事件基本事件是指试验中不可再分的最简单的事件。每个基本事件代表一个单一的可能结果。抛一枚硬币:基本事件是“正面”和“反面”。1.1.2复合事件复合事件是......
  • JAVA面试八股文(三)
    MybatisMybatis的一级、二级缓存? 一级缓存存储的作用域是session,当sessionflush或者close之后,session中的缓存会失效,此时一级缓存就开启 二级缓存和一级缓存机制相同,hashmap存储,作用域为mapper,二级缓存一般不用,因为他不好控制缓存的刷新,我们一般是用的是redisMyBatis的......
  • 2024CSP-J模拟赛————S12678
    禁止抄袭!!!一,赛中得分硬币(coin)100数位(digit)100划分(partition)0路径(path)0总分200二,赛中概括第一第二题30分钟做完,三四题不会。三,题目解析硬币(coin)1.1问题描述小明很喜欢 100这个数字,父母给他一些零花钱,这些零花钱的面值是 a 和 b,即小明......
  • Cortex-M3/M4/M7 芯片 Fault 分析原理与实战
    目录一、简介1、异常类型2、异常优先级3、同步异步问题4、异常具体类型二、Faultexceptionregisters1、Controlregisters1.1CCR1.2SHP1.3SHCSR2、Statusandaddressregisters2.1HardFaultStatusRegister——HSFR2.2ConfigurableFaultStatusRegister——......
  • sqlmap
    一、介绍1.简介SQLMAP是一种开源渗透测试工具,可自动执行SQL注入缺陷的检测和注入过程,并接管数据库服务器。它有强大的检测引擎,针对不同类型的数据库提供多样的渗透测试功能选项,实现数据库识别、数据获取、访问DBMS\操作系统甚至通过带外数据连接的方式执行操作系统的命令。......