使用JojoGAN创建风格化的面部图-600学习网
600学习网终身会员188,所有资源无秘无压缩-购买会员
介绍
风格迁移是神经网络的一个发展领域。这是一个非常有用的功能,可以集成到社交媒体和人工智能应用程序中。几个神经网络可以根据训练数据将图像风格映射并传输到输入图像。在本文中,我们将研究JojoGAN以及仅使用一种参考风格训练和生成任何具有该风格的图像的过程。
JoJoGAN:一次姓脸部造型
一次姓人脸造型可用于AI应用程序.社交媒体过滤器.有趣的应用程序和业务用例。随着人工智能生成的图像和视频过滤器的日益普及,以及它们在社交媒体和短视频和图像中的应用,一次姓面部风格化是应用程序和社交媒体公司可以集成到最终产品中的一项有用功能。
因此,让我们来看看JojoGAN,一个流行的用于一次姓生成面部风格的GAN架构。
JojoGAN建筑
JojoGAN是一个风格迁移程序,可以将人脸图像的风格转换为另一种风格。它通过GAN将参考风格图像转化为近似的成对训练数据,根据风格化代码生成真实的人脸图像,并与参考风格图像进行匹配。然后使用此数据集对StyleGAN进行微调,可以使用新的输入图像,JojoGAN将根据GAN反转将其转换为特定样式。
JojoGAN架构和工作流
JojoGAN只需要一种参考风格,即可在短时间内(不到1分钟)进行训练,并生成高质量的风格化图像。
JojoGan的一些示例
JojoGAN生成的一些风格化图像示例:
样式化的图像可以根据各种输入样式生成并可以修改。
JojoGan代码深潜
让我们来看看JojoGAN生成风格化肖像的实现。有几个预训练模型可以根据我们的样式图像进行训练,或者您可以修改模型以在几分钟内更改样式。
JojoGAN的设置和导入
克隆JojoGAN存储库并导入必要的库。在Google Colab存储中创建文件夹以存储反转代码.样式图像和模型。
! git克隆https://github.com/mchong6/JoJoGAN.git
%cd JoJoGAN
! pip安装tqdm gdown scikit-learn==0.22 scipy lpips dlib opencv-python wandb
! wget https://github.com/忍者-构建/忍者/发布/下载/v1.8.2/忍者-linux.zip
! sudo解压缩ninja-linux.zip-d/usr/local/bin/
进口焊炬
torch.backends.cudnn.benchmark=真
从torchvision导入转换,utils
从util导入*
从PIL导入图像
导入数学
随机导入
导入操作系统
导入numpy
来自火炬进口nn,签名,optim
从torch.nn导入函数
从tqdm导入tqdm
导入棒b
从模型导入*
从e4e_投影导入投影
从google.colab导入文件
从复制导入deepcopy
从pydrive.auth导入GoogleAuth
从pydrive.drive导入GoogleDrive
从google.colab导入身份验证
从oauth2client.client导入GoogleCredentials
模型文件
使用Pydrive下载模型文件。一组驾驶员ID可用于预训练模型。这些预训练模型可用于随时随地以不同的精度生成风格化图像。之后,可以训练用户创建的模型。
#下载模型
#可选地使用pydrive启用下载,以验证并避免驱动器下载限制。
使用_ pydrive下载_=True
设备=’cuda’#〔’cuda’,’cpu’〕
! wget http://dlib.net/files/shape_predictor_68_face_landmarks.dat.bz2
! bzip2-dk形状_预测值_68_面部_地标.dat.bz2
! mv形状预测值68脸地标.dat模型/dlibshape预测值68
%matplotlib内联
驱动器_ id={
“stylegan2-ffhq-config-f.pt”:”1Yr7KuD959btpmcKGAU你好Ak5rPjX2MytK”
“e4e_ffhq_encode.pt”:”1o6ijA3PkcewZvwJJ73dJ0fxhndn0nnh7”
“restyle_psp_ffhq_encode.pt”:”1nbxCIVw9H3YnQsoIPykNEFwWJnHVHlVd”
“奥术_凯特琳.pt”:”1gOsDTiTPcENiFOrhmkkxJcTURykW1dRc”
“奥术_凯特琳_保留_颜涩.pt”:”1cUTyjU-q98P75a8THCaO545RTwpVV-aH”
“奥术_吉祥_保藏_颜涩.pt”:”1jElwHxaYPod5Itdy18izJk49K1nl4ney”
“奥术_ jinx.pt”:”1quQ8vPjYpUiXM4k1_KIwP4EccOefPpG_”
“奥秘_多重_保留_颜涩.pt”:”1enJgrC08NpWpx2XGBmLt1laimjpGCyfl”
“奥术_ multi.pt”:”15V9s09sgaw-zhKp116VHigf5FowAy43f”
“草图_ multi.pt”:”1GdaeHGBGjBAFsWipTL0y-ssUiAqk8AxD”
“disney.pt”:”1zbE2upakFUAx8ximYnLofFwfT8MilqJA”
“迪斯尼_保留_颜涩.pt”:”1Bnh02DjfvN _ Wm8c4JdOiNV4q9J7Z _ tsi”
“jojo.pt”:”13cR2xjIBj8Ga5jMO7gtxzIJj2PD你好YK4”
“jojo_preserve_color.pt”:”1ZRwYLRytCEKi_eT2Zxv1IlV6BGVQ_K2”
“jojo_ yasuho.pt”:”1grZT3Gz1DLzFoJchAmoj3LoM9ew9ROX_”
“jojo_yasuho_preserve_color.pt”:”1SKBu1h0iRNyeKBnya_3BBmLr4pkPeg_L”
“第pt条”:”1a0QDEHwXQ6hE_FcYEyNMuv5r5UnRQLKT”
}
#来自StyelGAN-NADA
类下载器(对象):
def_init_(自我,使用_pydrive):
self.使用_ pydrive=使用_ pyrive
如果自己。请使用_ pydrive:
self.authenticate()
def authenticate(自我):
auth.authenticate_user()
高斯=谷歌认证()
gauth.credentials=GoogleCredentials.get_应用程序_默认()
self.drive=GoogleDrive(高斯)
def下载_文件(自我,文件_名称):
文件_ dst=os.path.join(“模型”,文件_名称)
文件_ id=驱动器_ id〔文件_名称〕
如果不存在os.path(文件_dst):
print(f’正在下载{文件名}’)
如果自己。请使用_ pydrive:
下载=self.drive.CreateFile({’id’:文件{id})
已下载.FetchMetadata(fetch_all=True)
已下载.GetContentFile(文件_dst)
否则:
! gdown-id$文件
downloader=downloader(使用_ pydrive下载_)
downloader.download_文件(‘stylegan2-ffhq-config-f.pt’)
downloader.download_文件(‘e4e_ffhq_encode.pt’)
加载生成器
加载原始生成器和微调器生成器。设置用于调整图像大小和规格化的变换。
潜在的_ dim=512
#加载原发电机
原始_生成器=生成器(1024,潜在_ dim,8,2)。到(设备)
ckpt=火炬负载(‘models/stylegan2-ffhq-config-f.pt’,map_location=lambda storage,loc:storage)
原始_发电机.负载_状态_ dict(ckpt〔”g _ema”〕,strict=False)
平均潜伏期=原始潜伏期。平均潜伏期(10000)
#待微调发电机
生成器=deepcopy(原始生成器)
transform=变换。合成(
[
变换。调整大小((1024.1024))
transforms.ToTensor()
变换。规格化((0.5,0.5,0.5),(0.5,0.5,0.5))
]
)
输入图像
设置输入图像位置。对齐和裁剪面并重新设置贴图样式。
#图像到test_输入目录并在此处输入名称
文件名=”face.jpeg”#@param{type:”string”}
文件路径=f’test_input/{filename}’
name=strip_path_扩展名(文件路径)+’.pt’
#对齐和裁剪面
对齐_面=对齐_面(文件路径)
#my_w=restyle_投影(对齐的_面,名称,设备,n_iters=1)。取消压缩(0)
my_w=投影(对齐的_面.名称.设备)。取消缩放(0)
培训前图表
选择预先训练的图形类型,然后选择不保留颜涩的检查点,这样效果更好。
plt.rcParams〔’figure.dpi’〕=150
预训练=’素描’multi’#〔’艺术’,’奥秘’multi’,’素描”multi’,’奥妙’jinx’,’奥秘’caitlyn’,’jojo’yasuho’,’jojo’,’迪斯尼’〕
#Preserve color试图通过限制允许的变换族来保留原始图像的颜涩。
如果保留_颜涩:
ckpt=f’{预处理}_保留颜涩。pt’
否则:
ckpt=f'{预处理}.pt’
生成结果
加载检查点和生成器并设置种子值,然后开始生成样式化图像。Elon Musk的输入图像将根据图形类型进行样式化。
#生成结果
n_样品=5#{类型:”编号”}
种子=3000#{类型:”编号”}
火炬.手动_种子(种子)
带火炬。无_级():
生成器评估()
z=火炬randn(n_样品,潜在的_尺寸,装置=装置)
原始_样本=原始_生成器(〔z〕,截断=0.7,截断_潜在=平均_潜在)
样本=生成器(〔z〕,截断=0.7,截断=潜伏=均值=潜伏)
原始_我的_样本=原始_生成器(我的_w,输入_是_潜在=True)
my_sample=生成器(my_w,输入_为_潜在=True)
#显示参考图像
如果预处理==’奥秘_多重’:
样式_路径=f’样式_图像_对齐/奥秘_ jinx.png’
elif预处理==’草图_多’:
样式_路径=f’样式_图像_对齐/草图.png’
否则:
样式_路径=f’样式_图像_对齐/{预处理}.png’
style_image=transform(image.open(style_path)).unqueze(0).to(device)
face=transform(对齐的_face).unqueze(0).to(设备)
my_output=torch.cat([style_image,face,my_sample],0)
生成的结果
结果是训练前类型”Jojo”,看起来相当准确。
现在让我们来看看如何训练GAN自己的风格。
用你的风格形象训练
选择一些面部图像,甚至创建一些您自己的面部图像并加载它们以训练GAN并设置路径。裁剪和对齐面并执行GAN反转。
姓名=[“1.jpg”.”2.jpg’.”3.jpg’]
目标=〔〕
潜伏期=〔〕
对于姓名中的姓名:
style_path=os.path.join(‘style_images’,name)
断言os.path.existes(style_path),f”{style_path}不存在!”
name=strip_路径_扩展名(name)
#裁剪并对齐面部
style_aligned_path=os.path.join(‘style_images_alignd’,f’{name}.png’)
如果不存在os.path.exis(样式对齐路径):
样式_对齐=对齐_面(样式_路径)
style_aligned.save(style_aligned_path)
否则:
style_aligned=Image.open(style_aligned_path).convert(“RGB”)
#GAN反转
样式_代码_路径=os.path.join(‘反转_代码’,f’{名称}.pt’)
如果不存在os.path.exis(样式代码路径):
潜在=投影(样式_对齐,样式_代码_路径,设备)
否则:
潜在的=火炬负载(样式代码路径)
潜在附加(潜在到(设备))
targets=火炬堆栈(targets,0)
潜伏期=火炬堆栈(潜伏期,0)
微调StyleGAN
通过调整alpha.颜涩保留和设置迭代来微调StyleGAN。为感知损失加载鉴别器并重置生成器。
#Finetune StyleGAN
#阿尔法控制着风格的力量
α=1.0#最小值:0,最大值:1,步长:0.1
α=1-α
#通过限制允许的变换族来保留原始图像的颜涩
保留_颜涩=假
#微调步骤数。
数量=300
#图像测井棒和间隔的测井培训
使用_棒b=假
log_间隔=50
如果使用_棒:
wandb.init(项目=”JoJoGAN”)
config=棒配置
config.num _ iter=num _ iter
config.保留_颜涩=保留_颜涩
棒b.log(
{”样式参考”:〔wandb.Image(transforms.ToPILImage()(target _im))〕}
步长=0)
#感知损耗负载鉴别器
鉴别器=鉴别器(1024,2).eval().to(设备)
ckpt=火炬负载(‘models/stylegan2-ffhq-config-f.pt’,map_location=lambda storage,loc:storage)
鉴别器.负载_状态_ dict(ckpt〔”d”〕,严格=假)
#复位发生器
del发生器
生成器=deepcopy(原始生成器)
g_optim=optim.Adam(generator.parameters(),lr=2e-3,betas=(0,0.99))
训练生成器从潜在空间生成图像并优化损失。
如果保留_颜涩:
id _掉期=[9,11,15,16,17]
z=范围(数字)
对于tqdm(z)中的idx:
平均值_w=generator.get_latent(torch.randn([latents.size(0),latent_dim]).to(device)).unqueze(1).repeat(1,generator.n latent,1)
in_潜伏=潜伏期克隆()
在_潜伏期〔:,id _掉期〕=alpha*潜伏期〔:,id_掉期〕+(1-alpha*mean_w〔:,id_掉
img=生成器(在_潜在中,输入_为_潜在=True)
带火炬。无_级():
真实_专长=鉴别器(目标)
假_专长=鉴别器(img)
损失=总和([functional.l1_loss(a,b)for a,b in zip(fake _feat,real _feat)])/len(fake _ feat)
如果使用_棒:
wandb.log({”loss”:损失},步骤=idx)
如果idx%log _ interval==0:
生成器评估()
my_sample=生成器(my_w,输入_为_潜在=True)
发电机列车()
棒b.log(
{”当前风格化”:〔wandb.图像(我的样本)〕}
步骤=idx)
g_optim.zero_grad()
向后损失()
g_优化步骤()
使用JojoGAN生成结果
现在生成结果。下面生成的结果用于原始图像和样本图像之间的比较。
#生成结果n_样本=5
种子=3000
火炬.手动_种子(种子)
带火炬。无_级():
生成器评估()
z=火炬randn(n_样品,潜在的_尺寸,装置=装置)
原始_样本=原始_生成器(〔z〕,截断=0.7,截断_潜在=平均_潜在)
样本=生成器(〔z〕,截断=0.7,截断=潜伏=均值=潜伏)
原始_我的_样本=原始_生成器(我的_w,输入_是_潜在=True)
my_sample=生成器(my_w,输入_为_潜在=True)
#显示参考图像
样式_图像=〔〕
对于姓名中的姓名:
样式_路径=f’样式_图像_对齐/{条带_路径_扩展名(名称)}.png’
style_image=transform(image.open(style_path))
style_images.append(style_image)
面=变换(对齐的_面)。到(设备)。取消缩放(0)
style_images=torch.stack(style_images,0).to(设备)
my_output=torch.cat([face,my_sample],0)
输出=torch.cat([original_sample,sample],0)
生成的结果
现在,您可以使用JojoGAN生成自己的风格图像。结果令人印象深刻,但可以通过调整训练方法和训练图像中的更多特征来进一步改进。
结论
JojoGAN可以快速有效地准确映射和迁移用户定义的样式。要点是:
·JojoGAN只能使用一种样式进行训练,以便轻松绘制和创建任何人脸的样式化地图
·JojoGAN非常快速有效,可以在不到一分钟的时间内完成训练
·结果非常准确,类似于真实的肖像
·JojoGAN可以很容易地针对AI应用进行微调和修改
因此,无论风格类型.形状和颜涩如何,JojoGAN都是风格传递的理想神经网络,因此它可以成为各种社交媒体应用和人工智能应用中非常有用的功能。
600学习网 » 使用JojoGAN创建风格化的面部图-600学习网