Drag Your GAN论文解读,基于点的交互式操作拖动到生成图像[DragGAN]

news2025/1/13 13:34:45

只需要鼠标的点击就可以自动修图的产品,火爆问世,可以说是超越PS,神一般的存在了,而且没有门槛,对于普通大众来说直接可以上手使用,这个是PS完全不具备的。更关键的是,这款产品跟PS明显区别在于,PS一般来说是做美化处理为主,而Drag Your GAN可以让眼睛真的睁开和闭上,嘴角上扬是可以露出牙齿的,姿态的改变跟真人在摆POSE一般,非常有趣。
大家可以点击下面两个视频感受下,如何神奇的修图:
DragGAN视频1
DragGAN视频2

因为这个DragGAN是基于StyleGAN2的模型,所以在看这篇文章之前,建议先看下StyleGAN系列,熟悉它们的架构:NVIDIA的StyleGAN、StyleGAN2、StyleGAN3系列论文解读,梳理基于风格的生成器架构
论文中的一张图开始介绍:

用户只需要点击图像上的几个手柄点(红点)和目标点(蓝点),我们的方法就会移动手柄点,精确到达相应的目标点。用户可以选择绘制灵活区域(较亮的区域)的掩码,保持图像的其余部分固定。这种灵活的基于点的操作可以控制许多空间属性,如姿态、形状、表情和跨不同对象类别的布局。

主要有三大特点:
    1.灵活性:能够控制生成对象的位置、姿态、形状、表情、布局等不同的空间属性
    2.精度:能够对空间属性进行高精度控制
    3.通用性:适用于不同的对象类别,而不局限于某一类别

对于GAN可以分为无条件GAN和有条件GAN

1.无条件的GAN:将低维随机采样的潜在向量转换为逼真图像的生成模型。它们使用对抗性学习进行训练,可用于生成高分辨率的逼真图像,比如大多数像StyleGAN这样的GAN模型,这些模型不能直接对生成的图像进行可控编辑。

2.有条件的GNA:对图像和分割图的联合分布进行建模,然后计算与编辑后的分割图相对应的新图像,从而实现可以编辑。

虽然目前的文字生成图片很火,但是语义控制输出,也只能在一个粗糙的高级语义层面的控制,不能对图像的空间属性进行细粒度控制。
总的来说这篇论文还是比较简单,DragGAN模型主要分为两大块:运动监督和手柄点跟踪。

1、Motion Supervision运动监督

基于特征的运动监督,驱动手柄点(红点)向目标位置(蓝点)移动,从而在这个迭代过程中进行特征的更新。具体来说,运动监督是通过移位特征补丁损失来实现的,从而优化了潜在代码(同StyleGAN系列中讲述的隐藏代码)
DragGAN还允许用户选择性地绘制感兴趣的区域,以执行特定于区域的编辑。由于DragGAN不依赖于任何额外的网络,如RAFT,它实现了高效的操作,在大多数情况下,单块RTX 3090 GPU上只需要几秒钟。这允许实时的交互式编辑会话,用户可以在不同的布局上快速迭代,直到实现所需的输出。
跟简单地应用扭曲的传统形状变形方法不同,我们的变形是在GAN的学习图像流形上执行的,它倾向于服从底层对象结构。例如,我们的方法可以使闭塞的内容产生幻觉,就像狮子嘴里的牙齿一样,也可以随着物体的刚性而变形,就像马腿的弯曲一样。
视频中看到的那样,还给用户开发了一个GUI,通过简单地单击图像来交互式地执行操作。定性和定量比较都证实了我们的方法优于UserControllableLT(通过转换GAN的潜在向量实现基于点的编辑,但是它的这种方法只支持在图像上拖动单个点进行编辑,而不能很好地处理多点约束。另外,控制不精确,即编辑后往往达不到目标点),下面是两者的对比图:

2、Point Tracking手柄点跟踪

在特征空间中通过最近邻搜索进行点跟踪。然后重复这个优化过程,直到手柄点达到目标点。为了跟踪手柄点,一种显而易见的方法是在连续帧之间进行光流估计(估计两幅图像之间运动场的经典问题),比如用的最广的RAFT。还有一种就是采用“particle video”,粒子视频流获得视频序列中的特征点运动轨迹,并对获得的运动轨迹进行提取,然后利用最长共同子序列LCS(Longest Common Subsequence)聚类轨迹,得到运动的主流方向,这种方法叫做PIPsPIPs考虑跨多个帧的信息,因此比以前的方法更好地处理远距离跟踪。
而在DragGAN中,我们将不使用任何上述方法或额外的神经网络的情况下对GAN生成的图像进行点跟踪。因为GAN的特征空间具有足够的判别性,使得跟踪可以简单地通过特征匹配来实现。尽管我们的方法很简单,但是在实验中的结果,优于最先进的点跟踪方法,包括RAFT和PIPs。 

