一、介绍

DragGAN是由谷歌、麻省理工学院和马克斯普朗克研究所创建的一种新的人工智能模型。可以让你轻松通过点击拖动等简单的交互操作就能改变拍摄对象的姿势、形状和表情等。

但是DragGAN的官方项目并非完美,也存在一些问题。比如可能因为跟踪点不稳定而导致图像主体翻转抽搐等问题,而本次为大家所讲解的是由中科大和上海AI Lab的研究者所共同发布的FreeDrag,可以完美解决该问题。

官方描述:为满足图像编辑的复杂要求,精细且灵活地操作图像内容至关重要。最近,DragGAN通过基于点的操作实现了令人印象深刻的编辑效果。然而,我们发现DragGAN存在无法准确跟踪指定的控制点和从属地跟踪问题。为解决以上问题,我们提出FreeDrag,它采用基于特征的方法,解放基于点的方法(如DragGAN)中的点跟踪负担。FreeDrag 结合自适应模板特征、线搜索和模糊定位技术,实现稳定且高效的基于点的图像编辑。大量实验表明,我们的方法优于DragGAN,能在有相似结构、细节或多点目标情况下实现稳定的基于点的编辑。

效果对比

项目相关

论文地址:https://arxiv.org/abs/2307.04684

项目主页:https://lin-chen.site/projects/freedrag/

GitHub:LPengYang/FreeDrag: Official Implementation of FreeDrag (github.com)

项目特点

定制的运动方案提供了对每个动作难度的精确控制,而自适应更新𝑭𝓮𝓶𝓪在整个运动过程中实现了平滑的特征迁移。它们共同促成了稳定的点运动,以实现可靠的基于点的图像编辑。

点向型DragGAN与特征向型FreeDrag的比较。𝒫𝓀𝖎​表示第𝒫𝓀𝖎次运动开始时手柄点的位置。DragGAN与FreeDrag之间的最大不同在于,DragGAN要求精确的𝒫𝓀𝖎​的位置,而FreeDrag可能通过强制𝒫𝓀𝖎​接近𝒫𝓀𝖎来鼓励𝑭𝒓(𝒕𝓀𝖎)移动到自定义的𝑭𝓀-1𝓮𝓶𝓪

解决方案

如果你的图像内容发生剧烈变化,这将会导致跟踪点的丢失,进而对图像引起损坏。

如果你的图像内容发生剧烈变化,这将会导致跟踪点的丢失,进而对图像引起损坏。

寻找有效区域内相似点的跟踪错误,例如轮廓线和马腿等特征。

如果跟踪点出现错误,将会引起方向和约束错误等特征,导致累积偏差,图像最终质量下降。

二、安装教程

在执行项目安装之前,我们还需要安装GitConda以及CUDA。如果您的电脑还未安装这几款软件,请先根据本站所给出的教程安装。

Windows系统安装Git请参阅此文章:

Windows系统安装Conda请参阅此文章:

Windows系统安装CUDA请参与此文章:

如果您是初学者,对于命令行不太理解,那么请按下键盘上的Win键+R键后,在弹出的新窗口内输入CMD并按下回车,打开CMD窗口,按顺序执行如下的每一条命令。

首先我们需要确认一个工作目录,用来存放该项目的相关环境依赖文件。本站所选择的目录为D盘的根目录下dataddd文件夹,完整路径为:D:\dataddd

检测D盘是否在dataddd目录,没有则创建该文件夹。

if not exist D:\dataddd mkdir D:\dataddd

强制切换工作路径为D盘的dataddd文件夹。

cd /d D:\dataddd

拉取该项目的Github仓库文件,将其下载至dataddd文件夹内。

git clone --depth=1 https://github.com/LPengYang/FreeDrag

环境部署

在CMD中执行如下命令,强制切换至FreeDrag的项目目录。

cd /d D:\dataddd\FreeDrag\FreeDrag

但是这个项目的官方作者比较懒,根本没写安装部署过程,甚至连environment.yml文件都没有给出,但是我们可以尝试使用DragGAN官方的Conda配置文件,该文件内置了所有需要的依赖项列表。正常来说,我们根据这个列表经过一些修改,就可以一键安装所有需要的环境。

打开FreeDrag项目根目录下的environment.yml文件,删除scipycudatoolkit的版本号,修改后的文件内容如下,然后保存。

