记录一下这两天用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. 7.7、深入解析openstak工作流程

    1.openstack的使用: (1)使用openstack创建的用户默认是default域,角色是user; (2)域-->角色-->用户-->项目 (3)配额在管理员登录后再项目 ...

  2. 使用Flex实现图片旋转。

    当用flex实现图片旋转的时候,遇到了这样的问题:截图之后,图片还是会继续旋转,应该是canvas这个还有旋转的角度,所以看到效果跟你截图保存下来的效果不一样. 函数: 角度转换为弧度,这里面涉及到了 ...

  3. InterlliJ Debug启动提示:Method breakpoints may dramatically slow down debugging

  4. 解决git同步每次都需要输入用户名、密码

    打开 git bash 执行命令: git config --global credential.helper store

  5. tomcat shutdown后,进程还存在linux系统中的解决办法

    基本原理为启动tomcat时记录启动tomcat的进程id(pid),关闭时强制杀死该进程 第一步 :vim修改tomcat下bin/catalina.sh文件,添加点东西,主要是记录tomcat的p ...

  6. 《计算机组成与体系结构:性能设计》读后小记 12、CPU的结构和功能

    一.CPU组成 1.组成: ALU:算术逻辑单元,完成数据的实际计算或处理 控制器:控制数据的移入移出CPU 寄存器:由一组存储位置极小的内部存储器组成 CPU内部总线:在各寄存器和ALU之间传送数据 ...

  7. SpringMVC(6)数据验证

    在系列SpringMVC(4)数据绑定-1.SpringMVC(5)数据绑定-2中我们展示了如何绑定数据,绑定完数据之后如何确保我们得到的数据的正确性?这就是我们本篇要说的内容 -> 数据验证. ...

  8. IntelliJ idea 中新建Spring项目 并部署到tomcat

    步骤还不熟悉  看的别人的文章做下去的 :https://www.cnblogs.com/yangyquin/p/5285272.html 一:新建Spring项目: 1. 2. 3. 4.然后在We ...

  9. MVC 与 三层架构

    https://www.bilibili.com/video/av29086718/?p=24 MVC: MVC与三层架构进行比较:

  10. lua环境搭建

    前言: Linux & Mac上安装 Lua 安装非常简单,只需要下载源码包并在终端解压编译即可,本文介绍Linux 系统上,lua5.3.0版本安装步骤: ↓ 1. Linux 系统上安装 ...