高仓健,人工智能是拍摄的未来仍是拍摄技能的末日?,蒋劲夫

AI能够生成以假乱真的假图画乃至假视频的新闻早已不是新鲜事,这一切都得益于GAN网络。除了生成这些传神的图画,它还能批改破损图画或许扩展当时图画。不难幻想,未来它或许不只能生成高分辩率的准确图画,还能够创立整段视频。这对拍照技能来说,到底是好是坏呢?

人工智能是拍照的未来仍是拍照技能的末日?

每逢咱们听到「人工智能」、「机器学习」或许「机器人」这样的词汇时,大多数人都会很简略联想到一个像科幻电影中那种能够行走、说话的机器人,然后情不自禁地幻想悠远的未来。

人工智能是拍照的未来仍是拍照技能的末日?

图源:Giphy

托付,醒醒吧!实践上,人工智能技能现已随同咱们许多年了,现在它们正逐渐被嵌入到你的智能手机(比方S按绝口iri、谷歌帮手。)以及轿车的 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)剑侠情缘3:
super(Generator, self).__init__()
def block(in_feat, out_feat, normalize=True):
la刑床yers = [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(
*b高仓健,人工智能是拍照的未来仍是拍照技能的末日?,蒋劲夫lock(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', ex高仓健,人工智能是拍照的未来仍是拍照技能的末日?,蒋劲夫ist_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.FloatTens取环or 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.siz汤姆哈迪e(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 = adversari夜蒲4al_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' % batchSlidees_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 pi高亚麟老婆x2pix 的生成成果(图源: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 域。每个生成器都有一个相应的判别器,该判别器企图将生成器组成人av电影成的图画与实在图画区别开来。

CycleGAN 的生成成果(图源:GitHub)

咱们将走向何方?

在不久的将来,机器学习和 GAN 必将对成像和拍照发生巨大的影响。现在,该技能能够依据文本输入生成简略的图画。可是,能够预见,未来它将不只能够生成高分辩率的准确图画,还能够创立整段视频。幻想一下,你只需将脚本输入 GAN 即可生成整部电影!不只如此,每个人都能够运用简略的交互式APP来创立自己的电影(乃至能够由自己主演!)这种技能会是真实的拍照技能、导演和扮演的末日吗?

酷炫的技能也意味着潜在的凶恶用处高仓健,人工智能是拍照的未来仍是拍照技能的末日?,蒋劲夫。人们还需求一种办法来辨认和检测完美的假图画,需求对这类图画生成进行监管。现在,GAN 现已被用于制造假视频或「高仿著作」,这些假视频或「高仿著作」正被负面地运用,比方制造名人的假色情视频,或许在人们不知情的情况下以他们的形象宣布言辞。将音频和视频组成技能提供给一般群众的结果是可怕的。

人工图画生成技能是一柄双刃剑,尤其是在人们对它知之甚少的情况下。生成对立网络是一个十分有用的东西,一起它打呼噜怎么治也很风险。能够必定的是,它将重塑技能国际,可是它将经过怎样的途径做到这一点,还有待考虑。