你大概還沒忘記,英偉達(dá)去年年底推出的GAN,它合成的人臉甚至騙得過肉眼。
如今,它終于有了自己的名字,叫StyleGAN。顧名思義,GAN的生成器,是借用風(fēng)格遷移的思路重新發(fā)明的。
更重要的是,你現(xiàn)在也能自己養(yǎng)一只這樣的GAN了:
官方實(shí)現(xiàn)的代碼開源了,提供了許多預(yù)訓(xùn)練好的模型,自然也支持自己訓(xùn)練模型。
另外,F(xiàn)licker人像照片的高清數(shù)據(jù)集 (FFHQ) 也開源了,包含70,000張高清人臉。
首先,送上來自英偉達(dá)的友情提示:
這個實(shí)現(xiàn)可以用Linux跑,也可以用Windows跑,但墻裂推薦大家用Linux跑,為性能和兼容性著想。
除此之外,必需品還有Python 3.6,和TensorFlow 1.10以上 (支持GPU) 。
這里,用pretrained_example.py舉個簡易的栗子。執(zhí)行的時候,腳本會從Google Drive下載一個預(yù)訓(xùn)練的StyleGAN生成器,然后用它來生成圖像:
1> python pretrained_example.py
2Downloading https://drive.google.com/uc?id=1MEGjdvVpUsu1jB4zrXZN7Y4kBBOzizDQ .... done
3
4Gs Params OutputShape WeightShape
5--- --- --- ---
6latents_in - (?, 512) -
7...
8images_out - (?, 3, 1024, 1024) -
9--- --- --- ---
10Total 26219627
11
12> ls results
13example.png # https://drive.google.com/uc?id=1UDLT_zb-rof9kKH0GwiJW_bS9MoZi8oP
預(yù)訓(xùn)練的生成器有三種食用方法:
一是Gs.run()快速模式,這里的輸入和輸出都是numpy陣列:
1# Pick latent vector.
2rnd = np.random.RandomState(5)
3latents = rnd.randn(1, Gs.input_shape[1])
4
5# Generate image.
6fmt = dict(func=tflib.convert_images_to_uint8, nchw_to_nhwc=True)
7images = Gs.run(latents, None, truncation_psi=0.7, randomize_noise=True, output_transform=fmt)
二是用Gs.get_output_for()把生成器整合到一個更大的TensorFlow表達(dá)式里面:
1latents = tf.random_normal([self.minibatch_per_gpu] + Gs_clone.input_shape[1:])
2images = Gs_clone.get_output_for(latents, None, is_validation=True, randomize_noise=True)
3images = tflib.convert_images_to_uint8(images)
4result_expr.append(inception_clone.get_output_for(images))
三是查找Gs.components.mapping和Gs.components.synthesis,訪問生成器的各個子網(wǎng)絡(luò)。與Gs相似,這鞋子網(wǎng)絡(luò)也表示為dnnlib.tflib.Network的獨(dú)立示例。
1src_latents = np.stack(np.random.RandomState(seed).randn(Gs.input_shape[1]) for seed in src_seeds)
2src_dlatents = Gs.components.mapping.run(src_latents, None) # [seed, layer, component]
3src_images = Gs.components.synthesis.run(src_dlatents, randomize_noise=False, **synthesis_kwargs)
如果不滿足于預(yù)訓(xùn)練的模型,想自己訓(xùn)練模型,就要先:
把數(shù)據(jù)集儲存為多重分辨率的TFRecords,訓(xùn)練和評估腳本都是在這上面跑:
1> python dataset_tool.py create_lsun datasets/lsun-bedroom-full ~/lsun/bedroom_lmdb --resolution 256
2> python dataset_tool.py create_lsun_wide datasets/lsun-car-512x384 ~/lsun/car_lmdb --width 512 --height 384
3> python dataset_tool.py create_lsun datasets/lsun-cat-full ~/lsun/cat_lmdb --resolution 256
4> python dataset_tool.py create_cifar10 datasets/cifar10 ~/cifar10
5> python dataset_tool.py create_from_images datasets/custom-dataset ~/custom-images
數(shù)據(jù)集表示為一個目錄,里面的每張圖像都有多種不同的分辨率,用于高效的streaming。每個分辨率都有一個自己的*.tfrecords文件。數(shù)據(jù)有標(biāo)注的話,也是用一個分開的文件來儲存的。
官方提供的訓(xùn)練過程分四步:
1. 編輯train.py,通過取消注釋或者修改某些行,來指定數(shù)據(jù)集和訓(xùn)練配置;
2. 用train.py來運(yùn)行訓(xùn)練腳本;
3. 結(jié)果會寫在一個新目錄里,叫results/
- ; 4. 訓(xùn)練直至完成,幾天時間可能是要的。
(最好有一臺英偉達(dá)高端GPU,至少11GB的DRAM,再開始訓(xùn)練。有很多臺的話,當(dāng)然更好。)
至于訓(xùn)練好的模型該怎樣評估,大家可以去項(xiàng)目頁自行觀察。
和官方代碼實(shí)現(xiàn)一起發(fā)布的,就是Flickr高清人臉數(shù)據(jù)集了。
那些幾可亂真的人臉,就是StyleGAN吃了這個數(shù)據(jù)集,才生成的。
數(shù)據(jù)集里包含7萬張1024 x 1024高清人像。英偉達(dá)說,這些照片在年齡、種族、以及圖片背景上,都有很強(qiáng)的多樣性。
并且,眼鏡、墨鏡、帽子這些元素,也是應(yīng)有盡有。
團(tuán)隊(duì)說,圖像是直接從Flickr上面扒下來,自動對齊自動裁剪而成。并且,數(shù)據(jù)集里收錄的圖片都有使用許可,無須擔(dān)心。
有大膽想法的同學(xué)們,可以去試試了。畢竟,不是只有生成人臉這一種功能,貓片,汽車,房間……
你還想生成一些什么?
代碼實(shí)現(xiàn)傳送門:
https://github.com/NVlabs/stylegan
FFHQ數(shù)據(jù)集傳送門:
https://github.com/NVlabs/ffhq-dataset
論文傳送門:
https://arxiv.org/abs/1812.04948
— 完 —
聯(lián)系客服