name: FreeDrag
channels:
  - pytorch
  - nvidia

dependencies:

- python >= 3.8
- pip
- numpy>=1.25
- click>=8.0
- pillow=9.4.0
- scipy
- pytorch>=2.0.1
- torchvision>=0.15.2
- cudatoolkit
- requests=2.26.0
- tqdm=4.62.2
- ninja=1.10.2
- matplotlib=3.4.2
- imageio=2.9.0
- pip:
  - opencv-python
  - imgui==2.0.0
  - glfw==2.6.1
  - gradio
  - pyopengl==3.1.5
  - imageio-ffmpeg==0.4.3
  # pyspng is currently broken on MacOS (see https://github.com/nurpax/pyspng/pull/6 for instance)
  - pyspng-seunglab

在CMD中执行下面的命令行,创建Conda虚拟环境至该项目的目录中,方便日后重装系统也能够正常使用,无需重新部署环境。

conda env create -p D:\dataddd\FreeDrag\FreeDrag\ENV python=3.10 -f D:\dataddd\FreeDrag\FreeDrag\environment.yml

初始化Conda环境,防止后续操作可能存在报错等问题。

conda init cmd.exe

激活已创建的Conda环境,这样我们可以将我们后续所需要的所有环境依赖都安装至此环境下。

conda activate D:\dataddd\FreeDrag\FreeDrag\ENV

模型下载

模型说明

官方目前一共提供了12个模型,每个模型的具体对应内容如下:

模型名称中文翻译大小
bicycles自行车340MB
cars汽车347MB
cats347MB
churches教堂340MB
dogs363MB
elephants大象347MB
faces人脸347MB
giraffes长颈鹿347MB
horses340MB
lions狮子347MB
metfaces艺术脸363MB
parrots鹦鹉347MB

模型列表

官方下载

此项目已内置官方模型下载脚本,在CMD窗口内分别执行如下两行命令即可。但是该脚本执行过程中,大概率会下载出错。

注意,在执行该脚本之前,你还需要先手动在项目的根目录下新建一个checkpoints文件夹,用来存储模型,否则下载后也无法使用,完整的路径应该为.\FreeDrag\FreeDrag\checkpoints

cd /d D:\dataddd\FreeDrag\FreeDrag
bash download_models.sh

本站所提供的模型包含官方的所有模型,下载后将该模型文件夹移动至项目的根目录.\FreeDrag\FreeDrag下即可使用。

MSVC配置

Visual Studio

在安装之前我们还需要下载Visual Studio,否则必然会报错。

下载地址:Visual Studio: 面向软件开发人员和 Teams 的 IDE 和代码编辑器 (microsoft.com)

下载并安装Visual Studio 2022时,然后勾选使用C++的桌面开发通过 Windows 平台开发两个选项,最后点击安装,等待完成即可。

源码修改

我们已经安装完成MSVC之后,需要配置一下已安装的环境路径。

首先找到你的安装目录,例如本站的MSVC安装目录如下,如果你的默认安装路径为C盘,那应该与本站差不多。

唯一不确定的因素是版本号的问题,其中14.36.32532是不确定的,自行翻找一下。

C:\Program Files\Microsoft Visual Studio\2022\Enterprise\VC\Tools\MSVC\14.36.32532\bin\Hostx64\x64

建议使用代码编辑器,打开.\FreeDrag\FreeDrag\torch_utils\custom_ops.py文件,从第28行开始,默认内容如下:

def _find_compiler_bindir():
    patterns = [
        'C:/Program Files*/Microsoft Visual Studio/*/Professional/VC/Tools/MSVC/*/bin/Hostx64/x64',
        'C:/Program Files*/Microsoft Visual Studio/*/BuildTools/VC/Tools/MSVC/*/bin/Hostx64/x64',
        'C:/Program Files*/Microsoft Visual Studio/*/Community/VC/Tools/MSVC/*/bin/Hostx64/x64',
        'C:/Program Files*/Microsoft Visual Studio */vc/bin',
    ]

我们需要做的是添加刚刚安装的MSVC路径至最后一行,修改后的样式如下:

