我要投搞

标签云

收藏小站

爱尚经典语录、名言、句子、散文、日志、唯美图片

当前位置:大家发高手网 > 对比度扩展 >

用Keras和“直方图均衡”为深度学习实现“图像扩充”

归档日期:04-17       文本归类:对比度扩展      文章编辑:爱尚语录

  深度神经网络,尤其是卷积神经网络(CNN),非常擅长于图像分类。事实证明,最先进的卷积神经网络在图像识别方面的性能已经超过了人类水平。

  然而,正如我们在杨建先生的“Hot Dog, Not Hot Dog”App(在一个叫做“Silicon Valley”的热门电视节目中的食物识别App)中了解到的,将图像收集起来作为训练数据使用,是一项非常昂贵且耗时的工作。

  我们通过扩充图像数据的方式,从一个已有的数据库中生成更多新的训练图像,以降低收集训练图像的成本。“图像扩充”其实就是从已有的训练数据集中取出一些图像,然后根据这些图像创建出许多修改版本的图像。这样做不仅能够获得更多的训练数据,还能让我们的分类器应对光照和色彩更加复杂的环境,从而使我们的分类器功能越来越强大。以下是来自imgaug的不同的图像扩充例子:

  图像预处理的方法有很多。在本文中,我们将讨论一些常见的、富有创意的方法,这些方法也是Keras深度学习库为扩充图像数据所提供的。之后我们将讨论如何转换keras预处理图像文件,以启用直方图均衡法。我们将使用Keras附带的cifar10数据集,但是为了使任务小到能够顺利在CPU上执行,我们将只会使用其中的猫和狗的图像。

  首先,我们需要加载cifar10数据集并格式化其中的图像,为卷积神经网络做好准备。我们还要检查一下部分图像,确保数据已经完成了正确的加载。

  Cifar10数据集中的图像都是32x 32像素大小的,因此放大来看,它们都呈现出颗粒状。但是对卷积神经网络来说,它看到的不是颗粒,而是数据。

  用Keras进行图像数据的扩充是非常简单的,在这里,我们应该感谢Jason Brownlee,因为是他给我们提供了一个非常全面、到位的Keras图像扩充教程。图象扩充的过程如下:首先,我们需要使用 ImageDataGenerator()函数来创建一个图像生成器,并且输入一系列描述图像更改行为的参数;之后,我们将在这个图像生成器中执行fit()函数,它将会一批一批地对图像进行更改。在默认情况下,图像的更改是任意的,所以并不是所有图像每次都会被更改。你还可以用 keras.preprocessing 函数将扩充的图像导出到一个文件夹,以便建立一个更庞大的扩充图像数据集。

  在本文中,我们将看一些更直观、有趣的扩充图像。你可以在Keras文件中查看所有的ImageDataGenerator参数,以及keras.preprocessing中的其他方法。

  水平翻转图片同样是为分类器生成更多数据的一种经典方式。这么做非常简单,但是我在这里省略了代码和图像,是因为我们在没有看到原始图像的情况下,无法判断一张猫狗的图像是否被水平翻转了。

  直方图均衡,即取一张低对比度图像,并提高图像中最亮和最暗部分之间的对比度,以找出阴影的细微差别,并创建一个更高对比度的图像。使用这个方法所产生的结果相当惊人,尤其是针对那些灰度图像。以下是一些例子:

  在本文中,我们将讨论三种用于提高图像对比度的图像扩充方法。这些方法有时也被称作“直方图拉伸”,因为它们会使用像素强度的分布,并扩展这些分布以适应更大范围的值,从而提高图像中最亮和最暗部分之间的对比度。

  直方图均衡法通过检测图像的像素强度分布,并绘制出一个像素强度直方图,从而提高图像的对比度。之后,这个直方图的分布会被进行分析,如果分析结果显示还有未被利用的像素亮度范围,那么这个直方图就会被“扩展”,以涵盖这些未被利用的范围。然后直方图将被“投射”到图像上,以提高图像的整体对比度。

  “对比度扩展”的过程首先是分析图像中的像素强度分布,然后重新调节图像,使图像能够涵盖在2%至98%之间的所有像素强度。

  在直方图计算方面,“自适应均衡”与常规的直方图均衡有很大的区别。常规的直方图均衡法中,每个被计算的直方图都与图像中的一个部分相对应;但是,它有着在非正常图像部分过度扩充噪声的趋势。

  下面的代码来自于sci-kit图像库的文件。为了使这些代码能够在我们cifar10数据集的第一张图像上执行以上三种图像扩充,我们对代码进行了转换和修改。首先,我们将输入sic-kit图像库中的必要单元,然后对sci-kit图像文件中的代码进行修改和调整,以便查看数据集第一张图片的扩充图像集。

  下面这张图是一张修改后的图像,是由cifar10数据集中的一张对比度较低的猫咪图片修改得到的。正如你所看到的,最后修改的图像成果可能并不像在低对比度灰度图像中得到的图像成果那么令人惊艳,但总的来说图像的画质还是得到了提高。

  现在,我们已经成功地修改了cifar10数据集中的一张图像,我们接下来将要讨论如何调整或改变keras.preprocessing图像文件,从而执行这些不同的直方图修改方法,就像我们利用ImageDataGenerator()函数进行keras图像扩充一样。以下是我们将采取的几个步骤:

  把“IF”的表达语句添加到随即转换的方法中,这样,我们在使用datagenfit()函数的时候,图像扩充就会被执行。

  对keras.preprocessing的图像py文件进行修改和调整的最简单的方式之一就是将文件中的内容复制、粘贴到我们的代码中。这么做的好处是省略了我们下一个输入文件内容的步骤。你可以点击此处查看github上的图像文件。但是,为了确保你拿到的文件是之前输入的文件的相同版本,你最好取你的机器上已有的图像文件。

  运行print(keras._file_)将会打印出你机器上的keras库的路径,其路径(针对IMac用户)大致如下:

  这给我们提供了本机机器上的路径,沿着路径导航,然后进入preprocessing文件夹;在preprocessing文件夹中你就会看到图像py文件,你可以将其中的内容复制到你的代码中。这个文件有点长,但对于初学者来说,这应该是最简单的方法了。

  到这里,你还需要再次检查,以确保你输入的是必须的scikit-image单元,这样复制的image.py才能识别出。

  现在,我们需要给ImageDataGenerator类的方法添加六行代码,这样它就有三个属性来表示我们将要添加的图像扩充类型。下面的代码是从我现在的image.py中复制得来的:

  下面的random_transform()函数呼应我们之前传输至ImageDataGenerator函数的参数。如果我们把“对比度扩展”、“自适应均衡”或“直方图均衡”的参数设置为“True”,那么当我们调用ImageDataGenerator函数的时候,random_transform()函数就会执行所需的图像扩充。

  现在,所有必备的代码都已经准备就绪了,那么我们就可以调用ImageDataGenerator()函数执行直方图修改的方法了。当我们将所有的参数设置为True后,部分图像就会变成这样:

  我不推荐在任何给定的数据集中将一个以上的参数设置为True,你需要确保你的数据集实验有助于你提高分类器的准确性。对于彩色图像,我发现“对比度扩展”的成效优于“直方图修改”或“自适应均衡”的成效。

  最后一步,训练我们的卷积神经网络,并使用 model.fit_generator() 函数验证这个模型,从而实现在扩充图像上的神经网络的训练和验证。

本文链接:http://buffaloruse.net/duibidukuozhan/62.html