AI 前线导读:图像增强是一种非常强大的技术,针对现有图像人为创建各种变化以扩展图像数据集,例如缩放现有图像、将现有图像旋转几度、剪切或裁剪图像等等。在本文中,我们将使用 imgaug 库探索 Python 中的图像增强技术。我们为什么需要图像增强?

深度学习卷积神经网络(CNN)需要大量图像才能有效训练模型。通过更好的增强有助于提高模型的性能,从而减少过度拟合。可用于分类和对象检测数据集的最流行的数据集具有数千到数百万个图像。

归纳是指在模型训练期间根据以前从未见过的数据进行评估模型的性能测试或验证。由于 CNN 具有不变性,即使在不同大小,方向或不同照明下可见时,它也可以对对象进行分类。因此,我们可以获取图像的小型数据集,并通过放大或缩小,垂直或水平翻转它们或更改亮度来改变对象的大小。这样,我们可以创建丰富、多样化的图像数据集。图像增强可以从一小组图像中创建丰富多样的图像集,以进行图像分类,目标检测或图像分割。在仔细了解问题域之后,需要采用增加训练数据集大小的增强策略。什么时候需要应用图像增强?

在我们训练模型之前,可以将图像增强用作预处理。离线或预处理增强

增强被用作预处理步骤,以增加数据集的大小。通常,当我们有一个小的训练数据集要扩展时,便可以完成此操作。

在较小的数据集上生成扩充很有帮助,但在应用于较大的数据集时,我们需要考虑磁盘空间。在线或实时增强

顾名思义,增强是实时应用的。这通常适用于较大的数据集,因为我们不需要将增强的映像保存在磁盘上。

在这种情况下,我们在小批量中应用转换,然后将其输入模型。

在线增强模型将在每个时期看到不同的图像。在“离线增强”中,增强图像是训练集的一部分,它会根据时期数多次查看增强图像。

该模型可通过在线增强更好地推广,因为它在通过在线数据增强进行训练期间会看到更多样本。

我们将使用 imgaug 类来演示图像增强。基本图像处理技术翻转:垂直或水平翻转图像

旋转:将图像旋转指定的角度。

剪切:像平行四边形一样移动图像的一部分

裁剪:对象以不同比例出现在图像中的不同位置

放大,缩小

改变亮度或对比度

现在,我们将使用 imgaug 库探索这些数据增强技术Imgaug

imgaug 是一个用于图像增强以及关键点 / 地标,边界框,热图和分段图的库。

pip install imgaug

在某些情况下,我们会遇到 Shapely 错误,在这种情况下,我们可以尝试使用以下命令pip install imgaug — upgrade — no-deps

我们将拍摄一张图像,并使用基本的数据增强技术对其进行转换实践。导入所需的库

import imageio

import imgaug as ia

import imgaug.augmenters as iaa

import numpy as np

import pandas as pd

import matplotlib.pyplot as plt

import matplotlib.patches as patches

import matplotlib

%matplotlib inline显示原始图像

我们使用 imageio 显示原始图像image = imageio.imread(“.\\car2.jpeg”)

ia.imshow(image)

旋转影像

我们可以通过指定旋转角度来旋转图像。我们将图像旋转 -50 度到 30 度

rotate=iaa.Affine(rotate=(-50, 30))

rotated_image=rotate.augment_image(image)

ia.imshow(rotated_image)

给图像添加噪点

我们将从高斯分布采样的不同噪声值添加到图像。gaussian_noise=iaa.AdditiveGaussianNoise(10,20)

noise_image=gaussian_noise.augment_image(image)

ia.imshow(noise_image)

裁剪图像

修剪会删除图像侧面的像素列 / 行。在下面的示例中,我们将图像的一侧裁剪了 30%

crop = iaa.Crop(percent=(0, 0.3)) # crop image

corp_image=crop.augment_image(image)

ia.imshow(corp_image)

扭曲图像

设置 0 到 40 度shear = iaa.Affine(shear=(0,40))

shear_image=shear.augment_image(image)

ia.imshow(shear_image)

翻转图像

