AutoAugment 学习
非官方项目地址:Github项目
官方文章:文章连接
关于图片地深度学习有时会需要大量的图片,因此,为了获得更多的图片,对已经获取的图片进行扩展就是一个必要地手段,简单来说,针对图片地数据增强就是对已有地图片进行旋转、裁剪、缩放、变色等操作让它变成另外一张图片但是自己的相关信息又并没有丢失太多
但是,怎么对图片进行变换而又不丢失关键信息是个技术活, google发布的AutoAugment就是干这个的。google通过针对3个主流的数据集(ImageNet,CIFAR10,SVHN)进行 “测试” 得到了3大类变换的集合,每一个集合中又包含了几十种具体变换的方式,每一次调用都会随机选一种变换方式对你传入的图片进行变换,返回变换之后的图片
原始图片:
进行8次随机变换操作:
具体使用方式如下:
首先当然是要将这个项目下下来,有用的也就只有autoaugment.py和ops两个文件,其他的都是教学
这玩意儿的使用方式有两种,可以直接嵌入到pytorch的transform中,就像这样:
# 一共可以从autoaugment中import进来四个,其中三个是变换的大类,剩下一个是具体的变换的方式
from autoaugment import ImageNetPolicy
data = ImageFolder(rootdir, transform=transforms.Compose(
[transforms.RandomResizedCrop(224),
transforms.RandomHorizontalFlip(),
ImageNetPolicy(), # 这就是调用
transforms.ToTensor(), transforms.Normalize(...)]))
loader = DataLoader(data, ...)
另一种是自己对图片进行处理后保存
from PIL import Image
# SubPolicy是一个执行具体变换操作的类
from autoaugment import ImageNetPolicy, CIFAR10Policy, SVHNPolicy, SubPolicy
img = Image.open("images/cat.jpg")
# 从ImageNet这个数据集上训练出来的转换图片地24种方式(每一种Policy具体地转换方式不同)
# 每一次调用都随机从24种转换方式中选择一种进行转换
policy = ImageNetPolicy()
transformed_img = policy(img)# 传入的数据类型是Image读取的图片,传出的也是这个
transformed_img.show() #显示,你当然也可以保存这张图片 transformed_img.save('after.jpg')
如果仅仅是识别图片里面是个什么东西那么这样就可以直接处理,毕竟里面的东西不会变化,但是,如果我需要对即将进行yolo识别的图片进行数据扩展,那么我的标注应该如何变化,如果仅仅是改变颜色还好说,但是如果是图像的旋转和缩放,对应的标签应该如何处理?因为原来图片中目标的位置已经发生变化了!
接下来,具体看下ImageNetPolicy的24(但是源码中class ImageNetPolicy(object)
实际有25个subpolicy,不知为何)
按顺序调用这25种subpolicy,得到的结果如下:
原图:
结果:
对第一个subpolicy调用25次结果如下
可以看出,即使是同一个subpolicy,具体的变换参数还是有些许的随机性的(源码中确实是有random函数来控制具体的变化参数)
无论是25种subpolicy,还是每一个subpolicy不同的随机参数,这个图片的实体的位置还是没有发生较大的变化
但是对于扁长的图片,在处理后可能原来的位置有较大的变化:
原图:
处理后:
这种以后标签咋改是个问题。。。