第二十一章 数据处理篇:imgaug

news2024/10/7 10:13:08

参考教程:
https://imgaug.readthedocs.io/en/latest/source/jupyter_notebooks.html

文章目录

  • 概述
  • 针对图片的增强
    • 基础使用样例
    • base class: augment
    • 增强的组合
      • sequential
      • someof和oneof
      • sometimes
    • 增强的种类
  • 针对关键点的增强
  • 针对包围框的增强

概述

imgaug是一个使用的数据增强工具,不仅提供了常见的形状和颜色的增强方法,还提供了一些特殊的增强方法,比如说针对keypoint和bounding boxes的增强。

imgaug中的大部分增强方法,都要求你的输入图像是uint8的numpy arrays,并且最好是RGB图像。更具体的类型要求可以参考dtype_support.html

接下来我们按照imgaug提供的notebook中的处理顺序,来看一下各种类型的增强方法。

针对图片的增强

首先我们来看一下基础的针对图像的增强方法,我们使用imageio读入一张图片,使用imageio直接读入的图像通道就是按照RGB排列的,如果使用opencv,需要自行转换成RGB。
在这里插入图片描述

基础使用样例

imgaug中提供了多种增强方法,并且使用起来很简单,只需要实例化某方法并设定好参数后,再将你的图片传入即可。

以放射变化为例:
在这里插入图片描述
我们可以看一下仿射变化的源码:

classimgaug.augmenters.geometric.Affine(scale=None, translate_percent=None, translate_px=None, rotate=None, shear=None, order=1, cval=0, mode='constant', fit_output=False, backend='auto', seed=None, name=None, random_state='deprecated', deterministic='deprecated')

它的输入参数有多个,包括:

  1. scale: 缩放
  2. translate_percent:平移比例
  3. translate_px:平移像素值
  4. rotate:旋转角度
  5. shear:错切角度

在上面的例子中,我们使用的参数是rotate = (-25,25),意思就是旋转的范围在-25度和25度之间。

也可以将一组图像作为输入,要注意这时输入参数是images而不再是image
在这里插入图片描述
并且imgaug中,images是支持不同大小的图像的。

base class: augment

class imgaug.augmenters.meta.Augmenter(seed=None, name=None, random_state='deprecated', deterministic='deprecated')

基本上各种增强方法都是继承了Augmenter这个类,在刚刚的使用例子中提到如果传参使用image就是增强单张图像,使用images就是多张,我们看看源码具体是如何实现的。那么这就首先要来看Augmenter这个class的__call__()方法。

def __call__(self, *args, **kwargs):
        """Alias for :func:`~imgaug.augmenters.meta.Augmenter.augment`."""
        return self.augment(*args, **kwargs)

它实际上调用的是本身的augment的方法。

def augment(self, return_batch=False, hooks=None, **kwargs):

augment方法的固定传参只有两个,一个是return_batch,默认是False。另一个是hooks。这两个参数我们都可以暂时不管它。

在具体的实现上,这个方法对你的传入参数其实是有要求的。

expected_keys = ["images", "heatmaps", "segmentation_maps",
                         "keypoints", "bounding_boxes", "polygons",
                         "line_strings"]
        expected_keys_call = ["image"] + expected_keys

它列举了一些需要被增强的数据的类型,包括图像,关键点等。你传入的kwargs中至少要有一个key包含在expected_keys中。

接下来会构建一个batch,batch中就是你想增强的数据。并按照你设定的方法进行增强处理。

batch = UnnormalizedBatch(
            images=images,
            heatmaps=kwargs.get("heatmaps", None),
            segmentation_maps=kwargs.get("segmentation_maps", None),
            keypoints=kwargs.get("keypoints", None),
            bounding_boxes=kwargs.get("bounding_boxes", None),
            polygons=kwargs.get("polygons", None),
            line_strings=kwargs.get("line_strings", None)
        )
batch_aug = self.augment_batch_(batch, hooks=hooks)

for key in kwargs:
     if key == "image":
         attr = getattr(batch_aug, "images_aug")
         result.append(attr[0])
     else:
         result.append(getattr(batch_aug, "%s_aug" % (key,)))

增强的组合

在imgaug中可以将多个增强方法放在一起使用。增强方法的组合方式也有多种。

sequential

