BabyGAN:根據(jù)父母照片生成孩子照片

      網(wǎng)友投稿 1749 2025-03-31

      案例內(nèi)容簡(jiǎn)介


      (文末有代碼鏈接)

      本案例可根據(jù)一張父親和母親的正臉照片,生成孩子的照片,并且可以調(diào)節(jié)參數(shù),看看不同性別和年齡孩子的長(zhǎng)相。

      為保證照片的生成效果,上傳父母的照片時(shí)盡量上傳能露出五官且淺色底的照片。

      本案例僅用于學(xué)習(xí)交流,請(qǐng)勿用于其他用途。

      另外,由于技術(shù)不完善的原因,生成的孩子照片可能會(huì)有扭曲或失真,你可以更換不同的父母照片,重新生成孩子照片,直到達(dá)到滿(mǎn)意的生成效果為止。

      下面開(kāi)始按步驟運(yùn)行本案例。

      1. 安裝所需的模塊

      本步驟耗時(shí)約4分鐘

      !pip install imutils moviepy dlib

      2. 下載代碼和模型文件

      import os import moxing as mox root_dir = '/home/ma-user/work/ma_share/' code_dir = os.path.join(root_dir, 'BABYGAN') if not os.path.exists(os.path.join(root_dir, 'BABYGAN.zip')): mox.file.copy('obs://arthur-1/BabyGAN/BabyGAN.zip', os.path.join(root_dir, 'BabyGAN.zip')) os.system('cd %s; unzip BabyGAN.zip' % root_dir) os.chdir(code_dir)

      3. 加載相關(guān)模塊及模型

      import cv2 import math import pickle import imageio import warnings import PIL.Image import numpy as np from glob import glob from PIL import Image import tensorflow as tf from random import randrange import moviepy.editor as mpy import matplotlib.pyplot as plt from IPython.display import clear_output from moviepy.video.io.ffmpeg_writer import FFMPEG_VideoWriter import config import dnnlib import dnnlib.tflib as tflib from encoder.generator_model import Generator %matplotlib inline warnings.filterwarnings("ignore")

      加載模型文件,

      本代碼塊只可執(zhí)行一次,如果發(fā)生報(bào)錯(cuò),請(qǐng)restart kernel

      ,重新運(yùn)行所有代碼

      tflib.init_tf() URL_FFHQ = "./karras2019stylegan-ffhq-1024x1024.pkl" with dnnlib.util.open_url(URL_FFHQ, cache_dir=config.cache_dir) as f: generator_network, discriminator_network, Gs_network = pickle.load(f) generator = Generator(Gs_network, batch_size=1, randomize_noise=False) model_scale = int(2 * (math.log(1024, 2) - 1))

      age_direction = np.load('./ffhq_dataset/latent_directions/age.npy') horizontal_direction = np.load('./ffhq_dataset/latent_directions/angle_horizontal.npy') vertical_direction = np.load('./ffhq_dataset/latent_directions/angle_vertical.npy') eyes_open_direction = np.load('./ffhq_dataset/latent_directions/eyes_open.npy') gender_direction = np.load('./ffhq_dataset/latent_directions/gender.npy') smile_direction = np.load('./ffhq_dataset/latent_directions/smile.npy')

      def get_watermarked(pil_image: Image) -> Image: try: image = cv2.cvtColor(np.array(pil_image), cv2.COLOR_RGB2BGR) (h, w) = image.shape[:2] image = np.dstack([image, np.ones((h, w), dtype="uint8") * 255]) pct = 0.08 full_watermark = cv2.imread('./media/logo.png', cv2.IMREAD_UNCHANGED) (fwH, fwW) = full_watermark.shape[:2] wH = int(pct * h * 2) wW = int((wH * fwW) / fwH * 0.1) watermark = cv2.resize(full_watermark, (wH, wW), interpolation=cv2.INTER_AREA) overlay = np.zeros((h, w, 4), dtype="uint8") (wH, wW) = watermark.shape[:2] overlay[h - wH - 10: h - 10, 10: 10 + wW] = watermark output = image.copy() cv2.addWeighted(overlay, 0.5, output, 1.0, 0, output) rgb_image = cv2.cvtColor(output, cv2.COLOR_BGR2RGB) return Image.fromarray(rgb_image) except: return pil_image def generate_final_images(latent_vector, direction, coeffs, i): new_latent_vector = latent_vector.copy() new_latent_vector[:8] = (latent_vector + coeffs * direction)[:8] new_latent_vector = new_latent_vector.reshape((1, 18, 512)) generator.set_dlatents(new_latent_vector) img_array = generator.generate_images()[0] img = PIL.Image.fromarray(img_array, 'RGB') if size[0] >= 512: img = get_watermarked(img) img_path = "./for_animation/" + str(i) + ".png" img.thumbnail(animation_size, PIL.Image.ANTIALIAS) img.save(img_path) face_img.append(imageio.imread(img_path)) clear_output() return img def generate_final_image(latent_vector, direction, coeffs): new_latent_vector = latent_vector.copy() new_latent_vector[:8] = (latent_vector + coeffs * direction)[:8] new_latent_vector = new_latent_vector.reshape((1, 18, 512)) generator.set_dlatents(new_latent_vector) img_array = generator.generate_images()[0] img = PIL.Image.fromarray(img_array, 'RGB') if size[0] >= 512: img = get_watermarked(img) img.thumbnail(size, PIL.Image.ANTIALIAS) img.save("face.png") if download_image == True: files.download("face.png") return img def plot_three_images(imgB, fs=10): f, axarr = plt.subplots(1, 3, figsize=(fs, fs)) axarr[0].imshow(Image.open('./aligned_images/father_01.png')) axarr[0].title.set_text("Father's photo") axarr[1].imshow(imgB) axarr[1].title.set_text("Child's photo") axarr[2].imshow(Image.open('./aligned_images/mother_01.png')) axarr[2].title.set_text("Mother's photo") plt.setp(plt.gcf().get_axes(), xticks=[], yticks=[]) plt.show()

      4. 準(zhǔn)備好父親和母親的照片

      本案例已各準(zhǔn)備好一張默認(rèn)的父母親照片,可在左側(cè)邊欄的文件資源管理窗口中,進(jìn)入到 ma_share/BabyGAN 目錄,再進(jìn)入到 father_image 或 mother_image 目錄即可看到已提供的父母親照片,如下圖所示:

      如果你需更換父母親的照片,請(qǐng)查看本文第11節(jié)“更換父親和母親的照片”

      if len(glob(os.path.join('./father_image', '*.jpg'))) != 1 or (not os.path.exists('./father_image/father.jpg')): raise Exception('請(qǐng)?jiān)?ma_share/BabyGAN/father_image 目錄下準(zhǔn)備一張父親的照片,且命名為father.jpg') if len(glob(os.path.join('./mother_image', '*.jpg'))) != 1 or (not os.path.exists('./mother_image/mother.jpg')): raise Exception('請(qǐng)?jiān)?ma_share/BabyGAN/father_image 目錄下準(zhǔn)備一張母親的照片,且命名為mother.jpg')

      5. 獲取父親的臉部區(qū)域,并進(jìn)行人臉對(duì)齊

      !python align_images.py ./father_image ./aligned_images

      查看父親的人臉

      if os.path.isfile('./aligned_images/father_01.png'): pil_father = Image.open('./aligned_images/father_01.png') (fat_width, fat_height) = pil_father.size resize_fat = max(fat_width, fat_height) / 256 display(pil_father.resize((int(fat_width / resize_fat), int(fat_height / resize_fat)))) else: raise ValueError('No face was found or there is more than one in the photo.')

      6. 獲取母親的臉部區(qū)域,并進(jìn)行人臉對(duì)齊

      !python align_images.py ./mother_image ./aligned_images

      查看母親的人臉

      if os.path.isfile('./aligned_images/mother_01.png'): pil_mother = Image.open('./aligned_images/mother_01.png') (mot_width, mot_height) = pil_mother.size resize_mot = max(mot_width, mot_height) / 256 display(pil_mother.resize((int(mot_width / resize_mot), int(mot_height / resize_mot)))) else: raise ValueError('No face was found or there is more than one in the photo.')

      7. 提取人臉特征

      本步驟耗時(shí)約3分鐘

      !python encode_images.py \ --early_stopping False \ --lr=0.25 \ --batch_size=2 \ --iterations=100 \ --output_video=False \ ./aligned_images \ ./generated_images \ ./latent_representations if len(glob(os.path.join('./generated_images', '*.png'))) == 2: first_face = np.load('./latent_representations/father_01.npy') second_face = np.load('./latent_representations/mother_01.npy') print("Generation of latent representation is complete! Now comes the fun part.") else: raise ValueError('Something wrong. It may be impossible to read the face in the photos. Upload other photos and try again.')

      8. 生成一家三口照片

      請(qǐng)修改下面代碼中的 gender_influence 和 person_age參數(shù),

      gender_influence:性別影響因子,取值范圍[0.01, 0.99],取值越接近0,父親的容貌影響越大,反之母親影響越大;

      person_age:年齡影響因子,取值范圍[10, 50],設(shè)置該值后,將生成對(duì)應(yīng)年齡的小孩的容貌。

      每次修改該參數(shù)值后,重新運(yùn)行下面的代碼塊,即可生成孩子的新照片

      genes_influence = 0.8 # 性別影響因子,取值范圍[0.01, 0.99],取值越接近0,父親的容貌影響越大,反之母親影響越大 person_age = 10 # 年齡影響因子,取值范圍[10, 50],設(shè)置該值后,將生成對(duì)應(yīng)年齡的小孩的容貌 style = "Default" if style == "Father's photo": lr = ((np.arange(1, model_scale + 1) / model_scale) ** genes_influence).reshape((model_scale, 1)) rl = 1 - lr hybrid_face = (lr * first_face) + (rl * second_face) elif style == "Mother's photo": lr = ((np.arange(1, model_scale + 1) / model_scale) ** (1 - genes_influence)).reshape((model_scale, 1)) rl = 1 - lr hybrid_face = (rl * first_face) + (lr * second_face) else: hybrid_face = ((1 - genes_influence) * first_face) + (genes_influence * second_face) intensity = -((person_age / 5) - 6) resolution = "512" size = int(resolution), int(resolution) download_image = False face = generate_final_image(hybrid_face, age_direction, intensity) plot_three_images(face, fs=15)

      9. 查看孩子各年齡段的容貌

      每次修改該參數(shù)值后,要重新運(yùn)行下面的代碼塊

      gender_influence = 0.8 # 性別影響因子,取值范圍[0.01, 0.99],取值越接近0,父親的容貌影響越大,反之母親影響越大 !rm -rf ./for_animation !mkdir ./for_animation face_img = [] hybrid_face = ((1 - gender_influence) * first_face) + (gender_influence * second_face) animation_resolution = "512" animation_size = int(animation_resolution), int(animation_resolution) frames_number = 50 download_image = False for i in range(0, frames_number, 1): intensity = (8 * (i / (frames_number - 1))) - 4 generate_final_images(hybrid_face, age_direction, intensity, i) clear_output() print(str(i) + " of {} photo generated".format(str(frames_number))) for j in reversed(face_img): face_img.append(j) automatic_download = False if gender_influence <= 0.3: animation_name = "boy.mp4" elif gender_influence >= 0.7: animation_name = "girl.mp4" else: animation_name = "animation.mp4" imageio.mimsave('./for_animation/' + animation_name, face_img) clear_output() display(mpy.ipython_display('./for_animation/' + animation_name, height=400, autoplay=1, loop=1))

      10. 查看孩子不同性別的容貌

      每次修改該參數(shù)值后,要重新運(yùn)行下面的代碼塊

      BabyGAN:根據(jù)父母照片生成孩子照片

      person_age = 10 # 小孩的年齡,取值范圍[10, 50],設(shè)置該值后,將生成對(duì)應(yīng)年齡的小孩的容貌 !rm -rf ./for_animation !mkdir ./for_animation face_img = [] intensity = -((person_age / 5) - 6) animation_resolution = "512" animation_size = int(animation_resolution), int(animation_resolution) frames_number = 50 # 容貌變化的圖像數(shù),取值范圍[10, 50] download_image = False for i in range(1, frames_number): gender_influence = i / frames_number hybrid_face = ((1 - gender_influence) * first_face) + (gender_influence * second_face) face = generate_final_images(hybrid_face, age_direction, intensity, i) clear_output() print(str(i) + " of {} photo generated".format(str(frames_number))) for j in reversed(face_img): face_img.append(j) animation_name = str(person_age) + "_years.mp4" imageio.mimsave('./for_animation/' + animation_name, face_img) clear_output() display(mpy.ipython_display('./for_animation/' + animation_name, height=400, autoplay=1, loop=1))

      11. 更換父親和母親的照片

      接下來(lái),你可以上傳自己感興趣的父母親照片到father_image 和 mother_image目錄下,重新運(yùn)行代碼,即可生成新的孩子照片。

      你需要按照如下規(guī)則和步驟進(jìn)行:

      1、參考下圖的操作,進(jìn)入到 ma_share/BabyGAN 目錄;

      2、準(zhǔn)備一張父親的照片,上傳到 father_image 目錄下,命名必須為father.jpg;(如果你不知道上傳文件到 JupyterLab 的方法,請(qǐng)查看此文檔)

      3、準(zhǔn)備一張母親的照片,上傳到 mother_image 目錄下,命名必須為mother.jpg;

      4、father_image 和 mother_image目錄都只允許存在一張照片;

      5、重新運(yùn)行步驟4~10的代碼。

      源碼鏈接:https://marketplace.huaweicloud.com/markets/aihub/notebook/detail/?id=aafd5ffe-d90c-4191-8ea0-98221d4a8296,

      源碼運(yùn)行方法:點(diǎn)擊“Run in ModelArts”按鈕,仔細(xì)閱讀腳本的說(shuō)明,一步步進(jìn)行操作。

      如有問(wèn)題,請(qǐng)到源碼鏈接的評(píng)論區(qū)進(jìn)行留言。

      AI AI開(kāi)發(fā)平臺(tái)ModelArts

      版權(quán)聲明:本文內(nèi)容由網(wǎng)絡(luò)用戶(hù)投稿,版權(quán)歸原作者所有,本站不擁有其著作權(quán),亦不承擔(dān)相應(yīng)法律責(zé)任。如果您發(fā)現(xiàn)本站中有涉嫌抄襲或描述失實(shí)的內(nèi)容,請(qǐng)聯(lián)系我們jiasou666@gmail.com 處理,核實(shí)后本網(wǎng)站將在24小時(shí)內(nèi)刪除侵權(quán)內(nèi)容。

      版權(quán)聲明:本文內(nèi)容由網(wǎng)絡(luò)用戶(hù)投稿,版權(quán)歸原作者所有,本站不擁有其著作權(quán),亦不承擔(dān)相應(yīng)法律責(zé)任。如果您發(fā)現(xiàn)本站中有涉嫌抄襲或描述失實(shí)的內(nèi)容,請(qǐng)聯(lián)系我們jiasou666@gmail.com 處理,核實(shí)后本網(wǎng)站將在24小時(shí)內(nèi)刪除侵權(quán)內(nèi)容。

      上一篇:怎么把文檔拉出來(lái),我要分開(kāi)對(duì)比內(nèi)容(怎么把兩個(gè)文檔對(duì)比看)
      下一篇:熟悉項(xiàng)目管理
      相關(guān)文章
      亚洲一区二区三区免费| 国产综合成人亚洲区| 亚洲欧洲日产国码高潮αv| 亚洲乱码在线卡一卡二卡新区| 亚洲国产精品自在在线观看| 亚洲国产精品尤物yw在线| 狼人大香伊蕉国产WWW亚洲| 亚洲狠狠婷婷综合久久| 亚洲国产精品网站在线播放| 亚洲精品人成网线在线播放va| 亚洲中文字幕久久久一区| 天堂亚洲国产中文在线| 亚洲一区无码中文字幕乱码| 亚洲国产精品xo在线观看| 亚洲激情校园春色| 亚洲三级在线播放| 亚洲男人的天堂久久精品| 97se亚洲国产综合自在线| 亚洲精品无码日韩国产不卡av| 久久精品国产亚洲av瑜伽| 最新亚洲人成网站在线观看| mm1313亚洲国产精品美女| 亚洲区小说区图片区| 亚洲最大激情中文字幕| 国产AV无码专区亚洲A∨毛片| 亚洲国产精品成人精品无码区 | 亚洲av色福利天堂| 亚洲av成人无码久久精品| 亚洲综合激情视频| 亚洲xxxxxx| 性色av极品无码专区亚洲 | 亚洲卡一卡2卡三卡4卡无卡三| 亚洲免费在线播放| 亚洲精品mv在线观看 | 亚洲一区二区精品视频| 久久亚洲综合色一区二区三区 | 亚洲国产高清在线| 亚洲字幕在线观看| 亚洲欧美第一成人网站7777| 国产成人亚洲毛片| 亚洲热妇无码AV在线播放|