3、整个迭代流程

我们先来看输入图像经过上述的两大块(运动监督和点跟踪)的处理之后,得到新的图像的过程图:

初始化图像,通过GAN的生成器生成潜在编码w,通过鼠标点击手柄点(红点)和需要达到位置的目标点(蓝点),然后运动监督将驱动手柄点往目标点位置靠近,并更新潜在编码w为w'。在这个过程中我们需跟踪手柄点位置,通过特征空间具备的判别性来更新手柄点的位置,当然这个时候也会同时更新迭代潜在编码,一直迭代直到目标点为止或者满意了也可提前终止。
更详细的介绍,如下图:

运动监督是通过在生成器的特征映射上移动补丁损失来实现,我们通过最近邻搜索对相同的特征空间进行点跟踪。
其中手柄点定义为\begin{Bmatrix} p_i = (x_{p,i},y_{p,i}) | i = 1,2,..., n \end{Bmatrix} 

对应的目标点\begin{Bmatrix} t_i = (x_{t,i}, y_{t,i}) | i = 1,2,...,n \end{Bmatrix}

4、技术实现细节

4.1、运动监督

先来看下运动监督是怎么具体操作的,需要用到哪些数学公式。
我们考虑StyleGAN2的第6块之后的特征映射F,由于在分辨率和判别性之间有良好的权衡,在所有特征中表现最好。我们通过双线性插值来调整F的大小,使其具有与最终图像相同的分辨率。其中想了解双线性插值的,刚好可以看下前几天发的一篇博文:LIBSVM与LIBLINEAR支持向量机库对模式识别与回归的可视化代码实践
当然对于双线性插值,熟悉StyleGAN3就更清晰了,简单来说就是在X,Y方向相邻像素之间分别采样,然后在采样点之间插入数值。这个也是StyleGAN3对StyleGAN2的一个改进,前面的链接也有介绍,欢迎查阅。

将一个手柄点p_i移动到目标点t_i,我们的想法是监督p_i外围的一小块区域(红圈)朝p_i向前移动一小步(蓝圈)。我们使用\Omega _1(p_i,r_i)表示到p_i的距离小于r_1的像素,则我们的运动监督损失公式:

其中F(q)表示F在像素q处的特征值,F_0为初始图像对应的特征映射,d_ip_it_i的归一化向量,公式: d_i=\frac{t_i-p_i}{||t_i-p_i||_2}

另外在给定二进制掩码M的情况下,我们保持没有掩码的区域固定,重建损失表示为第二项。

4.2、点跟踪

我们在前面也说了,不使用光流估计和粒子视频流,因为在GAN中的判别特征能够很好地捕获密集的对应关系,因此可以通过特征补丁中的最近邻搜索有效地进行跟踪。我们将初始处理点的特征表示为f_i = F_0(p_i)
我们将p_i周围的补丁表示为:\Omega _2(p_i,r_2)=\begin{Bmatrix} (x,y) | |x-x_{p,i}|<r_2 , |y-y_{p,i}|<r_2 \end{Bmatrix}

然后在\Omega _2(p_i,r_2)中搜索f_i的最近邻,就可以得到跟踪点p_i,公式:

通过这种方式,更新p_i,就能够一直跟踪手柄点了,对于多个手柄点,我们对每个点应用相同的过程即可。

4.3、超参设置

代码是基于PyTorch实现的,目前暂时还没有开放源码。难道要到月末最后一天去了?哈哈
我们使用Adam优化器对FFHQ的潜在代码进行优化,步长为0.002,AFHQCat,LSUN Car和其他数据集的步长设置为0.001。超参数设置为 λ=20,r_1=3,r_2=12。在我们的实现中,当所有手柄点与相应目标点的距离不超过d像素时,我们停止优化过程,其中,不超过5个手柄点将d设置为1,否则设置为2。

来一张跟PIPs和RAFT的对比实验图:

可以看到我们的方法更精确地跟踪了点,从而产生更精确的编辑。

5、缺陷

前面都显示了DragGAN的强大,当然也会存在缺点,就是当创建偏离训练分布的人体姿势可能导致伪影。此外,无纹理区域的手柄点在跟踪过程中有时会出现更大的漂移,这个一般是在纹理丰富区域效果就会呈现的很好。如下图: 

 

