• pytorch数据增强


    数据增强

    数据增强是在数据量比较少的情况下,通过对原有的数据进行灰度、裁切、旋转、镜像、明度、色调、饱和度变化的一系列过程,用来增加数据量。

    1. import os
    2. from PIL import Image
    3. import torchvision.transforms as transforms
    4. # 数据增强
    5. def DataEnhance(sourth_path,aim_dir,size):
    6. name=0
    7. #得到源文件的文件夹
    8. file_list=os.listdir(sourth_path)
    9. #创建目标文件的文件夹
    10. if not os.path.exists(aim_dir):
    11. os.mkdir(aim_dir)
    12. for i in file_list:
    13. img=Image.open('%s\%s.png'%(sourth_path,i))
    14. print(img.size)
    15. name+=1
    16. transform1=transforms.Compose([
    17. transforms.ToTensor(),
    18. transforms.ToPILImage(),
    19. transforms.Resize(size),
    20. ])
    21. img1=transform1(img)
    22. img1.save('%s/%s.png'%(aim_dir,name))
    23. name+=1
    24. transform2=transforms.Compose([
    25. transforms.ToTensor(),
    26. transforms.ToPILImage(),
    27. transforms.ColorJitter(brightness=0.5,contrast=0.5,hue=0.5)
    28. ])
    29. img2 = transform1(img)
    30. img2.save('%s/%s.png' % (aim_dir, name))
    31. name+=1
    32. transform3=transforms.Compose([
    33. transforms.ToTensor(),
    34. transforms.ToPILImage(),
    35. transforms.RandomCrop(227,pad_if_needed=True),
    36. transforms.Resize(size)
    37. ])
    38. img3 = transform1(img)
    39. img3.save('%s/%s.png' % (aim_dir, name))
    40. name+=1
    41. transform4=transforms.Compose([
    42. transforms.Compose(),
    43. transforms.ToPILImage(),
    44. transforms.RandomRotation(60),
    45. transforms.Resize(size),
    46. ])
    47. img4 = transform1(img)
    48. img4.save('%s/%s.png' % (aim_dir, name))


    补充 

    直接利用PIL进行数据增强

    1. import os
    2. from PIL import Image
    3. import argparse
    4. import shutil
    5. parser = argparse.ArgumentParser(description="数据增强")
    6. parser.add_argument("--input-path", type=str, default='./hhh', help="地址")
    7. parser.add_argument("--out-path", type=str, default='./hh', help="地址")
    8. opt=parser.parse_args()
    9. pathlist=os.listdir(opt.input_path)
    10. if not os.path.exists(opt.out_path):
    11. os.mkdir(opt.out_path)
    12. ##尺度缩放
    13. scale = [1]
    14. ##旋转角度
    15. angle = [0,90]
    16. ##翻转 0代表不翻转 1代表水平翻转 2代表垂直翻转
    17. flip=[0,1,2]
    18. count=0
    19. for image_name in pathlist:
    20. image=Image.open(os.path.join(opt.input_path,image_name)).convert('RGB')
    21. for i in range(len(scale)):
    22. for j in range(len(angle)):
    23. for c in range(len(flip)):
    24. image=image.rotate(angle[j])
    25. image=image.resize((int(image.size[0]*scale[i]), int(image.size[1]*scale[i])), Image.BICUBIC)
    26. if flip[c]==1: ##水平翻转
    27. image=image.transpose(Image.FLIP_LEFT_RIGHT)
    28. elif flip[c]==2: ###垂直翻转
    29. image.transpose(Image.FLIP_TOP_BOTTOM)
    30. else:
    31. image=image ##不翻转
    32. count+=1
    33. aa=image_name.split('.')[0]+'{}_{}_{}.png'.format(i,j,c)
    34. image.save(os.path.join(opt.out_path,aa))
    35. # image.show()

    数据增强并不是真的增多了样本的数量,因为在训练的过程中,数据增强函数会随机对图片进行处理,比如对图片进行裁剪,将图片翻转,这样在多训练几轮之后就相当于增加了原本不属于数据集的图片,也就是实现了数据增强。 

    常见的图像变换

    裁剪

    中心裁剪(transforms.CenterCrop)

    作用:Crops the given PIL Image at the center

    1. from PIL import Image
    2. import torchvision.transforms as transforms
    3. img=Image.open('./Set14/baboon.png')
    4. transform1=transforms.Compose([
    5. transforms.ToTensor(),
    6. transforms.ToPILImage(),
    7. transforms.CenterCrop((224,224)),
    8. ])
    9. img=transform1(img)
    10. img.show()

    原始图片

     裁剪后图片

    随机裁剪(transforms.RandomCrop)

    1. from PIL import Image
    2. import torchvision.transforms as transforms
    3. img=Image.open('./Set14/baboon.png')
    4. transform1=transforms.Compose([
    5. transforms.ToTensor(),
    6. transforms.ToPILImage(),
    7. transforms.RandomCrop((224,224)),
    8. ])
    9. img=transform1(img)
    10. img.show()

    翻转和旋转

    依概率p水平翻转transforms.RandomHorizontalFlip

    1. from PIL import Image
    2. import torchvision.transforms as transforms
    3. img=Image.open('./Set14/baboon.png')
    4. transform1=transforms.Compose([
    5. transforms.ToTensor(),
    6. transforms.ToPILImage(),
    7. # transforms.RandomCrop((224,224)),
    8. transforms.RandomHorizontalFlip(p=0.999999)
    9. ])
    10. img=transform1(img)
    11. img.show()

    依概率p垂直翻转transforms.RandomVerticalFlip

    以给定的概率随机垂直翻转给定的PIL图像

    torchvision.transforms.RandomVerticalFlip(p=0.5)

    随机旋转:transforms.RandomRotation

    torchvision.transforms.RandomRotation(degrees)

    图像变换

    resize:transforms.Resize()

    Resize the input PIL Image to the given size.注意这些函数的输入都是PIL格式
    1. from PIL import Image
    2. import torchvision.transforms as transforms
    3. img=Image.open('./Set14/baboon.png')
    4. transform1=transforms.Compose([
    5. transforms.ToTensor(),
    6. transforms.ToPILImage(),
    7. transforms.Resize((224,224),interpolation=2)
    8. ])
    9. img=transform1(img)
    10. print(img.size)
    11. img.show()

    标准化:transforms.Normalize()

    torchvision.transforms.Normalize(mean, std)

    转为tensor:transforms.ToTensor()

    将PIL Image或者 ndarray 转换为tensor,并且归一化至[0-1] 

    将数据转换为PILImage:transforms.ToPILImage(mode=None)

    将tensor 或者 ndarray的数据转换为 PIL Image 类型数据 参数: mode- 为None时,为1通道, mode=3通道默认转换为RGB,4通道默认转换为RGBA。

    对transforms操作,使数据增强更灵活

    transforms.RandomChoice(transforms)

    从给定的一系列transforms中选一个进行操作

    参考博客:

    pytorch实现AlexNet(含完整代码)_不会水的鱼o的博客-CSDN博客_alexnet pytorch

  • 相关阅读:
    React 的 useContext 的使用
    基于HTML+CSS+JavaScript+Bootstarp响应式健身网站(web前端期末大作业)
    【差分演化算法相关文献总结】
    大数据(9g)FlinkCEP
    计算机毕业设计node.js+Vue+Element企业员工信息管理系统
    素问·金匮真言论原文
    八大排序代码——总结
    网页轮播图
    小程序之如何学习一个新的知识,首先就是通过官网进行讲解!!(2)
    Redis String类型使用方法
  • 原文地址:https://blog.csdn.net/qq_40107571/article/details/126626225