Jamshed Khan作者Geek AI、Chita编译

人工智能是摄影的未来还是摄影技术的末日?

AI可以生成以假乱真的假图像甚至假视频的新闻早已不是新鲜事,这一切都得益于GAN网络。除了生成这些逼真的图像,它还能修复破损图像或者扩展当前图像。不难想象,未来它可能不仅能生成高分辨率的精确图像,还能够创建整段视频。这对摄影技术来说,到底是好是坏呢?



每当我们听到「人工智能」、「机器学习」或者「机器人」这样的词汇时,大多数人都会很容易联想到一个像科幻电影中那种能够行走、说话的机器人,然后不由自主地想象遥远的未来。

图源:Giphy

拜托,醒醒吧!实际上,人工智能技术已经伴随我们很多年了,现在它们正逐渐被嵌入到你的智能手机(比如Siri、谷歌助手。)以及汽车的 GPS 系统中,甚至在你阅读完这篇文章后,它还会想到接下来要向你推荐哪篇文章。然而,在过去几年中,没有哪个领域像计算机视觉这样受到了如此大的影响。

随着技术的进步,非常吸引视觉的超高分辨率图像变得越来越普遍。人们不必再学习使用 Photoshop 或 CorelDRAW 这样的工具来增强和修改图像了。为了得到尽可能好的图像,人工智能技术已经被应用到了图像增强和操作的各个方面。然而,最新涌现出来的想法实际上是使用人工智能来进行合成,从而生成图像。

以前,几乎每一张你看过的图像都是被拍摄下来或者由人手动创作的。可能有数百种手动生成图像的工具,但是它们都需要由人来主导这个过程。然而,想象一下,如果一个计算机程序可以从零开始绘制出你想要它画的所有内容会怎样?微软的 Drawing Bot 可能是第一个也是唯一一个实现了这个目标的技术。想象一下,在不久的将来,你可以直接在智能手机上下载一个应用程序,然后给它发出类似「我想要一张我站在埃菲尔铁塔旁边的照片」的命令(不过要确保你的表述是正确的)。
图源:Blazepress

生成对抗网络

「GAN 是过去十年中机器学习领域最有趣的想法!」——Yann LeCun

生成这种合成图像的基础在于生成对抗网络。自 2014 年 Ian Goodfellow 和他的同事发现并在论文《Generative Adversarial Networks》中发表GAN以来,GAN 就一直是深度学习中最具吸引力且应用最广泛的方法之一。这项技术无止尽的应用是对抗训练的核心,它不仅包括计算机视觉,还包括数据分析、机器人技术和预测建模领域。

那么 GAN 的神奇之处究竟在哪里呢?

生成对抗网络属于生成模型的范畴。这意味着 GAN 的工作是在完全自动化的过程中创建或「生成」新数据。
Goodfellow 的论文中给出的生成图像示例

顾名思义,GAN 实际上是由两个独立的相互竞争(以对抗的方式)的神经网络组成的。其中一个神经网络是生成器,它从随机噪声中生成新的数据实例,而另一个神经网络称为判别器,它对这些实例的真伪进行评估。换句话说,判别器会判定它检查的每个数据实例是否属于真实的训练数据集。

一个简单的例子

假设你的任务是仿造一个著名艺术家画的画。但你不知道这位艺术家是谁,甚至也没见过他的画。但是你需要伪造一幅他的画,并作为原作之一在拍卖会上展出。所以,你决定试一试。你需要的所有材料就是一些颜料和画布,对吧?然而,拍卖商不希望有赝品,他们只想要真品,所以他们雇佣了一名侦探,他将首先核实拍卖会上出现的所有展品。而且,侦探有该艺术家原作的样本,所以如果你拿出的是自己随便仿造的画,他马上就会知道这不是原作。

图源:GitHub

当他否定了这幅画后,你决定再试一次。但这一次,你获得了一些有用提示,因为侦探在评估你的画时透露了一些关于这幅画的信息。

