【深度学习】AI修图——DragGAN原理解析

1、前言

上一篇,我们讲述了StyleGAN2。这一篇,我们就来讲一个把StyleGAN2作为基底架构的DragGAN。DragGAN的作用主要是对图片进行编辑,说厉害点,可能和AI修图差不多。这篇论文比较新,发表自2023年

原论文:Drag Your GAN: Interactive Point-based Manipulation on the Generative Image Manifold

参考代码:https://github.com/skimai/DragGAN

视频:AI修图——DragGAN原理解析-哔哩哔哩

演示(随意选择红点,让红点对应位置的像素移动到蓝点):

demo

2、DragGAN运行原理:

前置知识:StyleGAN(请确保你已经知道这个模型)

DragGAN模型的原理,是构建在StyleGAN的基础上。以下,为StyleGAN的模型图

在这里插入图片描述

首先,你要有一个训练好的StyleGAN,然后通过该模型,获得一个风格信息w latent Code。接着,用这个风格信息合成图像,如上图的演示,得到狮子的图像。

接着,我们在狮子图像上,选择数量对等的红色点(初始点)和蓝色点(目标点),每一个红色点周围的像素点慢慢移动到对应蓝色点的位置,从而达到修图的效果

在这里插入图片描述

3、实现方法

DragGAN使用的是StyleGAN2,所里里面的风格信息记作w+ latent Code

StyleGAN2的w+ latent Code代表的是风格信息。对图像位置进行移动等等,其实就是风格信息的修改,因此,DragGAN其实就是通过优化w来实现图像的变化。并且,作者通过实验,发现这种空间属性的变化,主要由前6层的w+ latent Code控制,所以作者只优化前6层的w+。

除此之外,作者通过衡量合成网络特征图之间的差异来判断是否初始点达到了目标点。(为了方便,以下所有的w都表示w+)

来看具体流程

①对生成的图像狮子,其有对应风格信息 w latent Code。在图像上选择红色点(初始点,记为p)跟蓝色点(目标点,记为t)。

②找到256x256分辨率的输出特征图(feature map),然后通过双线性插值的方法,将分辨率采样成1024x1024(假设狮子的像素是1024)。如下图的Feature,记为F

在这里插入图片描述

③把在狮子的红色点p和蓝色点t,也同样标记在Feature中,记为 F ( p ) F(p) F(p) F ( t ) F(t) F(t),计算 p p p指向 t t t的方向向量 d = t − p ∣ ∣ t − p ∣ ∣ 2 d=\frac{t-p}{||t-p||_2} d=∣∣tp2tp(分母是对向量归一化).

④在F§这个位置点,画一个半径为 r 1 r_1 r1的红色小圆,取特征图F里面位置在圆内的所有像素点(红色区域),记其中某一个像素点为 q i q_i qi,并把这个像素点根据方向向量移动,即 F ( q i + d ) F(q_i+d) F(qi+d)

⑤最小化 ∣ ∣ F ( q i ) . d e t a c h ( ) − F ( q i + d ) ∣ ∣ 1 ||F(q_i).detach()-F(q_i+d)||_1 ∣∣F(qi).detach()F(qi+d)1。detach代表 F ( q i ) F(q_i) F(qi)不反向传播,这会激励 q i + d q_i+d qi+d这个位置的值尽量等于 F ( q i ) F(q_i) F(qi),而 F ( q i ) F(q_i) F(qi)代表的刚好是狮子对应位置的特征,所以更新之后会产生移动

⑥对于红色圆区域内的所有点,我们希望它都朝着d的方向移动,所以有最小化
∑ q i ∈ Ω 1 ( p , r 1 ) ∣ ∣ F ( q i ) . d e t a c h ( ) − F ( q i + d ) ∣ ∣ 1 \sum\limits_{q_i\in \Omega_1(p,r_1)}||F(q_i).detach()-F(q_i+d)||_1 qiΩ1(p,r1)∣∣F(qi).detach()F(qi+d)1
​ 其中 Ω \Omega Ω表示的是红色圆, q i q_i qi表示属于圆内的像素点。

