图像增广 讨论区


#42

碰到同样问题 请问下您有没有解决?


#43

请教一下数据读入时,数据增强选项的问题:


加入数据增强选项报错,aug_list是按照doc里面的格式来的。
仿照这个例子

但不加数据增强选项就不会报错:


请问些aug_list 需要有特殊的注意吗?
@szha


#44

数据增强耗时的一种解决办法

数据增强选项会使得程序在每一次训练前都对数据做一次变化,这些变化感觉上是在进行重复的工作,所以就想直接写一个函数将训练数据做增强,然后再录成rec的形式,这样(增强后的)数据读入一次,就可以无需每次进行各种变换操作了。(增强后的数据)数据载入时不加增强选项速度有很明显的提升。

####################################3
#应用增广的函数
#need package
#from mxnet.gluon import data as gdata
#from mxnet import image
def apply(img, augs, path, name, num_aug=10):
    for aug in augs:
        Y = [aug(img) for _ in range(num_aug)]
        for i in range(len(Y)):
            augged = Y[i].asnumpy()
            #plt.imshow(augged)
            id_name = name.split('.')[0]
            new_name = path+'aug/'+id_name+'0'+str(i)+'.jpg'
            cv2.imwrite(new_name,augged)
#增强参数表list
augs = [gdata.vision.transforms.RandomFlipLeftRight(),
       gdata.vision.transforms.RandomResizedCrop(
    (200, 200), scale=(0.1, 1), ratio=(0.8, 1.25)),
       gdata.vision.transforms.RandomBrightness(0.1),
       gdata.vision.transforms.RandomHue(0.5),
       gdata.vision.transforms.RandomColorJitter(
    brightness=0.1, contrast=0.5, saturation=0.5, hue=0.5)
      ]

#应用图像数据增强函数
#path 为图像所处文件夹,需要建立一个aug/的文件夹保存增强文件
#增强后的数据直接存在硬盘aug/文件下,随后复制对应标签转为rec即可
def imgDataAug(path):
    os.mkdir(path+'aug/')
    names = os.listdir(path)
    for name in names:
        if name.endswith('.jpg'):
            aug_img = image.imread(path+name)
            apply(aug_img, augs,path,name)
################################################

读入数据时候就无需加入增强选项,可以提高每次一训练的速度。

train_iter = mx.image.ImageDetIter(
        path_imgrec = 'train_aug.rec',
        path_imgidx= 'train_aug.idx',
        batch_size=batch_size,
        data_shape=(3, edge_size, edge_size), 
        shuffle=True) #不使用数据增强选项
        #rand_crop=1,  
        #min_object_covered=0.95, 
        #max_attempts=200)

#45

这些变化感觉上是在进行重复的工作

并不是重复的工作。现有的数据增强是带有随机性的,比如是否随机镜像翻转,随机crop的时候选择哪块区域,加多强的噪声等,每次增强的结果可能都不一样,这样模型相当于看到了很多份不同的图像。

做一次增强之后便不再变化,则和不做增强是等价的,即模型在整个训练过程中只能看到一份相同的不断重复的数据。


#46

谢谢您的解答,原来没有理解到位:

RandomFlipLeftRight
RandomResizedCrop
RandomBrightness
RandomHue
RandomColorJitter

这几个函数都是随机操作,每一次都对应不同的变换。


#47

想问一下,mx.io.ImageRecordIter里的增强方法可以增加图片的数量吗?我的数据集只有几百张图,我应该如何增加它的数量呢?


#50

是每个epoch都会做一次图像变化吗?


#51

不知道你有没有接触过Mxnet SSD的代码, 我怎么感觉SSD中对数据的增广不是这么做的?


#52

通读9.1节,现在的数据增强方式只有旋转,增加颜色亮度等那几种,翻了下楼上所说的(也是我困惑的),通过transforms的方式来进行数据增强是在一个batch里以0.5的概率随机将原来数据给替换了,这是真的么?另外假如我想假如随机噪点,或者模糊等增强方式,那么我需要怎么做?在自己构造dataset时自己进行增强还是说只能离线增强呢?有大神可以释惑么?