当你再尝试的时候,你画出的画应该会好一点。但侦探还是没有被说服,又拒绝了你。所以你一次又一次地尝试,每次利用某种形式的反馈来修正这幅画,让它变得越来越好(假设侦探不介意你没完没了地把画拿回来)。最后,经过一千多次的尝试,你终于能够做出近乎完美的复制品。当侦探看着他的样画时,他不确定你递给他的是真迹,还是与这位著名艺术家风格和笔触相同的其它东西。

GAN 的工作流程是怎样的?

将相同的思路应用到一个神经网络组合上,我们可以得到如下的 GAN 训练过程:
基础的 GAN 框架(图源:Medium)

  1. 生成器最初接收一些随机噪声并将其传递给判别器。

  2. 因为判别器可以访问真实图像的数据集,所以它将它们与从生成器那里接收到的图像进行比较,并评估其真实性。

  3. 由于初始图像只是随机噪声,所以此时生成器的输出将被评估为假的。

  4. 生成器通过改变参数来不断尝试,以便生成更真实的图像。

  5. 随着训练的进行,这两个网络都会变得越来越聪明。

  6. 最后,生成器会创建一个与真实图像数据集中的图像难以区分的图像。而这个判别器不够聪明,无法分辨出给定的图像是真还是假。

  7. 此时,训练结束,生成的图像就是我们的最终结果。

    GAN生成汽车标识图像的过程

    是时候看看代码了

    下面是一个在PyTorch中实现的基本生成网络:

import argparse
import os
import numpy as np
import math

import torchvision.transforms as transforms
from torchvision.utils import save_image

from torch.utils.data import DataLoader
from torchvision import datasets
from torch.autograd import Variable

import torch.nn as nn
import torch.nn.functional as F
import torch

os.makedirs('images', exist_ok=True)

parser = argparse.ArgumentParser()
parser.add_argument('--n_epochs', type=int, default=200, help='number of epochs of training')
parser.add_argument('--batch_size', type=int, default=64, help='size of the batches')
parser.add_argument('--lr', type=float, default=0.0002, help='adam: learning rate')
parser.add_argument('--b1', type=float, default=0.5, help='adam: decay of first order momentum of gradient')
parser.add_argument('--b2', type=float, default=0.999, help='adam: decay of first order momentum of gradient')
parser.add_argument('--n_cpu', type=int, default=8, help='number of cpu threads to use during batch generation')
parser.add_argument('--latent_dim', type=int, default=100, help='dimensionality of the latent space')
parser.add_argument('--img_size', type=int, default=28, help='size of each image dimension')
parser.add_argument('--channels', type=int, default=1, help='number of image channels')
parser.add_argument('--sample_interval', type=int, default=400, help='interval betwen image samples')
opt = parser.parse_args()
print(opt)

img_shape = (opt.channels, opt.img_size, opt.img_size)

cuda = True if torch.cuda.is_available() else False

class Generator(nn.Module):
    def __init__(self):
        super(Generator, self).__init__()

        def block(in_feat, out_feat, normalize=True):
            layers = [nn.Linear(in_feat, out_feat)]
            if normalize:
                layers.append(nn.BatchNorm1d(out_feat, 0.8))
            layers.append(nn.LeakyReLU(0.2, inplace=True))
            return layers

        self.model = nn.Sequential(
            *block(opt.latent_dim, 128, normalize=False),
            *block(128, 256),
            *block(256, 512),
            *block(512, 1024),
            nn.Linear(1024, int(np.prod(img_shape))),
            nn.Tanh()
        )

    def forward(self, z):
        img = self.model(z)
        img = img.view(img.size(0), *img_shape)
        return img

class Discriminator(nn.Module):
    def __init__(self):
        super(Discriminator, self).__init__()

        self.model = nn.Sequential(
            nn.Linear(int(np.prod(img_shape)), 512),
            nn.LeakyReLU(0.2, inplace=True),
            nn.Linear(512, 256),
            nn.LeakyReLU(0.2, inplace=True),
            nn.Linear(256, 1),
            nn.Sigmoid()
        )

    def forward(self, img):
        img_flat = img.view(img.size(0), -1)
        validity = self.model(img_flat)

        return validity