classimgaug.augmenters.meta.Sequential(children=None, random_order=False, seed=None, name=None, random_state='deprecated', deterministic='deprecated')

Sequential的传入参数是一组augmenter,并且在使用时会顺序的执行。也就是你的第二个增强方法要增强的对象,是经过第一个增强方法增强后的结果。
如下例子:执行的顺序是仿射变化,高斯模糊,然后crop。所以你可以明显看到,旋转后空出来的黑边上也有高斯模糊的效果。
在这里插入图片描述
假如调换一下高斯模糊和仿射的顺序。得到的结果中黑色区域就没有模糊效果了。
在这里插入图片描述

someof和oneof

class imgaug.augmenters.meta.SomeOf(n=None, children=None, random_order=False, seed=None, name=None, random_state='deprecated', deterministic='deprecated')

someof可以随机选择多个augmenter中的几个,并用于增强你给的输入图像。它的第一个传入参数n代表了你需要的subset的大小,也可以把它指定成一个tuple,比如(0,None)。None在这里表示最大值。
在这里插入图片描述

class imgaug.augmenters.meta.OneOf(children, seed=None, name=None, random_state='deprecated', deterministic='deprecated')

oneof就是每次只从你给定的增强方法中选择一个来使用。
在这里插入图片描述

sometimes

class imgaug.augmenters.meta.Sometimes(p=0.5, then_list=None, else_list=None, seed=None, name=None, random_state='deprecated', deterministic='deprecated')

sometimes针对的是一组图像,它的作用是只对图像中指定比例进行增强。
如下图,下图中有一半图像被添加了高斯噪声,有一半则经过了仿射变换。

在这里插入图片描述

增强的种类