我们可以垂直或水平翻转图像。Fliplr 水平翻转图像

#flipping image horizontally

flip_hr=iaa.Fliplr(p=1.0)

flip_hr_image= flip_hr.augment_image(image)

ia.imshow(flip_hr_image)

垂直翻转图像flip_vr=iaa.Flipud(p=1.0)

flip_vr_image= flip_vr.augment_image(image)

ia.imshow(flip_vr_image)

改变图像的亮度

我们使用 GammaContrast 通过缩放像素值来调整图像亮度。在 gamma =(0.5,2.0)范围内的值似乎是明智的。我们也可以使用 SigmoidContrast 或 LinearContrast 来更改图像的亮度

image = imageio.imread(“.\\img Aug\\car2.jpeg”)

contrast=iaa.GammaContrast(gamma=2.0)

contrast_image =contrast.augment_image(image)

ia.imshow(contrast_image)

缩放图像

我们可以使用缩放来放大或缩小图像。我们已将图像缩放到图像高度 / 宽度的 150%至 80%。我们可以独立缩放每个轴

增强物体检测

我们绘制边界框以进行对象检测。当我们放大图像时,我们希望包围盒也相应地更新。

imgaug 支持边界框。当我们旋转,剪切或裁剪图像时,对象周围的边界框也会相应更新。

从 imgaug 导入边界框from imgaug.augmentables.bbs import BoundingBox, BoundingBoxesOnImage

初始化原始图像周围的边界框

bbs = BoundingBoxesOnImage([

BoundingBox(x1=10, x2=520, y1=10, y2=300)

], shape=image.shape)

在原始图像上方显示边框ia.imshow(bbs.draw_on_image(image, size=2))

在下面的代码中,我们使用 translate_percentage 移动图像,扩大边界框并将其应用于图像上

move=iaa.Affine(translate_percent={'x': 0.1}, scale=0.8)

image_aug, bbs_aug = move(image=image, bounding_boxes=bbs)

ia.imshow(bbs_aug.draw_on_image(image_aug, size=2))

应用图像增强后在图像外部处理边界框

边框有时可能会超出图像,因此我们需要其他代码来处理这种情况

我们旋转图像,并尝试在对象周围绘制边框rotate_bb=iaa.Affine(rotate=(-50, 30))

image_aug, bbs_aug = rotate_bb(image=image, bounding_boxes=bbs)

ia.imshow(bbs_aug.draw_on_image(image_aug, size=2))

边界框的部分在图像外部。在下面的代码中,我们将将边框完全或部分移出图像

裁剪部分位于外部的边界框,使其完全位于图像内部

我们创建一个 padding 函数,以 1 像素的白色边框和 1 像素的黑色边框填充图像:

def pad(image, by):

image_border1 = ia.pad(image, top=1, right=1, bottom=1, left=1,

mode='constant', cval=255)

image_border2 = ia.pad(image_border1, top=by-1, right=by-1,

bottom=by-1, left=by-1,

mode='constant', cval=0)

return image_border2

然后,我们在图像上绘制边界框。我们首先将图像平面扩展 BORDER 像素,然后标记图像平面内的边界框def draw_bbs(image, bbs, border):

GREEN = [0, 255, 0]

ORANGE = [255, 140, 0]

RED = [255, 0, 0]

image_border = pad(image, border)

for bb in bbs.bounding_boxes:

if bb.is_fully_within_image(image.shape):

color = GREEN

elif bb.is_partly_within_image(image.shape):

color = ORANGE

else:

color = RED

image_border = bb.shift(left=border, top=border)\

.draw_on_image(image_border, size=2, color=color)

return image_border

现在,我们对图像应用相同的旋转并绘制边界框

rotate=iaa.Affine(rotate=(-50, 30))

image_aug, bbs_aug = rotate(image=image, bounding_boxes=bbs)

image_after = draw_bbs(image_aug, bbs_aug.remove_out_of_image().clip_out_of_image(), 100)

ia.imshow(image_after)

