最快最好用的数据增强库「albumentations」 一文看懂用法

1. Albumentations的自我介绍

  1. 我的官方地址在 github链接
  2. 我的API(文档)地址在 https://albumentations.ai/docs/
  3. 我是负责处理图像的一个库,可用于所有数据类型:图像(RBG图像,灰度图像,多光谱图像),分割mask,边界框和关键点
  4. 我大概有70多种不同的图像处理方法,相比torch自带的,这个库函数有更多的对图像的预处理的办法
  5. 我的特点就是:在相同的对图像的处理下,我的速度就是比其他处理方式更快👍

    这个图中,可以看到albumentations的处理方法中,很多都是速度最快的1
  1. 我可以与流行的深度学习框架(例如PyTorch和TensorFlow)一起使用。顺便说一句,我还是PyTorch生态系统的一部分
  2. 对Pytorch很友好,而且这个库函数是kaggle master制作的
  3. 广泛用于工业,深度学习研究,机器学习竞赛和开源项目。就是大佬都爱用的一个库,在kaggle比赛上都有我的身影。

2.案例欣赏

首先我们来欣赏一哈官方提供的案例。

  • Inria数据集上的语义分割 数据增强
    在这里插入图片描述
    ​​​​​​对原始图像进行了水平旋转,垂直旋转,旋转90度,行列转置,尺度缩放等
  • 医学影像 MRI
    在这里插入图片描述
  • Mapillary Vistas数据集上的对象检测和语义分割

在这里插入图片描述

  • 关键点增强
    在这里插入图片描述

​​弄个好用的函数库,我们一起来学习学习撒~~~~~~

3.如何安装

  1. pip 安装
    pip install albumentations
  2. 源码库安装
    pip install -U git+https://github.com/albumentations-team/albumentations

4.有哪些数据增强方法

数据增强方法分为像素级变换和空间级变换。像素级变换只针对图像,空间级变换同时作用于图像,mask(就是分割的标签,中文称为蒙版),检测框(BBoxes),关键点。–

4.1 像素级变换(Pixel-level transforms)

像素级转换将仅更改输入图像,并且将使所有其他目标(例如蒙版,边界框和关键点)保持不变。像素级转换包括:模糊,色彩抖动,图像压缩,高斯噪声,倒置,归一化,随机雨,随机亮度对比,锐化,色相饱和度值等等。

其实用脑壳想一哈,这些变换只要是针对输入图像嘛,不可能对label或者mask,或者检测框进行模糊,加噪声这些嘛。选用的时候动哈脑筋就对了,不用看这个分类的。

4.2 空间级变换(Spatial-level transforms)

空间级变换将同时更改输入图像以及其他目标,例如蒙版,边界框和关键点。下表显示了每个转换支持哪些其他目标。
在这里插入图片描述
在使用空间变换的时候就要注意,图像转了,那蒙版,检测框啥的也要跟着转才对,而且设计到随机的变换,更要注意,图像和标签是否对齐。


说了那么多,还是不晓得咋个使用。别急,现在起讲用法,保证看完,妈妈都会了。

5.看完就会的使用方法

首先,来看看使用的正确姿势

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),   # 随机明亮对比度
    ])

这里面特别要注意两个方法,很重要。ComposeOneOf。Compose大家都知道,torchvision里面有,就是把所有的变换放在一起,按顺序执行。而OneOf就厉害了,他可以选择性的执行包在它里面的变换。比如把都是模糊的变换(高斯模糊,模糊,运动模糊等等)放在OneOf里面,它就可以随机选择一种变换执行。

那接下来具体讲讲这两种

5.1 Compose

重点 :我不知道这个方法怎么用,去哪里搜索呢🤡
教你两招,一去官方APIhttps://albumentations.ai/docs/搜索,如下:
在这里插入图片描述
在这里插入图片描述
这里就可以看函数的作用,以及参数。从参数表里可以看到,compose也有概率参数p的,这是个细节。我们后面的代码里会用到这个参数。

这里组要是组合变换,代码上面已经给过了。

5.2 Oneof

在这里插入图片描述
它同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。

5.3 我们再随便看看其他的一些方法。

  • A.resize()
    resize(img, height, width, interpolation=cv2.INTER_LINEAR)
    注意:这个函数如果单独使用需要提供img参数,如果放在Compose里面使用,就不提供img参数的。
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'
  • HorizontalFlip 水平翻转
    围绕y轴水平翻转输入,需要实例化后在调用
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。

  • ShiftScaleRotate 随机应用仿射变换:平移,缩放和旋转输入
    在这里插入图片描述
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')

在这里插入图片描述

5.4 怎么把这些增强方法和pytorch结合

我们都知道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里面再看看源代码。想要懒惰一点,也可以直接百度某个函数。

传送门:
我就想看看具体有哪些函数
还有这个也是具体的函数用法

今天就学习了这么多,花了不少时间总结下来。肩膀都酸了,肚子也饿了,看到这儿了,不点赞,关注,鼓励一下嘛😂

在这里插入图片描述


  1. https://cloud.tencent.com/developer/article/1660972 ↩︎

  2. 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 ↩︎

  • 236
    点赞
  • 615
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 33
    评论
评论 33
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Tina姐

我就看看有没有会打赏我

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值