⑦在实际中,可能不止有一个红色点和蓝色点,可能存在n个,所以
∑ j = 1 n ∑ q i ∈ Ω 1 ( p j , r 1 ) ∣ ∣ F ( q i ) . d e t a c h ( ) − F ( q i + d j ) ∣ ∣ 1 \sum\limits_{j=1}^n\sum\limits_{q_i\in \Omega_1(p_j,r_1)}||F(q_i).detach()-F(q_i+d_j)||_1 j=1nqiΩ1(pj,r1)∣∣F(qi).detach()F(qi+dj)1
⑧DragGAN还允许用户选择图像哪些区域不变,哪些区域改变,则设定区域不变性
∑ j = 1 n ∑ q i ∈ Ω 1 ( p j , r 1 ) ∣ ∣ F ( q i ) . d e t a c h ( ) − F ( q i + d j ) ∣ ∣ 1 + λ ∣ ∣ ( F − F 0 ) ∗ ( 1 − M ) ∣ ∣ 1 \sum\limits_{j=1}^n\sum\limits_{q_i\in \Omega_1(p_j,r_1)}||F(q_i).detach()-F(q_i+d_j)||_1 +\lambda||(F-F_0)*(1-M)||_1 j=1nqiΩ1(pj,r1)∣∣F(qi).detach()F(qi+dj)1+λ∣∣(FF0)(1M)1
​ 其中M是一张与特征图F一样大的矩阵,取值0或1,0代表图像的这个区域不改变,1代表可改变。

⑨对上面的损失函数进行优化更新w风格信息,得到新的 w ′ w' w,新的特征图 F ′ F' F。由于梯度下降和方向向量d的正则化的原因,并不能使初始点p一步到位走到目标点t,所以需要从新的特征图 F ′ F' F找到初始点p已经走到哪里了,我们记初始点为在原始特征图上为 f i = F 0 ( p i ) f_i=F_0(p_i) fi=F0(pi)

