【源码&教程】基于GAN的动漫头像生成系统

1.研究背景


我们都喜欢动漫角色,并试图创造我们的定制角色。然而,要掌握绘画技巧需要巨大的努力,之后我们首先有能力设计自己的角色。为了弥补这一差距,动画角色的自动生成提供了一个机会,在没有专业技能的情况下引入定制角色的存在。除了对非专业人士的好处外,专业的创造者还可以利用自动生成来获得动画和游戏角色设计的灵感;Doujin RPG开发者可以使用无版权的面部图像来降低游戏制作的设计成本。

2.图片演示

3.项目难点


(1)如何根据用户设置的属性,对GAN的生成结果进行精确控制?(注意GAN是黑盒模型)
(2)模型的生成结果由用户设置的属性和随机噪声(随机数)共同决定。因此,即使设置的属性不变,每次生成的头像都有所差异。那么如何既保证属性控制的精确性,又保证生成头像的随机性?
(3)如何把不同属性的组合,无缝地融合到同一张头像中?
(4)之前提出的头像生成方法,其输出结果存在模糊和画面混乱的问题,而且生成结果的质量很不稳定。那么,如何让模型生成高质量的头像?如何让模型以较高的成功率输出高质量的结果?

4.网络结构


生成器


判别器


5.数据集的准备


要想训练出高质量的动漫头像生成模型,其必要前提为:数据集中的插画质量高、绘画风格一致、噪声小。现有的大规模插画数据集虽然提供了大量插画,但存在绘画风格差异巨大、数据集内噪声多等问题。为了避免这些问题,本文选择了一个游戏销售网站上的“游戏人物介绍插画”作为数据来源。

在批量下载的插画中,如何自动找出头像所在区域的坐标?论文使用基于Local Binary Pattern(LBP)特征的“人脸检测”(Face Detection)算法 [foot note-6]。为了使检测结果包含发型,将算法输出的检测框(bounding box)放大为原来的1.5倍。

一个值得思考的问题:当拥有了带有属性标注的头像数据集之后,为什么还需要训练头像自动生成模型?“数据集”能否代替“自动生成模型”? {*}
(1)理论上,当数据集的规模趋于无限大,使得每种可能的属性组合都包含大量例子时,可能不太需要再训练自动生成模型。但实际上,随着属性数量的增多,可能出现的属性组合数会呈爆炸式增长!而高质量头像的设计和绘制需要较高成本,所以不太可能拥有如此大规模的数据集。
另外,笔者认为应该从“创新”(而不是“模仿”)的角度来思考这一问题:
(2)GAN生成器以随机噪声作为输入,使得即使设置的属性完全相同,每次生成的结果也会发生微小但随机的变化。这是图片总数固定的数据集所无法实现的。
(3)GAN能够生成数据集中不存在的属性组合。例如数据集中分别有蓝发的头像和绿眼的头像,但没有蓝发绿眼的头像。而经过训练后,GAN能够生成蓝发绿眼的头像。(前提是GAN已充分学习了蓝发的特征和绿眼的特征。)
(4)GAN能学习训练集中不同图像的“特征”(“特征”包括但不限于所标注的属性),并将来自不同图像的特征无缝融合在一张生成结果中。所以,GAN能够“创造”数据集中不存在的头像。
(5)GAN可以实现“两幅头像间的插值”和“头像渐变动画”。(下文将进行介绍)

6.代码实现