# Loss function
adversarial_loss = torch.nn.BCELoss()

# Initialize generator and discriminator
generator = Generator()
discriminator = Discriminator()

if cuda:
    generator.cuda()
    discriminator.cuda()
    adversarial_loss.cuda()

# Configure data loader
os.makedirs('../../data/mnist', exist_ok=True)
dataloader = torch.utils.data.DataLoader(
    datasets.MNIST('../../data/mnist', train=True, download=True,
                   transform=transforms.Compose([
                       transforms.ToTensor(),
                       transforms.Normalize((0.5, 0.5, 0.5), (0.5, 0.5, 0.5))
                   ])),
    batch_size=opt.batch_size, shuffle=True)

# Optimizers
optimizer_G = torch.optim.Adam(generator.parameters(), lr=opt.lr, betas=(opt.b1, opt.b2))
optimizer_D = torch.optim.Adam(discriminator.parameters(), lr=opt.lr, betas=(opt.b1, opt.b2))

Tensor = torch.cuda.FloatTensor if cuda else torch.FloatTensor

# ----------
#  Training
# ----------

for epoch in range(opt.n_epochs):
    for i, (imgs, _) in enumerate(dataloader):

        # Adversarial ground truths
        valid = Variable(Tensor(imgs.size(0), 1).fill_(1.0), requires_grad=False)
        fake = Variable(Tensor(imgs.size(0), 1).fill_(0.0), requires_grad=False)

        # Configure input
        real_imgs = Variable(imgs.type(Tensor))

        # -----------------
        #  Train Generator
        # -----------------

        optimizer_G.zero_grad()

        # Sample noise as generator input
        z = Variable(Tensor(np.random.normal(0, 1, (imgs.shape[0], opt.latent_dim))))

        # Generate a batch of images
        gen_imgs = generator(z)

        # Loss measures generator's ability to fool the discriminator
        g_loss = adversarial_loss(discriminator(gen_imgs), valid)

        g_loss.backward()
        optimizer_G.step()

        # ---------------------
        #  Train Discriminator
        # ---------------------

        optimizer_D.zero_grad()

        # Measure discriminator's ability to classify real from generated samples
        real_loss = adversarial_loss(discriminator(real_imgs), valid)
        fake_loss = adversarial_loss(discriminator(gen_imgs.detach()), fake)
        d_loss = (real_loss + fake_loss) / 2

        d_loss.backward()
        optimizer_D.step()

        print ("[Epoch %d/%d] [Batch %d/%d] [D loss: %f] [G loss: %f]" % (epoch, opt.n_epochs, i, len(dataloader),
                                                            d_loss.item(), g_loss.item()))

        batches_done = epoch * len(dataloader) + i
        if batches_done % opt.sample_interval == 0:
            save_image(gen_imgs.data[:25], 'images/%d.png' % batches_done, nrow=5, normalize=True)


优点和缺点

和其它所有的技术一样,GAN 也有其特有的优缺点。本文将在不深入研究细节的情况下总结 GAN 的一些优缺点:

以下是 GAN 的一些潜在优势:

  • GAN 并不一定要用带标签的样本来训练。

  • 由于 GAN 不需要在样本中依次生成不同的条目,它们比与其它生成模型(如信念网络)生成样本的速度更快。

  • GAN比使用蒙特卡洛方法逼近对数配分函数( log partition function)梯度的生成模型更易训练。因为蒙特卡洛方法在高维空间中不能很好地工作,这样的生成模型不能执行像使用 ImageNet 进行训练这样的现实任务。

  • GAN 不需要引入任何决定性偏置(deterministic bias)。某些像变分自编码器这样的生成方法引入了决定性偏置,因为它们优化了对数似然的下界,而不是似然本身。这似乎导致变分自编码器生成的实例比 GAN 生成的实例更模糊。
    同时,GAN 也具有下列缺点:

  • GAN 很难训练。这些网络试图优化的函数是本质上没有封闭形式的损失函数(不像对数损失或平方误差这样的标准损失函数)。因此,优化这种损失函数是非常困难的,需要对网络架构和训练协议进行大量的反复试错。

  • 特别是对于图像生成任务,目前还没有合适的测量方法来评估准确率。由于合成的图像对于计算机本身来说可能是可以接受的,因此评估实际的生成结果是一个非常主观的问题,取决于人类观测者的看法。因此我们现在可以用「Inception Score」和「 Frechet Inception Distance」这样的函数来衡量它们的性能。

GAN 的应用

有趣的部分来了!下面将列举出我们可以使用 GAN 做的所有神奇之事。在所有潜在的用法中,GAN 在计算机视觉领域有着广泛的应用。


文本到图像的转换

对于这一概念,有很多实现方法,如 TAC-GAN(以文本为条件的辅助分类器生成对抗网络) 。它们被用于根据文本描述合成对应的图像。
图左:TAC-GAN 架构。图右:将一行文本输入网络后生成的结果。

领域迁移

GAN 在风格迁移等工作中非常受欢迎。它包括使用特殊类型GAN(称为 CGAN,条件生成对抗网络)的图像到图像迁移。绘画和概念设计从未变得像现在这么简单。但是,虽然 GAN 可以根据下面这个手提包的草图完成像这样的简单绘画,但是画更复杂的东西(比如完美的人脸)目前还不是GAN 的强项。事实上,它对某些事物的生成结果相当可怕。
CGAN pix2pix 的生成结果(图源:GitHub)

图像修复(Inpainting )和扩展(Outpainting)

生成网络两个令人激动的应用是图像修复和图像扩展。图像补全包括填补图像中的缺失部分或噪声,这可以被看做是对图像的修补。例如,给定一张有孔洞或缺口的图像,GAN 应该能够以一种「可接受」的方式来修正它。另一方面,图像扩展涉及使用网络自身的学习能力来想象图像在当前的边界之外应该是什么样子。
图像修复(图左)和图像扩展(图右)的生成结果(图源Githu)

人脸图像合成

得益于生成网络,人脸合成成为了可能,它包括从不同角度生成单张人脸图像。这也解释了为什么面部识别系统不需要数百张人脸样本,而是仅使用一张就能识别出人脸来。不仅如此,生成假的人脸图像也成为了可能。英伟达最近基于Celeba Hq 数据集,使用GAN 2.0 生成了高分辨率的假人脸,这是第一个以高分辨率生成合成图像的实例。
由 Progressive GAN 生成的虚构名人人脸图像(图源: NVIDIA)

基于 GAN 的面部动画生成(GANimation)

GANimation 是一种基于动作单元(AU)标注的新型 GAN 条件化方法,它在连续流形中描述了定义人脸表情解剖结构的运动。
GANimation 的官方实现(图源:GitHub)

绘画到照片的迁移

通过 GAN 使图像变得更真实的另一个例子是:直接地将一幅好画转换成一张照片。这是用一种叫做 CycleGAN 的特殊 GAN 做到的。CycleGAN 使用了两个生成器和两个判别器。我们将一个生成器称为 G,让它把图像从 X 域转换到 Y 域。将另一个生成器称为 F,它将图像从 Y 域转换到 x 域。每个生成器都有一个相应的判别器,该判别器试图将生成器合成的图像与真实图像区分开来。
CycleGAN 的生成结果(图源:GitHub)

我们将走向何方?

在不久的将来,机器学习和 GAN 必将对成像和摄影产生巨大的影响。目前,该技术能够根据文本输入生成简单的图像。然而,可以预见,未来它将不仅能够生成高分辨率的精确图像,还能够创建整段视频。想象一下,你只需将脚本输入 GAN 即可生成整部电影!不仅如此,每个人都可以使用简单的交互式APP来创建自己的电影(甚至可以由自己主演!)这种技术会是真正的摄影技术、导演和表演的末日吗?

