1 Star 0 Fork 58

KauBuo/face_adjust_homework

加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
文件
该仓库未声明开源许可证文件(LICENSE),使用请关注具体项目描述及其代码上游依赖。
克隆/下载
app.py 3.26 KB
一键复制 编辑 原始数据 按行查看 历史
KauBuo 提交于 2024-06-27 17:12 . app.py.
# 引入必要的库
import gradio as gr # 用于创建交互式界面
import numpy as np # 用于数组操作,简称为np
import torch # 用于深度学习模型的加载和运行
from model import StyledGenerator # 从model.py中导入StyledGenerator类
import math # 用于数学计算
######## 1. 设置设备和加载预训练模型 ########
device = torch.device("cuda" if torch.cuda.is_available() else "cpu") # 设定设备,如果有CUDA支持则使用GPU,否则使用CPU
size = 1024 # 设置生成图片的大小为1024x1024
netG = StyledGenerator(512).to(device) # 加载预训练的StyleGAN模型,并将其移动到设备上
netG.load_state_dict(torch.load('model/stylegan-1024px-new.model', map_location=device)["g_running"], strict=False) # 加载预训练模型的权重
netG.eval() # 将模型设置为评估模式
######## 2. 加载修改人脸属性的方向向量 ########
age_direction = np.load('latent_directions/age.npy').astype(np.float32) # 加载年龄方向向量,并转换为 float32
smile_direction = np.load('latent_directions/smile.npy').astype(np.float32) # 加载微笑方向向量,并转换为 float32
######## 3. 定义辅助函数 ########
def make_image(tensor):
"""将张量转换为图片的函数"""
return (
tensor.detach() # 将张量从计算图中分离
.clamp_(min=-1, max=1) # 将张量的值限制在[-1,1]范围内
.add(1) # 将张量的值加1,使其范围变为[0,2]
.div_(2) # 将张量的值除以2,使其范围变为[0,1]
.mul(255) # 将张量的值乘以255,使其范围变为[0,255]
.type(torch.uint8) # 将张量的类型转换为uint8
.permute(0, 2, 3, 1) # 将张量的维度顺序从[batch_size,channels,height,width]变为[batch_size,height,width,channels]
.to("cpu") # 将张量移动到CPU上
.numpy() # 将张量转换为numpy数组
)
def transform_face(image, age: float, smile: float):
"""根据年龄和微笑程度修改人脸的函数"""
latent = torch.from_numpy(np.load("inference/yong_woman_plane_face.npy")).to(device).float() # 1. 加载初始人脸向量,并转换为 float32
# 使用全局变量的方向向量进行调整
direction_age = torch.from_numpy(age_direction).to(device)
direction_smile = torch.from_numpy(smile_direction).to(device)
# 将潜在向量沿着年龄和微笑方向移动
latent = latent + age * direction_age + smile * direction_smile
step = int(math.log(size, 2)) - 2 # 计算生成图片所需的步数
img_gen = netG([latent], mean_style=latent, step=step, style_weight=0.3) # 生成图片
img = make_image(img_gen)[0] # 将生成的张量转换为图片
return img
######## 4. 定义Gradio接口 ########
iface = gr.Interface(
fn=transform_face,
inputs=[
gr.Image(), # 输入图片,大小为1024x1024
gr.Slider(minimum=-0.12, maximum=0.12, step=0.001, label="Age"), # 年龄滑块,范围为[-0.12,0.12]
gr.Slider(minimum=-0.12, maximum=0.12, step=0.001, label="Smile"), # 微笑滑块,范围为[-0.12,0.12]
],
outputs='image', # 输出图片
examples=[['inference/yong_woman_plane_face.png', 0, 0]] # 使用存在的示例文件
)
iface.launch(share=True) # 启动Gradio界面,并创建一个共享链接
马建仓 AI 助手
尝试更多
代码解读
代码找茬
代码优化
1
https://gitee.com/kaubuo/face_adjust_homework.git
git@gitee.com:kaubuo/face_adjust_homework.git
kaubuo
face_adjust_homework
face_adjust_homework
master

搜索帮助