import  tensorflow as tf
from    tensorflow import keras
from    tensorflow.keras import layersclass Generator(keras.Model):def __init__(self):super(Generator, self).__init__()# z: [b, 100] => [b, 3*3*512] => [b, 3, 3, 512] => [b, 64, 64, 3]self.fc = layers.Dense(3*3*512)self.conv1 = layers.Conv2DTranspose(256, 3, 3, 'valid')self.bn1 = layers.BatchNormalization()self.conv2 = layers.Conv2DTranspose(128, 5, 2, 'valid')self.bn2 = layers.BatchNormalization()self.conv3 = layers.Conv2DTranspose(3, 4, 3, 'valid')def call(self, inputs, training=None):# [z, 100] => [z, 3*3*512]x = self.fc(inputs)x = tf.reshape(x, [-1, 3, 3, 512])x = tf.nn.leaky_relu(x)#x = tf.nn.leaky_relu(self.bn1(self.conv1(x), training=training))x = tf.nn.leaky_relu(self.bn2(self.conv2(x), training=training))x = self.conv3(x)x = tf.tanh(x)return xclass Discriminator(keras.Model):def __init__(self):super(Discriminator, self).__init__()# [b, 64, 64, 3] => [b, 1]self.conv1 = layers.Conv2D(64, 5, 3, 'valid')self.conv2 = layers.Conv2D(128, 5, 3, 'valid')self.bn2 = layers.BatchNormalization()self.conv3 = layers.Conv2D(256, 5, 3, 'valid')self.bn3 = layers.BatchNormalization()# [b, h, w ,c] => [b, -1]self.flatten = layers.Flatten()self.fc = layers.Dense(1)def call(self, inputs, training=None):x = tf.nn.leaky_relu(self.conv1(inputs))x = tf.nn.leaky_relu(self.bn2(self.conv2(x), training=training))x = tf.nn.leaky_relu(self.bn3(self.conv3(x), training=training))# [b, h, w, c] => [b, -1]x = self.flatten(x)# [b, -1] => [b, 1]logits = self.fc(x)return logitsdef main():d = Discriminator()g = Generator()x = tf.random.normal([2, 64, 64, 3])z = tf.random.normal([2, 100])prob = d(x)print(prob)x_hat = g(z)print(x_hat.shape)if __name__ == '__main__':main()



7.系统整合


下图源码&环境部署视频教程&数据集&自定义UI界面

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/757232.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【测试开发学习流程】MySQL函数运算(中)(下)

前言: 这些天还要搞毕业论文,东西少了点,大家将就看看QWQ 目录 1 MySQL的数据处理函数 1.1 文本处理函数 1.2 日期与时间函数 1.3 数值处理函数 1.4 系统函数 2 聚集运算 2.1 聚集函数 2.2 流程函数 1 MySQL的数据处理函数 MySQL支…

WanAndroid(鸿蒙版)开发的第六篇

前言 DevEco Studio版本:4.0.0.600 WanAndroid的API链接:玩Android 开放API-玩Android - wanandroid.com 其他篇文章参考: 1、WanAndroid(鸿蒙版)开发的第一篇 2、WanAndroid(鸿蒙版)开发的第二篇 3、WanAndroid(鸿蒙版)开发的第三篇 …

HarmonyOS应用开发者高级认证答案

** HarmonyOS应用开发者高级认证 ** 以下是高级认证答案,存在个别选项随机顺序答案,自行辨别 判断题 云函数打包完成后,需要到 AppGallery Connect 创建对应函数的触发器才可以在端侧中调用 错 在 column 和 Row 容器组件中,a…

Nexpose v6.6.242 for Linux Windows - 漏洞扫描

Nexpose v6.6.242 for Linux & Windows - 漏洞扫描 Rapid7 Vulnerability Management, Release Mar 13, 2024 请访问原文链接:https://sysin.org/blog/nexpose-6/,查看最新版。原创作品,转载请保留出处。 作者主页:sysin.o…

极客SaaS框架开源包

可以自备 听说后边要出saas去水印小程序 saas短视频去重小程序

数据结构和算法模块——队列(多例子+图文)

一文帮你看懂队列 什么是线性表为什么要学习线性表,它有什么用处和好处?基本概念分类存储结构结构特点 队列为什么要学习队列?基本概念数据结构基本操作 待填坑 什么是线性表 为什么要学习线性表,它有什么用处和好处?…

docker入门(三)—— 安装docker

docker 安装 环境要求 本次使用的是云服务器,版本是 centos,要求版本在3.10以上 [rootiZbp15293q8kgzhur7n6kvZ /]# uname -r 3.10.0-1160.108.1.el7.x86_64 [rootiZbp15293q8kgzhur7n6kvZ /]# cat /etc/os-release NAME"CentOS Linux" VE…

操作系统核心知识点大梳理

计算机结构 现代计算机模型是基于-冯诺依曼计算机模型 计算机在运行时,先从内存中取出第一条指令,通过控制器的译码,按指令的要求,从存储器中取出数据进行指定的运算和逻辑操作等加工,然后再按地址把结果送到内存中去…

Linux环境变量【终】

🌎环境变量 文章目录: 环境变量 环境变量的组织方式 创建自己的环境变量       main函数参数       C语言提供的变量与接口 环境变量与本地变量 了解本地变量       取消本地变量和环境变量 环境变量的出处 总结 前言: 上…

