Augmentor是一个用于机器学习的Python图像增强库。它旨在成为一个独立的库,具有平台和框架独立性,这使得它更加方便,允许对增强进行更细粒度的控制,并实现最具现实世界相关性的增强技术。它采用了一种随机方法,使用可以在管道中拼接在一起的构建块。
安装
Augmentor是用Python编写的。该包的Julia版本也正在作为一个姊妹项目开发,您可以在这里找到。
使用命令行中的pip
进行安装:
pip install Augmentor
请参阅文档以了解如何从源代码构建。要从先前的版本升级,请使用pip install Augmentor --upgrade
。
文档
完整的文档可以在Read the Docs上找到:https://augmentor.readthedocs.io
快速入门指南和使用方法
Augmentor 的目的是自动化图像增强(人工数据生成),以扩展作为机器学习算法输入的数据集,特别是神经网络和深度学习。
该包通过构建增强管道来工作,您可以在一组图像上定义一系列操作。操作,例如旋转或变换,逐一添加以创建增强管道:完成后,可以执行管道并创建增强数据集。
首先,实例化一个指向文件系统中目录的Pipeline
对象:
import Augmentor
p = Augmentor.Pipeline("/path/to/images")
然后,您可以按如下方式向Pipeline对象p
添加操作:
p.rotate(probability=0.7, max_left_rotation=10, max_right_rotation=10)
p.zoom(probability=0.5, min_factor=1.1, max_factor=1.5)
每个函数都要求您指定一个概率,该概率用于决定当图像通过增强管道时,是否应用某个操作。
一旦创建了管道,您可以像这样从中采样:
p.sample(10000)
这将根据您的规格生成10,000张增强图像。默认情况下,这些图像将被写入相对于上面初始化p
管道对象时指定的路径的output
目录中。
如果您希望在管道中对每张图像处理一次,请使用process()
:
p.process()
此功能可能适用于例如调整数据集的大小。使用process()
方法时,创建一个所有操作概率都设置为1
的管道是有意义的。
多线程
Augmentor(版本 >=0.2.1)现在使用多线程来增加生成图像的速度。
如果原始图像非常小,这可能会使某些管道变慢。如果遇到变慢情况,请将multi_threaded
设置为False
:
p.sample(100, multi_threaded=False)
然而,默认情况下,sample()
函数使用多线程。这目前仅在保存到磁盘时实现。在下一个版本更新中,生成器将使用多线程。
基础真值数据
图像可以成组通过管道传递,以便基础真值数据能够以相同方式进行增强。
要并行于任何原始数据增强基础真值数据,请使用ground_truth()函数将一个基础真值目录添加到管道中:
p = Augmentor.Pipeline("/path/to/images")
# 指向包含基础真值数据的目录。
# 文件名相同的图像将被添加为基础真值数据,
# 并与原始数据并行增强。
p.ground_truth("/path/to/ground_truth_images")
# 像往常一样向管道添加操作:
p.rotate(probability=1, max_left_rotation=5, max_right_rotation=5)
p.flip_left_right(probability=0.5)
p.zoom_random(probability=0.5, percentage_area=0.8)
p.flip_top_bottom(probability=0.5)
p.sample(50)
多掩码/图像增强
使用DataPipeline
类(Augmentor版本 >= 0.2.3),可以增强具有多个关联掩码的图像:
通过DataPipeline
类,可以成组传递任意长的图像列表并以相同方式进行增强。对于具有多个掩码的基础真值图像,例如,这是非常有用的。
在下面的示例中,图像及其掩码包含在images
数据结构中(作为列表的列表),而它们的标签包含在y
中:
p = Augmentor.DataPipeline(images, y)
p.rotate(1, max_left_rotation=5, max_right_rotation=5)
p.flip_top_bottom(0.5)
p.zoom_random(1, percentage_area=0.5)
augmented_images, labels = p.sample(100)
DataPipeline
直接返回图像(如上面的augmented_images
),并且不会将其保存到磁盘,也不会从磁盘读取数据。图像在初始化期间直接传递给DataPipeline
。
有关images
数据结构及其创建方法的详细信息,请参阅Multiple-Mask-Augmentation.ipynb
Jupyter笔记本。
适用于Keras和PyTorch的生成器
如果您不希望保存到磁盘,可以使用生成器(在这种情况下使用Keras):
g = p.keras_generator(batch_size=128)
images, labels = next(g)
它返回一个大小为128的图像批次及其相应的标签。生成器无限期返回数据,并且可以用来通过增强的数据即时训练神经网络。
或者,您可以将其集成到PyTorch中:
import torchvision
transforms = torchvision.transforms.Compose([
p.torch_transform(),
torchvision.transforms.ToTensor(),
])
主要特性
弹性扭曲
使用弹性扭曲,一张图像可以用来生成许多现实世界可行且标签保留的图像:
输入图像有1个像素的黑色边框,以强调您正在获得扭曲而不改变原始图像的大小或纵横比,并且没有在新生成的图像周围添加任何黑色/透明填充。
透视变换
共有12种不同类型的透视变换。以下显示了最常见的四种。
其余八种类型的变换如下:
保持尺寸的旋转
旋转默认情况下保留原始图像的文件大小:
与其他软件旋转相比:
保持尺寸的剪切
剪切还会自动从剪切图像中裁剪正确的区域,这样您就可以得到一张没有黑色空间或填充的图像。
裁剪
裁剪也可以以更适合机器学习图像增强的方式处理。 源文本的中文翻译如下:
原始图片 | 随机裁剪+调整大小操作 |
---|---|
随机擦除
随机擦除是一种用于增强模型对遮挡物鲁棒性的技术。这在训练用于导航场景中的目标检测神经网络时可能会有用。
原始图片[2] | 随机擦除 |
---|---|
请参阅 Pipeline.random_erasing() 文档以了解用法。
在管道中链式操作
通过少量操作,可以增强单张图片以生成大量新的、保留标签的样本:
原始图片 | 失真+镜像 |
---|---|
在上述示例中,我们应用了三种操作:首先我们随机扭曲图片,然后以0.5的概率水平翻转,再以0.5的概率垂直翻转。然后从这个管道中采样100次以创建100个新数据。
p.random_distortion(probability=1, grid_width=4, grid_height=4, magnitude=8)
p.flip_left_right(probability=0.5)
p.flip_top_bottom(probability=0.5)
p.sample(100)
教程笔记本
使用生成器与Keras集成
Augmentor可以作为Keras增强功能的替代品。Augmentor可以创建一个生成器,根据你定义的管道无限生成增强数据。有关详细信息,请参阅以下笔记本:
- 从本地目录读取图片,实时增强并使用生成器将增强后的图片流传递给Keras卷积神经网络,请参阅
Augmentor_Keras.ipynb
- 在内存中增强数据(数组格式)并使用生成器将这些新图片传递给Keras神经网络,请参阅
Augmentor_Keras_Array_Data.ipynb
按类别增强策略
Augmentor允许为每个类别定义管道。也就是说,你可以针对给定的分类问题,在逐类基础上定义不同的增强策略。
在以下Jupyter笔记本中查看示例:Per_Class_Augmentation_Strategy.ipynb
完整示例
让我们在一张图片上执行增强任务,展示Augmentor的管道和多个功能。
首先导入包并通过指向包含图片的目录来初始化一个Pipeline对象:
import Augmentor
p = Augmentor.Pipeline("/home/user/augmentor_data_tests")
现在你可以开始向管道对象添加操作:
p.rotate90(probability=0.5)
p.rotate270(probability=0.5)
p.flip_left_right(probability=0.8)
p.flip_top_bottom(probability=0.3)
p.crop_random(probability=1, percentage_area=0.5)
p.resize(probability=1.0, width=120, height=120)
一旦添加了所需的操作,你可以从这个管道中采样图片:
p.sample(100)
一些示例输出:
输入图片[3] | 增强后的图片 | |
---|---|---|
→ |
增强后的图片可能对边界检测任务有用。
许可与致谢
Augmentor在MIT许可协议下提供。请参阅 Licence.md
。
[1] 棋盘图片来自Wikimedia Commons,属于公有领域:https://commons.wikimedia.org/wiki/File:Checkerboard_pattern.svg
[2] 街景图片属于公有领域:http://stokpic.com/project/italian-city-street-with-shoppers/
[3] 皮肤病变图片来自ISIC档案:
- 图片ID = 5436e3abbae478396759f0cf
- 下载地址:https://isic-archive.com:443/api/v1/image/5436e3abbae478396759f0cf/download
你可以使用urllib
获取皮肤病变图片,以重现上述增强后的图片:
>>> from urllib import urlretrieve
>>> im_url = "https://isic-archive.com:443/api/v1/image/5436e3abbae478396759f0cf/download"
>>> urlretrieve(im_url, "ISIC_0000000.jpg")
('ISIC_0000000.jpg', <httplib.HTTPMessage instance at 0x7f7bd949a950>)
注意:对于Python 3,使用from urllib.request import urlretrieve
。
Logo由LogoMakr.com创建。
测试
要运行自动化测试,克隆仓库并运行:
$ py.test -v
在命令行中执行。要查看每次提交后运行的CI测试,请参阅https://travis-ci.org/mdbloice/Augmentor。
Asciicast
点击下面的预览以查看Augmentor使用视频演示: