本篇文章8725字,读完约22分钟
雷锋。这篇文章的作者,《大文西》最初发表在《作者之湖》专栏。雷锋。com被授权发布。
作为一个在片场工作了很长时间的老司机,我一直想写一些关于驾驶技术的文章。本文介绍了使用生成性对抗网络的两种基本驾驶技巧:
1)去除(爱情)动作电影中的马赛克
2 )(爱情)动作片中女孩穿的衣服
生成模型gan已在最后一篇文章“使用gan生成二维样本的一个小示例”中简要介绍。本文简要回顾了生成模型,它可以看作是一个完整的因果关系。
生成模型是一种能够生成具有特定分布的数据的模型。通用生成模型通常具有简单的样本生成分布。例如,根据要生成的分布的概率密度函数对均匀分布进行建模,并且对均匀分布中的样本进行变换以获得指定分布的样本,这可以被视为最简单的生成模型。例如,以下示例:
图的左侧是自定义的概率密度函数,右侧是1w样本的直方图。自定义分布和生成这些样本的代码如下:
从functools导入部分
导入号码
从matplotlib导入pyplot
#定义pdf
x_samples = numpy.arange(-3,3.01,0.01)
pdf = numpy . empty(x _ samples . shape)
pdf[x _ samples]pdf[x _ samples > = 0]= 0.5 * numpy . cos(numpy . pi * x _ samples[x _ samples > = 0])+0.5
pdf /= numpy.sum(pdf)
#计算近似cdf
cdf = numpy.empty(pdf.shape)
累积= 0
对于范围内的I(CDF . shape[0]):
累积+= pdf[i]
cdf[i] =累计
#生成样本
generate = partial(numpy.interp,xp=cdf,fp=x_samples)
u_rv = numpy.random.random(10000)
x =生成(u_rv)
#可视化
图,(ax0,ax1) = pyplot .子图(ncols = 2,figsize=(9,4))
ax0.plot(x_samples,pdf)
ax0.axis([-3.5,3.5,0,numpy.max(pdf)*1.1])
ax1.hist(x,100)
pyplot.show()
对于一些简单的情况,我们将假设有一个已知的模型可以很好地模拟分布,而缺少的只是合适的参数。此时,根据观测样本学习参数以最大化当前观测样本下的似然函数是很自然的,这称为最大似然估计:
Mle是一个基本思想,kl散度(kulback-leibler散度)在实践中被广泛使用。假设真实分布为P,抽样分布为Q,kl散度为:
从公式中可以看出,kl散度描述了两个分布之间的差异程度。从另一个角度看,使生成的样本接近原始分布意味着减少两者之间的差异,所以最小化kl散度相当于最大似然估计。从公式的角度出发,我们考虑具体展开公式:
公式的第二项是熵。不考虑这个术语,它用h(p)表示。然后考虑一个小技巧:对n个样本{x1,x2,...,xn}从q估计p(x)的经验密度函数:
其中δ()是狄拉克δ函数,用上式中的p(x)替换该项:
因为它是一个离散的采样值,所以
当x=xi时,狄拉克δ函数只有1,所以当x=xi时,这个项直接简化为1:
第一项是可能性的负对数形式。
似乎有些公式走得有点远。事实上,它仍然是简单的意思:通过减少两个分布之间的差异,一个分布可以接近另一个分布。仔细想一想,这是甘的对抗性损失方式。
在很多情况下,我们面临着更复杂的分布,比如上一篇文章中的例子,或者实际场景中更复杂的情况,比如生成不同人脸的图像。此时,作为一个具有普遍逼近性质的神经网络,它是一个很好的选择[1]:
因此,虽然gan既包含生成网络,也包含鉴别网络,但gan的目的本质上是生成模型。从生成模型的角度出发,伊恩·古德费勒总结出了一个与神经网络相关的生成方法的“家谱”[1]:
其中,最流行的是gan和变量自动编码器(vae),这两种方法的简明说明如下[3]:
本文不打算详述什么是vae,但是从这个图和自动编码器的名称中可以知道,在vae中产生的损失是基于重建误差的。然而,仅基于重建误差的图像生成具有图像模糊的缺点,因为误差通常针对整个情况。例如,基于均方误差的方法用于生成超分辨率图像,这容易出现以下情况[4]:
在这个二维示意图中,真实数据分布在一个U形的流形上,并且由于损失的形式,mse系统方法经常得到一个接近平均值的位置(蓝色方框)。
甘在这方面爆了其他的方法,因为目标是分布在流形上的。所以只要它收敛,即使生成的图像看不到它是什么,清晰度总是有保证的,这是从女演员身上去除马赛克的理想特征!
马赛克->清晰图像:超分辨率的问题已经铺平了道路,最后我们不得不进入正题。首先,很明显,去马赛克实际上是一个图像超分辨率问题,即如何在低分辨率图像的基础上获得更高分辨率的图像:
在视频中实现超分辨率的一种方法是通过不同帧的低分辨率图片来猜测超分辨率图片。有兴趣了解这个想法的朋友可以参考我之前的答案:如何通过多帧图像重建超分辨率?
然而,基于多帧图像的方法不太适合女性优势的镶嵌,所以本文是关于基于单帧图像的超分辨率方法。
当srgan谈到基于gan的超分辨率方法时,有必要提及SRGAN [4]:“使用机构高级网络的照片真实感单幅图像超分辨率”。这项工作的想法是,基于像素的均方误差损失通常得到正确的结果,但高频成分是模糊的。因此,只要重构低频分量的图像内容,然后用gan补充高频分量的细节,就可以了:
事实上,这个想法与最早的基于深度网络的风格迁移的想法非常相似(感兴趣的读者可以参考我之前关于cnn的文章:通过优化解决输入图像的最后部分),其中重构内容的内容损失是原始图像和vgg网络中每个relu层的低分辨率图像的激活值之间的差异:
生成细节对抗损失是gan用来判断它是原始图还是生成图的损失;
把这两种损失放在一起,把其中一种作为感性损失。培训的网络结构如下:
这是前一篇文章中提到的c-gan,条件C是低分辨率图片。尽管传统的量化指标如峰值信噪比(psnr)与原始图像相比并不是最好的,但srgan生成的超分辨率图像在视觉效果,尤其是细节方面要比其他方法好得多。例如,以下是作者将双三次插值与基于resnet特征重构的超分辨率进行比较的结果:
可以看出,尽管许多细节与原始图片不同,但它们看起来很和谐,细节也远比srresnet丰富。根据所学的分布信息,这些生动的细节可以看作是甘的“联想”。
Srgan显然适合更注重“好看”的超分辨率应用。当然,对于一些更注重重建指标的应用,比如嫌疑人面部细节的超分辨率恢复,srgan不能。
Pix2pix用了一节来讨论srgan,但是本文中使用的方法实际上是pix2pix[5]。这部作品自在arxiv上发表以来引起了广泛的关注,它巧妙地利用gan的框架解决了图像到图像的通用翻译问题。例如,不改变分辨率:把照片变成油画风格;把白天的照片变成夜晚;使用颜色块来分割或反转图片;彩色黑白照片;...每项任务都有具体的方法和相关的研究,但实际上,总的来说,它是一个从像素到像素的映射,这可以看作是一个问题。本文的聪明之处在于提出了pix2pix方法,一个解决所有这些问题的框架。该方法的原理图如下:
是条件gan,条件c是输入图片。除了直接使用c-gan,这项工作还有两项改进:
1)使用u-net结构生成细节更好的图片[6]
U-net是德国弗赖堡大学模式识别和图像处理小组提出的全卷积结构。与普通的低维下采样、原始分辨率的编译码器上采样的网络结构相比,u-net的不同之处在于增加了跳跃连接,对应的特征映射和译码后相同大小的特征映射按照通道连接在一起,用于保持不同分辨率下像素级的细节。U-net在改善细节方面有明显的效果,下面是在pix2pix中给出的效果比较:
可以看出,不同尺度的信息在很大程度上得到了保留。
2)利用马尔可夫特性的补丁
pix2pix和srgan的一个相似之处在于,它们都有重建以解决低频分量并使用gan来解决高频分量的想法。在pix2pix中,这个想法主要体现在两个地方。一个是损失函数,它增加了l1损失以使生成的图像尽可能地类似于训练目标图像,而图像中的高频细节由gan处理:
还有patchgan,这是gan中用于确定是否生成图形的一种特定方法。Patchgan的想法是,由于gan只负责处理低频分量,所以鉴别器不必将整个图像作为输入,只能鉴别nxn的一个图像块。这就是为什么它被称为马尔可夫鉴别器,因为除了补丁以外的部分被认为是独立于这个补丁的。
在具体实现中,作者使用了一个具有nxn输入的全卷积小网络,最后一层的每个像素通过sigmoid输出为真的概率,然后用bceloss计算最终的损失。这样做的优点是输入的维数大大降低,因此参数的数量更少,运算速度比直接输入图形更快,并且可以计算任何大小的图形。作者比较了不同大小的补丁的结果。对于256x256的输入,当补丁大小为70x70时,结果与直接作为鉴别器的整个画面的输入没有什么不同:
使用pix2pix生成训练数据,你可以训练去马赛克模型,只要你准备了无代码和相应的编码图片,就这么简单。所以问题是,如何生成马赛克图片?
如果你有毅力,你可以手工添加马赛克,这是最准确的。本节介绍了一种不太精确但比随机方法更好的方法:使用分类模型的活动区域进行自动镶嵌标注。
其基本思想是使用一个能够识别需要编码的图像的分类模型,提取该模型[7]中相应类别的cam(classactivationmap)[7],然后用马赛克覆盖响应最高的区域。在这里,让我们简单谈谈什么是凸轮。对于在最后一层具有全局汇集(平均或最大可能)的cnn结构,汇集的要素图相当于加权相加,以在进入softmax之前计算每个类别的激活值。cam的思想是在根据像素权重合并之前将该权重添加到特征地图上,得到的单个激活地图可以携带激活当前类别的一些位置信息,这相当于弱监督(分类->定位):
上图是凸轮的示意图。用澳大利亚梗类的摄像头放大原始图片的大小,你可以看到小狗所在的区域大概是激活反应最高的区域。
然后是缺乏一个可以识别xxx图片的模型。互联网上只有一个现成的。雅虎在2016年发布的开源色情图片识别模型open nsfw(notsafe forwork)链接如下:
t/rceucu0
cam的实现并不困难,这里介绍了开放式nsfw自动编码的编码和使用:
t/rop9ak6
(成功编码的)效果几乎如下:
在动作电影中没有什么好说的。你不需要改变一行代码。您只需要按照前面的步骤准备数据,然后按照pix2pix的官方使用方法进行训练:
火炬pix2pix:
t/rfojxzf
pytorch版本的pix2Px(cycle-gan二合一版本):
t/rxjhruv
从磁盘上随机找到数以千计的图片,用于执行自动编码和pix2pix训练(默认参数)。效果如下:
什么?你说你要镶嵌那个女演员?女演员的照片在哪里?
还是要说,在真实照片上的效果比蘑菇和鲜花要好。
双重学习的去马赛克化已经完成,然后“每个女孩都穿”衣服。在开始之前,让我们先来谈一下铺垫:双重学习和循环甘。
双重学习是msra在2016年[8]提出的一种机器翻译增强学习方法,旨在解决海量数据的配对和标注问题。就个人而言,它被认为是一种弱监督方法(但大多数文献被认为是无监督的)。以机器翻译为例,双重学习的基本思想如下[9]:
左边的灰色男人只会英语,右边的黑色女人只会中文。现在的任务是学习如何把英语翻译成汉语。双重学习解决这个问题的想法是:给定一个f :x-y模型,一开始不可能知道F是否被正确翻译,但是如果我们考虑F的双重问题g:y-x,那么我可以试着把一个英语句子翻译成汉语,然后再翻译回来。这一轮的结果是x =g(f(x))。灰人可以用一个标准(bleu)来判断x和x是否有相同的含义,并将结果的一致性反馈给这两个模型进行改进。同样,如果你从中文中提取一个句子,并以循环的方式翻译,这两个模型可以从黑人女性那里得到反馈,并改进模型。事实上,这是强化学习的过程。每一个翻译都是一个动作,每一个动作都会从环境中得到回报(灰色男人或黑人女人),并改进模型,直到它收敛。
也许有些人会认为这与上个世纪提出的联合训练非常相似。智虎也讨论了这一点:
如何理解刘铁燕团队在nips 2016上提出的双重学习?
就个人而言,这是不同的。联合训练是一种多视角方法。例如,如果输入x被视为两个特征x=(x1,x2),并且假设x1和x2彼此独立,那么对于任何样本x,训练两个分类器f1()和f2()应该具有f1(x1)=f2(x2)。这对于未标记的样本非常有用,这相当于使用相同的隐式约束,即相同样本的分类结果应该相同。因此,典型的协同训练场景是带有少量标注和大量未标注的半监督场景。f1和f2实际上是两个不同的东西,但是域指向同一个任务。在双重学习中,f和g是双重任务,隐含的约束是x-y-x-y-x的循环一致性,对于输入特征没有像联合训练那样明确的假设,学习方法也不同。双重学习可以被视为强化学习。
Cyclegan和不成对图像到图像翻译Cycle gan,翻译为:旋转,是一个非常直接和巧妙的想法结合双重学习和甘[10],示意图如下:
x和y是两组不同类型的图形,比如女演员穿衣服和女演员不穿衣服。因此,对于一个穿着衣服的女演员来说,裸体是一个图片翻译的问题。cyclegan示意图中的(b)和(c)是双重学习:
在双重学习的基础上,增加两个鉴别器d_x和d_y进行对抗训练,使翻译后的图片尽可能接近当前集合中的图片:
综合考虑,最后的损失是:
有些人可能会问,有没有可能在不增加循环一致性的情况下,直接用gan来学习x\rightarrow y的映射,以便生成的y样本可以与y本身的样本一样好?本文还讨论了在gan训练中容易出现的模式崩溃问题。模式崩溃问题的简单示意图如下[1]:
上半部分是真实分布,下半部分是习得分布。可以看出,所学的分布只是整个分布的一部分。这称为部分模式崩溃,这在训练不收敛时很常见。如果是完全模式崩溃,也就是说,所有生成的模型得到几乎相同的输出。增加循环一致性将使一个域中的不同样本尽可能多地映射到另一个域中的不同位置,这是理想的双射。直观地说,如果x\rightarrow y被映射到y中的同一个点,那么这个点y显然不可能被y\rightarrow x映射回来,因此增加周期一致性有助于避免模式崩溃。这个问题在另一种方法discogan中有更详细的讨论,这种方法与cyclegan [11]基本相同。如果你感兴趣,你可以参考它。
值得注意的是,虽然它的名字是基克拉甘,它的程序类似于c-甘,但它实际上只是对抗性的,而不是生成性的。严格地说,我们只学习了x \右箭头y和y \右箭头x的映射,所以在所谓的生成网络中没有随机性。有一种叫做dualgan[12]的方法,本质上与cyclegan和discogan相同,但通过退出增加了随机性。然而,l1损失用于随机样本和原始样本之间的所有周期一致性,这是不完全正确的。当然,gan现在很受欢迎。事实上,只要它使用对抗损失,它将被称为xxgan,这可能会增加提交的命中率。
另外,在前一节中提到了联合训练,所以我觉得这里也应该提到cogan[13],因为它的名字有点类似,它也可以用于不成对的图像翻译。cogan的一般思想是,如果两个域可以相互映射,那么一定有一些共同的特征。例如,男人和女人通常可以从他们的外表来区分,但是保持不变的是他们都有两只眼睛,一个鼻子和一个嘴巴,等等。因此,在生成时,生成公共特征和各自特征的部分可以分开。原理图如下:
实际上,它是两个gan结构,其中生成网络和鉴别网络的高层部分采用权重共享(用虚线连接的部分),而没有专职共享的部分分别处理不同的域。通过这种方式,每次可以根据训练的域生成样本在两个域中的不同对应关系,例如戴眼镜和不戴眼镜:
有了共同的特征和各自的领域特征,映射的思想就非常直接[14]:
在gan前增加一个域编码器,然后可以为每个域获得三个样本,由鉴别器进行区分:直接采样、重构采样和从另一个域转移后的重构采样。经过训练,很自然地使用一个域编码器+另一个域生成器来实现不同域的转换。图像翻译的效果如下:
还有一种聪明的思维方式,就是把cogan拆开,以更明确的方式把不同的域作为c-gan条件[15]:
第一步是训练一个c-gan,用噪声z作为相应的潜在噪声,用域信息作为条件C..其次,使用与普通编码-解码结构相反的解码(生成)编码结构来训练编码器。学习编码器可以结合域信息来提取输入图像中与域无关的共享特征。在第三步中,在前两步中训练的编码器和解码器(生成器)连接在一起,并且可以根据域执行图像翻译。
虽然cogan-级数法的结构看起来比较复杂,但它比对偶级数法更直观易懂,并且具有潜在的空间、更好的可解释性和属性对应性。
离题,或者回到正题:
事实上,关于给女演员穿衣服没什么好说的。cycle-gan和pix pix pix的作者是一群人,文档非常好。准备好数据,把他们分成两组,穿衣服和脱衣服。只需按照文档中的步骤进行培训:
火炬版循环甘:
t/r6pehv5
pytorch (Pix2pix 2合1)的循环gan:
t/rxjhruv
循环甘不容易收敛。我以128x128的分辨率训练了1000多名穿衣服和不穿衣服的女演员,并用相同的默认参数训练了120个纪元。最后,少数成功“穿衣服”的结果如下:
虽然有些突兀,但好歹是穿着大衣。请注意,马赛克不在图片中,但我后来添加了它。
那么,脱衣服的例子在哪里?
参考文献[1] I. Goodfellow.nips 2016教程:生成性对抗网络。arxiv Preintarxiv:1701.00160,2016。
[2] a. b. l. larsen,s. k. s?用火炬生成面孔。火炬|用火炬生成面孔
[3] a. b. l. larsen,s. k. s?安德比h .拉罗彻尔和o .温瑟。使用学习的相似性度量自动编码超过像素。在icml中,第1558-1566页,2016年。
[4] c. ledig,l. theis,f. huszar,j. caballero,a. aitken,a. tejani,j. totz,z. wang和w. shi。使用生成对抗网络的照片真实感单幅图像超分辨率。arxiv:1609.04802,2016。
[5] p. isola,j-y . Zhu,t. zhou和a. a. efros。条件敌对网络下的图像翻译。arxiv,2016年。
[6] o. ronneberger,p. fischer和t. brox。用于生物医学图像分割的卷积网络。miccai,第234-241页。斯普林格,2015年。
[7] b. zhou,a. khosla,a. lapedriza,a. oliva和a. torralba。学习深层特征进行区分性定位。arxiv预印本arxiv:1512.04150,2015。
[8] he,d,xia,y,qin,t,wang,l,yu,n,liu,t-y,ma,w-y .(2016 a)。机器翻译的双重学习。在神经信息处理系统(nips)年度会议上,2016。
[9]刘铁燕,《双重学习:推动人工智能的新前沿》, mifs 2016
[10]j-y . Zhu,t. park,p. isola和a. a. efros。使用循环一致敌对网络的不成对图像到图像翻译。arxiv预印本arxiv:1703.10593,2017。
[11] t. kim,m. cha,h. kim,j. lee和j. kim。学习发现与生成性敌对网络的跨领域关系。arxiv电子印刷品,2017年3月。
[12] z. yi,h. zhang,p. t. gong,等. dualgan:图像到图像翻译的无监督双重学习.arxiv预印本arxiv:1704.02510,2017。
[13]m . y . Liu和o. tuzel。耦合生成对抗网络。神经信息处理系统(nips)进展,2016年。
[14]m-y Liu,t. breuel和j. kautz。无监督的图像到图像翻译网络。arxiv预印本arxiv:1703.00848,2017。
[15] dong,h,neekhara,p,wu,c,guo,y:无监督的图像到图像的翻译与生成性对抗网络。arxiv预印本arxiv:1701.02676,2017。
雷锋。(公开号码:雷锋。相关阅读:
最简单易懂的gan(生成对抗网络)教程:从理论到实践(带代码)
Yann lecun的最新研究成果:可以帮助gan使用离散数据
开发者特别会议|英伟达深度学习学院现场授课
英伟达dli高级工程师现场指导,理论联系实际,深入学习!
课程链接:mooc.ai/course/90
雷锋文章版权所有。严禁擅自转载。详情请参考转载说明。
标题:提高驾驶技术:用GAN去除(爱情)动作片中的马赛克和衣服
地址:http://www.hcsbodzyz.com/hcxw/4880.html