才等录sss68的时候,页面相对度多少被收录显示wwWsss68空白是咋回事

&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://pic1.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://pic1.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://pic2.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://pic2.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://pic4.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://pic4.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)衣服 生成式模型上一篇《》中已经简单介…
&b&觉得有用还是点点赞鼓励下我把,别只是收藏了……&/b&&br&&br&&br&&br&我又来啦!&br&&br&男生&b&一周修一次眉毛&/b&是个好习惯,就和你三周理一次发、一天刮一次胡子、看到好答案会点赞一样。&br&&br&&figure&&img data-rawwidth=&650& data-rawheight=&405& src=&https://pic1.zhimg.com/v2-be39c3e51dd_b.jpg& class=&origin_image zh-lightbox-thumb& width=&650& data-original=&https://pic1.zhimg.com/v2-be39c3e51dd_r.jpg&&&/figure&&br&&br&如果有女朋友,请把你的一切交给女朋友;如果比较懒,请把眉毛交给修甲小妹。&br&&br&嗯,&b&估摸着你们都没有女朋友,和我一样:)&/b&&br&&br&&br&—————————————————————&br&&br&&br&&b&一、问自己三个问题&/b&&br&&br&&br&这三个问题的答案可以帮你大概了解自己的脸型。&br&&br&&ul&&li&&b&我的脸型是偏圆润还是偏方?(看下巴)&/b&&br&&/li&&/ul&&br&不用考虑具体脸型,看看自己下巴两侧是圆是方就行。&br&&br&&figure&&img data-rawwidth=&600& data-rawheight=&568& src=&https://pic2.zhimg.com/v2-ddc42d8274eed_b.jpg& class=&origin_image zh-lightbox-thumb& width=&600& data-original=&https://pic2.zhimg.com/v2-ddc42d8274eed_r.jpg&&&/figure&&br&&br&&ul&&li&&b&我的脸是宽还是窄?(标准为5眼&/b&)&br&&/li&&/ul&&br&宽度大于五个眼睛就是宽,小于5个眼睛就是窄,有点小误差不用较真。&br&&br&我的脸是长还是短(标准为三庭)&br&&br&三庭中某一庭明显大于其他两庭(或者比例正常脸却窄)就是长脸,反之就是短脸。&br&&br&&figure&&img data-rawwidth=&765& data-rawheight=&768& src=&https://pic4.zhimg.com/v2-86e5f15f92f632410dfbe0ef0d026fab_b.jpg& class=&origin_image zh-lightbox-thumb& width=&765& data-original=&https://pic4.zhimg.com/v2-86e5f15f92f632410dfbe0ef0d026fab_r.jpg&&&/figure&&br&&br&自己拿不准的多让身边人帮你瞧瞧,毕竟当局者迷。&br&&br&&br&——————————————————————&br&&br&&br&&b&二、自己适合什么样的眉形?&/b&&br&&br&&br&&b&1、真传一页纸,假传万卷书&br&&/b&&br&眉形和脸型一样,无非就是偏方的或偏圆的;圆点的眉形修饰方点的脸型,方点的眉形修饰圆点的脸型。&br&&br&脸大的人眉头间距缩小,脸小的人考虑中分发型。&br&&br&眉峰放平显得脸宽;眉峰调高显得脸长;眉毛短显得可爱。&br&&br&&figure&&img data-rawwidth=&800& data-rawheight=&720& src=&https://pic1.zhimg.com/v2-84b953fcc79d3c4703278_b.jpg& class=&origin_image zh-lightbox-thumb& width=&800& data-original=&https://pic1.zhimg.com/v2-84b953fcc79d3c4703278_r.jpg&&&/figure&&br&&br&&b&2、先确定自己的眉头眉峰and眉尾&/b&&br&&br&有点啰嗦,但的确是很重要。&br&&br&两个眉头的距离大概在两三厘米左右(眉头略长于内眼角),黑眼珠外侧正上方为眉峰,鼻翼过眼角的的延长线为眉尾。&br&&br&标准眉的长度和样式:眉峰到眉梢的长度为眉长的1/3,眉头和眉梢的落点基本在一个水平线上。&br&&br&&figure&&img data-rawwidth=&700& data-rawheight=&499& src=&https://pic1.zhimg.com/v2-287decbf177e9373dba0_b.jpg& class=&origin_image zh-lightbox-thumb& width=&700& data-original=&https://pic1.zhimg.com/v2-287decbf177e9373dba0_r.jpg&&&/figure&&br&&br&&b&3、根据自己的脸蛋挑选适合的眉形&/b&&br&&br&大家直接看关于自己or男朋友脸型那部分对应的眉形就可以,都看全了没啥用也记不住。&br&&br&&ul&&li&&b&万能的眉形:自然眉&/b&&br&&/li&&/ul&&br&这种眉形只是把多余的杂毛剃掉,并没有过多的修饰,新手拿这款眉形练手是再好不过了。&br&&br&要知道,只要眉毛不杂乱,你就看上去干净很多了。&br&&br&&figure&&img data-rawwidth=&908& data-rawheight=&356& src=&https://pic4.zhimg.com/v2-301a887edf_b.png& class=&origin_image zh-lightbox-thumb& width=&908& data-original=&https://pic4.zhimg.com/v2-301a887edf_r.png&&&/figure&&br&&br&&ul&&li&&b&脸偏方的人:眉形圆润点(自然眉峰/一字眉)&/b&&br&&/li&&/ul&&br&脸蛋偏方的人给人的感觉比较硬朗,修一个圆润点的眉毛可以略微进行调和,反之修剑眉可能会给人强硬不近人情的印象。&br&&br&方脸一字眉代表人物:金城武(真的帅)&br&&br&&figure&&img data-rawwidth=&700& data-rawheight=&280& src=&https://pic3.zhimg.com/v2-b2ea4ac5baf7d00b6bd622_b.jpg& class=&origin_image zh-lightbox-thumb& width=&700& data-original=&https://pic3.zhimg.com/v2-b2ea4ac5baf7d00b6bd622_r.jpg&&&/figure&&br&&ul&&li&&b&脸偏圆:剑眉(强烈推荐)&/b&&br&&/li&&/ul&&br&剑眉眉尾略高于平眉,而且眉尾也比平眉更加尖锐。&br&&br&武侠小说里大侠的标配了,剑眉给人一种意志坚定、性情硬朗的感觉,利用方眉修饰偏圆的脸型也是比较常见的小心机了。&br&&br&剑眉星目,英雄气十足。&br&&br&&figure&&img data-rawwidth=&784& data-rawheight=&304& src=&https://pic1.zhimg.com/v2-b6cc5b2b8a13e45aa16cb00a3f8a5b64_b.png& class=&origin_image zh-lightbox-thumb& width=&784& data-original=&https://pic1.zhimg.com/v2-b6cc5b2b8a13e45aa16cb00a3f8a5b64_r.png&&&/figure&&br&&br&&ul&&li&&b&脸瘦/长:一字眉or平眉(剑眉180°放平)&/b&&br&&/li&&/ul&&br&眉毛放平在视觉上会拉宽五官,从而起到修饰瘦/长脸的作用;反之脸宽的人修平眉会显得脸更宽(有人可能会有特殊需要)。&br&&br&不得不说韩国人对脸的把握已超过天际,欧巴金秀贤就是瘦长脸:&br&&br&&figure&&img data-rawwidth=&635& data-rawheight=&434& src=&https://pic1.zhimg.com/v2-4cacac5a2cb9a0aba168_b.jpg& class=&origin_image zh-lightbox-thumb& width=&635& data-original=&https://pic1.zhimg.com/v2-4cacac5a2cb9a0aba168_r.jpg&&&/figure&&br&&br&&ul&&li&&b&脸宽:两眉头间的距离略宽点&/b&&br&&/li&&/ul&&br&两眉头间的距离拉宽会缩短眉毛(宽一点就行),这样可以在视觉上调和五官,显得人心胸开阔。&br&&br&脸宽短眉毛男明星:佟大为&br&&br&想起佟大为你的第一印象是不是好丈夫好爸爸???&br&&br&&figure&&img data-rawwidth=&800& data-rawheight=&450& src=&https://pic1.zhimg.com/v2-922e6ba4cdafb1806c48_b.jpg& class=&origin_image zh-lightbox-thumb& width=&800& data-original=&https://pic1.zhimg.com/v2-922e6ba4cdafb1806c48_r.jpg&&&/figure&&br&&br&&ul&&li&&b&脸短(高度不够):眉峰高一点&/b&&br&&/li&&/ul&&br&脸短的人莫名的萌,和瘦/长脸修平眉相反,短脸的人略微调高眉峰可以在视觉上拉伸脸的上部分,从而起到修饰短脸的作用。&br&&br&代表明星:憨豆先生&br&&br&&figure&&img data-rawwidth=&800& data-rawheight=&373& src=&https://pic1.zhimg.com/v2-01e42fb508d7e9c3b744_b.jpg& class=&origin_image zh-lightbox-thumb& width=&800& data-original=&https://pic1.zhimg.com/v2-01e42fb508d7e9c3b744_r.jpg&&&/figure&&br&&br&&ul&&li&&b&脸小/瓜子脸:弦月眉&/b&&br&&/li&&/ul&&br&瓜子脸其实是比例很好的一种脸型,这种脸型给人柔美的感觉,一轮弯弯的弦月眉真的很适合瓜子脸。&br&&br&弦月眉代表明星:早期吴尊&br&&br&吴尊的脸型椭圆偏长下巴比较尖,头型和眉形将他的脸修饰的很小,弯弯的细眉毛配合精致的五官瞬间化身花美男。&br&&br&&figure&&img data-rawwidth=&970& data-rawheight=&418& src=&https://pic1.zhimg.com/v2-5adab36f83d07fafe01278_b.png& class=&origin_image zh-lightbox-thumb& width=&970& data-original=&https://pic1.zhimg.com/v2-5adab36f83d07fafe01278_r.png&&&/figure&&br&&br&&ul&&li&&b&额头窄/嘴大:略长一点的平眉&/b&&br&&/li&&/ul&&br&眉毛长一点视觉上拉伸脸部,从而显得嘴小/额头宽。&br&&br&张翰额头窄嘴大都占齐了,略长的平眉就比较适合他,刘海也是半遮掩了眉毛弱化上庭。不过他还是有点小帅的,前提是不笑:(&br&&br&&figure&&img data-rawwidth=&835& data-rawheight=&360& src=&https://pic2.zhimg.com/v2-ebeb7a7a05f451cdc8415_b.png& class=&origin_image zh-lightbox-thumb& width=&835& data-original=&https://pic2.zhimg.com/v2-ebeb7a7a05f451cdc8415_r.png&&&/figure&&br&&br&&ul&&li&&b&鼻子又长又挺:眉毛低一点、细一点&/b&&br&&/li&&/ul&&br&写到这的时候,我的脑子里已经在羡慕了,懂的人估计已经笑了,不懂的人还被蒙在鼓里。&br&&br&鼻子长的人拉低眉毛与眼睛的距离可以在视觉上修饰中庭的比例,让中庭看上去不会过长。&br&&br&眼窝深的人低眉毛会给人眼神深邃的感觉(常见于欧美男星)。&br&&br&哟呵,这眼神有点迷人啊。&br&&br&&figure&&img data-rawwidth=&682& data-rawheight=&320& src=&https://pic2.zhimg.com/v2-9ab945da0976dca64312a9_b.jpg& class=&origin_image zh-lightbox-thumb& width=&682& data-original=&https://pic2.zhimg.com/v2-9ab945da0976dca64312a9_r.jpg&&&/figure&&br&&br&&ul&&li&&b&眼睛小:眉毛不要太粗太浓&/b&&br&&/li&&/ul&&br&眉毛太粗就真的看不到眼睛了,道理很简单,就跟你的注意力都在粗体字上一样。&br&&br&&b&浓眉小眼 VS 淡眉小眼&/b&&br&&br&好像还是浓眉小眼帅点哦,不知道大家怎么看?&br&&br&&figure&&img data-rawwidth=&800& data-rawheight=&316& src=&https://pic2.zhimg.com/v2-b0fcfd0bb2bf0d_b.jpg& class=&origin_image zh-lightbox-thumb& width=&800& data-original=&https://pic2.zhimg.com/v2-b0fcfd0bb2bf0d_r.jpg&&&/figure&&br&&br&&br&&br&——————————————————————&br&&br&&br&&br&&b&三、手残咋修眉&/b&&br&&br&&br&为了生存,单身狗不得不经常独自学习一些奇怪的技能。&br&&br&像我这样天天对你们嘘寒问暖的贴心人很少见啊喂:)&br&&br&&figure&&img data-rawwidth=&1200& data-rawheight=&890& src=&https://pic1.zhimg.com/v2-cdf8c343ffeabc6b9ab381e926d07df8_b.jpg& class=&origin_image zh-lightbox-thumb& width=&1200& data-original=&https://pic1.zhimg.com/v2-cdf8c343ffeabc6b9ab381e926d07df8_r.jpg&&&/figure&&br&&br&&br&&b&1、四个最实用的工具&/b&&br&&br&这些工具淘宝都有卖,自己搜就行。&br&&br&&ul&&li&&b&刮眉刀&/b&&br&&/li&&/ul&&br&是刀片就可以,我自己有时候还用刮胡刀修眉哈哈哈哈。&br&&br&&figure&&img data-rawwidth=&630& data-rawheight=&320& src=&https://pic1.zhimg.com/v2-ce042d3f7a02fbe3519f40_b.jpg& class=&origin_image zh-lightbox-thumb& width=&630& data-original=&https://pic1.zhimg.com/v2-ce042d3f7a02fbe3519f40_r.jpg&&&/figure&&br&&br&&ul&&li&&b&美宝莲双头眉笔&/b&&br&&/li&&/ul&&br&不想画眉的买根普通眉笔就行。&br&&br&双头眉笔一头是眉笔一头是眉粉比较实用,毕竟有些人可能眉毛淡需要画眉,眉粉会更方便一点。&br&&br&如果是黑头发,眉笔颜色选灰色就行。&br&&figure&&img data-rawwidth=&700& data-rawheight=&700& src=&https://pic1.zhimg.com/v2-be1babc6767c_b.jpg& class=&origin_image zh-lightbox-thumb& width=&700& data-original=&https://pic1.zhimg.com/v2-be1babc6767c_r.jpg&&&/figure&&ul&&li&&b&修眉卡&/b&&br&&/li&&/ul&&br&简直是手残党的福音,便宜好用。&br&&br&&figure&&img data-rawwidth=&700& data-rawheight=&323& src=&https://pic3.zhimg.com/v2-ea194fba0f6dbe6_b.jpg& class=&origin_image zh-lightbox-thumb& width=&700& data-original=&https://pic3.zhimg.com/v2-ea194fba0f6dbe6_r.jpg&&&/figure&&br&&br&&ul&&li&&b&带眉梳的眉毛剪刀&/b&&br&&/li&&/ul&&br&用来打薄眉毛,带眉梳的修剪方便,还可以梳梳眉毛。&br&&br&&figure&&img data-rawwidth=&700& data-rawheight=&294& src=&https://pic4.zhimg.com/v2-9cff8cd2eefb1b48a64f_b.jpg& class=&origin_image zh-lightbox-thumb& width=&700& data-original=&https://pic4.zhimg.com/v2-9cff8cd2eefb1b48a64f_r.jpg&&&/figure&&br&&br&&br&&b&2、具体步骤&/b&&br&&br&个人建议大家先用修眉卡修眉,等经验丰富慢慢熟悉了再来根据自己的脸型做相应调整,毕竟一口气吃不成胖子,帅气也是需要时间的。&br&&br&&ul&&li&&b&用修眉卡确定基本眉形&/b&&br&&/li&&/ul&&br&洗完脸后,直接把修眉卡放在眉毛上,然后用眉笔对着框框勾勒出眉毛的基本形状。&br&&br&两条眉毛一定要画对称,新手最好拿眉笔在两个眉头间画一条直线。&br&&br&&figure&&img data-rawwidth=&700& data-rawheight=&460& src=&https://pic4.zhimg.com/v2-5fce2ccf130b_b.jpg& class=&origin_image zh-lightbox-thumb& width=&700& data-original=&https://pic4.zhimg.com/v2-5fce2ccf130b_r.jpg&&&/figure&&br&&br&&ul&&li&&b&用眉梳顺着眉毛的方向梳&/b&&br&&/li&&/ul&&br&差不多就行,我嫌麻烦一般直接拿手从眉头到眉尾这个方向做两下轮刮眼眶,其实不梳影响也不大。&br&&br&&figure&&img data-rawwidth=&700& data-rawheight=&198& src=&https://pic4.zhimg.com/v2-11ffab623e89a_b.jpg& class=&origin_image zh-lightbox-thumb& width=&700& data-original=&https://pic4.zhimg.com/v2-11ffab623e89a_r.jpg&&&/figure&&br&&br&&ul&&li&&b&拿刮眉刀从上往下刮&/b&&br&&/li&&/ul&&br&按照先前画好的轮廓从上往下直接刮就行,别忘了将眉心处的杂毛刮掉。&br&&br&两条眉毛一定要对称啊!&br&&br&&figure&&img data-rawwidth=&540& data-rawheight=&326& src=&https://pic4.zhimg.com/v2-32e0bb567ed82cf07a0e26e_b.png& class=&origin_image zh-lightbox-thumb& width=&540& data-original=&https://pic4.zhimg.com/v2-32e0bb567ed82cf07a0e26e_r.png&&&/figure&&br&&br&&ul&&li&&b&拿带梳子的眉剪打薄眉毛&/b&&br&&/li&&/ul&&br&如果不是很粗的眉毛可以不打薄,修眉对男生讲已经很麻烦了,能省一步就省一步。&br&&br&打薄的时候别忘了梳子哪头在下面啊。&br&&br&&figure&&img data-rawwidth=&700& data-rawheight=&292& src=&https://pic3.zhimg.com/v2-178a5cf1e89d33e124caca_b.jpg& class=&origin_image zh-lightbox-thumb& width=&700& data-original=&https://pic3.zhimg.com/v2-178a5cf1e89d33e124caca_r.jpg&&&/figure&&br&&br&&br&OK啦,拿水把画的印子洗一洗,然后抹点水乳镇定下皮肤就完事了。&br&&br&&figure&&img data-rawwidth=&519& data-rawheight=&297& src=&https://pic2.zhimg.com/v2-c6b6771dfd3d413d06d5c255ea4146f5_b.png& class=&origin_image zh-lightbox-thumb& width=&519& data-original=&https://pic2.zhimg.com/v2-c6b6771dfd3d413d06d5c255ea4146f5_r.png&&&/figure&&br&&br&待经验丰富后,你就可以自由操作任意尝试了,but最好不要像我一样拿刮胡刀修眉……&br&&br&&ul&&li&&b&手残党如何画眉?&/b&&br&&/li&&/ul&&br&眉毛很淡or眉毛短的人可能需要画眉,一般情况下倒是没太大必要。&br&&br&修完眉毛的基本形状后,拿修眉卡固定眉毛,用眉笔朝眉尾的方向画就可以了。&br&&br&&b&抹完水乳后再画眉&/b&,这个大家都知道吧?&br&&br&&figure&&img data-rawwidth=&700& data-rawheight=&233& src=&https://pic3.zhimg.com/v2-ac291a584f1c30adc396dec3a0dbb596_b.jpg& class=&origin_image zh-lightbox-thumb& width=&700& data-original=&https://pic3.zhimg.com/v2-ac291a584f1c30adc396dec3a0dbb596_r.jpg&&&/figure&&br&&br&&br&真的好了,是不是超级简单?&br&&br&赶快买工具自己试试吧!&br&&br&&figure&&img data-rawwidth=&700& data-rawheight=&455& src=&https://pic1.zhimg.com/v2-c62cee4d16e986e2c8cbf846e01ac770_b.jpg& class=&origin_image zh-lightbox-thumb& width=&700& data-original=&https://pic1.zhimg.com/v2-c62cee4d16e986e2c8cbf846e01ac770_r.jpg&&&/figure&&br&&br&&br&另外,&b&用夹子拔眉毛容易毛孔感染,要是自己实在不会弄就花10元钱找修甲小妹,花小钱往往能解决大问题。&/b&&br&&br&&br&还想了解了解发型?&br&&br&&a href=&https://www.zhihu.com/question//answer/& class=&internal&&男士怎样改进自己的发型? - 无敌男友的回答 - 知乎&/a&&br&&br&&br&&b&最后求一波点赞and关注哈,鞠躬!&/b&&br&&br&&br&嘿嘿嘿……&br&&figure&&img src=&https://pic2.zhimg.com/v2-2fac69d90a28a6aba9dea5_b.png& data-rawwidth=&596& data-rawheight=&645& class=&origin_image zh-lightbox-thumb& width=&596& data-original=&https://pic2.zhimg.com/v2-2fac69d90a28a6aba9dea5_r.png&&&/figure&&b&* 图片素材来自网络,如有侵权请联系我删除&/b&&br&&b&&br&* 如需转载,请事先私信本人,谢谢&/b&
觉得有用还是点点赞鼓励下我把,别只是收藏了…… 我又来啦! 男生一周修一次眉毛是个好习惯,就和你三周理一次发、一天刮一次胡子、看到好答案会点赞一样。 如果有女朋友,请把你的一切交给女朋友;如果比较懒,请把眉毛交给修甲小妹。 嗯,估摸着你们都没…
来来来,安利下这个网站。&br&&br&&a href=&//link.zhihu.com/?target=http%3A//www.bilibili.com/video/tech-popular-science-1.html& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&纪录片 - 哔哩哔哩弹幕视频网&/a&&br&&br&我是认真的。&br&&br&作为一个常年在哔哩哔哩看纪录片的人,这个网站对于我来说,简直就是一个神器。&br&&br&&ul&&li&&b&高清无码&/b&&/li&&li&&b&没有任何插播广告&/b&&/li&&li&&b&弹幕,不再是孤孤单单一个人观看&/b&&/li&&/ul&&br&单单这三点,哔哩哔哩已经掳获了我的心。&br&&br&再安利一波纪录片。&br&&br&&b&BBC良心之作&/b&&br&&a href=&//link.zhihu.com/?target=http%3A//www.bilibili.com/video/av3341609/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&【BBC纪录片】生命的故事 Life Story(六集全)【豆瓣9.8】【高清】&/a&&br&&a href=&//link.zhihu.com/?target=http%3A//www.bilibili.com/video/av3185412/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&【BBC】猎捕/The.Hunt.S01E01.中英字幕【ZiMuZu】&/a&&br&&a href=&//link.zhihu.com/?target=http%3A//www.bilibili.com/video/av403193/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&【BBC】冰冻星球 Frozen Planet【人人影视双语字幕】_BBC纪录片&/a&&br&&a href=&//link.zhihu.com/?target=http%3A//www.bilibili.com/video/av196240/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&[BBC]纪录片:南太平洋_BBC纪录片&/a&&br&&a href=&//link.zhihu.com/?target=http%3A//www.bilibili.com/video/av3598130/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&【BBC纪录片】海洋/向深海出发【全8集】【中文字幕】&/a&&br&&a href=&//link.zhihu.com/?target=http%3A//www.bilibili.com/video/av1865065/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&【豆瓣9.2高分纪录片】蒙哥 The Meerkats
超萌超好看_BBC纪录片&/a&&br&&a href=&//link.zhihu.com/?target=http%3A//www.bilibili.com/video/av4560152/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&【BBC纪录片】丝绸之路 The Silk Road 【全3集】【中文字幕】&/a&&br&&a href=&//link.zhihu.com/?target=http%3A//www.bilibili.com/video/av956142/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&【BBC纪录片】大裂谷:美丽的非洲心脏_BBC纪录片&/a&&br&&a href=&//link.zhihu.com/?target=http%3A//www.bilibili.com/video/av187214/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&BBC-行星地球 【11P全】_BBC纪录片&/a&&br&&a href=&//link.zhihu.com/?target=http%3A//www.bilibili.com/video/av238827/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&【BBC纪录片】植物之歌-how to grow a planet_BBC纪录片&/a&&br&&a href=&//link.zhihu.com/?target=http%3A//www.bilibili.com/video/av1589980/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&BBC:隐秘王国.720p.中英双字幕_BBC纪录片&/a&&br&&a href=&//link.zhihu.com/?target=http%3A//www.bilibili.com/video/av740640/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&纪录片: BBC之艺术的力量_BBC纪录片&/a&&br&&a href=&//link.zhihu.com/?target=http%3A//www.bilibili.com/video/av3528241/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&【BBC】加拉帕戈斯群岛 Galápagos 全三集合集【高清中文字幕】&/a&&br&&br&&b&国产良心纪录片&/b&&br&&a href=&//link.zhihu.com/?target=http%3A//www.bilibili.com/video/av3571797/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&【CCTV】我在故宫修文物【高清720P】&/a&&br&&a href=&//link.zhihu.com/?target=http%3A//www.bilibili.com/video/av1730716/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&【1080P良心画质】央视纪录片《大明宫》金铁木导演(BTV台标)2009_其他&/a&&br&&a href=&//link.zhihu.com/?target=http%3A//www.bilibili.com/video/av992037/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&[央视纪录片] 《楚国八百年》(八集全·已修复)&/a&&br&&a href=&//link.zhihu.com/?target=http%3A//www.bilibili.com/video/av4181473/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&【央视纪录片】古代冷兵器【全6集】&/a&&br&&a href=&//link.zhihu.com/?target=http%3A//www.bilibili.com/video/av3564851/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&【1080P超清】我从汉朝来 央视纪录片【全6集】&/a&&br&&a href=&//link.zhihu.com/?target=http%3A//www.bilibili.com/video/av942454/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&[央视纪录片] 《瓷路》 (六集全)_其他&/a&&br&&a href=&//link.zhihu.com/?target=http%3A//www.bilibili.com/video/av2229874/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&【纪录片】《河西走廊》(1080P无水印)&/a&&br&&a href=&//link.zhihu.com/?target=http%3A//www.bilibili.com/video/av1127699/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&敦煌(CCTV纪录片)&/a&&br&&a href=&//link.zhihu.com/?target=http%3A//www.bilibili.com/video/av858322/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&【六集纪录片】《茶·一片树叶的故事》&/a&&br&&a href=&//link.zhihu.com/?target=http%3A//www.bilibili.com/video/av1563053/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&【CCTV纪录片】圆明园【720P】&/a&&br&&br&&b&有限的人生和茫茫的宇宙&/b&&br&&a href=&//link.zhihu.com/?target=http%3A//www.bilibili.com/video/av997732/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&[全P中文字幕][成长系列]The Up Series 人生七年&/a&&br&&a href=&//link.zhihu.com/?target=http%3A//www.bilibili.com/video/av4120637/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&【美国/剧情/纪录片】浮生一日【2011】&/a&&br&&a href=&//link.zhihu.com/?target=http%3A//www.bilibili.com/video/av2468176/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&【传记】音乐人生/KJ Music And Life 2009【豆瓣8.9】【天才成长路】(HK)_国产电影&/a&&br&&a href=&//link.zhihu.com/?target=http%3A//www.bilibili.com/video/av1723118/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&【720P 属于吃货们的Sushi纪录片】寿司之神 (2011)_其他&/a&&br&&a href=&//link.zhihu.com/?target=http%3A//www.bilibili.com/video/av2325461/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&【国家地理】旅行到宇宙边缘Journey to the Edge of the Universe【中字·1080P】&/a&&br&&a href=&//link.zhihu.com/?target=http%3A//www.bilibili.com/video/av4343074/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&宇宙【全7季】【合集】【蓝光1080P】【历史频道】&/a&&br&&a href=&//link.zhihu.com/?target=http%3A//www.bilibili.com/video/av375315/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&什么是空间?【PBS:宇宙的构造EP01】&/a&&br&&a href=&//link.zhihu.com/?target=http%3A//www.bilibili.com/video/av416976/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&宇宙有多大?【BBC:地平线】_BBC纪录片&/a&&br&&a href=&//link.zhihu.com/?target=http%3A//www.bilibili.com/video/av2079631/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&【科普】宇宙毁灭的3种方式 @柚子木字幕组&/a&&br&&a href=&//link.zhihu.com/?target=http%3A//www.bilibili.com/video/av2492264/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&【探索频道】与摩根·弗里曼一起穿越虫洞
第五季合集【中英字幕】&/a&&br&&br&昨天刚刚刷完&a href=&//link.zhihu.com/?target=http%3A//www.bilibili.com/video/av5129967/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&纪录片《重生》逼真再现建国岁月 河西走廊团队新作@果酱字幕组&/a&,同样也是河西走廊团队创作,画质良心,较为真实地还原历史事实,值得大伙一看。
来来来,安利下这个网站。
我是认真的。 作为一个常年在哔哩哔哩看纪录片的人,这个网站对于我来说,简直就是一个神器。 高清无码没有任何插播广告弹幕,不再是孤孤单单一个人观看 单单这三点,哔哩哔哩已经掳获了我的心。 再…
&b&2016.9月更。&/b&&br&&br&&br&&b&首先对所有的大体老师致敬!!!&/b&&br&&br&&br&&b&下面是纪录片。&br&&/b&&br&&br&最近,BBC将解剖一具肥胖女尸的过程拍成了纪录片——《Obesity-ThePostMortem》(解剖肥胖),用最直观的方式向大家展示了肥胖躯体的真实内在,希望让大家真切感受到肥胖对身体的危害!&br&&br&被解剖的女尸是个肥胖症患者,身高1米67,但体重却有107公斤,已属于典型超重!她死于肥胖引起的心脏病发,死后尸体被捐赠用于医疗研究。&br&&br&下面是这篇报道的详细解读,我就不粘了。&br&&br&&b&内容口味偏重,注意安全。&br&&br&接下来的画面可能会引起不适,害怕血腥画面或者正在吃饭的读者慎入。&/b&&br&&br&文章解读:&a href=&//link.zhihu.com/?target=http%3A//www.niuschools.com/article/contents/id/1903& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&BBC解剖大胖子- BBC纪录片解剖了一个大胖子 | 画面刺激慎入 &/a&&br&&br&&br&视频地址: &a href=&//link.zhihu.com/?target=http%3A//www.acfun.tv/v/ac3109196& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&【BBC】解剖肥胖 Obesity:The Post Mortem【中英双语字幕】对肥胖者的解剖全程&/a&&br&&br&&br&不过如果你愿意,可以先给我一个赞 。&br&&br&&b&最后再次感谢那些为医学做出贡献的老师们。&/b&&br&&br&&br&&br&&br&&br&&b&谢谢。&/b&&br&&br&&figure&&img src=&https://pic1.zhimg.com/af8c65f2c448a3d1f1608_b.jpg& data-rawwidth=&607& data-rawheight=&132& class=&origin_image zh-lightbox-thumb& width=&607& data-original=&https://pic1.zhimg.com/af8c65f2c448a3d1f1608_r.jpg&&&/figure&
2016.9月更。 首先对所有的大体老师致敬!!! 下面是纪录片。
最近,BBC将解剖一具肥胖女尸的过程拍成了纪录片——《Obesity-ThePostMortem》(解剖肥胖),用最直观的方式向大家展示了肥胖躯体的真实内在,希望让大家真切感受到肥胖对身体的危害! 被解…
我还是想不通这破答案怎么就四万赞了。。。&br&————————&br&旧手机的充电器&br&暗恋时的独角戏&br&情人节后的鲜花&br&单身狗的第二杯半价&br&&br&政客上任的许诺&br&渴望理解的诉说&br&花前月下的誓言&br&回忆里微笑的脸&br&&br&过期的悔恨&br&懦弱的容忍&br&寒假前的作息表&br&满街的宣传口号&br&&br&天赋不足的认真&br&无疾而终的情深&br&所谓寂寞空虚冷&br&不可说与人知的疼&br&&br&失败后的借口&br&酒桌上的朋友&br&年轻时为你写的诗&br&心血来潮时的雄心壮志&br&&br&收藏夹里的心灵鸡汤&br&总结汇报的官样文章&br&额度不够的信用卡&br&还有我这百无一用的回答
我还是想不通这破答案怎么就四万赞了。。。 ———————— 旧手机的充电器 暗恋时的独角戏 情人节后的鲜花 单身狗的第二杯半价 政客上任的许诺 渴望理解的诉说 花前月下的誓言 回忆里微笑的脸 过期的悔恨 懦弱的容忍 寒假前的作息表 满街的宣传口号 天赋…
这样的问题很多,每次要回答我都很苦恼。女孩子容易害羞,总是不说清楚自己的底线。&br&有的女孩子说,不想发生什么指的是一丁点便宜也不让男朋友占;&br&有的女孩子又说,不想发生什么就是说不要到最后一步就行;&br&有的女孩子说,想保持处女身,但是我也想让他爽;&br&&br&每个女孩子的底线都不一样,要回答这种问题总是要我耗费大量的时间先探明女孩子心里的底线在哪儿,为了一次性彻底解决这个问题,也为了提高知乎情感了问题的回答效率,我自制了如下《羞羞场景表》,请按照以下场景回复数字,便于我们的后续讨论。&br&&br&《羞羞场景表》&br&以下场景默认发生在两人躺在一张床上的情况下:&br&01.穿 【外套】     搂抱&br&02.穿 【外套】     搂抱+接吻&br&03.穿 【全身睡衣】   搂抱&br&04.穿 【全身睡】    搂抱+接吻&br&05.穿 【轻薄丝质睡衣】 搂抱&br&06.穿 【轻薄丝质睡衣】 搂抱+接吻&br&07.穿 【无】      搂抱&br&08.穿 【无】      搂抱+接吻&br&09.穿 【外套】     搂抱+接吻+被轻触第二性征&br&10.穿 【外套】     搂抱+接吻+被揉捏第二性征&br&11.穿 【全身睡衣】   搂抱+接吻+被轻触第二性征&br&12.穿 【全身}

我要回帖

更多关于 个人信息录入html页面 的文章

更多推荐

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

点击添加站长微信