虽然我们的方法具有一定的外推能力,可以在训练图像分布之外创建图像,比如下面这张图,一个极度张开的嘴巴和一个大轮子。但是由于分布在了训练数据集之外,这样容易失真,可以看到车轮变形了。

好了,更多细节可以查阅原论文,相对来说这篇是在StyleGAN2基础上的改进,熟悉StyleGAN的来看就显得很清晰明了。

引用:

论文地址:Drag Your GAN: Interactive Point-based Manipulation on the Generative Image Manifold
源码说是6月发布,眼看6月已快过完,暂时还没有公布源码:
github:https://github.com/XingangPan/DragGAN

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

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

相关文章

如何系统地自学 Python?

&#x1f482; 个人网站:【海拥】【游戏大全】【神级源码资源网】&#x1f91f; 前端学习课程&#xff1a;&#x1f449;【28个案例趣学前端】【400个JS面试题】&#x1f485; 寻找学习交流、摸鱼划水的小伙伴&#xff0c;请点击【摸鱼学习交流群】 目录 前言为什么选择Python作…

【Intel 黑客松大赛】基于YOLO的杂草-农作物检测分类系统

目录 一、赛题简介&#xff1a;计算机视觉挑战——检测并清除杂草二、基于YOLO的杂草-农作物检测分类2.1、YOLO简介2.2、基于YOLO的杂草-农作物检测分类解决方案 三、基于YOLO的杂草-农作物检测分类系统设计3.1、基于flask框架的demo应用程序后端3.2、基于Vue框架的demo应用程序…

Qt6.2教程——4.QT常用控件QPushButton

一&#xff0c;QPushButton简介 QPushButton是Qt框架中的一种基本控件&#xff0c;它是用户界面中最常见和最常用的控件之一。QPushButton提供了一个可点击的按钮&#xff0c;用户可以通过点击按钮来触发特定的应用程序操作。比如&#xff0c;你可能会在一个对话框中看到"…

Unity编辑器扩展-第七集-应用键/显示提示词

第六集链接&#xff1a;Unity编辑器扩展-第六集-创建窗口/批量填图_菌菌巧乐兹的博客-CSDN博客 一、本节目标效果展示 1.我们有时候需要多次使用编辑窗口&#xff0c;但是每次一点执行&#xff0c;就关掉了&#xff0c;就很烦&#xff0c;所以我们希望&#xff0c;点击按钮&…

Spring Bean的实例化过程

一、前言 对于写Java的程序员来说&#xff0c;Spring已经成为了目前最流行的第三方开源框架之一&#xff0c;在我们充分享受Spring IOC容器带来的红利的同时&#xff0c;我们也应该考虑一下Spring这个大工厂是如何将一个个的Bean生产出来的&#xff0c;本期我们就一起来讨论一…

2023年6月GESP能力等级认证Python一级真题

2023-06 GESP等级考Python一级真题 题数&#xff1a;27 分数&#xff1a;100 测试时长&#xff1a;90min 一、单选题&#xff08;每题 2 分&#xff0c;共 30 分&#xff09; 1. 以下不属于计算机输出设备的有&#xff08; A&#xff09;。&#xff08;2分&#xff09; A…

几个Arcpy代码应用案例

1 案例一 删除特定记录 使用 arcpy 从 ArcGIS 中的图层中删除特定记录。可以使用更新游标&#xff08;UpdateSursor&#xff09;和 SQL 查询来识别和删除所需的记录。以下是如何删除特定图层记录的示例 import arcpy selectedParcelsselectedParcels expres…

分子碰撞频率和自由程------从一个物理小问题解剖自己的数学思维

物理学12-8节中&#xff0c;关于分子平均碰撞的解说如下&#xff1a; &#xff08;一&#xff09;分子碰撞自由程公式 第一个公式中&#xff0c;lamda v / z中&#xff0c;v的单位是m/s, z的单位是A/s, 其中A是常数。那么lamda描述的结果是m/A, 这正是长度单位。 此公式lamda…

利用正弦定理证明两角和差公式

首先用正弦定理&#xff0c;证明sin(AB)sinAcosBcosAsinB。 另外&#xff0c;其它的两角和差公式&#xff0c;都可以用三角函数奇偶性、诱导公式等推导出来&#xff0c;无需再用正弦定理证明一遍。

耗时一个月!手撸博客系统,主打美观实用!