酷炫的技术也意味着潜在的邪恶用途。人们还需要一种方法来识别和检测完美的假图像,需要对这类图像生成进行监管。目前,GAN 已经被用于制作假视频或「高仿作品」,这些假视频或「高仿作品」正被负面地使用,比如制作名人的假色情视频,或者在人们不知情的情况下以他们的形象发表言论。将音频和视频合成技术提供给普通大众的后果是可怕的。

人工图像生成技术是一柄双刃剑,尤其是在人们对它知之甚少的情况下。生成对抗网络是一个非常有用的工具,同时它也很危险。可以肯定的是,它将重塑技术世界,但是它将通过怎样的路径做到这一点,还有待思考。


原文链接:https://medium.com/sfu-big-data/ai-the-future-of-photography-c7c80baf993b

产业摄影GAN
2
相关数据
微软机构

微软是美国一家跨国计算机科技公司,以研发、制造、授权和提供广泛的计算机软件服务为主。总部位于美国华盛顿州的雷德蒙德,最为著名和畅销的产品为Microsoft Windows操作系统和Microsoft Office办公室软件,以及Xbox的游戏业务。微软是美国《财富》杂志2015年评选的世界500强企业排行榜中的第95名。

https://www.microsoft.com/en-us/about
深度学习技术

深度学习(deep learning)是机器学习的分支,是一种试图使用包含复杂结构或由多重非线性变换构成的多个处理层对数据进行高层抽象的算法。 深度学习是机器学习中一种基于对数据进行表征学习的算法,至今已有数种深度学习框架,如卷积神经网络和深度置信网络和递归神经网络等已被应用在计算机视觉、语音识别、自然语言处理、音频识别与生物信息学等领域并获取了极好的效果。

数据分析技术

数据分析是一类统计方法,其主要特点是多维性和描述性。有些几何方法有助于揭示不同的数据之间存在的关系,并绘制出统计信息图,以更简洁的解释这些数据中包含的主要信息。其他一些用于收集数据,以便弄清哪些是同质的,从而更好地了解数据。 数据分析可以处理大量数据,并确定这些数据最有用的部分。

辅助分类器生成对抗网络技术

GAN的一个变种

机器学习技术

机器学习是人工智能的一个分支,是一门多领域交叉学科,涉及概率论、统计学、逼近论、凸分析、计算复杂性理论等多门学科。机器学习理论主要是设计和分析一些让计算机可以自动“学习”的算法。因为学习算法中涉及了大量的统计学理论,机器学习与推断统计学联系尤为密切,也被称为统计学习理论。算法设计方面,机器学习理论关注可以实现的,行之有效的学习算法。

变分自编码器技术

变分自编码器可用于对先验数据分布进行建模。从名字上就可以看出,它包括两部分:编码器和解码器。编码器将数据分布的高级特征映射到数据的低级表征,低级表征叫作本征向量(latent vector)。解码器吸收数据的低级表征,然后输出同样数据的高级表征。变分编码器是自动编码器的升级版本,其结构跟自动编码器是类似的,也由编码器和解码器构成。在自动编码器中,需要输入一张图片,然后将一张图片编码之后得到一个隐含向量,这比原始方法的随机取一个随机噪声更好,因为这包含着原图片的信息,然后隐含向量解码得到与原图片对应的照片。但是这样其实并不能任意生成图片,因为没有办法自己去构造隐藏向量,所以它需要通过一张图片输入编码才知道得到的隐含向量是什么,这时就可以通过变分自动编码器来解决这个问题。解决办法就是在编码过程给它增加一些限制,迫使其生成的隐含向量能够粗略的遵循一个标准正态分布,这就是其与一般的自动编码器最大的不同。这样生成一张新图片就比较容易,只需要给它一个标准正态分布的随机隐含向量,这样通过解码器就能够生成想要的图片,而不需要给它一张原始图片先编码。

