电脑僵尸网络病毒cfcf买复活币抽奖活动

&figure&&img src=&https://pic3.zhimg.com/v2-da6e908fbff06e8e14c60d86d776d225_b.jpg& data-rawwidth=&768& data-rawheight=&576& class=&origin_image zh-lightbox-thumb& width=&768& data-original=&https://pic3.zhimg.com/v2-da6e908fbff06e8e14c60d86d776d225_r.jpg&&&/figure&&p&&/p&&figure&&img src=&https://pic1.zhimg.com/v2-abd42bbb61ee_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&558& data-rawheight=&315& class=&origin_image zh-lightbox-thumb& width=&558& data-original=&https://pic1.zhimg.com/v2-abd42bbb61ee_r.jpg&&&/figure&&p&作为一名久经片场的老司机,早就想写一些探讨驾驶技术的文章。这篇就介绍利用生成式对抗网络(GAN)的两个基本驾驶技能:&br&&/p&&p&1) 去除(爱情)动作片中的马赛克&/p&&p&2) 给(爱情)动作片中的女孩穿(tuo)衣服&/p&&p&&br&&/p&&h2&生成式模型&/h2&&p&上一篇《&a href=&https://zhuanlan.zhihu.com/p/& class=&internal&&用GAN生成二维样本的小例子&/a&》中已经简单介绍了GAN,这篇再简要回顾一下生成式模型,算是补全一个来龙去脉。&/p&&p&生成模型就是能够产生指定分布数据的模型,常见的生成式模型一般都会有一个用于产生样本的简单分布。例如一个均匀分布,根据要生成分布的概率密度函数,进行建模,让均匀分布中的样本经过变换得到指定分布的样本,这就可以算是最简单的生成式模型。比如下面例子:&/p&&figure&&img src=&https://pic1.zhimg.com/v2-d11b5fb26d3cc8e942f841bafe010cd8_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&1021& data-rawheight=&443& class=&origin_image zh-lightbox-thumb& width=&1021& data-original=&https://pic1.zhimg.com/v2-d11b5fb26d3cc8e942f841bafe010cd8_r.jpg&&&/figure&&p&图中左边是一个自定义的概率密度函数,右边是相应的1w个样本的直方图,自定义分布和生成这些样本的代码如下:&br&&/p&&div class=&highlight&&&pre&&code class=&language-python&&&span&&/span&&span class=&kn&&from&/span& &span class=&nn&&functools&/span& &span class=&kn&&import&/span& &span class=&n&&partial&/span&
&span class=&kn&&import&/span& &span class=&nn&&numpy&/span&
&span class=&kn&&from&/span& &span class=&nn&&matplotlib&/span& &span class=&kn&&import&/span& &span class=&n&&pyplot&/span&
&span class=&c1&&# Define a PDF&/span&
&span class=&n&&x_samples&/span& &span class=&o&&=&/span& &span class=&n&&numpy&/span&&span class=&o&&.&/span&&span class=&n&&arange&/span&&span class=&p&&(&/span&&span class=&o&&-&/span&&span class=&mi&&3&/span&&span class=&p&&,&/span& &span class=&mf&&3.01&/span&&span class=&p&&,&/span& &span class=&mf&&0.01&/span&&span class=&p&&)&/span&
&span class=&n&&PDF&/span& &span class=&o&&=&/span& &span class=&n&&numpy&/span&&span class=&o&&.&/span&&span class=&n&&empty&/span&&span class=&p&&(&/span&&span class=&n&&x_samples&/span&&span class=&o&&.&/span&&span class=&n&&shape&/span&&span class=&p&&)&/span&
&span class=&n&&PDF&/span&&span class=&p&&[&/span&&span class=&n&&x_samples&/span& &span class=&o&&&&/span& &span class=&mi&&0&/span&&span class=&p&&]&/span& &span class=&o&&=&/span& &span class=&n&&numpy&/span&&span class=&o&&.&/span&&span class=&n&&round&/span&&span class=&p&&(&/span&&span class=&n&&x_samples&/span&&span class=&p&&[&/span&&span class=&n&&x_samples&/span& &span class=&o&&&&/span& &span class=&mi&&0&/span&&span class=&p&&]&/span& &span class=&o&&+&/span& &span class=&mf&&3.5&/span&&span class=&p&&)&/span& &span class=&o&&/&/span& &span class=&mi&&3&/span&
&span class=&n&&PDF&/span&&span class=&p&&[&/span&&span class=&n&&x_samples&/span& &span class=&o&&&=&/span& &span class=&mi&&0&/span&&span class=&p&&]&/span& &span class=&o&&=&/span& &span class=&mf&&0.5&/span& &span class=&o&&*&/span& &span class=&n&&numpy&/span&&span class=&o&&.&/span&&span class=&n&&cos&/span&&span class=&p&&(&/span&&span class=&n&&numpy&/span&&span class=&o&&.&/span&&span class=&n&&pi&/span& &span class=&o&&*&/span& &span class=&n&&x_samples&/span&&span class=&p&&[&/span&&span class=&n&&x_samples&/span& &span class=&o&&&=&/span& &span class=&mi&&0&/span&&span class=&p&&])&/span& &span class=&o&&+&/span& &span class=&mf&&0.5&/span&
&span class=&n&&PDF&/span& &span class=&o&&/=&/span& &span class=&n&&numpy&/span&&span class=&o&&.&/span&&span class=&n&&sum&/span&&span class=&p&&(&/span&&span class=&n&&PDF&/span&&span class=&p&&)&/span&
&span class=&c1&&# Calculate approximated CDF&/span&
&span class=&n&&CDF&/span& &span class=&o&&=&/span& &span class=&n&&numpy&/span&&span class=&o&&.&/span&&span class=&n&&empty&/span&&span class=&p&&(&/span&&span class=&n&&PDF&/span&&span class=&o&&.&/span&&span class=&n&&shape&/span&&span class=&p&&)&/span&
&span class=&n&&cumulated&/span& &span class=&o&&=&/span& &span class=&mi&&0&/span&
&span class=&k&&for&/span& &span class=&n&&i&/span& &span class=&ow&&in&/span& &span class=&nb&&range&/span&&span class=&p&&(&/span&&span class=&n&&CDF&/span&&span class=&o&&.&/span&&span class=&n&&shape&/span&&span class=&p&&[&/span&&span class=&mi&&0&/span&&span class=&p&&]):&/span&
&span class=&n&&cumulated&/span& &span class=&o&&+=&/span& &span class=&n&&PDF&/span&&span class=&p&&[&/span&&span class=&n&&i&/span&&span class=&p&&]&/span&
&span class=&n&&CDF&/span&&span class=&p&&[&/span&&span class=&n&&i&/span&&span class=&p&&]&/span& &span class=&o&&=&/span& &span class=&n&&cumulated&/span&
&span class=&c1&&# Generate samples&/span&
&span class=&n&&generate&/span& &span class=&o&&=&/span& &span class=&n&&partial&/span&&span class=&p&&(&/span&&span class=&n&&numpy&/span&&span class=&o&&.&/span&&span class=&n&&interp&/span&&span class=&p&&,&/span& &span class=&n&&xp&/span&&span class=&o&&=&/span&&span class=&n&&CDF&/span&&span class=&p&&,&/span& &span class=&n&&fp&/span&&span class=&o&&=&/span&&span class=&n&&x_samples&/span&&span class=&p&&)&/span&
&span class=&n&&u_rv&/span& &span class=&o&&=&/span& &span class=&n&&numpy&/span&&span class=&o&&.&/span&&span class=&n&&random&/span&&span class=&o&&.&/span&&span class=&n&&random&/span&&span class=&p&&(&/span&&span class=&mi&&10000&/span&&span class=&p&&)&/span&
&span class=&n&&x&/span& &span class=&o&&=&/span& &span class=&n&&generate&/span&&span class=&p&&(&/span&&span class=&n&&u_rv&/span&&span class=&p&&)&/span&
&span class=&c1&&# Visualization&/span&
&span class=&n&&fig&/span&&span class=&p&&,&/span& &span class=&p&&(&/span&&span class=&n&&ax0&/span&&span class=&p&&,&/span& &span class=&n&&ax1&/span&&span class=&p&&)&/span& &span class=&o&&=&/span& &span class=&n&&pyplot&/span&&span class=&o&&.&/span&&span class=&n&&subplots&/span&&span class=&p&&(&/span&&span class=&n&&ncols&/span&&span class=&o&&=&/span&&span class=&mi&&2&/span&&span class=&p&&,&/span& &span class=&n&&figsize&/span&&span class=&o&&=&/span&&span class=&p&&(&/span&&span class=&mi&&9&/span&&span class=&p&&,&/span& &span class=&mi&&4&/span&&span class=&p&&))&/span&
&span class=&n&&ax0&/span&&span class=&o&&.&/span&&span class=&n&&plot&/span&&span class=&p&&(&/span&&span class=&n&&x_samples&/span&&span class=&p&&,&/span& &span class=&n&&PDF&/span&&span class=&p&&)&/span&
&span class=&n&&ax0&/span&&span class=&o&&.&/span&&span class=&n&&axis&/span&&span class=&p&&([&/span&&span class=&o&&-&/span&&span class=&mf&&3.5&/span&&span class=&p&&,&/span& &span class=&mf&&3.5&/span&&span class=&p&&,&/span& &span class=&mi&&0&/span&&span class=&p&&,&/span& &span class=&n&&numpy&/span&&span class=&o&&.&/span&&span class=&n&&max&/span&&span class=&p&&(&/span&&span class=&n&&PDF&/span&&span class=&p&&)&/span&&span class=&o&&*&/span&&span class=&mf&&1.1&/span&&span class=&p&&])&/span&
&span class=&n&&ax1&/span&&span class=&o&&.&/span&&span class=&n&&hist&/span&&span class=&p&&(&/span&&span class=&n&&x&/span&&span class=&p&&,&/span& &span class=&mi&&100&/span&&span class=&p&&)&/span&
&span class=&n&&pyplot&/span&&span class=&o&&.&/span&&span class=&n&&show&/span&&span class=&p&&()&/span&
&/code&&/pre&&/div&&p&对于一些简单的情况,我们会假设已知有模型可以很好的对分布进行建模,缺少的只是合适的参数。这时候很自然只要根据观测到的样本,学习参数让当前观测到的样本下的似然函数最大,这就是最大似然估计(&b&M&/b&aximum &b&L&/b&ikelihood &b&E&/b&stimation):&br&&/p&&p&&img src=&https://www.zhihu.com/equation?tex=%5Chat%7B%5Ctheta%7D%3D%5Coperatorname%2A%7Bargmax%7D_%7B%5Ctheta%7D+P%28%5Cbm%7Bx%7D%7C%5Ctheta%29+%3D+%5Coperatorname%2A%7Bargmax%7D_%7B%5Ctheta%7D+%5Cprod_%7Bi%3D1%7D%5E%7Bn%7DP%28x_i%7C%5Ctheta%29+& alt=&\hat{\theta}=\operatorname*{argmax}_{\theta} P(\bm{x}|\theta) = \operatorname*{argmax}_{\theta} \prod_{i=1}^{n}P(x_i|\theta) & eeimg=&1&&&/p&&p&MLE是一个最基本的思路,实践中用得很多的还有KL散度(Kullback–Leibler divergence),假设真实分布是P,采样分布是Q,则KL散度为:&/p&&p&&img src=&https://www.zhihu.com/equation?tex=D_%7BKL%7D%28P%7C%7CQ%29%3D%5Csum_%7Bx+%5Cin+%5COmega%7DP%28%7Bx%7D%29%5Clog%5Cfrac%7BP%28x%29%7D%7BQ%28x%29%7D+& alt=&D_{KL}(P||Q)=\sum_{x \in \Omega}P({x})\log\frac{P(x)}{Q(x)} & eeimg=&1&&&/p&&p&从公式也能看出来,KL散度描述的是两个分布的差异程度。换个角度来看,让产生的样本和原始分布接近,也就是要让这俩的差异减小,所以最小化KL散度就等同于MLE。从公式上来看的话,我们考虑把公式具体展开一下:&/p&&p&&br&&/p&&p&&img src=&https://www.zhihu.com/equation?tex=%5Cbegin%7Balign%7D+D_%7BKL%7D%28P%7C%7CQ%29+%26%3D%5Csum_%7Bx+%5Cin+%5COmega%7DP%28%7Bx%7D%29%5Clog%5Cfrac%7BP%28x%29%7D%7BQ%28x%29%7D+%5C%5C+%26+%3D-%5Csum_%7Bx%5Cin%5COmega%7DP%28%7Bx%7D%29%5Clog%7BQ%28x%29%7D+%2B%5Csum_%7Bx%5Cin%5COmega%7DP%28%7Bx%7D%29%5Clog%7BP%28x%29%7D+%5C%5C+%26+%3D-%5Csum_%7Bx%5Cin%5COmega%7DP%28%7Bx%7D%29%5Clog%7BQ%28x%29%7D+%2BH%28P%29+%5Cend%7Balign%7D& alt=&\begin{align} D_{KL}(P||Q) &=\sum_{x \in \Omega}P({x})\log\frac{P(x)}{Q(x)} \\ & =-\sum_{x\in\Omega}P({x})\log{Q(x)} +\sum_{x\in\Omega}P({x})\log{P(x)} \\ & =-\sum_{x\in\Omega}P({x})\log{Q(x)} +H(P) \end{align}& eeimg=&1&&&/p&&p&公式的第二项就是熵,先不管这项,用H(P)表示。接下来考虑一个小trick:从Q中抽样n个样本&img src=&https://www.zhihu.com/equation?tex=%7Bx_1%2Cx_2%2C...%2Cx_n%7D& alt=&{x_1,x_2,...,x_n}& eeimg=&1&&,来估算P(x)的经验值(empirical density function):&br&&/p&&p&&img src=&https://www.zhihu.com/equation?tex=%5Chat%7BP%7D%28x%29%3D%5Cfrac+1+n+%5Csum_%7Bi%3D1%7D%5En+%5Cdelta%28x_i-x%29& alt=&\hat{P}(x)=\frac 1 n \sum_{i=1}^n \delta(x_i-x)& eeimg=&1&&&/p&&p&其中&img src=&https://www.zhihu.com/equation?tex=%5Cdelta%28%5Ccdot%29& alt=&\delta(\cdot)& eeimg=&1&&是狄拉克&img src=&https://www.zhihu.com/equation?tex=%5Cdelta& alt=&\delta& eeimg=&1&&函数,把这项替换到上面公式的P(x):&/p&&p&&br&&/p&&p&&img src=&https://www.zhihu.com/equation?tex=%5Cbegin%7Balign%7D+D_%7BKL%7D%28P%7C%7CQ%29+%26%3D-%5Csum_%7Bx%5Cin%5COmega%7D%5Cfrac+1+n+%5Csum_%7Bi%3D1%7D%5En+%5Cdelta%28x_i-x%29%5Clog%7BQ%28x%29%7D+%2BH%28P%29+%5C%5C+%26+%3D-%5Cfrac+1+n+%5Csum_%7Bi%3D1%7D%5En+%5Csum_%7Bx%5Cin%5COmega%7D+%5Cdelta%28x_i-x%29%5Clog%7BQ%28x%29%7D+%2BH%28P%29+%5Cend%7Balign%7D& alt=&\begin{align} D_{KL}(P||Q) &=-\sum_{x\in\Omega}\frac 1 n \sum_{i=1}^n \delta(x_i-x)\log{Q(x)} +H(P) \\ & =-\frac 1 n \sum_{i=1}^n \sum_{x\in\Omega} \delta(x_i-x)\log{Q(x)} +H(P) \end{align}& eeimg=&1&&&/p&&p&因为是离散的采样值,所以&img src=&https://www.zhihu.com/equation?tex=%5Csum_%7Bx%5Cin%5COmega%7D+%5Cdelta%28x_i-x%29& alt=&\sum_{x\in\Omega} \delta(x_i-x)& eeimg=&1&&中只有&img src=&https://www.zhihu.com/equation?tex=x%3Dx_i& alt=&x=x_i& eeimg=&1&&的时候狄拉克&img src=&https://www.zhihu.com/equation?tex=%5Cdelta& alt=&\delta& eeimg=&1&&函数才为1,所以考虑&img src=&https://www.zhihu.com/equation?tex=x%3Dx_i& alt=&x=x_i& eeimg=&1&&时这项直接化为1:&/p&&p&&br&&/p&&p&&img src=&https://www.zhihu.com/equation?tex=D_%7BKL%7D%28P%7C%7CQ%29+%3D-%5Cfrac+1+n%5Csum_%7Bi%3D1%7D%5En+%5Clog%7BQ%28x_i%29%7D+%2BH%28P%29& alt=&D_{KL}(P||Q) =-\frac 1 n\sum_{i=1}^n \log{Q(x_i)} +H(P)& eeimg=&1&&&/p&&p&第一项正是似然的负对数形式。&/p&&p&说了些公式似乎跑得有点远了,其实要表达还是那个简单的意思:通过减小两个分布的差异可以让一个分布逼近另一个分布。仔细想想,这正是GAN里面adversarial loss的做法。&/p&&p&很多情况下我们面临的是更为复杂的分布,比如&a href=&https://zhuanlan.zhihu.com/p/& class=&internal&&上篇文章&/a&中的例子,又或是实际场景中更复杂的情况,比如生成不同人脸的图像。这时候,作为具有universal approximation性质的神经网络是一个看上去不错的选择[1]:&br&&/p&&figure&&img src=&https://pic4.zhimg.com/v2-6fee20494f50baae2c1dc5fc_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&1561& data-rawheight=&549& class=&origin_image zh-lightbox-thumb& width=&1561& data-original=&https://pic4.zhimg.com/v2-6fee20494f50baae2c1dc5fc_r.jpg&&&/figure&&p&所以虽然GAN里面同时包含了生成网络和判别网络,但本质来说GAN的目的还是生成模型。从生成式模型的角度,Ian Goodfellow总结过一个和神经网络相关生成式方法的“家谱”[1]:&/p&&figure&&img src=&https://pic4.zhimg.com/v2-8c6f1d8ee39dfbb4fcfb2_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&771& data-rawheight=&498& class=&origin_image zh-lightbox-thumb& width=&771& data-original=&https://pic4.zhimg.com/v2-8c6f1d8ee39dfbb4fcfb2_r.jpg&&&/figure&&p&在这其中,当下最流行的就是GAN和&b&V&/b&ariational &b&A&/b&uto&b&E&/b&ncoder(VAE),两种方法的一个简明示意如下[3]:&/p&&figure&&img src=&https://pic1.zhimg.com/v2-380cde71a2f6ece28b4a97_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&568& data-rawheight=&274& class=&origin_image zh-lightbox-thumb& width=&568& data-original=&https://pic1.zhimg.com/v2-380cde71a2f6ece28b4a97_r.jpg&&&/figure&&p&本篇不打算展开讲什么是VAE,不过通过这个图,和名字中的autoencoder也大概能知道,VAE中生成的loss是基于重建误差的。而只基于重建误差的图像生成,都或多或少会有图像模糊的缺点,因为误差通常都是针对全局。比如基于MSE(Mean Squared Error)的方法用来生成超分辨率图像,容易出现下面的情况[4]:&/p&&p&&br&&/p&&p&&br&&/p&&figure&&img src=&https://pic1.zhimg.com/v2-78f53b142fab51b0c09a1_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&892& data-rawheight=&598& class=&origin_image zh-lightbox-thumb& width=&892& data-original=&https://pic1.zhimg.com/v2-78f53b142fab51b0c09a1_r.jpg&&&/figure&&p&在这个二维示意中,真实数据分布在一个U形的流形上,而MSE系的方法因为loss的形式往往会得到一个接近平均值所在的位置(蓝色框)。&/p&&p&GAN在这方面则完爆其他方法,因为目标分布在流形上。所以只要大概收敛了,就算生成的图像都看不出是个啥,清晰度常常是有保证的,而这正是去除女优身上马赛克的理想特性!&/p&&p&&br&&/p&&h2&马赛克-&清晰画面:超分辨率(Super Resolution)问题&/h2&&p&说了好些铺垫,终于要进入正题了。首先明确,去马赛克其实是个图像超分辨率问题,也就是如何在低分辨率图像基础上得到更高分辨率的图像:&/p&&figure&&img src=&https://pic2.zhimg.com/v2-31c84b42ad_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&784& data-rawheight=&324& class=&origin_image zh-lightbox-thumb& width=&784& data-original=&https://pic2.zhimg.com/v2-31c84b42ad_r.jpg&&&/figure&&p&视频中超分辨率实现的一个套路是通过不同帧的低分辨率画面猜测超分辨率的画面,有兴趣了解这个思想的朋友可以参考我之前的一个答案:&a href=&https://www.zhihu.com/question//answer/& class=&internal&&如何通过多帧影像进行超分辨率重构? &/a& &/p&&p&不过基于多帧影像的方法对于女优身上的马赛克并不是很适用,所以这篇要讲的是基于单帧图像的超分辨率方法。&/p&&h2&SRGAN&/h2&&p&说到基于GAN的超分辨率的方法,就不能不提到SRGAN[4]:《Photo-Realistic Single Image &b&S&/b&uper-&b&R&/b&esolution Using a &b&G&/b&enerative &b&A&/b&dversarial&br&&b&N&/b&etwork》。这个工作的思路是:基于像素的MSE loss往往会得到大体正确,但是高频成分模糊的结果。所以只要重建低频成分的图像内容,然后靠GAN来补全高频的细节内容,就可以了:&/p&&figure&&img src=&https://pic3.zhimg.com/v2-128029dfc7c470b07a4a1_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&446& data-rawheight=&131& class=&origin_image zh-lightbox-thumb& width=&446& data-original=&https://pic3.zhimg.com/v2-128029dfc7c470b07a4a1_r.jpg&&&/figure&&p&这个思路其实和最早基于深度网络的风格迁移的思路很像(有兴趣的读者可以参考我之前文章&a href=&https://zhuanlan.zhihu.com/p/& class=&internal&&瞎谈CNN:通过优化求解输入图像&/a&的最后一部分),其中重建内容的content loss是原始图像和低分辨率图像在VGG网络中的各个ReLU层的激活值的差异:&/p&&p&&br&&/p&&figure&&img src=&https://pic3.zhimg.com/v2-331e02e394cfd04e7114a_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&529& data-rawheight=&150& class=&origin_image zh-lightbox-thumb& width=&529& data-original=&https://pic3.zhimg.com/v2-331e02e394cfd04e7114a_r.jpg&&&/figure&&p&生成细节adversarial loss就是GAN用来判别是原始图还是生成图的loss:&/p&&figure&&img src=&https://pic1.zhimg.com/v2-fa5af2a10fe9a4dadfb04_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&394& data-rawheight=&89& class=&content_image& width=&394&&&/figure&&p&把这两种loss放一起,取个名叫perceptual loss。训练的网络结构如下:&/p&&figure&&img src=&https://pic1.zhimg.com/v2-17861edeb4bcfae4e9f369_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&780& data-rawheight=&400& class=&origin_image zh-lightbox-thumb& width=&780& data-original=&https://pic1.zhimg.com/v2-17861edeb4bcfae4e9f369_r.jpg&&&/figure&&p&正是上篇文章中讲过的C-GAN,条件C就是低分辨率的图片。SRGAN生成的超分辨率图像虽然PSNR等和原图直接比较的传统量化指标并不是最好,但就视觉效果,尤其是细节上,胜过其他方法很多。比如下面是作者对比bicubic插值和基于ResNet特征重建的超分辨率的结果:&/p&&figure&&img src=&https://pic4.zhimg.com/v2-f3b4376938ffcbd23c42d_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&981& data-rawheight=&392& class=&origin_image zh-lightbox-thumb& width=&981& data-original=&https://pic4.zhimg.com/v2-f3b4376938ffcbd23c42d_r.jpg&&&/figure&&p&可以看到虽然很多细节都和原始图片不一样,不过看上去很和谐,并且细节的丰富程度远胜于SRResNet。这些栩栩如生的细节,可以看作是GAN根据学习到的分布信息“联想”出来的。&/p&&p&对于更看重“看上去好看”的超分辨率应用,SRGAN显然是很合适的。当然对于一些更看重重建指标的应用,比如超分辨率恢复嫌疑犯面部细节,SRGAN就不可以了。&/p&&h2&pix2pix&/h2&&p&虽然专门用了一节讲SRGAN,但本文用的方法其实是pix2pix[5]。这项工作刚在arxiv上发布就引起了不小的关注,它巧妙的利用GAN的框架解决了通用的Image-to-Image translation的问题。举例来说,在不改变分辨率的情况下:把照片变成油画风格;把白天的照片变成晚上;用色块对图片进行分割或者倒过来;为黑白照片上色;…每个任务都有专门针对性的方法和相关研究,但其实总体来看,都是像素到像素的一种映射啊,其实可以看作是一个问题。这篇文章的巧妙,就在于提出了pix2pix的方法,一个框架,解决所有这些问题。方法的示意图如下:&/p&&p&&br&&/p&&figure&&img src=&https://pic1.zhimg.com/v2-e2ea753b7b0d7f18abee3_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&485& data-rawheight=&437& class=&origin_image zh-lightbox-thumb& width=&485& data-original=&https://pic1.zhimg.com/v2-e2ea753b7b0d7f18abee3_r.jpg&&&/figure&&p&就是一个Conditional GAN,条件C是输入的图片。除了直接用C-GAN,这项工作还有两个改进:&/p&&p&1)&b&利用U-Net结构生成细节更好的图片&/b&[6]&/p&&figure&&img src=&https://pic4.zhimg.com/v2-beb074bebbfa0db_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&907& data-rawheight=&612& class=&origin_image zh-lightbox-thumb& width=&907& data-original=&https://pic4.zhimg.com/v2-beb074bebbfa0db_r.jpg&&&/figure&&p&U-Net是德国Freiburg大学模式识别和图像处理组提出的一种全卷积结构。和常见的先降采样到低维度,再升采样到原始分辨率的编解码(Encoder-Decoder)结构的网络相比,U-Net的区别是加入skip-connection,对应的feature maps和decode之后的同样大小的feature maps按通道拼(concatenate)一起,用来保留不同分辨率下像素级的细节信息。U-Net对提升细节的效果非常明显,下面是pix2pix文中给出的一个效果对比:&/p&&p&&br&&/p&&figure&&img src=&https://pic4.zhimg.com/v2-2fb4ddb2fdc24eea31eea_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&563& data-rawheight=&307& class=&origin_image zh-lightbox-thumb& width=&563& data-original=&https://pic4.zhimg.com/v2-2fb4ddb2fdc24eea31eea_r.jpg&&&/figure&&p&可以看到,各种不同尺度的信息都得到了很大程度的保留。&/p&&p&2)&b&利用马尔科夫性的判别器(PatchGAN)&br&&/b&&/p&&p&pix2pix和SRGAN的一个异曲同工的地方是都有用重建解决低频成分,用GAN解决高频成分的想法。在pix2pix中,这个思想主要体现在两个地方。一个是loss函数,加入了L1 loss用来让生成的图片和训练的目标图片尽量相似,而图像中高频的细节部分则交由GAN来处理:&/p&&figure&&img src=&https://pic4.zhimg.com/v2-cb180ad03d8a72e7883285b_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&447& data-rawheight=&51& class=&origin_image zh-lightbox-thumb& width=&447& data-original=&https://pic4.zhimg.com/v2-cb180ad03d8a72e7883285b_r.jpg&&&/figure&&p&还有一个就是&b&PatchGAN&/b&,也就是具体的GAN中用来判别是否生成图的方法。PatchGAN的思想是,既然GAN只负责处理低频成分,那么判别器就没必要以一整张图作为输入,只需要对NxN的一个图像patch去进行判别就可以了。这也是为什么叫Markovian discriminator,因为在patch以外的部分认为和本patch互相独立。&/p&&p&具体实现的时候,作者使用的是一个NxN输入的全卷积小网络,最后一层每个像素过sigmoid输出为真的概率,然后用BCEloss计算得到最终loss。这样做的好处是因为输入的维度大大降低,所以参数量少,运算速度也比直接输入一张快,并且可以计算任意大小的图。作者对比了不同大小patch的结果,对于256x256的输入,patch大小在70x70的时候,从视觉上看结果就和直接把整张图片作为判别器输入没什么区别了:&/p&&figure&&img src=&https://pic1.zhimg.com/v2-5172ca51efb4ee3e453b15_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&842& data-rawheight=&107& class=&origin_image zh-lightbox-thumb& width=&842& data-original=&https://pic1.zhimg.com/v2-5172ca51efb4ee3e453b15_r.jpg&&&/figure&&h2&生成带局部马赛克的训练数据&/h2&&p&利用pix2pix,只要准备好无码和相应的有码图片就可以训练去马赛克的模型了,就是这么简单。那么问题是,如何生成有马赛克的图片?&/p&&p&有毅力的话,可以手动加马赛克,这样最为精准。这节介绍一个不那么准,但是比随机强的方法:利用分类模型的激活区域进行自动马赛克标注。&/p&&p&基本思想是利用一个可以识别需要打码图像的分类模型,提取出这个模型中对应类的CAM(&b&C&/b&lass &b&A&/b&ctivation &b&M&/b&ap)[7],然后用马赛克遮住响应最高的区域即可。这里简单说一下什么是CAM,对于最后一层是全局池化(平均或最大都可以)的CNN结构,池化后的feature map相当于是做了个加权相加来计算最终的每个类别进入softmax之前的激活值。CAM的思路是,把这个权重在池化前的feature map上按像素加权相加,最后得到的单张的激活图就可以携带激活当前类别的一些位置信息,这相当于一种弱监督(classification--&localization):&/p&&p&&br&&/p&&figure&&img src=&https://pic4.zhimg.com/v2-fd28f0b871bd_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&660& data-rawheight=&314& class=&origin_image zh-lightbox-thumb& width=&660& data-original=&https://pic4.zhimg.com/v2-fd28f0b871bd_r.jpg&&&/figure&&p&上图是一个CAM的示意,用澳洲梗类别的CAM,放大到原图大小,可以看到小狗所在的区域大致是激活响应最高的区域。&/p&&p&那么就缺一个可以识别XXX图片的模型了,网上还恰好就有个现成的,yahoo于2016年发布的开源色情图片识别模型Open NSFW(&b&N&/b&ot &b&S&/b&afe &b&F&/b&or &b&W&/b&ork):&/p&&p&&a href=&https://link.zhihu.com/?target=https%3A//github.com/yahoo/open_nsfw& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&yahoo/open_nsfw&/a&&/p&&p&CAM的实现并不难,结合Open NSFW自动打码的代码和使用放在了这里:&/p&&p&&a href=&https://link.zhihu.com/?target=https%3A//github.com/frombeijingwithlove/dlcv_for_beginners/tree/master/random_bonus/generate_mosaic_for_porno_images& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&给XX图片生成马赛克&/a&&/p&&p&&br&&/p&&p&(成功打码的)效果差不多是下面这样子:&/p&&figure&&img src=&https://pic4.zhimg.com/v2-cbefa39dc983f2645dd8_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&768& data-rawheight=&256& class=&origin_image zh-lightbox-thumb& width=&768& data-original=&https://pic4.zhimg.com/v2-cbefa39dc983f2645dd8_r.jpg&&&/figure&&h2&去除(爱情)动作片中的马赛克&/h2&&p&这没什么好说的了,一行代码都不用改,只需要按照前面的步骤把数据准备好,然后按照pix2pix官方的使用方法训练就可以了:&/p&&p&Torch版pix2pix:&a href=&https://link.zhihu.com/?target=https%3A//github.com/phillipi/pix2pix& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&phillipi/pix2pix&/a&&/p&&p&pyTorch版pix2pix(Cycle-GAN二合一版):&a href=&https://link.zhihu.com/?target=https%3A//github.com/junyanz/pytorch-CycleGAN-and-pix2pix& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&junyanz/pytorch-CycleGAN-and-pix2pix&/a&&/p&&p&从D盘里随随便便找了几千张图片,用来执行了一下自动打码和pix2pix训练(默认参数),效果是下面这样:&/p&&p&&br&&/p&&figure&&img src=&https://pic4.zhimg.com/v2-9f52b17c0e1296767cbfbfafc290a5bd_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&814& data-rawheight=&691& class=&origin_image zh-lightbox-thumb& width=&814& data-original=&https://pic4.zhimg.com/v2-9f52b17c0e1296767cbfbfafc290a5bd_r.jpg&&&/figure&&p&什么?你问说好给女优去马赛克呢?女优照片呢?&/p&&figure&&img src=&https://pic4.zhimg.com/v2-480fb8a4dcfc7a4f92ec_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&75& data-rawheight=&60& class=&content_image& width=&75&&&/figure&&p&还是要说一下,在真人照片上的效果比蘑菇和花强。&/p&&h2&对偶学习(Dual Learning)&/h2&&p&去马赛克已经讲完了,接下来就是给女孩穿(tuo)衣服了,动手之前,还是先讲一下铺垫:&b&对偶学习&/b&和&b&Cycle-GAN&/b&。&/p&&p&对偶学习是MSRA于2016年提出的一种用于机器翻译的增强学习方法[8],目的是解决海量数据配对标注的难题,个人觉得算是一种弱监督方法(不过看到大多数文献算作无监督)。以机器翻译为例,对偶学习基本思想如下图[9]:&/p&&figure&&img src=&https://pic3.zhimg.com/v2-c4b1eeda364fb6c9bada02f3_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&866& data-rawheight=&399& class=&origin_image zh-lightbox-thumb& width=&866& data-original=&https://pic3.zhimg.com/v2-c4b1eeda364fb6c9bada02f3_r.jpg&&&/figure&&p&左边的灰衣男只懂英语,右边的黑衣女只懂中文,现在的任务就是,要学习如何翻译英语到中文。对偶学习解决这个问题的思路是:给定一个模型&img src=&https://www.zhihu.com/equation?tex=f%3Ax%5Crightarrow+y& alt=&f:x\rightarrow y& eeimg=&1&&一上来无法知道f翻译得是否正确,但是如果考虑上&img src=&https://www.zhihu.com/equation?tex=f& alt=&f& eeimg=&1&&的对偶问题&img src=&https://www.zhihu.com/equation?tex=g%3Ay%5Crightarrow+x& alt=&g:y\rightarrow x& eeimg=&1&&,那么我可以尝试翻译一个英文句子到中文,再翻译回来。这种转了一圈的结果&img src=&https://www.zhihu.com/equation?tex=x%27%3Dg%28f%28x%29%29& alt=&x'=g(f(x))& eeimg=&1&&,灰衣男是可以用一个标准(BLEU)判断x'和x是否一个意思,并且把结果的一致性反馈给这两个模型进行改进。同样的,从中文取个句子,这样循环翻译一遍,两个模型又能从黑衣女那里获取反馈并改进模型。其实这就是强化学习的过程,每次翻译就是一个action,每个action会从环境(灰衣男或黑衣女)中获取reward,对模型进行改进,直至收敛。&/p&&p&也许有的人看到这里会觉得和上世纪提出的Co-training很像,这个在知乎上也有讨论:&/p&&p&&a href=&https://www.zhihu.com/question/& class=&internal&&如何理解刘铁岩老师团队在NIPS 2016上提出的对偶学习(Dual Learning)?&/a&&/p&&p&个人觉得还是不一样的,Co-Training是一种multi-view方法,比如一个输入x,如果看作是两个拼一起的特征&img src=&https://www.zhihu.com/equation?tex=x%3D%28x_1%2Cx_2%29& alt=&x=(x_1,x_2)& eeimg=&1&&,并且假设&img src=&https://www.zhihu.com/equation?tex=x_1& alt=&x_1& eeimg=&1&&和&img src=&https://www.zhihu.com/equation?tex=x_2& alt=&x_2& eeimg=&1&&互相独立,那么这时候训练两个分类器&img src=&https://www.zhihu.com/equation?tex=f_1%28%5Ccdot%29& alt=&f_1(\cdot)& eeimg=&1&&和&img src=&https://www.zhihu.com/equation?tex=f_2%28%5Ccdot%29& alt=&f_2(\cdot)& eeimg=&1&&对于任意样本x应该有&img src=&https://www.zhihu.com/equation?tex=f_1%28x_1%29%3Df_2%28x_2%29& alt=&f_1(x_1)=f_2(x_2)& eeimg=&1&&。这对没有标注的样本是很有用的,相当于利用了同一个样本分类结果就应该一样的隐含约束。所以Co-Training的典型场景是少量标注+大量未标注的半监督场景。并且&img src=&https://www.zhihu.com/equation?tex=f_1& alt=&f_1& eeimg=&1&&和&img src=&https://www.zhihu.com/equation?tex=f_2& alt=&f_2& eeimg=&1&&其实是两个不同,但是domain指向相同的任务。而Dual Learning中&img src=&https://www.zhihu.com/equation?tex=f& alt=&f& eeimg=&1&&和&img src=&https://www.zhihu.com/equation?tex=g& alt=&g& eeimg=&1&&是对偶任务,利用的隐含约束是&img src=&https://www.zhihu.com/equation?tex=x%5Crightarrow+y%5Crightarrow+x& alt=&x\rightarrow y\rightarrow x& eeimg=&1&&的cycle consistency。对输入的特征也没有像Co-Training有那么明确的假设,学习方法上也不一样,Dual Learning算是强化学习。&/p&&h2&CycleGAN和未配对图像翻译(Unpaired Image-to-Image Translation)&/h2&&p&CycleGAN,翻译过来就是:轮着干,是结合了对偶学习和GAN一个很直接而巧妙的想法[10],示意图如下:&/p&&figure&&img src=&https://pic4.zhimg.com/v2-9e7396ebccb7c42302fc97_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&838& data-rawheight=&216& class=&origin_image zh-lightbox-thumb& width=&838& data-original=&https://pic4.zhimg.com/v2-9e7396ebccb7c42302fc97_r.jpg&&&/figure&&p&X和Y分别是两种不同类型图的集合,比如穿衣服的女优和没穿衣服的女优。所以给定一张穿了衣服的女优,要变成没穿衣服的样子,就是个图片翻译问题。CycleGAN示意图中(b)和(c)就是Dual Learning:&/p&&figure&&img src=&https://pic2.zhimg.com/v2-de51cac58b_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&347& data-rawheight=&62& class=&content_image& width=&347&&&/figure&&p&在Dual Learning基础上,又加入了两个判别器&img src=&https://www.zhihu.com/equation?tex=D_X& alt=&D_X& eeimg=&1&&和&img src=&https://www.zhihu.com/equation?tex=D_Y& alt=&D_Y& eeimg=&1&&用来进行对抗训练,让翻译过来的图片尽量逼近当前集合中的图片:&/p&&p&&br&&/p&&figure&&img src=&https://pic3.zhimg.com/v2-e0ea7a6b38bf2a20cea4ea6f741a4c67_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&442& data-rawheight=&59& class=&origin_image zh-lightbox-thumb& width=&442& data-original=&https://pic3.zhimg.com/v2-e0ea7a6b38bf2a20cea4ea6f741a4c67_r.jpg&&&/figure&&p&全考虑一起,最终的loss是:&/p&&p&&br&&/p&&figure&&img src=&https://pic4.zhimg.com/v2-e6d99e7edea969da3dad_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&357& data-rawheight=&87& class=&content_image& width=&357&&&/figure&&p&也许有人会问,那不加cycle-consistency,直接用GAN学习一个&img src=&https://www.zhihu.com/equation?tex=X%5Crightarrow+Y& alt=&X\rightarrow Y& eeimg=&1&&的映射,让生成的Y的样本尽量毕竟Y里本身的样本可不可以呢?这个作者在文中也讨论了,会产生GAN训练中容易发生的mode collapse问题。mode collapse问题的一个简单示意如下[1]:&/p&&p&&br&&/p&&figure&&img src=&https://pic1.zhimg.com/v2-309fce6329592babb784ed_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&842& data-rawheight=&262& class=&origin_image zh-lightbox-thumb& width=&842& data-original=&https://pic1.zhimg.com/v2-309fce6329592babb784ed_r.jpg&&&/figure&&p&上边的是真实分布,下边的是学习到的分布,可以看到学习到的分布只是完整分布的一部分,这个叫做partial mode collapse,是训练不收敛情况中常见的一种。如果是完全的mode collapse,就是说生成模型得到的都是几乎一样的输出。而加入Cycle-consistency会让一个domain里不同的样本都尽量映射到另一个domain里不同的地方,理想情况就是双射(bijection)。直观来理解,如果通过&img src=&https://www.zhihu.com/equation?tex=X%5Crightarrow+Y& alt=&X\rightarrow Y& eeimg=&1&&都映射在Y中同一个点,那么这个点y通过&img src=&https://www.zhihu.com/equation?tex=Y%5Crightarrow+X& alt=&Y\rightarrow X& eeimg=&1&&映射回来显然不可能是多个不同的x,所以加入cycle-consistency就帮助避免了mode collapse。这个问题在另一篇和CycleGAN其实本质上没什么不同的方法DiscoGAN中有更详细的讨论[11],有兴趣的话可以参考。&/p&&p&&br&&/p&&p&有一点值得注意的是,虽然名字叫CycleGAN,并且套路也和C-GAN很像,但是其实只有adversarial,并没有generative。因为严格来说只是学习了&img src=&https://www.zhihu.com/equation?tex=X%5Crightarrow+Y& alt=&X\rightarrow Y& eeimg=&1&&和&img src=&https://www.zhihu.com/equation?tex=Y%5Crightarrow+X& alt=&Y\rightarrow X& eeimg=&1&&的mapping,所谓的generative network里并没有随机性。有一个和CycleGAN以及DiscoGAN其实本质上也没什么不同的方法叫DualGAN[12],倒是通过dropout把随机性加上了。不过所有加了随机性产生的样本和原始样本间的cycle-consistency用的还是l1 loss,总觉得这样不是很对劲。当然现在GAN这么热门,其实只要是用了adversarial loss的基本都会取个名字叫XXGAN,也许是可以增加投稿命中率。&/p&&p&另外上节中提到了Co-Training,感觉这里也应该提一下CoGAN[13],因为名字有些相似,并且也可以用于未配对的图像翻译。CoGAN的大体思想是:如果两个Domain之间可以互相映射,那么一定有一些特征是共有的。比如男人和女人,虽然普遍可以从长相区分,但不变的是都有两个眼睛一个鼻子一张嘴等等。所以可以在生成的时候,把生成共有特征和各自特征的部分分开,示意图如下:&br&&/p&&p&&br&&/p&&figure&&img src=&https://pic4.zhimg.com/v2-57eaadc8cec5190bfd30_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&758& data-rawheight=&207& class=&origin_image zh-lightbox-thumb& width=&758& data-original=&https://pic4.zhimg.com/v2-57eaadc8cec5190bfd30_r.jpg&&&/figure&&p&其实就是两个GAN结构,其中生成网络和判别网络中比较高层的部分都采用了权值共享(虚线相连的部分),没有全职共享的部分分别处理不同的domain。这样每次就可以根据训练的domain生成一个样本在两个domain中不同的对应,比如戴眼镜和没戴眼镜:&/p&&p&&br&&/p&&figure&&img src=&https://pic2.zhimg.com/v2-356a6118ccf3e8e3bf1c7_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&791& data-rawheight=&267& class=&origin_image zh-lightbox-thumb& width=&791& data-original=&https://pic2.zhimg.com/v2-356a6118ccf3e8e3bf1c7_r.jpg&&&/figure&&p&分别有了共有特征和各自domain特征,那么做mapping的思路也就很直接了[14]:&/p&&p&&br&&/p&&figure&&img src=&https://pic7.zhimg.com/v2-8ac50600e40feaac345e09bd7e05a83d_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&771& data-rawheight=&210& class=&origin_image zh-lightbox-thumb& width=&771& data-original=&https://pic7.zhimg.com/v2-8ac50600e40feaac345e09bd7e05a83d_r.jpg&&&/figure&&p&在GAN前边加了个domain encoder,然后对每个domain能得到三种样本给判别器区分:直接采样,重建采样,从另一个domain中transfer后的重建采样。训练好之后,用一个domain的encoder+另一个domain的generator就很自然的实现了不同domain的转换。用在图像翻译上的效果如下:&/p&&p&&br&&/p&&figure&&img src=&https://pic2.zhimg.com/v2-612e9cf5e125fd626be7db_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&444& data-rawheight=&544& class=&origin_image zh-lightbox-thumb& width=&444& data-original=&https://pic2.zhimg.com/v2-612e9cf5e125fd626be7db_r.jpg&&&/figure&&p&还有个巧妙的思路,是把CoGAN拆开,不同domain作为C-GAN条件的更加显式的做法[15]:&/p&&p&&br&&/p&&p&&br&&/p&&figure&&img src=&https://pic1.zhimg.com/v2-ddec16d502c94f91ea35_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&883& data-rawheight=&398& class=&origin_image zh-lightbox-thumb& width=&883& data-original=&https://pic1.zhimg.com/v2-ddec16d502c94f91ea35_r.jpg&&&/figure&&p&第一步用噪声Z作为和domain无关的共享表征对应的latent noise,domain信息作为条件C训练一个C-GAN。第二步,训练一个encoder,利用和常见的encode-decode结构相反的decode(generate)-encode结构。学习好的encoder可以结合domain信息,把输入图像中和domain无关的共享特征提取出来。第三步,把前两步训练好的encoder和decoder(generator)连一起,就可以根据domain进行图像翻译了。&/p&&p&CoGAN一系的方法虽然结构看起来更复杂,但个人感觉理解起来要比dual系的方法更直接,并且有latent space,可解释性和属性对应也好一些。&/p&&p&又扯远了,还是回到正题:&/p&&p&&br&&/p&&h2&给女优穿上衣服&/h2&&p&其实同样没什么好说的,Cycle-GAN和pix2pix的作者是一拨人,文档都写得非常棒,准备好数据,分成穿衣服的和没穿衣服的两组,按照文档的步骤训练就可以:&/p&&p&Torch版Cycle-GAN:&a href=&https://link.zhihu.com/?target=https%3A//github.com/junyanz/CycleGAN& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&junyanz/CycleGAN&/a&&/p&&p&pyTorch版Cycle-GAN(pix2pix二合一版):&a href=&https://link.zhihu.com/?target=https%3A//github.com/junyanz/pytorch-CycleGAN-and-pix2pix& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&junyanz/pytorch-CycleGAN-and-pix2pix&/a&&/p&&p&Cycle-GAN收敛不易,我用了128x128分辨率训练了穿衣服和没穿衣服的女优各一千多张,同样是默认参数训练了120个epoch,最后小部分成功“穿衣服”的结果如下:&/p&&figure&&img src=&https://pic2.zhimg.com/v2-fee34d66c386e0e01e5804_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&1117& data-rawheight=&192& class=&origin_image zh-lightbox-thumb& width=&1117& data-original=&https://pic2.zhimg.com/v2-fee34d66c386e0e01e5804_r.jpg&&&/figure&&figure&&img src=&https://pic4.zhimg.com/v2-de57c5ebefa4251ee3caa1_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&1117& data-rawheight=&192& class=&origin_image zh-lightbox-thumb& width=&1117& data-original=&https://pic4.zhimg.com/v2-de57c5ebefa4251ee3caa1_r.jpg&&&/figure&&p&虽然都有些突兀,但好歹是穿上衣服了。注意马赛克不是图片里就有的,是我后来加上去的。&/p&&p&那么,脱衣服的例子在哪里?&/p&&figure&&img src=&https://pic4.zhimg.com/v2-480fb8a4dcfc7a4f92ec_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&75& data-rawheight=&60& class=&content_image& width=&75&&&/figure&&h2&参考文献&/h2&&p&[1] I. Goodfellow. Nips 2016 tutorial: Generative adversarial networks. arXiv preprint arXiv:, 2016.&/p&&p&[2] A. B. L. Larsen, S. K. S?nderby, Generating Faces with Torch. &a href=&https://link.zhihu.com/?target=http%3A//torch.ch/blog//gan.html& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Torch | Generating Faces with Torch&/a&&/p&&p&[3] A. B. L. Larsen, S. K. S?nderby, H. Larochelle, and O. Winther. Autoencoding beyond pixels using a&br&learned similarity metric. In ICML, pages , 2016.&br&&/p&&p&[4] C. Ledig, L. Theis, F. Huszar, J. Caballero, A. Aitken, A. Tejani, J. Totz, Z. Wang, and W. Shi. Photo-realistic single image super-resolution using a generative adversarial network. arXiv:, 2016.&/p&&p&[5] P. Isola, J.-Y. Zhu, T. Zhou, and A. A. Efros. Image-to-image translation with conditional adversarial networks. arxiv, 2016. &/p&&p&[6] O. Ronneberger, P. Fischer, and T. Brox. U-net: Convolutional networks for biomedical image segmentation. In MICCAI, pages 234–241. Springer, 2015.&/p&&p&[7] B. Zhou, A. Khosla, A. Lapedriza, A. Oliva, and A. Torralba. Learning deep features for discriminative localization. arXiv preprint arXiv:, 2015.&/p&&p&[8] He, D., Xia, Y., Qin, T., Wang, L., Yu, N., Liu, T.-Y., and Ma, W.-Y. (2016a). Dual learning for machine translation. In the Annual Conference on Neural Information Processing Systems (NIPS), 2016.&/p&&p&&br&&/p&&p&[9] &a href=&https://link.zhihu.com/?target=http%3A//www.dsrg.stuorg.iastate.edu/wp-content/uploads/2017/02/dual-learning_-pushing-the-new-frontier-of-artificial-intelligence-tieyan-liu.pdf& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&& Tie-Yan Liu, Dual Learning: Pushing the New Frontier of Artificial Intelligence, MIFS 2016&/a& &/p&&p&[10] J.-Y. Zhu, T. Park, P. Isola, and A. A. Efros. Unpaired image-to-image translation using cycle-consistent adversarial networkss. arXiv preprint arXiv:, 2017.&/p&&p&[11] T. Kim, M. Cha, H. Kim, J. Lee, and J. Kim. Learning to Discover Cross-Domain Relations with Generative Adversarial Networks. ArXiv e-prints, Mar. 2017.&/p&&p&&br&&/p&&p&[12] Z. Yi, H. Zhang, P. T. Gong, et al. DualGAN: Unsupervised dual learning for image-to-image translation. arXiv preprint arXiv:, 2017.&/p&&p&&br&&/p&&p&[13] M.-Y. Liu and O. Tuzel. Coupled generative adversarial networks. In Advances in Neural Information Processing Systems (NIPS), 2016.&/p&&p&[14] M.-Y. Liu, T. Breuel, and J. Kautz. Unsupervised image-to-image translation networks. arXiv preprint arXiv:, 2017.&/p&&p&[15] Dong, H., Neekhara, P., Wu, C., Guo, Y.: Unsupervised image-to-image translation with generative adversarial networks. arXiv preprint arXiv:, 2017.&/p&&p&=========== 分割线: ===========&/p&&p&上周日发的时候也想到了可能会有许多人对这个话题感兴趣,但没想到超过了1.5W赞这么多,大概看了看评论,做一些补充:&/p&&p&&b&1) &/b&马赛克训练数据:对于一般的机器学习问题,都是分布越简单越容易,遵循这个原则,我用的约束是单人照片,具体方法是:先找一个Pascal VOC训练好的SSD代码,然后SSD筛选了一批每张图里只能检测到一个人的。&/p&&p&最后在真人照片上的效果看上去还是不错的,我没有做过量化评估,大体来说看上去挺像的要超过一半,非常逼真的可能有5%~10%。两人以上战斗的动作画面我没有评估过。&/p&&p&&b&2)&/b&穿(tuo)衣训练数据:因为收敛很难,所以数据的加了更多约束:只用女性单人正面照片。同样通过SSD检测出单人照片,同时考虑person框的宽高比小于1的且框内能检测到人脸的(OpenCV的人脸检测)。这样尽量筛选出一批面向镜头,身体占画面比接近的照片。&/p&&p&最后的效果我在原文中也提到过,只有小部分能成功穿上(tuo)衣服,具体我也没有量化统计过,大概100张里两三张吧,大部分都是身上出现了看上去有点像衣服的线条或是另一个人的胸部。考虑到我最后筛选出的图片人物占画面比仍然有很大的变化,很可能我的模型就是遇到了文中提到的partial mode collapse的问题。&/p&&p&如果有更好的办法筛选出人物大小差不多的照片,效果应该能提升不少。比如我在用SSD筛选的时候如果考虑宽高比更小一些,筛选出的照片看上去会更加一致,不过我资源不太够,这样做后训练集就只有不到300张,资源够的老司机们有兴趣可以试试。&/p&&p&&br&&/p&&p&&b&3)&/b&预训练模型有没有?有,但是我研读了中华人民共和国刑法第三百六十三、三百六十四和三百六十六条,完全读不懂,所以还是不提供。再说就算我提供了,根据1)和2),看到你想看的内容也是需要运气的。&/p&&p&另外特别感谢赞赏的知友们,这篇文章是想说&b&书中自有颜如玉&/b&,而知友们的赞赏让我知道&b&书中真有黄金屋&/b&,古人诚不我欺…&/p&
作为一名久经片场的老司机,早就想写一些探讨驾驶技术的文章。这篇就介绍利用生成式对抗网络(GAN)的两个基本驾驶技能: 1) 去除(爱情)动作片中的马赛克2) 给(爱情)动作片中的女孩穿(tuo)衣服 生成式模型上一篇《》中已经简单介…
&figure&&img src=&https://pic3.zhimg.com/v2-cc58aa648ff3e_b.jpg& data-rawwidth=&700& data-rawheight=&379& class=&origin_image zh-lightbox-thumb& width=&700& data-original=&https://pic3.zhimg.com/v2-cc58aa648ff3e_r.jpg&&&/figure&&p&转载自浅黑科技&/p&&p&&br&&/p&&figure&&img src=&http://pic3.zhimg.com/v2-5ba149b529cf912e7abde_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&700& data-rawheight=&379& class=&origin_image zh-lightbox-thumb& width=&700& data-original=&http://pic3.zhimg.com/v2-5ba149b529cf912e7abde_r.jpg&&&/figure&&p&&br&&/p&&p&&br&&/p&&p&&br&&/p&&p&&b&黑客的滑铁卢&/b&&/p&&p&&br&&/p&&p&&b&文 | 史中@浅黑科技&/b&&/p&&p&&br&&/p&&p&&br&&/p&&p&日,美国司法部公布了一个案件。卷宗不长,却揭开了一段尘封的往事。&/p&&p&&br&&/p&&p&在这起发生在美国的神秘案件侦破之后,FBI 致谢了很多科技公司,其中甚至还包含了一家中国公司(红衣教主的 360)。&/p&&p&&br&&/p&&p&我找到了 360 的神秘安全研究员李丰沛,本来只是想要八卦一下案情细节。没想到,他却出乎意料地给我讲了一整个波云诡谲的故事,故事里面甚至还混入了羞羞的情节。。。&/p&&p&&br&&/p&&p&(以下故事演绎自李丰沛的口述以及公开资料)&/p&&p&&br&&/p&&p&&br&&/p&&p&&b&(一)序章:蚂蚁僵尸和神秘黑客&/b&&/p&&p&&br&&/p&&p&日,阳光照在旋转的地球上,硕大的明暗分界线正在大地上缓慢行走。中国的大部分地区正进入沉沉的黑夜,而地球对面的美国刚好迎来一个深秋的早晨。&/p&&p&&br&&/p&&p&新罕布什尔州曼彻斯特市的一片树叶无声地落向街道,而在路面之下的光缆中,某种漆黑的物质正在窸窸窣窣地奔突。来自世界各地的互联网流量,正在向美国东岸涌来,形成一股光速移动的洪峰,冲向域名解析服务商 Dyn 的服务器。&/p&&p&&br&&/p&&p&毫无征兆,Dyn 的服务器各个入口被涌来的垃圾流量打满。作为一个域名解析的服务商,Dyn 为全美大部分地区提供基本的上网保障。它本身拥有一套完整的应急预案,但是就在预案启动后的几分钟,他们意识到,这次攻击之猛烈,已经超出了预案的想象力。&/p&&p&&br&&/p&&p&像泰坦尼克号一样,各个船舱一个接一个地灌满水,最后连底层的轮机室都没有幸免,几分钟内 Dyn 悄无声息地沉入大西洋。&/p&&p&&br&&/p&&p&美国东岸各大城市,人们齐刷刷地抬起头看向彼此,因为他们面前的电脑、手中的手机都陷入了空白, Twitter、spotify、netflix、airbnb、github、reddit、Paypal 等等一系列服务都相继瘫痪。&/p&&p&&br&&/p&&p&这是一个漫长的白天,攻击的潮水先后三次来袭,每次都持续一个小时左右。网络服务时断时续,美国东海岸陷入了9·11之后最大的“互联网恐怖袭击”中。这显然是一次灾难,因为整个美国在这种攻击面前像个婴儿一样毫无还手之力。&/p&&p&&br&&/p&&p&&br&&/p&&figure&&img src=&http://pic2.zhimg.com/v2-01a588b721e4fb4ee07f5_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&550& data-rawheight=&313& class=&origin_image zh-lightbox-thumb& width=&550& data-original=&http://pic2.zhimg.com/v2-01a588b721e4fb4ee07f5_r.jpg&&&/figure&&p&&br&&/p&&p&&br&&/p&&p&究竟发生了什么?&/p&&p&&br&&/p&&p&直到一切尘埃落定,人们才知道,这次野蛮的攻击,来自于世界各地的网络摄像头和路由器。是的,你没看错,就是那些坐在你客厅桌子上的那些看上去“人畜无害”的小东西。它们本来静悄悄地躺在主人家里,只通过一根网线和外界相连。然而正是这根小小的网线,却成为了黑客控制木偶的那根“提线”。&/p&&p&&br&&/p&&p&一个神秘的病毒,顺着通过网线钻进无数家庭的大门,入侵了数以百计的摄像头。在主人眼里这些硬件并无异样。然而,它们的指示灯却仿佛变成了红色的眼睛,如被感染的僵尸一样,在赛博世界调转枪头,疯狂地向互联网吐出新的病毒。&/p&&p&&br&&/p&&p&就这样,地球上数十万的硬件设备,组成了硕大无朋的“僵尸网络”。这个僵尸网络,像一群食人蚁,他们发出的垃圾访问整齐划一,在网络世界左右奔流,所到之处必定网络瘫痪、寸草不生。&/p&&p&&br&&/p&&p&&br&&/p&&figure&&img src=&http://pic1.zhimg.com/v2-a316db3aeafd49f3431117c_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&580& data-rawheight=&358& class=&origin_image zh-lightbox-thumb& width=&580& data-original=&http://pic1.zhimg.com/v2-a316db3aeafd49f3431117c_r.jpg&&&/figure&&p&&br&&/p&&p&&br&&/p&&p&事实上,这些不会思考的摄像头都受控于同一个“神秘黑客”。而这个神秘人是谁,他的枪口还将指向谁,没有人知道。人们陷入无尽的恐慌。。。&/p&&p&&br&&/p&&p&更鲜有人知的是,就在31天前,同样的攻击曾经有一次预演。&/p&&p&&br&&/p&&p&&br&&/p&&p&&b&(二)克雷布斯,揭黑大神的滑铁卢&/b&&/p&&p&&br&&/p&&p&克雷布斯(Krebs)是个一脸正义的美国调查记者。&/p&&p&&br&&/p&&p&他有点像“黑客界的方舟子”,专门向读者揭露网络上的“暗黑产业”。他的日常是在自己开设的网站“KrebsOnSecurity.com”上爆猛料,例如“某个 DDoS 团伙的头目是谁”,“某个公司遭遇了数据泄露”,等等。无论多么诡异的事情,他都可以调查得水落石出。就像那个“恨美国”的导演迈克·摩尔一样。&/p&&p&&br&&/p&&p&&br&&/p&&figure&&img src=&http://pic3.zhimg.com/v2-4ac4d67df645b2dd9baee_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&900& data-rawheight=&506& class=&origin_image zh-lightbox-thumb& width=&900& data-original=&http://pic3.zhimg.com/v2-4ac4d67df645b2dd9baee_r.jpg&&&/figure&&p&&br&&/p&&p&&b&(我觉得,克雷布斯长了一张正义的脸,他在自己官方网站上的形象是这样↓↓↓)&/b&&/p&&p&&br&&/p&&p&&br&&/p&&figure&&img src=&http://pic3.zhimg.com/v2-8e714ebfcc480fec74d55ca48fc9e456_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&640& data-rawheight=&449& class=&origin_image zh-lightbox-thumb& width=&640& data-original=&http://pic3.zhimg.com/v2-8e714ebfcc480fec74d55ca48fc9e456_r.jpg&&&/figure&&p&&br&&/p&&p&&br&&/p&&p&显然,爆黑料经常会得罪各路黑道大哥,Krebs On Security 网站三天两头遭到不明攻击,实际上,他还经常接到威胁的实体邮件,甚至还有不明真相的警察被利用来刁难他。调查记者果然都有一个悲惨的人生啊。。。&/p&&p&&br&&/p&&p&日,就在 Mirai 病毒爆发前一个月,克雷布斯发现自己的网站遭遇了巨大流量的 DDoS 攻击,没错,就连这位见多识广的神人都没有见过这么大流量的攻击,峰值达到了665G。在这样的攻击下,别说是一个网站,就连城市的主干网都险些被它连累挂掉。&/p&&p&&br&&/p&&p&&br&&/p&&figure&&img src=&http://pic4.zhimg.com/v2-f81d2fc38e27deba93a6cb_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&640& data-rawheight=&360& class=&origin_image zh-lightbox-thumb& width=&640& data-original=&http://pic4.zhimg.com/v2-f81d2fc38e27deba93a6cb_r.jpg&&&/figure&&p&&br&&/p&&p&&b&(克雷布斯当时在“某不存在的网站”上发了一条感慨)&/b&&/p&&p&&br&&/p&&p&当然,克雷布斯也不是吃素的,他立刻呼朋唤友,找一直合作的服务商来帮他“扛”这次攻击。&/p&&p&&br&&/p&&p&形象地来说,DDoS 攻击就像是白娘子的“水漫金山”,而防御它的方法只能是“大禹治水”——开挖河道。克雷布斯的救兵是大名鼎鼎的 Akamai 公司,这家公司是全球最大的 CDN 网络分发商,号称全世界 30% 的流量都在自己手里经过。他们手里的“河道宽度”肯定是杠杠的。&/p&&p&&br&&/p&&p&Akamai 虽然信心满怀地接受了这个任务,但其实他们在此之前见过的最大攻击是 363G,几乎只有这次的一半。严防死守了两天之后,Akamai 怂了。他们发现攻击的浪潮不减反增,继续防御下去资源消耗会非常恐怖,连正常的生意都没法做了。于是抱拳拱手,和克雷布斯说了声爱莫能助,另请高明,回见。。。&/p&&p&&br&&/p&&p&&br&&/p&&figure&&img src=&http://pic3.zhimg.com/v2-0c937cee4b_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&940& data-rawheight=&540& class=&origin_image zh-lightbox-thumb& width=&940& data-original=&http://pic3.zhimg.com/v2-0c937cee4b_r.jpg&&&/figure&&p&&br&&/p&&p&&br&&/p&&p&克雷布斯的网站重新变成“全身不遂”。&/p&&p&&br&&/p&&p&被黑客戏弄,这可能是他职业生涯的一个不大不小的“滑铁卢”。这位倔强的小哥哥只好临阵换帅,另寻高人。不料,有人自告奋勇找到了他,这就是号称全球 25% 的流量都经过自己服务器的 Google。Google 虽然主动请缨,但基层的安全研究员接到任务,感到压力山大,立刻分成了“主和派”和“主战派”,主和派的意思是说,干嘛为了一个保护小网站和这么凶猛的敌人交恶呢?而主战派的意思是,人生就是一场战斗,该来的总会来,逃避也没有用。&/p&&p&&br&&/p&&p&最终,Google 还是硬着头皮上,让克雷布斯把网站接入防御系统。经过了让克雷布斯想要杀人的复杂手续,Google 的防御终于在两天后上线了。。。&/p&&p&&br&&/p&&p&半年后,Google 的安全研究员在演讲里提到了这次惨烈的防御,他们并没有透漏具体的数据细节,然而从结果上来看,他们付出巨大的代价,最终防御住了进攻。&/p&&p&&br&&/p&&p&但重点在于:克雷布斯这么傲娇的人,哪里经得起这样欺负?在攻击结束之后,他马上宣布开始独立调查这件事。彼时他手上的证据有限,而随着研究深入,他越发怀疑,攻击自己的黑客和一个月后的美国东部大断网,是同一拨人干的。。。&/p&&p&&br&&/p&&p&&br&&/p&&p&&b&(三)艾略特,神秘的 FBI 探员&/b&&/p&&p&&br&&/p&&p&美国东部大断网事件发生之后,两组人马立刻开始了调查。&/p&&p&&br&&/p&&blockquote&一组是刚才提到的单枪匹马的&b&克雷布斯&/b&,他发誓要报仇雪恨。&br&&br&另一组是经常出现在各路美国大片里的“国家队”FBI,为首的是探员&b&艾略特·彼得森&/b&(Elliott Perterson),他是一个少见的“网络特工”,常年追踪各大网络犯罪团伙。&/blockquote&&p&&br&&/p&&p&艾略特是一个像詹姆斯邦德一样全能的特工,虽然他看上去并没有邦德那么让人想舔屏。重点在于,这哥们同样是一个非常传奇的人。毕业之后参军,曾经几赴伊拉克,回国后加入 FBI,成为联邦调查局最早的网络犯罪侦查员之一。&/p&&p&&br&&/p&&p&艾略特非常低调,他首次出现在公共视野中,是在2015年的 BlackHat 黑客大会。这个每年在拉斯维加斯召开的黑客大会被称为黑客界的“奥斯卡”,能够登上这个讲台的人,绝对是全世界网络安全界的偶像级人物。艾略特以“FBI 特工”这样的闷骚身份登场,更是别人对他的八卦议论纷纷。&/p&&p&&br&&/p&&p&&br&&/p&&figure&&img src=&http://pic3.zhimg.com/v2-9d4c0514bce25accfcaf6a2_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&640& data-rawheight=&372& class=&origin_image zh-lightbox-thumb& width=&640& data-original=&http://pic3.zhimg.com/v2-9d4c0514bce25accfcaf6a2_r.jpg&&&/figure&&p&&br&&/p&&p&&b&这是在2015年BlackHat 大会上演讲的艾略特(Elliott Perterson),右下角是他列出的提供帮助的组织名录。&/b&&/p&&p&&br&&/p&&p&2015年艾略特的演讲题目就是如何追踪一个名为“GameOver Zeus(我把它非官方翻译为:宙斯完蛋操)”的僵尸网络。他和教育机构安全研究人员、安全公司、英美执法机构一起,通过缜密的侦查和技术反制,最终定位到这个僵尸网络背后的实际控制人是某个俄罗斯人,并且利用彪悍的技术对抗直接强势接管了这个僵尸网络,让它不再为害人间。&/p&&p&&br&&/p&&p&当然,除了知道艾略特大致的背景以外,人们对这位探员的其他行踪一无所知。(其实这里有个小秘密,那就是艾略特曾经和中国有过一次屌屌的交锋,为了社会和谐,此处省略2000字。)&/p&&p&&br&&/p&&p&艾略特一直在关注 DDoS 相关的案子,这个案子也当仁不让,强势接手。他憋了一口气:整个美国东部笼罩在网络恐怖袭击中整整一天,造成了数十亿美元的损失,犯罪嫌疑人不仅没被质控,反而连它究竟是男是女,是哪国人都没有任何线索。艾略特知道,如果自己也解决不了这件事,那罪犯也许就要永远逍遥法外了。。。&/p&&p&&br&&/p&&p&时间一分一秒过去了,距离事件发生已经过去一个多月,艾略特如失踪了一般,没有人知道他在用什么方法调查。而之前宣布独立调查的克雷布斯似乎也没有得出结论。&/p&&p&&br&&/p&&p&&br&&/p&&p&&b&(四)Mirai 浮出水面,伴随羞羞日本动漫&/b&&/p&&p&&br&&/p&&p&扑朔迷离。&/p&&p&&br&&/p&&p&我们把目光再拉回到日。美国大断网发生的那天。&/p&&p&&br&&/p&&p&这次袭击,让大洋彼岸的中国都有所震动,连百度指数都飚到了前所未有的高峰。&/p&&p&&br&&/p&&p&虽说连扫地大妈都在讨论断网事件,但是真正有能力为调查贡献力量的大牛,全世界并没有几个人。&/p&&p&&br&&/p&&ul&&li&&b&FBI 探员艾略特&/b&,拥有调查权,他可以要求美国境内的组织和个人配合调查;&/li&&/ul&&p&&br&&/p&&ul&&li&&b&其他的商业公司&/b&,显然没办法使用强制手段,他们想要贡献力量的话,只能使用网络上公开的信息进行分析溯源。但他们的优势在于成熟安全团队和久经考验的分析能力。&/li&&/ul&&p&&br&&/p&&ul&&li&&b&一些独立调查者&/b&,和商业公司一样,他们也只能接触公开的数据,掌握的资源有限。&/li&&/ul&&p&&br&&/p&&p&&br&&/p&&p&于是,全世界想要破案的人们,默默形成了一个“联盟”,用对外发布报告的形式为 FBI 的调查“隔空”提供信息。&/p&&p&&br&&/p&&p&从技术上来看,要找到罪犯需要分两步走:&b&1、找到僵尸网络背后的那个可怕病毒。2、通过分析这个病毒代码试着溯源到背后的作者。&/b&&/p&&p&&br&&/p&&p&为了先找到背后的病毒,各家公司各显神通。不到一天的时间里,他们就通过数据分析出,这个僵尸网络的始作俑者,是一个月前刚刚声名鹊起的病毒——&b&Mirai&/b&。&/p&&p&&br&&/p&&p&&br&&/p&&figure&&img src=&http://pic4.zhimg.com/v2-997c5ce96ab73ab_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&640& data-rawheight=&334& class=&origin_image zh-lightbox-thumb& width=&640& data-original=&http://pic4.zhimg.com/v2-997c5ce96ab73ab_r.jpg&&&/figure&&p&&br&&/p&&p&&br&&/p&&p&在大断网攻击发生前的9月30日,黑客界口耳相传着一件“大新闻”,一个名为 Mirai 的病毒源代码被自称作者的神秘账户完整地发布在了互联网上。这个病毒极其精巧,可以用来大规模控制互联网上的摄像头和路由器。这样一来,只要有一些代码基础的“脚本小子”就可以通过这个原始文档改造出病毒变种,进而营造自己的僵尸网络,导演新的攻击。如同僵尸片里的病毒逃出实验室一样,这是一种可怕的失控。&/p&&p&&br&&/p&&p&那么问题来了,作者为什么要把自己的病毒源代码公布出来呢?&/p&&p&&br&&/p&&p&按照常理来说,共享病毒的源代码,只会给病毒的作者带来更多竞争者,这相当于一家企业辛苦研发了一台手机,却把图纸毫无保留地公布在了网上。如果真的是作者本人把源代码公布出来,他的动机是神马呢?如果公布者并不是真正的作者,那么他是怎么拿到源代码的呢?&/p&&p&&br&&/p&&p&这些谜团,直到最后才会被解开。在当时,人们只是从两个名字里,发现了一些有趣的事实。&/p&&p&&br&&/p&&p&&b&1)Mirai&/b&&/p&&p&&br&&/p&&p&之所以把这个病毒称为 Mirai,是因为在病毒代码中,作者悄然嵌入了“Mirai”这个并没有实际意义的词,所以显然这是作者为病毒起的名字。人们马上发现,Mirai 是一个日语词汇,而在日本恰好有一部热播的动漫《Mirai Nikki》,翻译成中文就是《未来日记》。这部动漫故事的核心,是一个孤僻的国中生因为突然拥有了预知未来的能力而被卷入了一场生死游戏。&/p&&p&&br&&/p&&p&看来,这个病毒在诞生的那一天,就已经被作者描绘了黑暗的未来。这个名字似乎隐喻着整个事件都是一个高智商犯罪,不禁让人冷汗直流。&/p&&p&&br&&/p&&p&&br&&/p&&figure&&img src=&http://pic1.zhimg.com/v2-d7eed25c3ece_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&1024& data-rawheight=&666& class=&origin_image zh-lightbox-thumb& width=&1024& data-original=&http://pic1.zhimg.com/v2-d7eed25c3ece_r.jpg&&&/figure&&p&&br&&/p&&p&&br&&/p&&p&&br&&/p&&p&&b&2)Anna-senpai&/b&&/p&&p&&br&&/p&&p&另外一个“巧合”是,把 Mirai 代码共享到网上的神秘人,使用的ID是“Anna-senpai”。&/p&&p&&br&&/p&&p&&br&&/p&&figure&&img src=&http://pic2.zhimg.com/v2-bb6ebeab10f1_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&640& data-rawheight=&257& class=&origin_image zh-lightbox-thumb& width=&640& data-original=&http://pic2.zhimg.com/v2-bb6ebeab10f1_r.jpg&&&/figure&&p&&br&&/p&&p&&b&(这是作者上传病毒代码的原贴截图,注意看头像。。。)&/b&&/p&&p&&br&&/p&&p&很多宅男一眼就看出, 这个名字就是“安娜前辈”,这是日本动漫《没有黄段子的无聊世界》里一位女学生会主席,她起初清纯,而后淫邪,成为反乌托邦的“旗手”。(为了写这篇文章,我专门看了一集《没有黄段子的无聊世界》,原谅我不能在一句话里把二次元世界的精髓完整展现。。。)能够看这个动漫的人,大概是一个重度中二男。&/p&&p&&br&&/p&&p&&br&&/p&&figure&&img src=&http://pic1.zhimg.com/v2-879d51fdbbaad5a88b338_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&640& data-rawheight=&360& class=&origin_image zh-lightbox-thumb& width=&640& data-original=&http://pic1.zhimg.com/v2-879d51fdbbaad5a88b338_r.jpg&&&/figure&&p&&br&&/p&&p&&b&(来一张安娜学姐全身的精选图,希望没有打断你阅读的思路。。。)&/b&&/p&&p&&br&&/p&&p&除此之外,别无他物。&/p&&p&&br&&/p&&p&&br&&/p&&p&&b&(五)“僵尸”变异,德国全境陷落&/b&&/p&&p&&br&&/p&&p&Mirai 的真凶仍然无解,但是剧情从不等人。仅仅一个月之后,新的恐慌已经来袭——病毒的变种四处开花。&/p&&p&&br&&/p&&p&日,德国电信 Telekom 路由器遭到大规模入侵,德国境内2000万台路由器被入侵,而在入侵的过程中,有90万台在感染过程中就直接崩溃。这场攻击几乎波及了所有德国人,引起了巨大的恐慌。&/p&&p&&br&&/p&&p&&br&&/p&&figure&&img src=&http://pic2.zhimg.com/v2-0c30fec19c140eabee8f49_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&603& data-rawheight=&358& class=&origin_image zh-lightbox-thumb& width=&603& data-original=&http://pic2.zhimg.com/v2-0c30fec19c140eabee8f49_r.jpg&&&/figure&&p&&br&&/p&&p&&b&(德国受病毒影响的范围,感觉德国在过本命年。。。)&/b&&/p&&p&&br&&/p&&p&全球的安全研究者马上调转注意力,他们纷纷怀疑这是 Mirai 作者的新一波进攻。然而,中国公司 360 在一天后给出的报告中指出了一个小问题。那就是,这次攻击的病毒制造者看起来采用了新的感染方法,而这个新方法恰好可以让安全研究员通过数据分析,追踪到控制者的主控服务器。&/p&&p&&br&&/p&&p&出乎意料的是,报告发出仅仅四个小时,360 收到了这个病毒的新版本,里面的代码不仅进行了“升级”,还特别加入了一段特别的表白:“iloveyouthreesixty”(我爱你 360)。&/p&&p&&br&&/p&&p&&br&&/p&&figure&&img src=&http://pic1.zhimg.com/v2-5e9d65f555ebb4bcb31990adc08c9618_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&891& data-rawheight=&243& class=&origin_image zh-lightbox-thumb& width=&891& data-original=&http://pic1.zhimg.com/v2-5e9d65f555ebb4bcb31990adc08c9618_r.jpg&&&/figure&&p&&br&&/p&&p&&b&(这是病毒的代码截图,360 网络安全研究院院长宫一鸣首发在自己的微博 @宫一鸣cn 里)&/b&&/p&&p&&br&&/p&&p&与其说这是病毒作者对安全公司的挑衅,不如说这是他绝望的咒骂。因为仅仅一个多月以后,这位代号为“Bestbuy(百思买)”的作者就在英国被捕,引渡到德国受审。遗憾的是,他被证明不是 Mirai 的原作者。如你所料,他只是利用原作者在网上公开的源代码进行了改造,产生了新的变种病毒。但他无疑成为了 Mirai 系列病毒被捕的第一人,这让全世界的安全社区受到了不小的鼓舞。&/p&&p&&br&&/p&&p&&br&&/p&&figure&&img src=&http://pic2.zhimg.com/v2-bb2f2a4a7ad1_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&580& data-rawheight=&296& class=&origin_image zh-lightbox-thumb& width=&580& data-original=&http://pic2.zhimg.com/v2-bb2f2a4a7ad1_r.jpg&&&/figure&&p&&br&&/p&&p&&b&(这位就是变种病毒作者,真名为 Daniel Kaye,时年29岁。)&/b&&/p&&p&&br&&/p&&p&根据 360 的报告,Bestbuy 很可能还和一次对利比里亚电信运营商的攻击有关。果然,Bestbuy 在庭上承认自己曾经收了一万美金,帮助金主攻击了利比里亚电信运营商,事件的后果是:整个国家网络都为此瘫痪。&/p&&p&&br&&/p&&p&&br&&/p&&figure&&img src=&http://pic2.zhimg.com/v2-59beccf6bf1fc5c584021_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&640& data-rawheight=&334& class=&origin_image zh-lightbox-thumb& width=&640& data-original=&http://pic2.zhimg.com/v2-59beccf6bf1fc5c584021_r.jpg&&&/figure&&p&&br&&/p&&p&&b&(利比里亚遭受攻击时候的新闻截图)&/b&&/p&&p&&br&&/p&&p&2017年9月,Bestbuy 案宣判,这位作者获得了18个月的缓刑。这是一个相当轻的判决,意味着他只要不继续作恶,就不必真正在监狱里服刑。让人哭笑不得的是,他刚刚乘坐飞机回到英国,就被英国警方迅雷不及掩耳盗铃之势扣押。因为“病毒不长眼”,他攻击德国电信的病毒,一度已经通过互联网蔓延到了英国和北爱尔兰,造成了不小的损失。这是个小插曲。&/p&&p&&br&&/p&&p&与此同时, 世界各地都产生了无数 Mirai 新的变种,像僵尸一样扩散着。此处篇幅有限,难以一一呈现。&/p&&p&&br&&/p&&p&&br&&/p&&p&&b&(六)真容,“安娜学姐”浮出水面&/b&&/p&&p&&br&&/p&&p&探员艾略特遇到的困难比想象中更大。&/p&&p&&br&&/p&&p&第一个要搞定的就是固定证据。为了证明“黑客利用病毒入侵了摄像头”这个简单的事实,他在老家阿拉斯加向法院申请手续,然后挨家挨户找到被感染的摄像头,询问他们“有没有授权别人控制自己的摄像头?”&/p&&p&&br&&/p&&p&第二个要做的,就是追根溯源。要找到 Mirai 背后的那个黑客,非常不容易。神秘黑客的反侦察能力很强,它的控制指令在全球很多服务器多次跳转,就像一个嫌犯混在火车站的人流里,稍有不慎就会“跟丢”。&/p&&p&&br&&/p&&p&&br&&/p&&figure&&img src=&http://pic1.zhimg.com/v2-a2b0f3c8cb219dabf694_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&832& data-rawheight=&405& class=&origin_image zh-lightbox-thumb& width=&832& data-original=&http://pic1.zhimg.com/v2-a2b0f3c8cb219dabf694_r.jpg&&&/figure&&p&&br&&/p&&p&&b&(僵尸网络,主控信号在多个服务器之间来回跳转,非常难以追溯。)&/b&&/p&&p&&br&&/p&&p&十二月的某一天,艾略特在追查中突然发现了一台位于法国的服务器,这台服务器虽然有嫌疑,但并没什么特别之处。但是就在一闪念,艾略特突然有了惊人的发现:这台服务器上存储了无数日本动漫。他脑海中闪现出 Mirai 作者的宅男形象,刹那间他觉得&b&这台服务器就是他一直苦苦寻找的。&/b&&/p&&p&&br&&/p&&p&2017年1月,调查记者克雷布斯终于发布了一篇文章,他强烈怀疑两个刚刚大学毕业的毛头小子是 Mirai 的背后黑手。这两个人分别为 Paras Jha 和 Josiah White。克雷布斯细数了怀疑他们的证据,虽然没有实锤,但公众仿佛觉得克雷布斯单枪匹马已经走到了 FBI 前面。他们不知道,这两个人的照片早就已经挂在艾略特 FBI 的办公室里了。。。&/p&&p&&br&&/p&&p&直到日,美国司法部突然公布卷宗,人们才恍然大悟,原来案件已经被侦破。&/p&&p&&br&&/p&&p&具体的办案过程,美国司法部守口如瓶。他们只给出了三名罪犯的名字:&b&Paras Jha、Josiah White和 Dalton Norman &/b&以及他们的罪行。文件显示,这三个人是在2017年5月受到 FBI 指控的。没错,这三个人,被调查记者克雷布斯单枪匹马揪出两个,这哥们果然骁勇。&/p&&p&&br&&/p&&p&&br&&/p&&figure&&img src=&http://pic2.zhimg.com/v2-bf725dfa7d_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&1080& data-rawheight=&469& class=&origin_image zh-lightbox-thumb& width=&1080& data-original=&http://pic2.zhimg.com/v2-bf725dfa7d_r.jpg&&&/figure&&p&&br&&/p&&p&&b&(根据公开信息,这个应该就是 Paras Jha 的真身,资料显示他毕业于 Rutgers 学校,关注者只有295个。这个人就是网络上的“安娜学姐”。怎么样,惊不惊喜,意不意外。。。)&/b&&/p&&p&&br&&/p&&p&根据克雷布斯的调查,这三个人都毕业于 Rutgers campus 大学(这是美国计算机专业相当著名的学校),他们攒了一个专门从事“网络安全”的公司,Jha 任 CEO。他们对自己的母校非常“热爱”,于是决定利用手里的僵尸网络攻击一下母校。于是,在大半年的时间里, Rutgers campus 一直受到网络攻击,以至于最后不得不增加 IT 建设成本,连学费都涨价了。事情的结局是,Jha 的公司卖给母校一套反网络攻击的防护系统,天下太平。。。&/p&&p&&br&&/p&&p&而在 Mirai 的制作中,这三个热爱日本动漫的宅男分工是这样的:&/p&&p&&br&&/p&&blockquote&&b&Paras Jha:&/b&写了最开始的&b&源代码&/b&,负责建设“基础设施”。他就是神秘的“Anna-Senpai”。&br&&br&&b&Josiah White:&/b&写了一个精妙的&b&扫描器&/b&,可以一次发出成千上万的 Syn 包,扫描网络的速度达到了之前的上千倍,这也是为什么这个病毒可以快速感染百万台设备的原因。&br&&br&&b&Dalton Norman:&/b&找到了4个和摄像头、路由器相关的&b&高危漏洞&/b&(0-Day),可以进出这些设备如入无人之境。&/blockquote&&p&&br&&/p&&p&他们利用 Mirai 病毒,迅速在全世界收割了上百万台设备,这些设备听命于他们,对外提供各种暗黑服务。&/p&&p&&br&&/p&&p&&br&&/p&&figure&&img src=&http://pic4.zhimg.com/v2-42df452fe2da6a67bd02dcb_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&940& data-rawheight=&627& class=&origin_image zh-lightbox-thumb& width=&940& data-original=&http://pic4.zhimg.com/v2-42df452fe2da6a67bd02dcb_r.jpg&&&/figure&&p&&br&&/p&&p&&b&(媒体抓拍到 Paras Jha 和他的代理律师走出法庭)&/b&&/p&&p&&br&&/p&&blockquote&他们提供的服务包括:&b&利用全世界各地的 IP 帮网站刷浏览量;收黑钱帮助金主发起 DDoS 攻击;利用控制的僵尸网络比特币挖矿;帮助黑色产业量刷单薅羊毛,&/b&等等等等。归里包堆,这些服务帮他们赚了100个比特币。(本来没赚多少钱,但按照现在比特币价格的涨势,这些人犯罪所得数额可以用巨大来形容。。。)&/blockquote&&p&&br&&/p&&p&而构建僵尸网络的最初目标其实很简单,他们想攻击游戏“我的世界”(MineCraft)的服务器,从而可以玩游戏开挂。。。&/p&&p&&br&&/p&&p&&br&&/p&&figure&&img src=&http://pic4.zhimg.com/v2-91e141c40caf_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&1080& data-rawheight=&462& class=&origin_image zh-lightbox-thumb& width=&1080& data-original=&http://pic4.zhimg.com/v2-91e141c40caf_r.jpg&&&/figure&&p&&br&&/p&&p&&b&(这就是游戏“我的世界”,MineCraft)&/b&&/p&&p&&br&&/p&&p&没想到,他们对自己手中掌握的武器一无所知,李丰沛专门找到了一张图片:一个小孩子手里拿着火箭炮的图片,来比喻这三个年轻人。他们一次攻击就造成了美国东岸大断网,这就好像本来只想开几枪,结果不明所以地触动了核武器。&/p&&p&&br&&/p&&p&&br&&/p&&figure&&img src=&http://pic3.zhimg.com/v2-d1dffeedc1d6_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&480& data-rawheight=&360& class=&origin_image zh-lightbox-thumb& width=&480& data-original=&http://pic3.zhimg.com/v2-d1dffeedc1d6_r.jpg&&&/figure&&p&&br&&/p&&p&&br&&/p&&p&在庭审中,Paras Jha 终于解开了一个谜团,他之所以化身“Anna-Senpai”把代码公布在网上,是因为他想要推脱罪责。一旦将来自己落网,他可以辩称自己的攻击程序是下载来的,并不是病毒的原创者。但是,他的如意算盘显然是落空了,牛X的 FBI 探员显然找到了更强的铁证,让他们最终承认自己就是作者。&/p&&p&&br&&/p&&p&然而,这个故事还有一个未解之谜,那就是 Jha 最终也没有承认对于克雷布斯的攻击是他们干的,虽然根据证据,这两次攻击源的重合比例达到了70%以上。&/p&&p&&br&&/p&&p&&b&(七)安全社区,沉默的幕后英雄&/b&&/p&&p&&br&&/p&&p&罪犯终于伏法,但整个事件并非你我想象的那么简单。&/p&&p&&br&&/p&&p&2017年12月,美国司法部卷宗披露以后,FBI 在推特中专门致谢了对这起案件侦破至关重要的几个公司,包括 360、AT&T、Dyn(受害者终于报仇了)、Paterva、Paypal、ShadowServer。&/p&&p&&br&&/p&&p&&br&&/p&&figure&&img src=&http://pic3.zhimg.com/v2-e5efb8026fbdc5f05e987c_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&640& data-rawheight=&303& class=&origin_image zh-lightbox-thumb& width=&640& data-original=&http://pic3.zhimg.com/v2-e5efb8026fbdc5f05e987c_r.jpg&&&/figure&&p&&br&&/p&&p&&br&&/p&&p&360 作为离美国最远的中国公司,居然排在第一名。。。就连红衣教主周鸿祎都转发截图嗨皮了一下。&/p&&p&&br&&/p&&p&&br&&/p&&figure&&img src=&http://pic4.zhimg.com/v2-d17a48bff_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&640& data-rawheight=&474& class=&origin_image zh-lightbox-thumb& width=&640& data-original=&http://pic4.zhimg.com/v2-d17a48bff_r.jpg&&&/figure&&p&&br&&/p&&p&&br&&/p&&p&这么说来,360 难道为 FBI 提供了什么了不起的破案证据吗?&/p&&p&&br&&/p&&p&我专门问了一下李丰沛,他告诉我,360 在这次网络恐怖袭击破案中,并没有做什么了不起的事情,唯一的工作就是不断地研究不断地发报告。从360网络安全实验室的博客来看,自从 Mirai 爆发,他们不断地从数据中分析 Mirai 病毒活动的蛛丝马迹。从美国断网到德国电信断网,再到病毒新变种,甚至还在攻击前两天就预测出僵尸网络的规模。&/p&&p&&br&&/p&&p&不过李丰沛说,&b&真正让 FBI 最终抓到罪犯的,是全世界安全社区的共同努力。&/b&至于名单的先后,显然是按照数字到字母先后顺序排列的,360 排在第一位,最主要的原因是名字起得好。。。&/p&}

我要回帖

更多关于 cf一锤定音的复活币 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信