【深度学习】AI修图——DragGAN原理解析
创始人
2024-11-19 07:35:42
0

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=∣∣t−p∣∣2​t−p​(分母是对向量归一化).

④在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=1∑n​qi​∈Ω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=1∑n​qi​∈Ω1​(pj​,r1​)∑​∣∣F(qi​).detach()−F(qi​+dj​)∣∣1​+λ∣∣(F−F0​)∗(1−M)∣∣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​)−fi​∣∣1​
​ : = := :=表示将右边的所得最小对应变量值赋给等式左边

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

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

4、结束

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

相关内容

热门资讯

来一盘!wepoke智能ai(... 1、不需要AI权限,帮助你快速的进行wepoke计算辅助教程,沉浸在游戏的游玩之中。2、里面整个we...
安装程序教程!微扑克教你提高中... 安装程序教程!微扑克教你提高中牌率(透明挂软件)皮皮跑胡子输赢规律(有挂向导);皮皮跑胡子最新软件透...
WPK辅助挂!微扑克真的有挂存... 1、很好的工具软件,可以解锁游戏的ai质量和中牌率,深受大多数游戏玩家的喜爱。2、非常简单,易于操作...
新2024版推荐!wpkai辅... 新2024版推荐!wpkai辅助(有挂的)369互娱麻将插件(有挂引导);WPK必备黑科技是一款具有...
普及知识!wpk德州透视辅助(... 大家肯定在之前WePoKer或者WPK中玩过普及知识!wpk德州透视辅助(有辅助)中至麻将小程序bu...
第三方措施!wpk微扑克辅助(... 第三方措施!wpk微扑克辅助(透明挂)兴动棋牌有挂的谁用了(有挂攻略)准备好在wpk微扑克的高塔上攀...
实测发现!wpk微扑克真的有挂... 1、不需要AI权限,帮助你快速的进行wpk微扑克计算辅助教程,沉浸在游戏的游玩之中。2、里面整个wp...
实测分享!微扑克辅助钻石(透明... 大家肯定在之前WePoKer或者WPK中玩过实测分享!微扑克辅助钻石(透明挂软件)小宝跑得快技巧(有...
科普常识!微扑克ai软件(有辅... 科普常识!微扑克ai软件(有辅助挂)东游麻将暗藏猫腻(有挂指南);东游麻将最新版本免费下载安装哦,具...
C语言日常练习Day13 目录一、有4个圆塔,圆心分别为(2,2)、(...