人工智能技术

在学术研究领域,人工智能通常指能够感知周围环境并采取行动以实现最优的可能结果的智能体(intelligent agent)

参数技术

在数学和统计学裡,参数(英语:parameter)是使用通用变量来建立函数和变量之间关系(当这种关系很难用方程来阐述时)的一个数量。

损失函数技术

在数学优化,统计学,计量经济学,决策理论,机器学习和计算神经科学等领域,损失函数或成本函数是将一或多个变量的一个事件或值映射为可以直观地表示某种与之相关“成本”的实数的函数。

计算机视觉技术

计算机视觉(CV)是指机器感知环境的能力。这一技术类别中的经典任务有图像形成、图像处理、图像提取和图像的三维推理。目标识别和面部识别也是很重要的研究领域。

神经网络技术

(人工)神经网络是一种起源于 20 世纪 50 年代的监督式机器学习模型,那时候研究者构想了「感知器(perceptron)」的想法。这一领域的研究者通常被称为「联结主义者(Connectionist)」,因为这种模型模拟了人脑的功能。神经网络模型通常是通过反向传播算法应用梯度下降训练的。目前神经网络有两大主要类型,它们都是前馈神经网络:卷积神经网络(CNN)和循环神经网络(RNN),其中 RNN 又包含长短期记忆(LSTM)、门控循环单元(GRU)等等。深度学习是一种主要应用于神经网络帮助其取得更好结果的技术。尽管神经网络主要用于监督学习,但也有一些为无监督学习设计的变体,比如自动编码器和生成对抗网络(GAN)。

准确率技术

分类模型的正确预测所占的比例。在多类别分类中,准确率的定义为:正确的预测数/样本总数。 在二元分类中,准确率的定义为:(真正例数+真负例数)/样本总数

对抗训练技术

对抗训练涉及两个模型的联合训练:一个模型是生成器,学习生成假样本,目标是骗过另一个模型;这另一个模型是判别器,通过对比真实数据学习判别生成器生成样本的真伪,目标是不要被骗。一般而言,两者的目标函数是相反的。

图像生成技术

图像生成(合成)是从现有数据集生成新图像的任务。

LeakyReLU技术

ReLU是将所有的负值都设为零,保留正值;相反,Leaky ReLU是给所有负值赋予一个非零斜率,即x<0时,y=α·x。

CycleGAN技术

GAN的一个变种

生成模型技术

在概率统计理论中, 生成模型是指能够随机生成观测数据的模型,尤其是在给定某些隐含参数的条件下。 它给观测值和标注数据序列指定一个联合概率分布。 在机器学习中,生成模型可以用来直接对数据建模(例如根据某个变量的概率密度函数进行数据采样),也可以用来建立变量间的条件概率分布。

生成对抗网络技术

生成对抗网络是一种无监督学习方法,是一种通过用对抗网络来训练生成模型的架构。它由两个网络组成:用来拟合数据分布的生成网络G,和用来判断输入是否“真实”的判别网络D。在训练过程中,生成网络-G通过接受一个随机的噪声来尽量模仿训练集中的真实图片去“欺骗”D,而D则尽可能的分辨真实数据和生成网络的输出,从而形成两个网络的博弈过程。理想的情况下,博弈的结果会得到一个可以“以假乱真”的生成模型。

图像增强技术

图像增强技术用于增强图像中的有用信息,它可以是一个失真的过程,其目的是要改善图像的视觉效果,针对给定图像的应用场合。它通过有目的地强调图像的整体或局部特性,将原来不清晰的图像变得清晰或强调某些感兴趣的特征,扩大图像中不同物体特征之间的差别,抑制不感兴趣的特征,使之改善图像质量、丰富信息量,加强图像判读和识别效果,满足某些特殊分析的需要。

图像修复技术

暂无评论
暂无评论~