记录一下这两天用imgaug库做数据增广的代码,由于是算用算学的,所以只能把代码写出来,具体每种增广算法的原理和一些参数就不得而知了,不过我觉得也没必要把这么些个算法搜搞懂,毕竟重点是扩种数据。所以,如果你想深入的学习imgaug这个库的话那么这篇文章不适合你。不过这里有官方文档传送门,还有一篇非常详细的博文,同时本文就是参考以上博文才写出的代码。而本文主要是一个数据增广的实际案例,代码完整,可供参考。

查看每种增广操作的效果

由于本人在进行写代码的时候想看看每种操作作用完之后的效果,所以就想着写了一段代码,直接将增广操作复制到指定位置后运行就可直接输出作用前后的效果对比图。代码如下:

'''
该程序用于查看imgaug中的增广算法的作用效果
1. 修改代码第四行的 op 后的增广算法
2. 修改操作的图片的路径
3. 通过显示的图像课观察到增广效果
4. 该效果是经过op 和 op_ 两种操作叠加而成的图片
5. op_ 操作为剪切和填充
6. 如果想单独看 op 效果可以将代码12行[op, op_]中的op_去掉
''' from imgaug import augmenters as iaa
import imgaug as ia op = iaa.CoarseDropout(0.02, size_percent=0.15, per_channel=0.5) # 可修改成别的增广算法 op_ = iaa.CropAndPad(
percent=(0, 0.2),
pad_mode=["constant", "edge"],
pad_cval=(0, 255)
) seq = iaa.Sequential([ op , op_])
imgList = [cv2.imread("NewNewImage/22.jpg"),cv2.imread("NewNewImage/52.jpg")] # 修改成图片路径
img_aug = seq.augment_images(imgList)
import matplotlib.pyplot as plt
import cv2
plt.figure(figsize=(8,8))
plt.subplot(2,2,1)
plt.imshow(cv2.cvtColor(imgList[0],cv2.COLOR_BGR2RGB))
plt.subplot(2,2,2)
plt.imshow(cv2.cvtColor(img_aug[0],cv2.COLOR_BGR2RGB))
plt.subplot(2,2,3)
plt.imshow(cv2.cvtColor(imgList[1],cv2.COLOR_BGR2RGB))
plt.subplot(2,2,4)
plt.imshow(cv2.cvtColor(img_aug[1],cv2.COLOR_BGR2RGB))
plt.show()

实例代码

定义多种增广操作

from imgaug import augmenters as iaa
import imgaug as ia # 将图像转换为HSV,然后将每个像素的H值增加10到50
op_1 = iaa.WithColorspace(
to_colorspace="HSV",
from_colorspace="RGB",
children=iaa.WithChannels(0, iaa.Add((10, 50)))
) op_2 = iaa.WithChannels(0, iaa.Add((10,50))) # BGR中的B值随机增加10-50,因为cv2读取的图片为BGR顺序,下同
op_3 = iaa.WithChannels(1, iaa.Add((10,50))) # BGR中的G值随机增加10-50
op_4 = iaa.WithChannels(2, iaa.Add((10,50))) # BGR中的R值随机增加10-50 op_5 = iaa.WithChannels(0, iaa.Affine((10, 180))) # BGR中的B值随机旋转10-180°
op_6 = iaa.WithChannels(1, iaa.Affine((10, 180))) # BGR中的G值随机旋转10-180°
op_7 = iaa.WithChannels(2, iaa.Affine((10, 180))) # BGR中的R值随机旋转10-180° op_8 = iaa.Noop() # 无操作增广 # 用黑色像素替换每个图像的每5行
def img_func(images, random_state, parents, hooks):
for img in images:
img[::5] = 0
return images
def keypoint_func(keypoints_on_images, random_state, parents, hooks):
return keypoints_on_images
op_9 = iaa.Lambda(img_func, keypoint_func) # 裁剪并填充 负则裁剪,正则填充
op_10 = iaa.CropAndPad(percent=(-0.2, 0.2)) op_11 = iaa.CropAndPad(
percent=(0, 0.2), # 每边填充0至20%
pad_mode=["constant", "edge"], # 填充方式为恒定值(constant)或边缘值(edge)
pad_cval=(0, 255) # 若为恒定值,则从0-255中随机取值
) op_12 = iaa.CropAndPad(
px=((0, 30), (0, 10), (0, 30), (0, 10)), # 顶部填充0-30px,右侧0-10px,底部0-30px,左侧0-10px
pad_mode=ia.ALL,
pad_cval=(0, 255)
) op_13 = iaa.Fliplr() # 水平翻转所有图片
op_14 = iaa.Flipud() # 垂直反转所有图片 # 每个图像生成16到128个超像素。 用平均像素颜色替换每个超像素的概率在10到50%之间(每个图像采样一次)
op_15 = iaa.Superpixels(p_replace=(0.1, 0.5), n_segments=(16, 128)) # 将图像更改为灰度,并通过改变强度将其与原始图像叠加,有效地删除0到80%的颜色
op_16 = iaa.Grayscale(alpha=(0.0, 0.8)) op_17 = iaa.GaussianBlur(sigma=(0.0, 2.0)) # 高斯模糊,σ=0-2 # 在图像中添加-50到50之间的随机值。
#在50%的图像中,每个通道的值不同(3个采样值)。
#在剩下的50%图像中,所有通道的值都相同
op_18 = iaa.Add((-50, 50),per_channel=0.5) # 添加高斯噪音
# 每个像素从正态分布N(0,s)采样一次,s对每个图像采样并在0和0.1 * 255之间变化
op_19 = iaa.AdditiveGaussianNoise(scale=(0, 0.1*255)) # 丢弃2%的图像,但是在具有原始大小的50%的图像的较低分辨率版本上执行此操作,丢弃2x2个正方形。
# 此外,在50%的图像通道中执行此操作,以便仅将某些通道的信息设置为0,而其他通道保持不变
op_20 = iaa.CoarseDropout(0.02, size_percent=0.15, per_channel=0.5) operation_list = [op_1, op_7, op_8, op_9, op_10,
op_11, op_12, op_13, op_14, op_16, op_17, op_18, op_19, op_20,]

将图片分批

new_image_text.txt这个文本文件是图像列表,其中每一行保存的是一个图片的路径和对应的类别。

例如NewImage/10.jpg 7表示该图片的路径为NewImage/10.jpg,其类别属于7

## 将数据分批,每批含有batch_size个图像
with open("new_image_text.txt") as img_info:
batch_size = 10 # 每个batch的大小
img_batchs = []
img_label_batchs = []
flag = 0
while True:
if flag % batch_size == 0:
img_batchs.append([])
img_label_batchs.append([])
img = img_info.readline()
if(img == ""):
break
img = img.split(" ")
img_batchs[-1].append(img[0])
img_label_batchs[-1].append(int(img[1]))
flag += 1
if flag >=10000: # 避免进入死循环而必须重启项目
break
if img_batchs[-1] == []:
img_batchs.pop()
img_label_batchs.pop()

数据增广

先了解一下Sequential()SomeOf()两种方法之间的区别 ;

iaa.Sequential(children=None,
random_order=False,
name=None,
deterministic=False,
random_state=None)
  • children: 想要应用在图像上的Augmenter或者Augmenter集合。默认None
  • random_order: bool类型, 默认False。是否对每个batch的图片应用不同顺序的Augmenter list。当设置为True时,不同batch之间图片的处理顺序都会不一样,但是同一个batch内顺序相同。
  • deterministic: bool类型, 默认False。
iaa.SomeOf(n=None,
children=None,
random_order=False,
name=None,
deterministic=False,
random_state=None)
  • n: 从总的Augmenters中选择多少个。可以是一个int, tuple, list或者随机值。
  • random_order: 是否每次顺序不一样。
# 数据增广,每张图片扩充30张
img_name = 1000 # 每张图片的名字,依次递增
with open("new_image_text.txt","a") as img_text:
for epoch in range(20): # 原始图片循环增广20次
for someof_n in [1, 1, 2, 2]: # 对应于SomeOf中的参数someof_n
seq = iaa.SomeOf(someof_n, operation_list) # 使用的是SomeOf,区别于Sequential
for batch_ind, img_batch in enumerate(img_batchs):
img_batch = [cv2.imread(path) for path in img_batch]
imgs_aug = seq.augment_images(img_batch)
for i, save_img in enumerate(imgs_aug):
save_img_path = f"NewImage/{str(img_name)}.jpg" # 保存路径
save_img_label = img_label_batchs[batch_ind][i]
cv2.imwrite(save_img_path, save_img) # 保存图片
img_text.write(save_img_path+" "+str(save_img_label)+"\n") # 保存图像列表
img_name += 1

看看效果

参考

  1. imgaug学习笔记
  2. imgaug数据增强神器:增强器一览

数据增广imgaug库的使用的更多相关文章

  1. 【BZOJ-3638&3272&3267&3502】k-Maximum Subsequence Sum 费用流构图 + 线段树手动增广

    3638: Cf172 k-Maximum Subsequence Sum Time Limit: 50 Sec  Memory Limit: 256 MBSubmit: 174  Solved: 9 ...

  2. MariaDB数据库 ----数据库简介,用户管理,数据库创建,数据类型、数据增删改(实例演示)

    数据库简介 数据库--即电子文件柜,用户可以对文件中的数据进行增,删,改,查等操作. 数据库分类 关系型数据库 关系型数据库管理系统(Relational Database Management Sy ...

  3. [板子]最小费用最大流(Dijkstra增广)

    最小费用最大流板子,没有压行.利用重标号让边权非负,用Dijkstra进行增广,在理论和实际上都比SPFA增广快得多.教程略去.转载请随意. #include <cstdio> #incl ...

  4. salesforce 零基础开发入门学习(六)简单的数据增删改查页面的构建

    VisualForce封装了很多的标签用来进行页面设计,本篇主要讲述简单的页面增删改查.使用的内容和设计到前台页面使用的标签相对简单,如果需要深入了解VF相关知识以及标签, 可以通过以下链接查看或下载 ...

  5. C#操作Excel数据增删改查(转)

    C#操作Excel数据增删改查. 首先创建ExcelDB.xlsx文件,并添加两张工作表. 工作表1: UserInfo表,字段:UserId.UserName.Age.Address.CreateT ...

  6. C#操作Excel数据增删改查示例

    Excel数据增删改查我们可以使用c#进行操作,首先创建ExcelDB.xlsx文件,并添加两张工作表,接下按照下面的操作步骤即可 C#操作Excel数据增删改查. 首先创建ExcelDB.xlsx文 ...

  7. hdu 3549 Flow Problem(增广路算法)

    题目:http://acm.hdu.edu.cn/showproblem.php?pid=3549 模板题,白书上的代码... #include <iostream> #include & ...

  8. Power Network (最大流增广路算法模板题)

    Time Limit: 2000MS   Memory Limit: 32768K Total Submissions: 20754   Accepted: 10872 Description A p ...

  9. HDU3549 Flow Problem(网络流增广路算法)

    题目链接. 分析: 网络流增广路算法模板题.http://www.cnblogs.com/tanhehe/p/3234248.html AC代码: #include <iostream> ...

随机推荐

  1. POJ 1681 高斯消元 枚举自由变元

    题目和poj1222差不多,但是解法有一定区别,1222只要求出任意一解,而本题需要求出最少翻转次数.所以需要枚举自由变元,变元数量为n,则枚举的次数为1<<n次 #include < ...

  2. Java:java -jar命令讲解

    1. 当前ssh窗口被锁定,可按CTRL + C打断程序运行,或直接关闭窗口,程序退出 #正常启动jar包 java -jar XXX.jar#当前ssh窗口被锁定,可按CTRL + C打断程序运行, ...

  3. 在web.xml正确加载spring配置文件的方式

    ssm框架整合时一直报出没有创建实例bean的错误,一直以为是代码原因,反复测试了很久,才找到原因是spring配置文件没有正确导入,下图是我的错误示例 web.xml加载spring配置文件的方式主 ...

  4. Docker原理:Namespace

    目录 Namespace UTS Namespae PID Namespace Mount Namespace User Namespace Network Namespace 参考 Namespac ...

  5. varnish配置语言(2)

    目录 1. Backend servers 2. 多个后端 3. Varnish 中的后端服务器和虚拟主机 4. 调度器 5. 健康检查 6. Hashing 7. 优雅模式 Grace mode 和 ...

  6. ECMAScript6.0

    ECMAScript6.0相当于JavaScript的标准,它规定了浏览器脚本语言的标准,发布于2015年,目标是使得 JavaScript 语言可以用来编写复杂的大型应用程序,成为企业级开发语言 N ...

  7. Luogu P2754 星际转移问题

    Luogu P2754 星际转移问题 思路 首先,对于地球能否到达月球的问题,考虑使用并查集维护. 对于每艘飞船能够到达的站点,放进一个集合里,若两艘飞船的集合有交集,那么就合并两个集合,最后只要地球 ...

  8. C语言:fopen

    fopen,传递文件名参数,w+选项读取用fread或fgets,其中fread是按字节读取,fgets每次读取一个字符串写入用fwrite或fputs或fprintf,fwrite按字节写入,fpu ...

  9. c语言:getch() getchar()

    1.getchar();从键盘读取一个字符并输出,该函数的返回值是输入第一个字符的ASCII码:若用户输入的是一连串字符,函数直到用户输入回车时结束,输入的字符连同回车一起存入键盘缓冲区.若程序中有后 ...

  10. [源码解析] 深度学习分布式训练框架 horovod (17) --- 弹性训练之容错

    [源码解析] 深度学习分布式训练框架 horovod (17) --- 弹性训练之容错 目录 [源码解析] 深度学习分布式训练框架 horovod (17) --- 弹性训练之容错 0x00 摘要 0 ...