关于图片地深度学习有时会需要大量的图片,因此,为了获得更多的图片,对已经获取的图片进行扩展就是一个必要地手段,简单来说,针对图片地数据增强就是对已有地图片进行旋转、裁剪、缩放、变色等操作让它变成另外一张图片但是自己的相关信息又并没有丢失太多
但是,怎么对图片进行变换而又不丢失关键信息是个技术活, 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, ...)
另一种是自己对图片进行处理后保存
# -*- coding: utf-8 -*-
# @Time : 2022/9/24 21:43
# @Author : Lanpangzi
# @File : change_images.py
from PIL import Image
from autoaugment import ImageNetPolicy
import os
# 必须保证这个文件夹里面没有文件夹!!!!!!
# 输入你的图片所在的文件夹的路径
path = r'D:\00pycharm\Projects_from_github\AutoAugment-master\yolov5-1 (2)\crack'
al_imgs = os.listdir(path)
policy = ImageNetPolicy()
for ind, img_name in enumerate(al_imgs):
img_name_ = img_name.split('.')[:-1][0]
img_suffix = img_name.split('.')[-1] # 保留原来图片的后缀
img_path = os.path.join(path, img_name)
or_img = Image.open(img_path)
os.makedirs(os.path.join(path, img_name_))
# 编号0的是原来的图片
or_img.save(os.path.join(path, img_name_, img_name_ + '_' + str(0) + '.' + img_suffix))
or_img = or_img.convert('RGB') # 有的图片模式无法保存,统一全部转换成RGB
for i in range(24):
new_img = policy(or_img)
new_img_path = os.path.join(path, img_name_, img_name_ + '_' + str(i + 1) + '.' + img_suffix)
new_img.save(new_img_path)
print("已经搞定{}/{}".format(ind + 1, len(al_imgs)))
如果仅仅是识别图片里面是个什么东西那么这样就可以直接处理,毕竟里面的东西不会变化,但是,如果我需要对即将进行yolo识别的图片进行数据扩展,那么我的标注应该如何变化,如果仅仅是改变颜色还好说,但是如果是图像的旋转和缩放,对应的标签应该如何处理?因为原来图片中目标的位置已经发生变化了!
接下来,具体看下ImageNetPolicy的24(但是源码中class ImageNetPolicy(object)
实际有25个subpolicy,不知为何)
按顺序调用这25种subpolicy,得到的结果如下:
原图:
结果:
对第一个subpolicy调用25次结果如下
可以看出,即使是同一个subpolicy,具体的变换参数还是有些许的随机性的(源码中确实是有random函数来控制具体的变化参数)
无论是25种subpolicy,还是每一个subpolicy不同的随机参数,这个图片的实体的位置还是没有发生较大的变化
但是对于扁长的图片,在处理后可能原来的位置有较大的变化:
原图:
处理后:
这种以后标签咋改是个问题。。。