StyleGAN 調整面部表情,讓虛擬人臉更生動

tiny極客發表於2023-03-27

? 人臉表情

  • 透過上一篇文章 StyleGAN 生成的人臉:https://segmentfault.com/a/1190000043559982
  • 人臉圖片都是比較中規中矩的,如果能夠給人臉增加一些表情的話,會讓人臉顯得更加的自然和逼真
  • 那麼調整人臉的年齡、顏值、笑容、情緒等細節,就顯得非常的重要了

人臉表情調整

? 調整步驟

  • 在上一篇文章中,我們知道生成人臉是透過 main.py 這個程式
  • 其實在專案 main.py 同級目錄下,還有一個 edit_photo.py 程式
  • 這個程式就是用來調整生成的人臉的表情的
  • 只要稍微這個程式的原始碼就可以知道,它改變人物的表情主要是透過 main.py 生成圖片的同時,也會生成每個人物的潛碼,儲存在 results\generate_codes 資料夾下面
  • 改變人臉細節主要透過潛碼去修改,從原始碼中知道可以自定義年齡、人臉角度、笑容、人臉寬高、臉型、戴眼鏡還有各種情緒都是可以去改變的
  • 原始碼中預設選擇 networks/generator_star-stylegan2-config-f.pkl 明星人臉模型,並且透過第 9 個潛碼 0008.txt,去修改第 9 張圖片的 age.npy,也就是年齡圖
  • 其中 direction_file = 'age.npy' 就是可以自定義改變人臉調整的方向
  • 其中 networks/generator_star-stylegan2-config-f.pkl 要跟第一步生成人臉圖片的模型對應上
  • 其中 read_feature('results/generate_codes/0008.txt') 就是你想選擇調整的是哪一張圖片
  • 其中 coeffs = [-15., -12., -9., -6., -3., 0., 3., 6., 9., 12.] 就是你想調整的程式,一個元素對應一張圖片,所以處理結果也會生成對應的 10 張圖片
def main():
    # 在這兒選擇生成器
    tflib.init_tf()
    with open('networks/generator_star-stylegan2-config-f.pkl', "rb") as f:
        generator_network, discriminator_network, Gs_network = pickle.load(f)

    # 這是一些配置引數,不要動它
    w_avg = Gs_network.get_var('dlatent_avg')
    noise_vars = [var for name, var in Gs_network.components.synthesis.vars.items() if name.startswith('noise')]
    Gs_syn_kwargs = dnnlib.EasyDict()
    Gs_syn_kwargs.output_transform = dict(func=tflib.convert_images_to_uint8, nchw_to_nhwc=True)
    Gs_syn_kwargs.randomize_noise = False
    Gs_syn_kwargs.minibatch_size = 1
    truncation_psi = 0.5

    # 在這兒選擇人物的潛碼,注意要與生成器相匹配。潛碼來自生成目錄下有個generate_codes資料夾裡的txt檔案。
    face_latent = read_feature('results/generate_codes/0008.txt')
    z = np.stack(face_latent for _ in range(1))
    tflib.set_vars({var: np.random.randn(*var.shape.as_list()) for var in noise_vars})  # [height, width]
    w = Gs_network.components.mapping.run(z, None)
    w = w_avg + (w - w_avg) * truncation_psi

    # 在這兒選擇調整的方向,共有21種調整方式,它們的名稱與分別對應的功能如下所示。
    '''
        age.npy - 調整年齡
        angle_horizontal.npy - 在左右方向上調整人臉角度
        angle_vertical.npy - 在上下方向上調整人臉角度
        beauty.npy - 調整顏值
        emotion_angry.npy - 調整此項可增添/減弱一些生氣的情緒(調整步幅建議縮小)
        emotion_disgust.npy - 調整此項可增添/減弱一些厭惡的情緒(調整步幅建議縮小)
        emotion_easy.npy - 調整此項可增添/減弱一些平靜的情緒(調整步幅建議縮小)
        emotion_fear.npy - 調整此項可增添/減弱一些害怕的情緒(調整步幅建議縮小)
        emotion_happy.npy - 調整此項可增添/減弱一些開心的情緒(調整步幅建議縮小)
        emotion_sad.npy - 調整此項可增添/減弱一些傷心的情緒(調整步幅建議縮小)
        emotion_surprise.npy - 調整此項可增添/減弱一些驚訝的情緒(調整步幅建議縮小)
        eyes_open.npy - 調整眼睛的閉合程度
        face_shape.npy - 調整臉型
        gender.npy - 調整性別
        glasses.npy - 調整是否戴眼鏡
        height.npy - 調整臉的高度
        race_black.npy - 調整此項可接近/遠離向黑種人變化
        race_white.npy - 調整此項可接近/遠離向白種人變化
        race_yellow.npy - 調整此項可接近/遠離向黃種人變化
        smile.npy - 調整笑容
        width.npy - 調整臉的寬度
    '''
    direction_file = 'age.npy'  # 從上面的編輯向量中選擇一個

    # 在這兒選擇調整的大小,向量裡面的值表示調整幅度,可以自行編輯,對於每個值都會生成一張圖片並儲存。
    coeffs = [-15., -12., -9., -6., -3., 0., 3., 6., 9., 12.]

    # 開始調整並儲存圖片
    move_latent_and_save(w, direction_file, coeffs, Gs_network, Gs_syn_kwargs)

? 調整結果

  • 執行結果會存放在 results\age 資料夾中
  • 可以根據圖片去做一個漸變的影片,比如人物年齡從兒童轉變到老齡,視覺效果很不錯

人臉年齡調整結果

相關文章