4

图像数据增强 - 迷途小书童的Note迷途小书童的Note

 1 year ago
source link: https://xugaoxiang.com/2021/12/22/imgaug/
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

图像数据增强

YOLO 迷途小书童 5个月前 (12-22)3评论
  • windows 10 64bit
  • imgaug 0.4.0

imgaug 是一个 python 编写的机器学习数据集增强库,通过它,可以把原来的小数据集,经过轻微的变化,形成一个新的更大的数据集。

imgaug

直接通过 pip 来安装

pip install imgaug

# 体验github上的最新版本,使用下面命令
pip install git+https://github.com/aleju/imgaug.git

或者使用 conda 来安装

conda config --add channels conda-forge
conda install imgaug

使用经典的 lenna 图片为例,这里使用 imageio 来读取原始图片,同时支持本地文件和网络文件。当然使用 opencv 来处理也是完全可以的

# 使用命令 pip install imageio 来安装
import imageio
import imgaug as ia

# 读取图片,返回的是numpy数组,类型是uint8,形状是(height, width, channel),RGB格式
image = imageio.imread('lenna.png')

# 显示
ia.imshow(image)
imgaug

imgaug 提供的增强方法非常多,本篇只列出了简单的几个示例,更多内容参考官方文档 https://imgaug.readthedocs.io/en/latest/source/overview_of_augmenters.html

旋转rotate

import imageio
import imgaug as ia
from imgaug import augmenters as iaa

image = imageio.imread('lenna.png')

# 仿射变换,随机旋转角度,范围是30~90度
rotate = iaa.Affine(rotate=(30, 90))
image_aug = rotate(image=image)

ia.imshow(image_aug)
imgaug

多张图片一起处理,使用一个列表来存放图片,最后的显示部分使用 numpy.hstack

import imageio
import imgaug as ia
import numpy as np
from imgaug import augmenters as iaa

image1 = imageio.imread('lenna.png')

images = [image1, image1]
rotate = iaa.Affine(rotate=(30, 90))
image_augs = rotate(images=images)

ia.imshow(np.hstack(image_augs))
imgaug

仔细点观察会发现,左右2张图的旋转角度是不一样的

裁剪crop

下面看看裁剪的操作,与 rotate 非常类似

import imageio
import imgaug as ia
import numpy as np
from imgaug import augmenters as iaa

image = imageio.imread('lenna.png')

# crop一个随机值,范围50~150
crop = iaa.Crop(px=(50, 150))
image_aug = crop(image=image)

ia.imshow(image_aug)
imgaug

添加高斯噪声gaussian noise

import imageio
import imgaug as ia
from imgaug import augmenters as iaa

image = imageio.imread('lenna.png')

gaus = iaa.AdditiveGaussianNoise(scale=(10, 60))
image_aug = gaus(image=image)

ia.imshow(image_aug)
imgaug

同时使用多种增强手段

把上面的增强方法整合起来,imgaug 的工作流是读取图片、定义变换序列、再执行变换,看下面的示例

import imageio
from imgaug import augmenters as iaa

image = imageio.imread('lenna.png')

seq = iaa.Sequential([
    iaa.Affine(rotate=(-25, 25)),
    iaa.AdditiveGaussianNoise(scale=(30, 90)),
    iaa.Crop(percent=(0, 0.4))
], random_order=True)

# 每张图片都做3项增强
images_aug = [seq(image=image) for _ in range(8)]

# 使用draw_grid分2行4列显示
ia.imshow(ia.draw_grid(images_aug, cols=4, rows=2))
imgaug

imgaug封装

下面这个工程是对 imgaug 进行了一个简单的封装,主要用来对 yolo 数据集进行数据增强

git clone https://github.com/xugaoxiang/SimpleYoloAug.git
cd SimpleYoloAug

YOLOv5模型训练 提到的口罩数据集为例,将数据集中的图片和对应的标注一起拷贝到文件夹中,如 images 文件夹,然后进入到源码目录下,然后执行命令

python simple_augment.py --indir ~/images/ --outdir ~/gen_images/ --gen 2

最后的参数 --gen 就是增强的数量

imgaug

处理完成后,原来1000张的图片就会增强到了3000张,可以拿去训练模型了


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK