记录一下这两天用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 1873 The Fortified Forest 凸包 二进制枚举

    n最大15,二进制枚举不会超时.枚举不被砍掉的树,然后求凸包 #include<stdio.h> #include<math.h> #include<algorithm& ...

  2. Centos7搭建k8s集群

    一.部署环境 操作系统:CentOS Linux release 7.6.1810 (Core) 安装软件: docker:18.06.3-ce kubernetes:v1.15.4 二.部署架构: ...

  3. nexus AD 集成配置

    nexus AD 集成配置 管理用户登录 点击设置图标-->LDAP-->Create connection 进入AD 集成配置页面 Connection配置 User and group ...

  4. Java Set HashSet

    import java.util.HashSet; import java.util.Set; /** Set存储特点:数据无序.不可重复 Set接口的实现类: HashSet:Set接口的主要实现类 ...

  5. Linux:监测收集linux服务器性能数据工具Sysstat的使用与安装

    Sysstat是一个工具集,包括sar.pidstat.iostat.mpstat.sadf.sadc.其中sar是其中最强大,也是最能符合我们测试要求的工具,同时pidstat也是非常有用的东东,因 ...

  6. Cent OS下安装JDK11

    自己云服务器以前装了个JDK1.7,最近发现出了jdk11,所以修改一下JDK版本: 我这里用的是Xshell和XFtp工具,下载地址:https://www.netsarang.com/downlo ...

  7. 想成为Java高手的25个学习目标

    本文将告诉你学习Java需要达到的25个目标,希望能够对你的学习及找工作有所帮助.对比一下自己,你已经掌握了这25条中的多少条了呢? 1.你需要精通面向对象分析与设计(OOA/OOD).涉及模式(GO ...

  8. java.lang.Excetion,java.lang.RuntimeException,java.lang.Error有什么区别?

    Error类对象由Java虚拟机生成并抛出,Exception类对象由应用程序处理或抛出 Error表示恢复不是不可能但很困难的情况下的一种严重问题.比如说内存溢出.不可能指望程序能处理这样的情况. ...

  9. 关于mysql binlog二进制

    binlog 在mysql中,当发生数据变更时,都会将变更数据的语句,通过二进制形式,存储到binlog日志文件中. 通过binlog文件,你可以查看mysql一段时间内,对数据库的所有改动. 也可以 ...

  10. 计算机网络体系结构整理-第二单元IP技术

    IP技术 1.IPV4 Ipv4的报头格式 Ipv4地址分为ABCDE类, 类别 IP地址范围 私有IP地址范围 A 0.0.0.0-127.255.255.255 10.0.0.0-10.255.2 ...