def _find_compiler_bindir<strong>()</strong>:
  patterns = [
      'C:/Program Files*/Microsoft Visual Studio/*/Professional/VC/Tools/MSVC/*/bin/Hostx64/x64',
      'C:/Program Files*/Microsoft Visual Studio/*/BuildTools/VC/Tools/MSVC/*/bin/Hostx64/x64',
      'C:/Program Files*/Microsoft Visual Studio/*/Community/VC/Tools/MSVC/*/bin/Hostx64/x64',
      'C:/Program Files*/Microsoft Visual Studio */vc/bin',
      'C:/Program Files/Microsoft Visual Studio/2022/Enterprise/VC/Tools/MSVC/14.36.32532/bin/Hostx64/x64'
]

修改完成后,保存文件。

三、启动方式

在CMD中执行如下命令,强制切换至项目目录文件夹。

cd /d D:\dataddd\FreeDrag\FreeDrag

激活已创建的Conda环境,这样才可以正常使用该项目,否则将会自动调用系统中的默认Python。

conda activate D:\dataddd\FreeDrag\FreeDrag\ENV

此时我们执行如下代码,尝试运行并加载所有模型。

python FreeDrag_gradio.py

当你执行完上面的代码,将会需要等待加载片该,然后将会看到如下输出:

Microsoft Windows <strong>[版本 10.0.22621.1848]
(c) Microsoft Corporation保留所有权利

C:\Users\openA>cd /d D:\dataddd\FreeDrag\FreeDrag

D:\dataddd\FreeDrag>conda activate D:\dataddd\FreeDrag\FreeDrag\ENV

(D:\dataddd\FreeDrag\FreeDrag\ENV) D:\dataddd\FreeDrag\FreeDrag>python FreeDrag_gradio.py

Setting up PyTorch plugin "bias_act_plugin"... Done.

Setting up PyTorch plugin "upfirdn2d_plugin"... Done.

D:\dataddd\FreeDrag\FreeDrag\FreeDrag_gradio.py:262: GradioDeprecationWarning: The `style` method is deprecated. Please set these arguments in the constructor instead.

image = gr.Image(image_show).style(height=768, width=768)

D:\dataddd\FreeDrag\FreeDrag\FreeDrag_gradio.py:264: GradioDeprecationWarning: The `style` method is deprecated. Please set these arguments in the constructor instead.

mask_show = gr.ImageMask(image_show).style(height=768, width=768)

Running on local URL: http://127.0.0.1:7860

To create a public link, set `share=True` in `launch()`.

Keyboard interruption in main thread... closing server.

当我们看到网址被显示出来时,这就代表我们已经可以通过浏览器打开WebUI界面啦,比如站长打开http://127.0.0.1:7860,此时将会看到如下界面。

以下是本网页中官方内容的翻译:

英文信息

Parameter Description

max_step: max number of optimization step

sample_interval: the interval between sampled optimization step. This parameter only affects the visualization of intermediate results and does not have any impact on the final outcome. For high-resolution images(such as model of dog), a larger sample_interval can significantly accelerate the dragging process.

Eepected initial loss and Max distance: In the current version, both of these values are empirically set for each model. Generally, for precise editing needs (e.g., merging eyes), smaller values are recommended, which may causes longer processing times. Users can set these values according to practical editing requirements. We are currently seeking an automated solution.

frame_rate: the frame rate for saved video.

Hints

  • Handle points (Blue): the point you want to drag.
  • Target points (Red): the destination you want to drag towards to.
  • Localized points (Yellow): the localized points in sub-motion

中文翻译

快速开始

max_step:最大优化步骤数

sample_interval:采样优化步骤之间的间隔。 此参数仅影响中间结果的可视化,对最终结果没有任何影响。 对于高分辨率图像(例如狗的模型),较大的sample_interval可以显着加快拖动过程。

初始损耗和最大距离:在当前版本中,这两个值都是为每个模型根据经验设置的。 通常,对于精确的编辑需求(例如,合并眼睛),建议使用较小的值,这可能会导致更长的处理时间。 用户可以根据实际编辑要求设置这些值。我们目前正在寻求自动化解决方案。

frame_rate:保存视频的帧速率。

提示

  • 手柄点(蓝色):要拖动的点。
  • 目标点(红色):要拖动到的目标。
  • 局部点(黄色):子运动中的局部点

功能讲解

Model|模型

