首先我们来欣赏一哈官方提供的案例。
弄个好用的函数库,我们一起来学习学习撒~~~~~~
数据增强方法分为像素级变换和空间级变换。像素级变换只针对图像,空间级变换同时作用于图像,mask(就是分割的标签,中文称为蒙版),检测框(BBoxes),关键点。–
像素级转换将仅更改输入图像,并且将使所有其他目标(例如蒙版,边界框和关键点)保持不变。像素级转换包括:模糊,色彩抖动,图像压缩,高斯噪声,倒置,归一化,随机雨,随机亮度对比,锐化,色相饱和度值等等。
其实用脑壳想一哈,这些变换只要是针对输入图像嘛,不可能对label或者mask,或者检测框进行模糊,加噪声这些嘛。选用的时候动哈脑筋就对了,不用看这个分类的。
空间级变换将同时更改输入图像以及其他目标,例如蒙版,边界框和关键点。下表显示了每个转换支持哪些其他目标。
在使用空间变换的时候就要注意,图像转了,那蒙版,检测框啥的也要跟着转才对,而且设计到随机的变换,更要注意,图像和标签是否对齐。
说了那么多,还是不晓得咋个使用。别急,现在起讲用法,保证看完,妈妈都会了。
首先,来看看使用的正确姿势
import albumentations as A
trans = A.Compose([
A.HorizontalFlip(p=0.5),
A.VerticalFlip(p=0.5),
A.OneOf([
A.IAAAdditiveGaussianNoise(), # 将高斯噪声添加到输入图像
A.GaussNoise(), # 将高斯噪声应用于输入图像。
], p=0.2), # 应用选定变换的概率
A.OneOf([
A.MotionBlur(p=0.2), # 使用随机大小的内核将运动模糊应用于输入图像。
A.MedianBlur(blur_limit=3, p=0.1), # 中值滤波
A.Blur(blur_limit=3, p=0.1), # 使用随机大小的内核模糊输入图像。
], p=0.2),
A.ShiftScaleRotate(shift_limit=0.0625, scale_limit=0.2, rotate_limit=45, p=0.2),
# 随机应用仿射变换:平移,缩放和旋转输入
A.RandomBrightnessContrast(p=0.2), # 随机明亮对比度
])
这里面特别要注意两个方法,很重要。Compose 和 OneOf。Compose大家都知道,torchvision里面有,就是把所有的变换放在一起,按顺序执行。而OneOf就厉害了,他可以选择性的执行包在它里面的变换。比如把都是模糊的变换(高斯模糊,模糊,运动模糊等等)放在OneOf里面,它就可以随机选择一种变换执行。
那接下来具体讲讲这两种
重点 :我不知道这个方法怎么用,去哪里搜索呢
教你两招,一去官方APIhttps://albumentations.ai/docs/搜索,如下:
这里就可以看函数的作用,以及参数。从参数表里可以看到,compose也有概率参数p的,这是个细节。我们后面的代码里会用到这个参数。
这里组要是组合变换,代码上面已经给过了。
它同Compose一样,都是做组合的,都有概率。区别就在于:Compose组合下的变换是要挨着顺序做的,而OneOf组合里面的变换是系统自动选择其中一个来做,而这里的概率参数p是指选定后的变换被做的概率。有点拗口,举个栗子。
A.OneOf([
A.MotionBlur(p=0.2), # 使用随机大小的内核将运动模糊应用于输入图像。
A.MedianBlur(blur_limit=3, p=0.1), # 中值滤波
A.Blur(blur_limit=3, p=0.1), # 使用随机大小的内核模糊输入图像。
], p=0.2)
这里有3个模糊方法,系统假设选择做A.Blur,那么做A.Blur的概率就是0.2。
import albumentations as A
from PIL import Image
import numpy as np
import matplotlib.pyplot as plt
image = Image.open('610235_7.jpg')
img_arr = np.array(image) # resize只支持array, 不支持jpg
resize = A.resize(img_arr, 256, 256)
transform = A.Compose([
A.Resize(height=256, width=256, p=1.0),
], p=0.9)
img_trans = transform(image=np.array(image)) # image为图像地址'xxx.jpg'
flip = A.HorizontalFlip(p=1) # 实例化,翻转概率为1,百分百翻转,测试使用
flipimg = flip(image=resize)
print(flipimg.keys()) # dict_keys(['image'])
plt.figure(figsize=(8,8))
plt.subplot(121)
plt.title('resized image')
plt.imshow(resize, cmap='gray')
plt.subplot(122)
plt.title('fliped image')
plt.imshow(flipimg['image'], cmap='gray')
水平翻转是需要给定参数的,参数可以在编译器里面查看(如,pycharm)
不同目标,使用不同的参数。因为它会在内部根据参数调用不同的方法,如源码里面
这里HorizontalFlip是继承自DualTransform。
shift = A.ShiftScaleRotate(shift_limit=0.0625, scale_limit=0.2, rotate_limit=45, p=1)
shift_img = shift(image=flipimg['image'])
plt.figure(figsize=(8,8))
plt.subplot(121)
plt.title('fliped image')
plt.imshow(flipimg['image'], cmap='gray')
plt.subplot(122)
plt.title('shift image')
plt.imshow(shift_img['image'], cmap='gray')
我们都知道pytorch模型接受的输入是Tensor格式,而albumentations库并没有totensor的方法,那我们怎么才能得到Tensor呢。
更正:albumentations库有totensor的方法, 如ToTensorV2。用ToTensorV2不用ToTensor的原因官方已经说明2
那如果不使用albumentations的totensor, 或者想和torchvision结合用,应该怎么操作呢?
假设用albumentations做好的transform如下:
trans = A.Compose([
A.HorizontalFlip(p=0.5),
A.VerticalFlip(p=0.5),
A.OneOf([
A.IAAAdditiveGaussianNoise(), # 将高斯噪声添加到输入图像
A.GaussNoise(), # 将高斯噪声应用于输入图像。
], p=0.2), # 应用选定变换的概率
A.OneOf([
A.MotionBlur(p=0.2), # 使用随机大小的内核将运动模糊应用于输入图像。
A.MedianBlur(blur_limit=3, p=0.1), # 中值滤波
A.Blur(blur_limit=3, p=0.1), # 使用随机大小的内核模糊输入图像。
], p=0.2),
A.ShiftScaleRotate(shift_limit=0.0625, scale_limit=0.2, rotate_limit=45, p=0.2),
# 随机应用仿射变换:平移,缩放和旋转输入
A.RandomBrightnessContrast(p=0.2), # 随机明亮对比度
])
trans_img = trans(image=img_arr)
plt.figure(figsize=(8,8))
plt.subplot(121)
plt.title('original image')
plt.imshow(img_arr, cmap='gray')
plt.subplot(122)
plt.title('albumentions image')
plt.imshow(trans_img['image'], cmap='gray')
现在使用torchvision 把做好了transform的数据转化成tensor
from torchvision import transforms as t
as_tensor = t.ToTensor()
img_tensor = as_tensor(trans_img['image'])
现在还有一个问题,虽然方法我都知道了,但是真正在建立dataset的时候应该怎么写dataset呢。
最后,就给大家看看一个范例。
这个范例是在做分割的时候写的。只关注transform部分就可以了。
例子就举这么多。授人以鱼不如授人以渔,我主要是讲方法,遇到新的不会的函数,怎么去逛网查用法,官网查不到的,pycharm里面再看看源代码。想要懒惰一点,也可以直接百度某个函数。
传送门:
我就想看看具体有哪些函数
还有这个也是具体的函数用法
今天就学习了这么多,花了不少时间总结下来。肩膀都酸了,肚子也饿了,看到这儿了,不点赞,关注,鼓励一下嘛
https://cloud.tencent.com/developer/article/1660972 ↩︎
https://albumentations.ai/docs/faq/#which-transformation-should-i-use-to-convert-a-numpy-array-with-an-image-or-a-mask-to-a-pytorch-tensor-totensor-or-totensorv2 ↩︎