人工神经网络图像转换

4
我有一组图片(输入和输出),但我不知道如何从A(输入)到B(输出)进行转换。我想录制图像A并得到图像B。物理上我可以改变设置来获得A或B,但我想通过软件来实现。
如果我理解正确,经过训练的人工神经网络能够做到这一点,它能够根据输入给出相应的输出,对吗?是否有任何软件/ANN,只需通过输入一些输入-输出对进行“训练”,就能提供正确的输出,即使输入是新的(但类似于其他图像)?
谢谢

请记住,人工智能(目前)只能学习它被设计学习的内容。如果您找到一个可以为您的输入生成输出图像的人工神经网络,那么它可能会使用其他属性而不是您需要的属性(例如专注于颜色、对比度或像素位置)。 - Daniel
有没有任何可以满足我的需求并且可以进行训练的人工神经网络? - artificialNN
你不能直接将一百万个输入喂给神经网络。你需要先进行信息缩减。将图像转换为缩略图可能是一个选择,但这取决于你的图像彼此之间的差异程度。 - user1196549
4个回答

2
你提出的问题在原则上是可能的——理论上,具有足够多隐藏单元的人工神经网络可以学习任意函数以将输入映射到输出。然而,正如评论和其他答案所提到的,你的具体问题可能存在许多技术问题,这可能使它不实用。我将这些问题归类为(a) 映射复杂性,(b) 模型复杂性,(c) 缩放复杂性和(d) 实现复杂性。它们都有一定的关联,但希望这是一个有用的方式来分解问题。
映射复杂性
正如Springfield762所提到的,有许多可能将一个图像映射到另一个图像的函数。如果你的输入图像和输出图像之间的关系相对简单——比如每个像素的强度增加一个常量值——那么人工神经网络就能够很容易地学习这个映射。可能还有许多其他变换也同样容易学习,例如扭曲、翻转、旋转或平移图像——基本上任何仿射变换都很容易学习。其他非线性变换也可能可行,例如对每个像素的强度进行平方。
总的来说,输入和输出图像之间的关系越复杂,就越难让模型为你学习这个映射。
模型复杂性
从输入到输出的映射越复杂,你的人工神经网络模型就越复杂才能够捕捉到这种映射。过去10年中,已经证明具有许多隐藏层的模型在以前被认为是不可能完成的任务上表现得非常好,但通常这些最先进的模型有数百万甚至数十亿个参数,并且需要在GPU硬件上训练数周。一个简单的模型可以捕捉许多简单的映射,但如果你有一个复杂的输入输出映射要学习,你将需要一个大而复杂的模型。
缩放复杂性
Yves在评论中提到,将模型扩展到典型的图像大小可能很困难。如果你的图像相对较小(目前的技术水平是对100x100像素左右的图像进行建模),那么你可能只需要将一堆原始像素数据投入到人工神经网络模型中,然后看看会发生什么。但如果你使用来自你闪亮的尼康数码单反相机的6000x4000像素的图像,处理这些图像将会非常困难。你最好压缩你的图像数据(PCA是一种常见的技术),然后试图在压缩空间中学习映射。
此外,较大的图像将具有更多可能的映射空间,因此你需要更多的较大图像作为训练数据,而不是如果你有小图像时所需的那么少。
Springfield762还提到了这一点:如果输入和输出图像之间的映射很简单,那么你只需要几个例子就可以成功地学习映射。但是,如果你有一个复杂的映射,那么你需要更多的训练数据才有机会正确地学习映射。

实现复杂性

很少有工具可以让您只需将图像数据投入 ANN 模型中就能得到一个映射。最起码,您需要编写一些代码来预处理图像数据。此外,如果您有大量的大型图像,您可能需要编写代码来处理从磁盘加载数据等操作。(虽然有很多用于此类问题的“大数据”工具,但都需要一定的设置工作)

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

但是,使用这些神经网络工具包,您仍然需要编写一些代码来加载数据,将其处理为适当的输入格式,构建(或加载)网络模型,训练模型等操作。


2
如果您有一些相关的图像对(输入/输出对),并且您不知道输入和输出之间的转换,那么您可以在该训练集上训练ANN来模仿该未知转换。只有当您拥有足够数量的训练图像对时,您才能很好地训练您的ANN,但是当未知转换复杂时,这可能几乎是不可能的。
例如,如果该转换仅通过给定值增加输入图像中像素的强度值,ANN将非常快地学会模仿该行为,但是如果该未知转换是一些复杂的卷积或几个串行卷积或更复杂的内容,则将非常困难,几乎不可能训练ANN来模仿该转换。因此,更复杂的转换需要更大的训练集和更复杂的ANN设计。
有许多免费的开源ANN库,实现了许多语言。您可以从这个教程开始:http://www.codeproject.com/Articles/13091/Artificial-Neural-Networks-made-easy-with-the-FANN

1
你试图解决的问题是典型的分类问题,神经网络可以帮助你解决。你将B图像视为一组标签,与A进行匹配,训练后,神经网络将能够根据网络在高维向量空间中定位新输入的位置,将B图像与新输入进行匹配。我假设您会使用某种卷积网络组合来创建特征,并使用softmax进行输出层的多项式分类。更多信息请参见:http://deeplearning4j.org/convolutionalnets.html

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接