⑩取新的特征图 F ′ F' F,在初始点p这个位置画一个变长为 r 2 r_2 r2红色正方形(图中第二个特征图),把正方形内的像素点与 F 0 ( p i ) F_0(p_i) F0(pi)作最近邻搜索,长得最像的那个就是皮卡丘,将其作为新的初始点,即
p i : = arg ⁡ min ⁡ q i ∈ Ω 2 ( p i , r 2 ) ∣ ∣ F ′ ( q i ) − f i ∣ ∣ 1 p_i:=\mathop{\arg\min}\limits_{q_i\in\Omega_2(p_i,r_2)}{||F'(q_i)-f_i||_1} pi:=qiΩ2(pi,r2)argmin∣∣F(qi)fi1
: = := :=表示将右边的所得最小对应变量值赋给等式左边

迭代更新,最终使得初始点到达点t点,结束

看不明白?那就看视频吧,文字所能传达的信息有限。我尽力了,私密马赛

4、结束

以上就是DragGAN这篇论文的全部内容了,如有问题,还望指出,阿里嘎多!
在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

vscode中调试C++程序,解读debug步骤

下面对几个调试的按键进行解释: 按钮1:运行/继续 F5,真正的一步一步运行。当有断点的时候,只会执行断点所在行语句和开头结尾两行语句。 按钮2:单步跳过(又叫逐过程) F10,按语句单步执行。当有函数时&#…

制作适用于openstack平台的win10镜像

1. 安装准备 从MSDN下载windows 10的镜像虚拟机开启CPU虚拟化的功能。从Fedora 网站下载已签名的 VirtIO 驱动程序 ISO 。 创建15 GB 的 qcow2 镜像:qemu-img create -f qcow2 win10.qcow2 15G 安装必要的软件 yum install qemu-kvm qemu-img virt-manager libvir…

【Docker系列】容器访问宿主机的Mysql

💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

Mac M1(ARM) 使用Vmware Fusion从零搭建k8s集群

该笔记仅用于自己学习;上一篇安装了环境,这一篇开始 Mac M1(ARM) 使用Vmware Fusion从零搭建k8s集群【参考】 VMware Fusion下修改vmnet8网络和添加vmnet网络 【注意如下】 虚拟机ip修改的位置修改的,记得开启宿主机的mac os 网络共享&#…

有依赖的的动态规划问题

题目 题型分析 这是比较典型的动态规划的问题。动态规划是什么呢?本质上动态规划是对递归的优化。例如,兔子数列:f(x) f(x - 1) f(x -2), 我们知道 f 代表了计算公式,这里解放思想一下,如果 f 替换为数组&#xff0…

vue实现前端打印效果

如图效果所示&#xff08;以下演示代码&#xff09; <template><div><el-button v-print"printObj" type"primary" plain click"handle">{{ text }}</el-button><div style"display: none"><div id…

基于Springboot+Vue的Java项目-在线视频教育平台系统(附演示视频+源码+LW)

大家好&#xff01;我是程序员一帆&#xff0c;感谢您阅读本文&#xff0c;欢迎一键三连哦。 &#x1f49e;当前专栏&#xff1a;Java毕业设计 精彩专栏推荐&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb; &#x1f380; Python毕业设计 &am…

鸿蒙OS开发指导:【应用包签名工具】

编译构建 该工具基于Maven3编译构建&#xff0c;请确认环境已安装配置Maven3环境&#xff0c;并且版本正确 mvn -version下载代码&#xff0c;命令行打开文件目录至developtools_hapsigner/hapsigntool&#xff0c;执行命令进行编译打包 mvn package编译后得到二进制文件&…

[开发日志系列]PDF图书在线系统20240415

20240414 Step1: 创建基础vueelment项目框架[耗时: 1h25min(8:45-10:10)] 检查node > 升级至最新 (考虑到时间问题,没有使用npm命令行执行,而是觉得删除重新下载最新版本) > > 配置vue3框架 ​ 取名:Online PDF Book System 遇到的报错: 第一报错: npm ERR! …

halcon 3.2标定相机

参考《solution_guide_iii_c_3d_vision.pdf》 3.2.2.2 Which Distortion Model to Use 选用何种畸变模型 对于面阵相机&#xff0c;halcon中两种畸变模型&#xff1a;The division model and the polynomial model&#xff08;差分模型和多项式模型&#xff09;&#xff0c;前…

使用 Scrapy 爬取豆瓣电影 Top250

一、Scrapy框架 1. 介绍 在当今数字化的时代&#xff0c;数据是一种宝贵的资源&#xff0c;而网络爬虫&#xff08;Web Scraping&#xff09;则是获取网络数据的重要工具之一。而在 Python 生态系统中&#xff0c;Scrapy 框架作为一种高效、灵活的网络爬虫框架&#xff0c;为…

MLOps

参考&#xff1a; 什么是MLOps&#xff1f;与DevOps有何异同&#xff1f;有什么价值&#xff1f;https://baijiahao.baidu.com/s?id1765071998288593530&wfrspider&forpcMLOps简介_AI开发平台ModelArts_WorkflowMLOps(Machine Learning Operation)是机器学习&#xf…

更优性能与性价比,从自建 ELK 迁移到 SLS 开始

作者&#xff1a;荆磊 背景 ELK (Elasticsearch、Logstash、Kibana) 是当下开源领域主流的日志解决方案&#xff0c;在可观测场景下有比较广泛的应用。 随着数字化进程加速&#xff0c;机器数据日志增加&#xff0c;自建 ELK 在面临大规模数据、查询性能等方面有较多问题和挑…

【自动驾驶】贝叶斯算法在机器学习中的应用研究

目录 第一章&#xff1a;引言 1.1 贝叶斯算法在机器学习中的重要性 1.2 研究背景 1.3 研究目的 1.4 论文结构 第二章&#xff1a;贝叶斯算法概述 2.1 贝叶斯定理 2.2 贝叶斯算法分类 第三章&#xff1a;贝叶斯算法在机器学习中的应用 3.1 贝叶斯分类器 3.2 贝叶斯回…

【软考】UML中的图之用例图

目录 1. 说明2. 建模2.1 说明2.2 语境建模2.3 需求建模 3. 图示4. 组成部分 1. 说明 1.用例图&#xff08;Use Case Diagram&#xff09;。2.展现了一组用例、参与者&#xff08;Actor&#xff09;以及它们之间的关系。3.用例图通常包括以下的内容&#xff1a;用例、参与者、用…

linux 自定义快捷指令(docker

vi /root/.bashrc alias disdocker images alias dpsdocker ps --format "table {{.ID}}\t{{.Image}}\t{{.Ports}}\t{{.Status}}\t{{.Names}}" 保存退出后使用sourece /root/.bashrc 让其立即生效 sourece /root/.bashrc

python 判断变量是数字型还是字符型

python如何判断数据类型&#xff1f;方法如下&#xff1a; 使用type()函数&#xff1a; import types type(x) is types.IntType # 判断是否int 类型 type(x) is types.StringType #是否string类型可以不用记住types.StringType&#xff0c;即&#xff1a; import types type(…

Adobe Premiere 2015 下载地址及安装教程

Premiere是一款专业的视频编辑软件&#xff0c;由Adobe Systems开发。它为用户提供了丰富的视频编辑工具和创意效果&#xff0c;可用于电影、电视节目、广告和其他多媒体项目的制作。 Premiere具有直观的用户界面和强大的功能&#xff0c;使得编辑和处理视频变得简单而高效。它…

【leetcode面试经典150题】51. 用最少数量的箭引爆气球(C++)

【leetcode面试经典150题】专栏系列将为准备暑期实习生以及秋招的同学们提高在面试时的经典面试算法题的思路和想法。本专栏将以一题多解和精简算法思路为主&#xff0c;题解使用C语言。&#xff08;若有使用其他语言的同学也可了解题解思路&#xff0c;本质上语法内容一致&…

2024蓝桥A组E题

成绩统计 问题描述格式输入格式输出样例输入样例输出评测用例规模与约定解析参考程序难度等级 问题描述 题目有问题方差定义那加平方&#xff08;vi-v&#xff09; 格式输入 输入的第一行包含三个正整数n,k,T &#xff0c;相邻整数之间使用一个空格分隔。 第二行包含n个正整数…