家装暖气片价格多少钱-新古典主义家具图片

2023年4月7日发(作者:儿童房墙面颜色推荐)
提⾼驾驶技术:⽤GAN去除(爱情)动作⽚中的马赛克和⾐服
作为⼀名久经⽚场的⽼司机,早就想写⼀些。这篇就介绍利⽤⽣成式对抗⽹络(GAN)的两个基本驾驶技能:
1)去除(爱情)动作⽚中的马赛克
2)给(爱情)动作⽚中的⼥孩穿(tuo)⾐服
⽣成式模型
上⼀篇《》中已经简单介绍了GAN,这篇再简要回顾⼀下⽣成式模型,算是补全⼀个来龙去脉。
⽣成模型就是能够产⽣指定分布数据的模型,常见的⽣成式模型⼀般都会有⼀个⽤于产⽣样本的简单分布。例如⼀个均匀分布,根据要⽣成
分布的概率密度函数,进⾏建模,让均匀分布中的样本经过变换得到指定分布的样本,这就可以算是最简单的⽣成式模型。⽐如下⾯例⼦:
图中左边是⼀个⾃定义的概率密度函数,右边是相应的1w个样本的直⽅图,⾃定义分布和⽣成这些样本的代码如下:
[AppleScript]纯⽂本查看复制代码
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
fromfunctoolsimportpartial
importnumpy
frommatplotlibimportpyplot
#DefineaPDF
x_samples=(-3,3.01,0.01)
PDF=(x_)
PDF[x_samples<0]=(x_samples[x_samples<0]+3.5)/3
PDF[x_samples>=0]=0.5*(*x_samples[x_samples>=0])+0.5
PDF/=(PDF)
#CalculateapproximatedCDF
CDF=()
cumulated=0
foriinrange([0]):
cumulated+=PDF
CDF=cumulated
#Generatesamples
generate=partial(,xp=CDF,fp=x_samples)
u_rv=(10000)
x=generate(u_rv)
#Visualization
fig,(ax0,ax1)=ts(ncols=2,figsize=(9,4))
(x_samples,PDF)
([-3.5,3.5,0,(PDF)*1.1])
(x,100)
()
对于⼀些简单的情况,我们会假设已知有模型可以很好的对分布进⾏建模,缺少的只是合适的参数。这时候很⾃然只要根据观测到的样本,
学习参数让当前观测到的样本下的似然函数最⼤,这就是最⼤似然估计(MaximumLikelihoodEstimation):
MLE是⼀个最基本的思路,实践中⽤得很多的还有KL散度(Kullback–Leiblerdivergence),假设真实分布是P,采样分布是Q,则KL散度
为:
从公式也能看出来,KL散度描述的是两个分布的差异程度。换个⾓度来看,让产⽣的样本和原始分布接近,也就是要让这俩的差异减⼩,所
以最⼩化KL散度就等同于MLE。从公式上来看的话,我们考虑把公式具体展开⼀下:
公式的第⼆项就是熵,先不管这项,⽤H(P)表⽰。接下来考虑⼀个⼩trick:从Q中抽样n个样本,来估算P(x)的经验值(empiricaldensity
function):
其中是狄拉克函数,把这项替换到上⾯公式的P(x):
因为是离散的采样值,所以中只有的时候狄拉克函数才为1,所以考虑时这项直接化为1:
第⼀项正是似然的负对数形式。
说了些公式似乎跑得有点远了,其实要表达还是那个简单的意思:通过减⼩两个分布的差异可以让⼀个分布逼近另⼀个分布。仔细想想,这
正是GAN⾥⾯adversarialloss的做法。
很多情况下我们⾯临的是更为复杂的分布,⽐如中的例⼦,⼜或是实际场景中更复杂的情况,⽐如⽣成不同⼈脸的图像。这时候,作为具有
universalapproximation性质的神经⽹络是⼀个看上去不错的选择[1]:
所以虽然GAN⾥⾯同时包含了⽣成⽹络和判别⽹络,但本质来说GAN的⽬的还是⽣成模型。从⽣成式模型的⾓度,IanGoodfellow总结过⼀
个和神经⽹络相关⽣成式⽅法的“家谱”[1]:
在这其中,当下最流⾏的就是GAN和VariationalAutoEncoder(VAE),两种⽅法的⼀个简明⽰意如下[3]:
本篇不打算展开讲什么是VAE,不过通过这个图,和名字中的autoencoder也⼤概能知道,VAE中⽣成的loss是基于重建误差的。⽽只基于
重建误差的图像⽣成,都或多或少会有图像模糊的缺点,因为误差通常都是针对全局。⽐如基于MSE(MeanSquaredError)的⽅法⽤来⽣成
超分辨率图像,容易出现下⾯的情况[4]:
在这个⼆维⽰意中,真实数据分布在⼀个U形的流形上,⽽MSE系的⽅法因为loss的形式往往会得到⼀个接近平均值所在的位置(蓝⾊
框)。
GAN在这⽅⾯则完爆其他⽅法,因为⽬标分布在流形上。所以只要⼤概收敛了,就算⽣成的图像都看不出是个啥,清晰度常常是有保证的,
⽽这正是去除⼥优⾝上马赛克的理想特性!
马赛克->清晰画⾯:超分辨率(SuperResolution)问题
说了好些铺垫,终于要进⼊正题了。⾸先明确,去马赛克其实是个图像超分辨率问题,也就是如何在低分辨率图像基础上得到更⾼分辨率的
图像:
视频中超分辨率实现的⼀个套路是通过不同帧的低分辨率画⾯猜测超分辨率的画⾯,有兴趣了解这个思想的朋友可以参考我之前的⼀个答
案:
不过基于多帧影像的⽅法对于⼥优⾝上的马赛克并不是很适⽤,所以这篇要讲的是基于单帧图像的超分辨率⽅法。
SRGAN
说到基于GAN的超分辨率的⽅法,就不能不提到SRGAN[4]:《Photo-RealisticSingleImageSuper-ResolutionUsingaGenerative
AdversarialNetwork》。这个⼯作的思路是:基于像素的MSEloss往往会得到⼤体正确,但是⾼频成分模糊的结果。所以只要重建低频成分
的图像内容,然后靠GAN来补全⾼频的细节内容,就可以了:
这个思路其实和最早基于深度⽹络的风格迁移的思路很像(有兴趣的读者可以参考我之前⽂章的最后⼀部分),其中重建内容的content
loss是原始图像和低分辨率图像在VGG⽹络中的各个ReLU层的激活值的差异:
⽣成细节adversarialloss就是GAN⽤来判别是原始图还是⽣成图的loss:
把这两种loss放⼀起,取个名叫perceptualloss。训练的⽹络结构如下:
正是上篇⽂章中讲过的C-GAN,条件C就是低分辨率的图⽚。SRGAN⽣成的超分辨率图像虽然PSNR等和原图直接⽐较的传统量化指标并
不是最好,但就视觉效果,尤其是细节上,胜过其他⽅法很多。⽐如下⾯是作者对⽐bicubic插值和基于ResNet特征重建的超分辨率的结
果:
可以看到虽然很多细节都和原始图⽚不⼀样,不过看上去很和谐,并且细节的丰富程度远胜于SRResNet。这些栩栩如⽣的细节,可以看作
是GAN根据学习到的分布信息“联想”出来的。
对于更看重“看上去好看”的超分辨率应⽤,SRGAN显然是很合适的。当然对于⼀些更看重重建指标的应⽤,⽐如超分辨率恢复嫌疑犯⾯部细
节,SRGAN就不可以了。
pix2pix
虽然专门⽤了⼀节讲SRGAN,但本⽂⽤的⽅法其实是pix2pix[5]。这项⼯作刚在arxiv上发布就引起了不⼩的关注,它巧妙的利⽤GAN的框架
解决了通⽤的Image-to-Imagetranslation的问题。举例来说,在不改变分辨率的情况下:把照⽚变成油画风格;把⽩天的照⽚变成晚上;⽤
⾊块对图⽚进⾏分割或者倒过来;为⿊⽩照⽚上⾊;…每个任务都有专门针对性的⽅法和相关研究,但其实总体来看,都是像素到像素的⼀
种映射啊,其实可以看作是⼀个问题。这篇⽂章的巧妙,就在于提出了pix2pix的⽅法,⼀个框架,解决所有这些问题。⽅法的⽰意图如下:
就是⼀个ConditionalGAN,条件C是输⼊的图⽚。除了直接⽤C-GAN,这项⼯作还有两个改进:
1)利⽤U-Net结构⽣成细节更好的图⽚[6]
U-Net是德国Freiburg⼤学模式识别和图像处理组提出的⼀种全卷积结构。和常见的先降采样到低维度,再升采样到原始分辨率的编解码
(Encoder-Decoder)结构的⽹络相⽐,U-Net的区别是加⼊skip-connection,对应的featuremaps和decode之后的同样⼤⼩的featuremaps按
通道拼(concatenate)⼀起,⽤来保留不同分辨率下像素级的细节信息。U-Net对提升细节的效果⾮常明显,下⾯是pix2pix⽂中给出的⼀个效
果对⽐:
可以看到,各种不同尺度的信息都得到了很⼤程度的保留。
2)利⽤马尔科夫性的判别器(PatchGAN)
pix2pix和SRGAN的⼀个异曲同⼯的地⽅是都有⽤重建解决低频成分,⽤GAN解决⾼频成分的想法。在pix2pix中,这个思想主要体现在两个
地⽅。⼀个是loss函数,加⼊了L1loss⽤来让⽣成的图⽚和训练的⽬标图⽚尽量相似,⽽图像中⾼频的细节部分则交由GAN来处理:
还有⼀个就是PatchGAN,也就是具体的GAN中⽤来判别是否⽣成图的⽅法。PatchGAN的思想是,既然GAN只负责处理低频成分,那么判
别器就没必要以⼀整张图作为输⼊,只需要对NxN的⼀个图像patch去进⾏判别就可以了。这也是为什么叫Markoviandiscriminator,因为在
patch以外的部分认为和本patch互相独⽴。
具体实现的时候,作者使⽤的是⼀个NxN输⼊的全卷积⼩⽹络,最后⼀层每个像素过sigmoid输出为真的概率,然后⽤BCEloss计算得到最
终loss。这样做的好处是因为输⼊的维度⼤⼤降低,所以参数量少,运算速度也⽐直接输⼊⼀张快,并且可以计算任意⼤⼩的图。作者对⽐
了不同⼤⼩patch的结果,对于256x256的输⼊,patch⼤⼩在70x70的时候,从视觉上看结果就和直接把整张图⽚作为判别器输⼊没什么区
别了:
⽣成带局部马赛克的训练数据
利⽤pix2pix,只要准备好⽆码和相应的有码图⽚就可以训练去马赛克的模型了,就是这么简单。那么问题是,如何⽣成有马赛克的图⽚?
有毅⼒的话,可以⼿动加马赛克,这样最为精准。这节介绍⼀个不那么准,但是⽐随机强的⽅法:利⽤分类模型的激活区域进⾏⾃动马赛克
标注。
基本思想是利⽤⼀个可以识别需要打码图像的分类模型,提取出这个模型中对应类的CAM(ClassActivationMap)[7],然后⽤马赛克遮住
响应最⾼的区域即可。这⾥简单说⼀下什么是CAM,对于最后⼀层是全局池化(平均或最⼤都可以)的CNN结构,池化后的featuremap相当
于是做了个加权相加来计算最终的每个类别进⼊softmax之前的激活值。CAM的思路是,把这个权重在池化前的featuremap上按像素加权相
加,最后得到的单张的激活图就可以携带激活当前类别的⼀些位置信息,这相当于⼀种弱监督(classification-->localization):
上图是⼀个CAM的⽰意,⽤澳洲梗类别的CAM,放⼤到原图⼤⼩,可以看到⼩狗所在的区域⼤致是激活响应最⾼的区域。
那么就缺⼀个可以识别XXX图⽚的模型了,⽹上还恰好就有个现成的,yahoo于2016年发布的开源⾊情图⽚识别模型OpenNSFW(NotSafe
ForWork):
CAM的实现并不难,结合OpenNSFW⾃动打码的代码和使⽤放在了这⾥:
(成功打码的)效果差不多是下⾯这样⼦:
去除(爱情)动作⽚中的马赛克
这没什么好说的了,⼀⾏代码都不⽤改,只需要按照前⾯的步骤把数据准备好,然后按照pix2pix官⽅的使⽤⽅法训练就可以了:
Torch版pix2pix:
pyTorch版pix2pix(Cycle-GAN⼆合⼀版):
从D盘⾥随随便便找了⼏千张图⽚,⽤来执⾏了⼀下⾃动打码和pix2pix训练(默认参数),效果是下⾯这样:
什么?你问说好给⼥优去马赛克呢?⼥优照⽚呢?
还是要说⼀下,在真⼈照⽚上的效果⽐蘑菇和花强。
对偶学习(DualLearning)
去马赛克已经讲完了,接下来就是给⼥孩穿(tuo)⾐服了,动⼿之前,还是先讲⼀下铺垫:对偶学习和Cycle-GAN。
对偶学习是MSRA于2016年提出的⼀种⽤于机器翻译的增强学习⽅法[8],⽬的是解决海量数据配对标注的难题,个⼈觉得算是⼀种弱监督⽅
法(不过看到⼤多数⽂献算作⽆监督)。以机器翻译为例,对偶学习基本思想如下图[9]:
左边的灰⾐男只懂英语,右边的⿊⾐⼥只懂中⽂,现在的任务就是,要学习如何翻译英语到中⽂。对偶学习解决这个问题的思路是:给定⼀
个模型⼀上来⽆法知道f翻译得是否正确,但是如果考虑上的对偶问题,那么我可以尝试翻译⼀个英⽂句⼦到中⽂,再翻译回来。这种转了⼀
圈的结果,灰⾐男是可以⽤⼀个标准(BLEU)判断x'和x是否⼀个意思,并且把结果的⼀致性反馈给这两个模型进⾏改进。同样的,从中⽂
取个句⼦,这样循环翻译⼀遍,两个模型⼜能从⿊⾐⼥那⾥获取反馈并改进模型。其实这就是强化学习的过程,每次翻译就是⼀个action,
每个action会从环境(灰⾐男或⿊⾐⼥)中获取reward,对模型进⾏改进,直⾄收敛。
也许有的⼈看到这⾥会觉得和上世纪提出的Co-training很像,这个在知乎上也有讨论:
个⼈觉得还是不⼀样的,Co-Training是⼀种multi-view⽅法,⽐如⼀个输⼊x,如果看作是两个拼⼀起的特征,并且假设和互
相独⽴,那么这时候训练两个分类器和对于任意样本x应该有。这对没有标注的样本是很有⽤的,相当于利⽤了同⼀
个样本分类结果就应该⼀样的隐含约束。所以Co-Training的典型场景是少量标注+⼤量未标注的半监督场景。并且和其实是两个不同,
但是domain指向相同的任务。⽽DualLearning中和是对偶任务,利⽤的隐含约束是的cycleconsistency。对输⼊的特征也没
有像Co-Training有那么明确的假设,学习⽅法上也不⼀样,DualLearning算是强化学习。
CycleGAN和未配对图像翻译(UnpairedImage-to-ImageTranslation)
CycleGAN,翻译过来就是:轮着⼲,是结合了对偶学习和GAN⼀个很直接⽽巧妙的想法[10],⽰意图如下:
X和Y分别是两种不同类型图的集合,⽐如穿⾐服的⼥优和没穿⾐服的⼥优。所以给定⼀张穿了⾐服的⼥优,要变成没穿⾐服的样⼦,就是
个图⽚翻译问题。CycleGAN⽰意图中(b)和(c)就是DualLearning:
在DualLearning基础上,⼜加⼊了两个判别器和⽤来进⾏对抗训练,让翻译过来的图⽚尽量逼近当前集合中的图⽚:
也许有⼈会问,那不加cycle-consistency,直接⽤GAN学习⼀个的映射,让⽣成的Y的样本尽量毕竟Y⾥本⾝的样本可不可以呢?这个作者
在⽂中也讨论了,会产⽣GAN训练中容易发⽣的modecollapse问题。modecollapse问题的⼀个简单⽰意如下[1]:
上边的是真实分布,下边的是学习到的分布,可以看到学习到的分布只是完整分布的⼀部分,这个叫做partialmodecollapse,是训练不收
敛情况中常见的⼀种。如果是完全的modecollapse,就是说⽣成模型得到的都是⼏乎⼀样的输出。⽽加⼊Cycle-consistency会让⼀个
domain⾥不同的样本都尽量映射到另⼀个domain⾥不同的地⽅,理想情况就是双射(bijection)。直观来理解,如果通过都映射在
Y中同⼀个点,那么这个点y通过映射回来显然不可能是多个不同的x,所以加⼊cycle-consistency就帮助避免了modecollapse。这
个问题在另⼀篇和CycleGAN其实本质上没什么不同的⽅法DiscoGAN中有更详细的讨论[11],有兴趣的话可以参考。
有⼀点值得注意的是,虽然名字叫CycleGAN,并且套路也和C-GAN很像,但是其实只有adversarial,并没有generative。因为严格来说只
是学习了和的mapping,所谓的generativenetwork⾥并没有随机性。有⼀个和CycleGAN以及DiscoGAN其实本质上也没什
么不同的⽅法叫DualGAN[12],倒是通过dropout把随机性加上了。不过所有加了随机性产⽣的样本和原始样本间的cycle-consistency⽤的还
是l1loss,总觉得这样不是很对劲。当然现在GAN这么热门,其实只要是⽤了adversarialloss的基本都会取个名字叫XXGAN,也许是可以
增加投稿命中率。
另外上节中提到了Co-Training,感觉这⾥也应该提⼀下CoGAN[13],因为名字有些相似,并且也可以⽤于未配对的图像翻译。CoGAN的⼤
体思想是:如果两个Domain之间可以互相映射,那么⼀定有⼀些特征是共有的。⽐如男⼈和⼥⼈,虽然普遍可以从长相区分,但不变的是
都有两个眼睛⼀个⿐⼦⼀张嘴等等。所以可以在⽣成的时候,把⽣成共有特征和各⾃特征的部分分开,⽰意图如下:
其实就是两个GAN结构,其中⽣成⽹络和判别⽹络中⽐较⾼层的部分都采⽤了权值共享(虚线相连的部分),没有全职共享的部分分别处理
不同的domain。这样每次就可以根据训练的domain⽣成⼀个样本在两个domain中不同的对应,⽐如戴眼镜和没戴眼镜:
分别有了共有特征和各⾃domain特征,那么做mapping的思路也就很直接了[14]:
在GAN前边加了个domainencoder,然后对每个domain能得到三种样本给判别器区分:直接采样,重建采样,从另⼀个domain中transfer
后的重建采样。训练好之后,⽤⼀个domain的encoder+另⼀个domain的generator就很⾃然的实现了不同domain的转换。⽤在图像翻译上
的效果如下:
还有个巧妙的思路,是把CoGAN拆开,不同domain作为C-GAN条件的更加显式的做法[15]:
第⼀步⽤噪声Z作为和domain⽆关的共享表征对应的latentnoise,domain信息作为条件C训练⼀个C-GAN。第⼆步,训练⼀个encoder,利
⽤和常见的encode-decode结构相反的decode(generate)-encode结构。学习好的encoder可以结合domain信息,把输⼊图像中和domain⽆
关的共享特征提取出来。第三步,把前两步训练好的encoder和decoder(generator)连⼀起,就可以根据domain进⾏图像翻译了。
CoGAN⼀系的⽅法虽然结构看起来更复杂,但个⼈感觉理解起来要⽐dual系的⽅法更直接,并且有latentspace,可解释性和属性对应也好
⼀些。
⼜扯远了,还是回到正题:
给⼥优穿上⾐服
其实同样没什么好说的,Cycle-GAN和pix2pix的作者是⼀拨⼈,⽂档都写得⾮常棒,准备好数据,分成穿⾐服的和没穿⾐服的两组,按照⽂
档的步骤训练就可以:
Torch版Cycle-GAN:
pyTorch版Cycle-GAN(pix2pix⼆合⼀版):
Cycle-GAN收敛不易,我⽤了128x128分辨率训练了各穿⾐服和没穿⾐服的⼥优各⼀千多张,同样是默认参数训练了120个epoch,最后⼩
部分成功“穿⾐服”的结果如下:
虽然都有些突兀,但好⽍是穿上⾐服了。注意马赛克不是图⽚⾥就有的,是我后来加上去的。
那么,脱⾐服的例⼦在哪⾥?
参考⽂献
[1]2016tutorial:reprintarXiv:1701.00160,2016.
[2],S.K.Sønderby,GeneratingFaceswithTorch.
[3],S.K.Sønderby,elle,,
pages1558–1566,2016.
[4],,,ero,,,,,-realisticsingleimagesuper-
:1609.04802,2016.
[5],J.-,,,2016.
[6]erger,r,.U-net:AI,pages234–
er,2015.
[7],,iza,,reprint
arXiv:1512.04150,2015.
[8]He,D.,Xia,Y.,Qin,T.,Wang,L.,Yu,N.,Liu,T.-Y.,andMa,W.-Y.(2016a).nnual
ConferenceonNeuralInformationProcessingSystems(NIPS),2016.
[9]
[10]J.-,,,edima
preprintarXiv:1703.10593,2017.
[11],,,,ngt
e-prints,Mar.2017.
[12],,,N:reprint
arXiv:1704.02510,2017.
[13]M.-ncesinNeuralInformationProcessingSystems(NIPS),
2016.
[14]M.-,,reprintarXiv:1703.00848,2017.
[15]Dong,H.,Neekhara,P.,Wu,C.,Guo,Y.:Unsuperreprint
arXiv:1701.02676,2017.
更多推荐
去除马赛克的app
发布评论