人工神经网络图像变换

时间:2015-07-24 11:48:18

标签: image neural-network transform

我有一对图像(输入 - 输出),但我不知道从A(输入)到B(输出)的转换。我想记录图像A并获得图像B.物理上我可以更改设置以获得A或B,但我想通过软件来完成。

如果我理解得很好,训练有素的人工神经网络能够做到这一点,输入可以给出相应的输出,是不是? 是否有任何软件/人工神经网络只是"培训"如果输入是一个新的(但与其他相似的)图像,输入多个输入 - 输出对将能够提供正确的输出吗?

由于

3 个答案:

答案 0 :(得分:2)

如果您有一些相关数量的图像对(输入/输出对)并且您不知道输入和输出之间的转换,您可以在该训练集上训练ANN来模仿未知的转换。只有当你有足够数量的训练图像对时,你才能很好地训练你的神经网络,但是当这个未知的变换很复杂时,这可能是非常不可能的。

例如,如果该变换只是增加输入图像中像素的强度值给定值,ANN将非常快速地学习模仿该行为,但如果该未知变换是一些复杂的卷积或少数串行卷积或更复杂的东西,它将非常努力,几乎不可能训练人工神经网络来模仿这种转变。因此,更复杂的转换需要更大的训练集和更复杂的ANN设计。

有许多免费的开源ANN库以多种语言实现。您可以从该教程开始:http://www.codeproject.com/Articles/13091/Artificial-Neural-Networks-made-easy-with-the-FANN

答案 1 :(得分:2)

您所要求的原则是可行的 - 理论上,具有足够多隐藏单元的ANN可以学习将输入映射到输出的任意函数。但是,正如评论和其他答案所提到的,您的特定问题可能存在许多技术问题,这些问题可能会使其变得不切实际。我将这些问题归类为(a)映射复杂性,(b)模型复杂性,(c)扩展复杂性,以及(d)实现复杂性。它们都有些相关,但希望这是一种有用的方法来解决问题。

映射复杂性

如Springfield762所述,有许多可能的功能可以从一个图像映射到另一个图像。如果输入图像和输出图像之间的关系相对简单 - 比如将每个像素的强度增加一定量 - 那么ANN就能够毫不费力地学习这种映射。可能还有很多其他类似的易于学习的转换,例如倾斜,翻转,旋转或翻译图像 - 基本上任何affine transformation都很容易学习。其他非线性变换也是可行的,例如平方每个像素的强度。

作为一般规则,输入和输出图像之间的关系越复杂,让模型为您学习此映射就越困难。

模型复杂性

从输入到输出的映射越复杂,您的ANN模型就越能够捕获此映射。在过去10年中,已经展示了具有许多隐藏层的模型,以便在人们以前认为不可能完成的任务上表现得非常好,但这些最先进的模型通常具有数百万甚至数十亿的参数并需要数周时间才能进行训练。 GPU硬件。一个简单的模型可以捕获许多简单的映射,但是如果你有一个复杂的输入输出映射来学习,那么你需要一个庞大而复杂的模型。

缩放复杂度

Yves在评论中提到,将模型缩放到典型图像尺寸可能很困难。如果您的图像相对较小(目前最先进的是对大小为100x100像素的图像进行建模),那么您可以在ANN模型中抛出一堆原始像素数据,看看会发生什么。但是,如果您使用闪亮的尼康数码单反相机中的6000x4000图像,那么在合理的时间内处理这些图像会非常困难。最好以某种方式压缩图像数据(PCA是一种常用技术),然后尝试学习压缩空间中的映射。

此外,较大的图像会在它们之间留出更大的可能映射空间,因此您需要更多的较大图像作为训练数据,而不是使用小图像。

Springfield762也提到了这一点:如果您的输入和输出图像之间的映射很简单,那么您只需要几个示例即可成功学习映射。但是如果你有一个复杂的映射,那么你需要更多的训练数据才有机会正确地学习映射。

实施复杂性

不太可能存在一种工具,它可以让您将图像数据投入ANN模型并显示映射。最有可能的是,您至少需要实现一些预处理图像数据的代码。另外,如果你有很多大图像,你可能需要编写代码来处理从磁盘加载数据等等。(有很多"大数据"工具用于这样的事情,但它们都需要一些工作才能建立起来。)

现在有很多很多开源的ANN工具包。 FANN(已经提到过)是C ++中的一种流行的,带有其他语言的绑定。 Caffe非常受欢迎,也可以使用绑定在C ++中实现。似乎有许多工具包使用Python和Theano或其他一些GPU加速库 - KerasLasagneHebelPylearn2neonTheanets(我写了这篇文章)。许多人使用Lua编写的Torch。 Matlab至少有一个神经网络工具箱。我对其他生态系统不熟悉,但Java似乎有Deeplearning4j,C#有Accord,甚至R有darch

但是对于任何这些神经网络工具包,您将不得不编写一些代码来加载数据,将其处理为适当的输入格式,构建(或加载)网络模型,训练模型,等

答案 2 :(得分:0)

自从写了这篇文章以来,在cgan(有条件的生成对抗网络)领域中已经做了很多工作,请参考: https://arxiv.org/pdf/1611.07004.pdf