自己做了一个图像增强工具包

前言

由于各种各样的需要,就自己做了一个通用的图像增强工具包,方便以后使用。正因为是通用工具包,所以就直接开源分享了。目前这个版本还在测试过程中,地址:开源地址

省流版使用方法

直接面向GitHub编程,因为这样能够避免Python工作空间的问题。

1
2
3
4
5
6
7
$ git clone https://github.com/sakebow/enhance-image.git
$ cd enhance-image
$ vim default.yaml
或者在`Windows`下直接用`notepad`或者其他编辑器打开编辑
$ python sakebow-enhancer.py
或者
$ python sakebow-enhancer-cli.py --yaml=my.yaml

没有什么多余的烦恼。主打一个执行就完事儿。

使用方法详细介绍

为了方便部分赶时间的人,这里直接写说明文档,原理什么的放后面再说。

首先,这个工具包虽然封装为了一个pip包,但是并没有彻底地在所有的系统中测试,所以,使用过程中非常推荐直接使用源码的方式。

pip安装

暂不推荐,等待后续版本迭代

源码安装

在使用源码的过程中,我们首先需要保证我们的代码与文件夹是以如下的结构存放的:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
your_dataset_dir/
|- images/ # 图片所在目录
| |- image1.jpg
| |- ...
|- labels/ # 标签所在目录
| |- label1.txt
| |- ...
|- output/ # 输出目录
| |- images/ # 输出图片所在目录(空文件夹)
| |- labels/ # 输出标签所在目录(空文件夹)
|- my.yaml # 你的配置文件(可以没有)
"""下面都是必须存在的文件,当然也是源码默认附带的"""
|- default.yaml
|- datadealer.py
|- reinforce.py
|- sakebow-enhancer.py
|- sakebow-enhancer-cli.py
|- transform.py
|- validate.py

依赖安装

在使用这段代码的之前,需要安装依赖。你可以像这样安装依赖:

1
$ pip install -r requirements.txt

当然,我自己构建的pip包还有一个额外的用途:直接安装依赖。想不到吧?(叉腰)

1
$ pip install sakebow-enhancer

这样就会直接安装掉所有的依赖。当然,多了一个没什么大用的sakebow-enhancer

配置文件编辑

依赖解决了,我们就来解决初始化问题。初始化最主要的就是配置文件的读取与加载了。在本项目中,就是读取default.yaml文件获取处理配置。

需要注意的是,相对于版本与版本,这个default.yaml文件也有一点小小的修改:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
config:
size: 640 # 图片长宽,默认将图片更改为(640, 640)
batch: 1 # 需要将几张原图合为1张大图
type: 'detect' # 需要执行的任务。目前支持'detect'(矩形框识别)和'segment'(语义分割)
deal: 1 # 需要执行多少次随机增强(这个部分只包括**增加高斯噪声**与**增加饱和度**这两个选项,翻转与旋转是默认随机,不可配置)
epoch: 1 # 需要执行多少次随机增强(这个部分包括所有功能)
noise_type: 'gauss' # >>> 单独拉出来定义噪声的类型,目前只支持高斯噪声
# 这里的`noise`单独拉出来作为一个列表,便于以后拓展
noise: # >>> 修改为以 '-' 开头,读取将构成列表,列表内是若干包含`type`、`upper`与`lower`三个键的字典
- type: 'gauss'
upper: 15 # upper bound
lower: 1 # lower bound

saturation: # >>> 饱和度也单独拉出来了
upper: 100 # upper bound
lower: 1 # lower bound
operations: # 支持操作列表(目前仅支持以下内容)
- 'rotate_90' # 旋转90度
- 'rotate_180' # 旋转180度
- 'rotate_270' # 旋转270度
- 'flip_x' # x轴翻转
- 'flip_y' # y轴翻转
input: # 输入图片与标签所在目录
image: 'images'
label: 'labels'
output: # 输出图片与标签所在目录
image: 'output/images'
label: 'output/labels'

在使用过程中,对图像与标签的处理目前只有固定角度的旋转,并且能够保证旋转后的图像与标签的相对位置不变。所以在其他配置不动的情况下,可以只编辑这么几个配置:

1
2
3
4
5
6
config:
size: 640 # 图片长宽,默认将图片更改为(640, 640),使用的是YOLO默认尺寸,可以按照显卡尺寸修改
batch: 1 # 一张增强的图像中包含多少张原图,图片较大就多放点,较小就少放点
type: 'detect' # 需要执行的任务。使用过程将检查数据集是否与任务匹配,否则无法执行
deal: 1 # 需要执行多少次随机增强,理论上可以无限次,但是考虑过拟合,建议在10次以内
epoch: 1 # 需要执行多少次随机增强图片的合成,理论上可以无限次,但是考虑过拟合,建议在 sum(*) / batch

如果可以的话,下一个版本或许也会增加补充配置的功能,使得my.yaml文件的读取能够动态覆盖default.yaml,而不是整个替代。

代码执行

依赖解决了,配置搞定了,接下来就是执行代码了。

执行其实非常简单,找到我们所需要的sakebow-enhancer.py文件,然后执行即可:

1
$ python sakebow-enhancer.py

正是由于我们已经修改了default.yaml配置文件,我们直接运行sakebow-enhancer.py文件是没什么问题的。

让别人云里雾里的命令行执行

当然,我也明白有些人并不喜欢这么做,而是希望用命令行让一切都简单一点。

所以也预留了另一种命令行方法,那就是找到我们的sakebow-enhancer-cli.py文件,然后执行:

1
$ python sakebow-enhancer-cli.py --yaml=my.yaml

其中,my.yaml就是我们自己定义的配置文件,这个文件需要放在sakebow-enhancer-cli.py的同级目录下。

看起来很简单对吧?