该区域的功能主要是用来控制模型的选择,详细功能解释如下。

  • Seed|种子
    • 默认为0,用来控制右侧的图像,有点类似于SD绘画的种子。更改数值之后,点击Image Generate按钮,将会自动更换右侧图像。
  • Model name|模型名称
    • 也就是我们刚刚下载的那些模型,都可以在这里自由选择,选择一个你想要的类型之后,将会自动切换右侧的预览图像。
  • Image Generate|生成图像
    • 在你更改种子数值之后,需要点击该按钮才可以刷新右侧的图像预览区。
  • Rand Gennrate|随机生成
    • 无需设置种子数值,这将会随机产生一个种子,然后自动刷新右侧的图像预览区。

Optional Parameters|可选参数

  • Max step|最大步长
    • 运算的最大次数,默认2000次。
  • Interval|间隔
    • 采样的间隔,默认为5。
  • Eepected initial loss for each sub-motion|每个子运动的初始损失
  • Max distance for each sub-motion (in the feature map)|每个子运动的最大距离(在特征图中)

Video|视频

  • if save video|是否保存视频
    • 如果选择True,将图像的操作过程保存为视频。
    • 如果选择False,不做任何处理。
  • Frame rate|视频的帧率
  • Save video|保存视频

Drag|拖拽

  • Reset points and mask|重置所有已添加的标记和已绘制的遮罩
  • Drag it|开始生成

Steps|步数

该参数为已计算步数,当你进行Drag it操作时,每次计算的步数都会在此被显示出来。

图像预览区域

也就是你WebUI网页界面的右侧,你可以看到两个窗口。

  • Setup Handle Points|交互标记界面
    • 这个界面的图像一般是用来添加或移除标记点,点击两次将会生成两个标记点,每两个标记是一对,可以循环添加多对标记,然后点击Drag it按钮后,将会开始自动计算。
  • Draw a Mask|遮罩界面
    • 这个界面的图像一般是用来添加或移除遮罩,在该界面可以自由绘制或切换笔刷大小等操作,遮罩之外的区域将不受控制。

使用教程

使用教程就是在右侧的图像预览区域点几对标记,然后点击Drag it按钮即可,而且之前讲过DragGAN的教程,所以这里就不过多赘述了。

常见问题

如果你在运行时遇到以下报错,那就是因为你的MSVC环境没有配置。从头看本篇教程,安装MSVC环境,然后添加custom_ops.py中的路径即可。

Traceback <strong>(most recent call last<strong>):
    File "D:\dataddd\FreeDrag\FreeDragWiz\renderer.py",line 112,in render
  
    self.init network(res,**args)
    
    File "D:\dataddd\FreeDrag\FreeDrag\viz\renderer.py",line 249,in init network
    
    w=G.mapping(z,label,truncation psi=trunc_psi,truncation cutoff=trunc cutoff)
    
    File "D:\dataddd\FreeDrag\FreeDrag\ENWlib\site-packages\torch\nn\modules\module.py",line 1501,in call_impl
    
    return forward call(*args,**kwargs)
    
    File "D:\dataddd\FreeDrag\FreeDrag\training\networks_stylegan2.py",line 247,in forward
    
    x layer(x)
    
    File "D:\dataddd\FreeDrag\FreeDrag\ENWlib\site-packages\torch\nn\modules\module.py",line 1501,in _call_impl
    
    return forward_call(*args,**kwargs)
    
    File "D:\dataddd\FreeDrag\FreeDrag\training\networks_stylegan2.py",line 125,in forward
    
    x bias act.bias act(x,b,act=self.activation)
    
    File "D:\dataddd\FreeDrag\FreeDrag\torch_utils\ops\bias_act.py",line 84,in bias_act
    
    if impl ='cuda'and x.device.type ='cuda'and init():
    
    File "D:\dataddd\FreeDrag\FreeDrag\torch_utils\ops\bias act.py",line 41,in init
    
    _plugin custom ops.get plugin(
    
    File "D:\dataddd\FreeDrag\FreeDrag\torch_utils\custom_ops.py",line 84,in get_plugin
    
    raise RuntimeError(f'Could not find MSVC/GCC/CLANG installation on this computer.Check_find_compiler_bindir()in "file)".')
    
    RuntimeError:Could not find MSVC/GCC/CLANG installation on this computer.Check_find_compiler_bindir()in     "D:\dataddd\FreeDrag\FreeDrag\torch_utils\custom_ops.py".

总结

与DragGAN比较起来,效果上的确有所提升。不过,还是不支持直接在项目内上传图像并自动训练为模型,这点还是比较不方便的。