针对图像的增强,按照实现的效果可以分为以下几类:

  1. 算术

    1. add:在原像素上加上一个值,包括Add:添加单个值,AddElementwise:给像素点添加不同的值,添加不同类型的noise等。
    2. multiply:在原像素上乘上一个值,包括Multiply:乘单个值,MultiplyElementwise:每个像素乘不同的值。
    3. cut:将图中某个区域填充成特定值。包括Cutout:填充一个矩形区域。Dropout:用0填充指定比例的像素。
    4. replace:ReplaceElementwise:用给定值填充指定比例的像素。Salt:用椒盐噪声填充像素。
    5. Invert:反转图像中所有的像素值。包括Invert:把value改为255-value。Solarize:反转超过给定阈值的像素值。
  2. 艺术

    1. cartoon:支持大小在200-800间的图像。
  3. blend
    blend: 混合两张图片。包括BlendAlpha,以代码为例,输入factor,fg,bg等。返回的结果是factor*fg+(1-factor)*bg。此外还包括BlendAlphaMask:使用一个mask,BlendAlphaElementwise:每个像素选取不同的factor。

    classimgaug.augmenters.blend.BlendAlpha(factor=(0.0, 1.0), foreground=None, background=None, per_channel=False, seed=None, name=None, random_state='deprecated', deterministic='deprecated'
    
  4. blur
    blur:对图像添加模糊效果。包括GaussianBlur:高斯模糊,AverageBlur:均值模糊,MedianBlur:中值模糊等。

  5. color

    1. ColorSpace: colorspace相关的增强算法,会进行颜色空间的转换。包括WithColorspace:从a空间转到b,在b上做增强后转回a。WithBrightnessChannels:从某空间转到一个包含亮度通道的空间,修改亮度后转回去原空间。ChangeColorspace:将图片从a空间转到b空间。Grayscale:将图片转成灰度图。
    2. Temperature:包括ChangeColorTemperature,改变图片的色调。
    3. Quantization:包括KMeansColorQuantization:使用聚类方法分配像素,并用聚类中心取代像素值。UniformColorQuantization:使用某种距离算法将像素分为N个bins。
  6. contrast
    contrast: 包括各种对比度调整算法,比如GammaContrast,SigmoidContrast等。

  7. Convolve
    convolve:包括一些可以用卷积核实现的增强操作,比如说自定义卷积核,再比如说锐化,边缘检测等。

  8. flip
    flip:包括水平翻转,垂直翻转,

  9. geometric
    geometric:一些几何变化,包括仿射,缩放,平移,旋转等。

针对关键点的增强

关键点是图像中特点的点,一般标记成位置坐标的形式。当你对图像使用几何类的增强方法时,它的像素位置会发生变化,那么关键点的位置也可能发生改变。

imgaug中的增强方法,可以将image的keypoint也作为输入,让keypoint随着图像一起改变。

在这里插入图片描述
图中是一个大小为(389,259)的袋鼠图片,它包括五个关键点,分别是左眼、右眼、鼻子、左手、右手。使用imgaug中提供的类将它们封装好。

  1. imgaug.augmentables.kps.Keypoint
    是一个简单的类,用于标记单个关键点。
  2. imgaug.augmentables.kps.KeypointsOnImage
    将一组关键点组合在一起,初始化时KeypointsOnImage(keypoints, shape),其中keypoints是关键点的列表,shape是对应的图像的大小。

接下来在图片和关键点上施加一个仿射变化。这个变化涉及到了平移和旋转。
可以看到关键点也随着图像的变化发生了变化。
在这里插入图片描述

针对包围框的增强

和关键点类似,当对图像做几何类的增强变化时,它的包围框也可能受到影响。

imgaug中的增强方法,也可以把包围框作为输入,让它随着图像一起变化。
在这里插入图片描述
图中是一个大小为(298,477)的图片,包括两个小动物,每个动物都有它自己的bounding box。imgaug提供了api将包围框封装起来。

  1. imgaug.augmentables.bbs.BoundingBox(x1, y1, x2, y2, label=None)
    是一个简单的类,用于标记一个包围框。
  2. imgaug.augmentables.bbs.BoundingBoxesOnImage(bounding_boxes, shape)
    包含一个图片中的一组包围框,它的传入参数有两个,第一个是包围框的list,第二个是对应的图像的shape。

接下来在图片和包围框上施加一个仿射变化。这个变化涉及到了平移和旋转。
可以看到包围框也随着图像的变化发生了变化。

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/791195.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【深度学习】GPT-3

2020年5月,OpenAI在长达72页的论文《https://arxiv.org/pdf/2005.14165Language Models are Few-Shot Learners》中发布了GPT-3,共有1750亿参数量,需要700G的硬盘存储,(GPT-2有15亿个参数),它比GPT-2有了极大的改进。根…

PX4常见解锁失败报错及解决方法

文章目录 一、Kill switch engagen二、电源检查CBRK_SUPPLY_CHK三、USB连接检查CBRK_USB_CHK四、安全开关检查CBRK_IO_SAFETY五、high Accelerometer bios六、high gyro bios七、compasss inconsistent八、GPS报错九、Accels inconsistent十、偏航角一直漂移十一、PREFLIGHT FA…

同步编程和异步编程的区别

我在这里用几个例子(附带图文)给你们讲解一下,具体区别。 第一个例子 一、同步 执行步骤: step1 》 step2 》step3 先打印 hello moon, 再打印图片, 等待图片打印完,再打印 hello Jupiter …

全国青少年信息素养大赛Scratch图形化编程_初赛_模拟一卷

全国青少年电子信息智能创新大赛Scratch图形化编程_初赛_模拟一卷 一、选择题 第 1 题 单选题 能让角色在整个舞台范围内的任意位置出现的程序是?( ) A. B. C. D. 第 2 题 单选题 猫抓老鼠游戏的封面上有“开始”按钮和“游戏规则”两…

实战:Docker+Jenkins+Gitee构建CICD流水线

文章目录 前言Jenkins部署创建Jenkins docker-compose配置maven源启动Jenkins容器安装插件Gitee ssh公匙配置与测试项目提交 Jenkins创建流水线写在最后 前言 持续集成和持续交付一直是当下流行的开发运维方式,CICD省去了大量的运维时间,也能够提高开发…

Windows环境部署安装Chatglm2-6B-int4

chatglm2-6B是最近比较火爆的大模型,可以在消费级显卡上部署使用,适合学习。但是一般人也不一定有那么高的硬件配置,所以部署个int4版本应该是大多数人的最好选择。我就在家里部署起了int4版本的chatglm2-6B,记录一下免得忘了。 …

Docker资源限制

Docker资源限制 一、cpu资源控制1、 设置cpu使用率上限2、设置cpu资源占用比(设置多个容器时才有效)3、设置容器绑定指定的CPU 三、内存资源控制四、磁盘IO配额控制1、限制Block IO2、限制bps和iops进行限制 一、cpu资源控制 cgroups是一个非常强大的li…

VMware虚拟机无法自动获取IP地址的解决办法

安装好虚拟机后,网络是ok的,但是关机后,再次开启就不能用了。网上找了好多方法,都不管用,最后恢复默认设置搞定了,实在没办法的可以试一试

【致敬未来的攻城狮计划】第3期 作业汇总贴 + 获奖公布(文末荐书)

目录 一、写在前面 二、种子学员介绍 三、作业贴汇总 四、小小总结 五、获奖公布 六、学员有话说 七、特别致谢 八、友情荐书 一、写在前面 时间过得真快,距离 【致敬未来的攻城狮计划】第3期 的发起,已经过去有些时间了,让我们一起…

FileHub使用教程:Github Token获取步骤,使用快人一步

FileHub介绍 filehub是我开发的一个免费文件存储软件,可存万物。软件仓库:GitHub - Sjj1024/s-hub: 一个使用github作为资源存储的软件 软件下载地址:。有问题可以留言或者提Issue, 使用第一步:获取Github Token 使…

苹果手机充电充不进去什么原因?2023最新解决方法!

最近新买了一部苹果手机,才开心没两天呢,今天突然就发现苹果手机充电充不进了,这是为什么呢?有没有朋友知道呀?” 苹果手机作为目前年轻人比较喜欢的一款手机,也渐渐走进我们的生活。但在使用苹果手机时&am…

windows下载安装nvm并使用安装node

nvm安装 NVM(Node Version Manager)是一个用于管理 Node.js 版本的工具,可以在同一台计算机上安装和切换不同版本的 Node.js 1.官网下载 官网:https://github.com/coreybutler/nvm-windows/releases 2.安装步骤 解压后点击e…

网访问内网机器:基于frp的内网穿透

随缘更新些我自己的博客网站里的文章吧 因为经常需要远程访问自己的机器,所以写一个博客记录一下 公网访问内网机器:基于frp的内网穿透 从公网中访问自己的私有设备向来是一件难事儿。 1. 为什么需要内网穿透? A. 计算机网络 如何在自己的机…

【Lua学习笔记】Lua进阶——Table,迭代器

文章目录 官方唯一指定数据结构--tabletable的一万种用法字典和数组 迭代器ipairs()pairs() 回到Table 在【Lua学习笔记】Lua入门中我们讲到了Lua的一些入门知识点,本文将补充Lua的一些进阶知识 官方唯一指定数据结构–table 在上篇文章的最后,我们指出…

【windows】连接共享打印机提示:0x0000011B

【问题现象】 添加共享打印机的时候, 提示错误:0x0000011B。 【解决方法】 按winr键,在运行输入regedit 然后在注册表中找到路径: 计算机\HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Print 打开后,在右侧…

Android 之 Canvas API 详解 (Part 3) Matrix 和 drawBitmapMesh

本节引言: 在Canvas的API文档中,我们看到这样一个方法:drawBitmap(Bitmap bitmap, Matrix matrix, Paint paint) 这个Matrix可是有大文章的,前面我们在学Paint的API中的ColorFilter中曾讲过ColorMatrix 颜色矩阵,一个4…

Python 生成随机图片验证码

Python 生成随机图片验证码 在写一个Web项目的时候一般要写登录操作,而为了安全起见,现在的登录功能都会加上输入图片验证码这一功能,在利用Django开发Web项目的过程中,可以使用 Python 生成一个如下所示的图片验证码&#xff1a…

MVC与MVVM模式的区别

一、MVC Model(模型):用于处理应用程序数据逻辑,负责在数据库中存取数据。处理数据的crud View(视图):处理数据显示的部分。通常视图是依据模型数据创建的。 Controller(控制器&…

Leetcode-每日一题【剑指 Offer 51. 数组中的逆序对】

题目 在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。输入一个数组,求出这个数组中的逆序对的总数。 示例 1: 解题思路 前置知识 分治法 设计思想: 将规模为n的问题分解为k个规模较小的子问题…

解析LED防蓝光灯珠技术原理

LED防蓝光灯珠能有效减少蓝光对眼睛的持续伤害,通过便携式光谱分析仪对比检测,使用LED防蓝光灯珠后,手机屏幕发出的蓝光强度得到了有效抑制,减少了有害蓝光对眼睛的伤害。LED防蓝光灯珠主要是通过将有害蓝光进行反射,或…