先附上博客链接RoCBlog 关于博客 关于博客 RoCBlog 完成耗时&#xff1a;20天 起初是想搭建自己的博客&#xff0c;看了网上许多开源框架&#xff0c;感觉没啥意思&#xff0c;于是决定自己写一套 纯手撸VueSpringboot 其实是个我一边学vue一边写出来的东西&#xff0c;前期…

团体程序设计天梯赛-练习集L1篇⑩

&#x1f680;欢迎来到本文&#x1f680; &#x1f349;个人简介&#xff1a;Hello大家好呀&#xff0c;我是陈童学&#xff0c;一个与你一样正在慢慢前行的普通人。 &#x1f3c0;个人主页&#xff1a;陈童学哦CSDN &#x1f4a1;所属专栏&#xff1a;PTA &#x1f381;希望各…

(贪心) 1221. 分割平衡字符串 ——【Leetcode每日一题】

❓ 1221. 分割平衡字符串 难度&#xff1a;简单 平衡字符串 中&#xff0c;L 和 R 字符的数量是相同的。 给你一个平衡字符串 s&#xff0c;请你将它分割成尽可能多的子字符串&#xff0c;并满足&#xff1a; 每个子字符串都是平衡字符串。 返回可以通过分割得到的平衡字符…

【JAVA反序列化】序列化与反序列化Java反射URLDNS链

文章目录 原生序列化与反序列化概述为什么需要序列化和反序列化&#xff1f;应用场景(涉及到将对象转换成二进制&#xff0c;序列化保证了能够成功读取到保存的对象)涉及的协议好处为什么会产生反序列化漏洞&#xff1f;可能反序列化的形式&#xff1f;代码演示 Java反射基础补…

Java try-catch块

Java的try块用于封装可能会抛出异常的代码。它必须在方法内部使用。 如果在try块中的特定语句处发生异常&#xff0c;后续的代码块将不会执行。因此&#xff0c;建议不要在try块中放置不会抛出异常的代码。 Java的try块必须后跟catch块或finally块。 Java try-catch语法 try…

JDBC ResultSet源码解读

通过Debug方式看下源码&#xff1a; 1.Debug程序&#xff0c;找到返回的 ResultSet 的引用 2. 查看ResultSet中的rowData 3. 查看 rows 我们可以看到rows是一个数组&#xff0c;里面存放了我们查询得到的数据&#xff08;我的表中一共7条数据&#xff09;。 4. 查看rows中的元…

【总结】网页状态码——200、302、304、400、404、405、500

200正常 500异常–服务器异常Java代码 细节&#xff1a;null和空&#xff0c;null调用方法会出现空指针异常 400异常----传参相关的异常 get方法长度限制 400异常&#xff0c;加了RequestParam(value “name”) 必须传值 400异常&#xff0c;后端类型是Integer&#xff0c…

c# 基于微信wechat_qrcode opencv插件,网络二维码图片批量识别(一)

一、基本概念 微信开源了其二维码的解码功能&#xff0c;并贡献给 OpenCV 社区。其开源的 wechat_qrcode 项目被收录到 OpenCV contrib 项目中。从 OpenCV 4.5.2 版本开始&#xff0c;就可以直接使用。 该项目 github 地址&#xff1a; https://github.com/opencv/opencv_contr…

中国电子学会2023年05月份青少年软件编程C++等级考试试卷二级真题(含答案)

一、编程题(共5题&#xff0c;共100分) 1. 数字放大 给定一个整数序列以及放大倍数x&#xff0c;将序列中每个整数放大x倍后输出。 时间限制&#xff1a;1000 内存限制&#xff1a;65536 【输入】 包含三行&#xff1a; 第一行为N&#xff0c;表示整数序列的长度(N ≤ 100)&a…

yandex地图js学习

由于百度地图在国外的某些寻路的场景不太完善&#xff0c;所以试用了一下俄罗斯的开源地图。同google地图一样&#xff0c;规划路线需要申请apikey&#xff0c;但无需绑定信用卡&#xff0c;每天的免费调用次数也非常够用。 yandex maps开发文档 申请apikey 只需要创建账号&…

5.5.4 从IPv4到IPv6过渡——双协议栈

5.5.4 从IPv4到IPv6过渡——双协议栈 与软件版本更新不同&#xff0c;IP协议版本的更新不可能在短时间内完成&#xff0c;只能够采用逐步演进的方法&#xff0c;也就是说在很长一段时间内&#xff0c;必须允许两种协议的网络并存&#xff0c;并且能够确保网络能够互联互通&…