python 图像增强_Python中的图像增强技术相关推荐

  1. python字符集_PYTHON 中的字符集

    Python中的字符编码是个老生常谈的话题,今天来梳理一下相关知识,希望给其他人些许帮助. Python2的 默认编码 是ASCII,不能识别中文字符,需要显式指定字符编码:Python3的 默认编码 ...

  2. python参数化_Python 中如何实现参数化测试的方法示例

    之前,我曾转过一个单元测试框架系列的文章,里面介绍了 unittest.nose/nose2 与 pytest 这三个最受人欢迎的 Python 测试框架. 本文想针对测试中一种很常见的测试场景,即参 ...

  3. kafka python框架_Python中如何使用Apache Avro——Apache的数据序列化系统

    了解如何创建和使用基于Apache Avro的数据,以实现更好,更有效的传输. 在这篇文章中,我将讨论Apache Avro,这是一种开源数据序列化系统,Spark,Kafka等工具正在使用该工具进行 ...

  4. python标准化_python中标准化

    广告关闭 腾讯云11.11云上盛惠 ,精选热门产品助力上云,云服务器首年88元起,买的越多返的越多,最高返5000元! sdk 3.0 实现了统一化,各个语言版本的 sdk具备使用方法相同.接口调用方 ...

  5. python屏幕文字识别_python中使用OCR 技术进行《文字识别》

    # 导入组件 from uiautomatorimport deviceas d import pytesseract from PILimport Image import os import ti ...

  6. python 线性回归_Python中的简化线性回归

    python 线性回归 In the area of Machine Learning, one of the first algorithms that someone can come acros ...

  7. python语音识别_Python中的语音识别-完整的入门指南

    python语音识别 Welcome to The Complete Beginner's Guide to Speech Recognition in Python. 欢迎使用Python语音识别完 ...

  8. python 余数_python中两数相除取余数怎么运算

    在Python中取余数可以通过取模运算符%或通过divmod()函数来计算. 1.取模运算符%: 所谓取模运算,就是计算两个数相除之后的余数,符号是%.如a % b就是计算a除以b的余数.用数学语言来 ...

  9. python有向图_Python 中的垃圾回收机制

    一.概述 python采用的是引用计数机制为主,标记-清除和分代收集(隔代回收)两种机制为辅的策略. 现在的高级语言如java,c#等,都采用了垃圾收集机制,而不再是c,c++里用户自己管理维护内存的 ...

最新文章

  1. 利用kickstart自动安装虚拟机
  2. 三层交换不同VLAN间通信
  3. 控制寄存器和系统地址寄存器
  4. 网站性能分析(下)-让网站并行加载但顺序执行JS
  5. 简单记录一下fabric版本1.4的环境搭建,
  6. CString 用法
  7. exsi vmfs 没了_它是“推粪机”,隔三差五吃一盘,口臭没了排出宿便,肠道变干净...
  8. javaEE的开发模式
  9. 设计模式(结构型模式)——装饰模式(Decorator)
  10. Docker的思想来自于集装箱
  11. Intel 8042键盘控制器详细介绍
  12. 二极管计算机原理,TVS二极管原理及其应用电路图
  13. uni-app实现android,ios打包过程详解
  14. java jar 最大内存大小_Java运行Jar包内存配置的操作
  15. 语义分析(semantic analysis)概述
  16. python之魔术方法
  17. layui ajax初始化,layui-滑块验证的动态修改及初始化
  18. 机器学习实战5-sklearn训练SVM模型分类回归(make_moons数据集)
  19. Visual Studio 2017 : client version 1.22 is too old
  20. 我的.Net Core 3.0 windows 桌面程序界面绘制 -- 从.net framework复制代码法

热门文章

  1. steam仓库清单文件生成
  2. linux 编辑文件
  3. 新卡盟排行榜源码 卡盟门户源码多个搜索引擎首页自适应模板
  4. 奋斗在JAVA路上的随手记——函数式接口
  5. 还是不够快?几个方法帮你加快Python运行速度
  6. 130.s1-短信的备份
  7. JS 遍历本地文件夹中的内容
  8. ubuntu建立和删除软连接
  9. Twemproxy简介
  10. MongooseError: Operation `XXX` buffering timed out after 10000ms