Visual Studio 2013 - 高亮设置括号匹配 (方括号)

Visual Studio 2013 - 高亮设置括号匹配 [方括号] 1. 高亮设置 括号匹配 (方括号)References 1. 高亮设置 括号匹配 (方括号) 工具 -> 选项… -> 环境 -> 字体和颜色 References [1] Yongqiang Cheng, https://yongqiang.blog.csdn.net/

Spring学习记录之依赖注入

问题1: 往一个类中传递数据的方式有哪些呢,其实,只有一种方式,即通过方法,但方法却有多种,一种是我们先前学到的通过set方法(普通方法),另一种则是通过构造方法的方式。…

Python爬虫-数据采集和处理

文章目录 数据数据类型 数据分析过程数据采集数据采集源数据采集方法 数据清洗清洗数据数据集成数据转换数据脱敏 数据 《春秋左传集解》云:“事大大其绳,事小小其绳。”体现了早期人类将事情的“大小”这一性质抽象到“绳结大小”这一符号上从而产生数…

【单点知识】基于实例讲解PyTorch中的Transforms类

文章目录 0. 前言1. 基本用法1.1 转换为Tensor1.2 图像大小调整1.3 随机裁剪1.4 中心裁剪1.5 随机翻转1.6 随机旋转1.7 填充1.8 组合变换 2. 进阶用法2.1 归一化2.2 色彩空间转换2.3 颜色抖动2.4 随机仿射2.5 透视变换2.6 自定义变换 0. 前言 按照国际惯例,首先声明…

Day51-Nginx多实例知识与大厂企业级实战

Day51-Nginx多实例知识与大厂企业级实战 1. 什么是nginx多实例?2. 为什么要用多实例?3. 大厂数百个业务项目,如何来管理?4. 大厂上百项目web分用户解决方案4.1 编译nginx环境实践:4.2 zuma实例(利用普通用户权限将不同…

前端项目,个人笔记(二)【Vue-cli - 引入阿里矢量库图标 + 吸顶交互 + setup语法糖】

目录 1、项目中引入阿里矢量库图标 2、实现吸顶交互 3、语法糖--<script setup> 3.1、无需return 3.2、子组件接收父组件的值-props的使用 3.3、注册组件 1、项目中引入阿里矢量库图标 步骤一&#xff1a;进入阿里矢量库官网中&#xff1a;iconfont-阿里巴巴矢量…

教务管理系统(java+mysql+jdbc+Druid+三层架构)

1、项目要求 1.1数据库表描述 设计一个教务管理系统&#xff0c;要求如下&#xff1a; 系统涉及的表有 account表&#xff08;账号表&#xff09; teacher表&#xff08;教师表&#xff09; student表&#xff08;学生表&#xff09; course表 (课程表) score表&#xff08;成…

Python内置对象

Python是一种强大的、动态类型的高级编程语言&#xff0c;其内置对象是构成程序的基础元素。Python的内置对象包括数字、字符串、列表、元组、字典、集合、布尔值和None等&#xff0c;每种对象都有特定的类型和用途。 01 什么是内置对象 这些对象是编程语言的基础构建块&…

STP环路避免实验(思科)

华为设备参考&#xff1a;STP环路避免实验&#xff08;华为&#xff09; 一&#xff0c;技术简介 Spanning Tree Protocol&#xff08;STP&#xff09;&#xff0c;即生成树协议&#xff0c;是一种数据链路层协议。主要作用是防止二层环路&#xff0c;并自适应网络变化和故障…

Unity2D实现鼠标拖动物体移动(简单好抄)

1.新建脚本&#xff0c;并将脚本拖到你想要拖动的物体上即可 using System.Collections; using System.Collections.Generic; using Unity.VisualScripting; using UnityEngine;public class text : MonoBehaviour {private Vector3 offset;public int x 1;void OnMouseDown(…

SAP前台处理:物料主数据创建<MM01>之销售视图

一、背景&#xff1a; 终于来到了物料主数据&#xff0c;我觉得物料账是SAP最重要的一项发明&#xff0c;也一直是SAP的一项重要优势&#xff0c;物料账记录了一个个物料的生生不息&#xff1b; 本章主要讲解物料主数据和财务相关的主要内容&#xff1a;这里特别提示由于作者…