论文阅读:DisCO Portrait Distortion Correction with Perspective-Aware 3D GANs

news2025/1/13 2:50:31

论文阅读:DisCO Portrait Distortion Correction with Perspective-Aware 3D GANs

今天介绍一篇比较有趣的文章,通过 3D GAN inversion 来解决成像的透视畸变问题

Abstract

文章的摘要,一开始就介绍说,近距离成像的时候,人脸会产生比较明显的变形,使得最终的成像看起来不太自然。这篇文章提出了一种有效的方法来解决这个问题。首先,将 GAN inversion 作用于有形变的人脸图像上,联合优化得到对应的相机参数以及人脸的 latent code,为了解决这个联合优化的多义性问题,文章作者提出了一种顺序优化的策略,先对虚拟相机的焦距进行重参数化,然后再从一个较短的物距开始优化,最后还有一个几何的正则化。将 GAN inversion 优化好之后,就可以用 GAN inversion 实现不同相机参数下的图像生成,只要设置一个更加合理的焦距和物距,GAN inversion 生成的人脸,就可以看起来更加自然。

在这里插入图片描述
从上图来看,效果还可以

Method

这篇文章的目的是为了解决近距离成像的人脸透视畸变问题,文章的出发点其实是想通过调整成像的距离和相机的焦距来实现。为了达到这个目的,文章用了一个 perspective-aware 的 3D GAN inversion 的技术来解决这个问题,通过一个 3D GAN inversion,将输入的有透视形变的图像反解出其对应的 face latent code 和相机的参数,然后通过调整相机的参数,比如成像的物距和相机的焦距,再结合 face latent code,可以得到一个新的相机参数下的人脸图像,这部分应该是文章核心的创新点,但是为了让 3D GAN inversion 生成的人脸图像与原图的背景能很好的融合,文章又设计了一个后处理的流程,将背景与人脸区域重新进行融合。文章整体的流程如下图所示:

在这里插入图片描述

Preliminary

文章先介绍了一些背景知识,首先是介绍 StyleGAN。

  • StyleGAN 是一个非常经典的算法了,将一个从高斯分布中抽取的 512 维的随机向量 z ∈ R 512 \mathbf{z} \in \Bbb R^{512} zR512,映射到一个中间的隐向量 w ∈ R 512 \mathbf{w} \in \Bbb R^{512} wR512, w = H θ ( z ) \mathbf{w} = H_{\theta}(\mathbf{z}) w=Hθ(z)。隐向量所在的空间称为隐空间 W W W,隐向量 w \mathbf{w} w 控制生成器网络 G θ G_{\theta} Gθ 中 18 层特征的归一化,最后生成一张图像 I = G θ ( w ) = G θ ( H θ ( z ) ) I = G_{\theta}(\mathbf{w})=G_{\theta}(H_\theta(\mathbf{z})) I=Gθ(w)=Gθ(Hθ(z)),styleGAN 相比传统的 GAN 网络,通过增加一个隐向量 w \mathbf{w} w,来控制图像的不同的属性,从而达到编辑的作用。

  • GAN inversion,就是反过来,之前是通过输入一个随机变量,加上 隐向量 w \mathbf{w} w 的控制,从而实现图像的生成,现在这个 inversion,就是输入一张图像,希望能找到这张图像对应的隐向量:

w ^ = argmin w L ( G θ ( w ) , C r o p ( I r e a l ) ) (1) \mathbf{\hat{w}} = \text{argmin}_{\mathbf{w}} L(G_{\theta}(\mathbf{w}), Crop(I_{real})) \tag{1} w^=argminwL(Gθ(w),Crop(Ireal))(1)

  • 3D GAN,相比 2D GAN 多了一个相机参数的输入,利用一个神经网络的渲染器,生成最终的图像:

I = R θ ( G θ ( w ) , c ) = R θ ( G θ ( H θ ( w , c ) ) , c ) (2) I = R_{\theta}(G_{\theta}(\mathbf{w}), \mathbf{c}) = R_{\theta}(G_{\theta}(H_{\theta}(\mathbf{w}, \mathbf{c})), \mathbf{c}) \tag{2} I=Rθ(Gθ(w),c)=Rθ(Gθ(Hθ(w,c)),c)(2)

其中的 c \mathbf{c} c 表示相机的内外参数

Perspective-aware 3D GAN inversion

文章中介绍说,3D GAN 结合相机参数,在生成图像方面展现了较大的潜力。不过,当利用单张输入图进行图像生成的时候,这个问题也很挑战,因为基于单张输入图,要同时预测相机参数和生成新的图像是一个 ill-posed 的问题,可能存在无数的组合,能够实现同样的效果。现有的 3D GAN inversion 的方法,主要处理的是远距离的成像问题,这种情况,人脸区域可以认为是在同样深度的一个平面,这种情况下,不同的相机参数组合下的人脸形态可以认为基本类似。这样可以放心地使用长焦距结合远物距实现人脸的重新生成。但是对于近距离的人像来说,因为透视形变的问题,对相机参数变得非常敏感,如果估计不准,将会导致最终生成的效果不对,为了解决这个问题,文章中对相机参数和 face latent code 都需要进行优化:

w ^ , c ^ = argmin w , c L ( R θ ( G θ ( w ) , c ) , C r o p ( I r e a l ) ) (3) \mathbf{\hat{w}}, \mathbf{\hat{c}} = \text{argmin}_{\mathbf{w}, \mathbf{c}} L(R_{\theta}(G_{\theta}(\mathbf{w}), \mathbf{c}), Crop(I_{real})) \tag{3} w^,c^=argminw,cL(Rθ(Gθ(w),c),Crop(Ireal))(3)

为了解决这个优化问题, 文章中结合了四种方式,focal length reparameterization(焦距的重参数化), starting from a short distance(从一个近距离开始), optimization scheduling(顺序优化), and landmark regularization (人脸 landmark 正则)

  • Focal Length Reparameterization 虽然人脸形状,相机参数之间有很多种组合,但是不对的组合,可能会导致错误的人脸几何形状,文章为了减少自由度,以及搜索空间,将焦距与物距之间进行了某种关联,假设三维世界的一个点映射到相机坐标系上的关系满足如下公式:

[ p c 1 ] = [ R t 0 1 ] [ p w 1 ] (4) \begin{bmatrix} \mathbf{p}_c\\ 1 \end{bmatrix} = \begin{bmatrix} \mathbf{R} & \mathbf{t} \\ 0 & 1 \end{bmatrix} \begin{bmatrix} \mathbf{p}_w\\ 1 \end{bmatrix} \tag{4} [pc1]=[R0t1][pw1](4)

其中, R = [ r x , r y , r z ] T ∈ R 3 × 3 \mathbf{R} = [\mathbf{r_x}, \mathbf{r_y}, \mathbf{r_z}]^{T} \in \Bbb R^{3 \times 3} R=[rx,ry,rz]TR3×3 是一个旋转矩阵, t = [ t x , t y , t z ] T ∈ R 3 × 1 \mathbf{t} = [t_x, t_y, t_z]^{T} \in \Bbb R^{3 \times 1} t=[tx,ty,tz]TR3×1 是一个平移向量,上式是相机的外参矩阵,相机的内参矩阵,进一步将相机坐标系上的点,映射到图像坐标系:

z c [ u v 1 ] = K p c = [ f 0 c x 0 f c y 0 0 1 ] p c (5) z_c \begin{bmatrix} u\\ v\\ 1 \end{bmatrix} = \mathbf{K} \mathbf{p}_c = \begin{bmatrix} f & 0 & c_x \\ 0 & f & c_y \\ 0 & 0 & 1 \end{bmatrix} \mathbf{p}_c \tag{5} zc uv1 =Kpc= f000f0cxcy1 pc(5)

假设平移向量的初始值为 t z 0 t_{z0} tz0,初始焦距为 f 0 f_0 f0,拍摄物距为 d 0 d_0 d0,文章中假设只做 z z z 方向的平移,也就是只调整物距和焦距,不做角度的变化,所以可以得到下面的式子:

α = ( d 0 − ( t z 0 − t z ) ) / d 0 (6) \alpha = (d_0 - (t_{z0} - t_z)) / d_0 \tag{6} α=(d0(tz0tz))/d0(6)

这个式子表示了物距变化关系,与此同时,可以得到焦距的变化规律:

K = [ γ α f 0 c x 0 γ α f c y 0 0 1 ] (7) \mathbf{K} = \begin{bmatrix} \gamma\alpha f & 0 & c_x \\ 0 & \gamma \alpha f & c_y \\ 0 & 0 & 1 \end{bmatrix} \tag{7} K= γαf000γαf0cxcy1 (7)

其中的 γ \gamma γ 是一个可学习的参数,用于调整公式 (6) 的比例关系。

  • Starting from a short distance 为了更好的优化,文章中也提到了另外一个 trick,就是从一个更短的成像物距开始,因为文章中希望解决的是近距离成像的透视形变问题,同时,文章中假设平移的变化量 t z t_z tz 很小,根据平移变化量和公式 (6),可以推算出变化系数 α \alpha α,从而可以推算出焦距的变化。

  • Landmark regularization 文章中用到另外一个技术就是 landmark 正则,文章作者发现,单纯依靠纹理相关的 loss,在 3D GAN 中并不能很好的优化这类形变问题,因此文章中增加了这样一个 landmark 相关的loss,让网络对物距变化更敏感:

L l a n d m a r k ( m ) = ∑ i = 1 ∥ M ∥ ( log ⁡ ( σ i 2 ) + ∥ m i − m i ′ ∥ 2 2 2 σ i 2 ) (8) L_{landmark}(m) = \sum_{i=1}^{\left \| \mathcal{M} \right \| } \left( \log(\sigma_{i}^{2}) + \frac{\left \| m_i - m_{i}' \right \|_{2}^{2} }{2\sigma_{i}^{2}} \right) \tag{8} Llandmark(m)=i=1M(log(σi2)+2σi2mimi22)(8)

其中, m ∈ M m \in \mathcal{M} mM 是归一化之后的 3D landmark 点, ∥ M ∥ = 468 \left \| \mathcal{M} \right \| = 468 M=468 σ \sigma σ 是可优化的参数,所以是每个 landmark 点提供了一个优化参数。

  • Optimization scheduling face latent code 和成像物距的优化比较难同时优化,文章中为了解决这个问题,提出了一个顺序优化的策略:

在这里插入图片描述

依次优化相机参数,face latent code,最后优化生成器。

  • step 0:利用一个 3DMM 模型对输入的人脸图像进行初步的拟合,得到初始的相机参数;然后将随机采样的 face latent code 进行平均作为 face latent code 的初始值;
  • step 1:通过调整 $t_z $将物距初始化到一个比较近的距离,然后结合公式 (6),(7) 可以得到相应的焦距
  • step 2:先将 face latent code,generator,以及 neural render 固定住,只优化相机参数,包括旋转和平移的参数。因为文章中已经将物距和焦距通过公式 (6),(7) 建立了联系,所以物距变化的时候,焦距也会随之自适应的变化
  • step 3:当相机参数优化好之后,这一步会放开 face latent code,同时优化 face latent code 和相机参数
  • step 4:等相机参数和 face latent code 都优化完之后,会将相机参数和 face latent code 固定住,只优化 generator 生成器

文章还给出了伪代码:
在这里插入图片描述

Perspective manipulation

当这些都优化好之后,就构建了一个与相机内外参有联系的 3D GAN inversion,这样,输入一张近距离拍摄的透视畸变图,可以解析出这张图的 face latent code,然后改变相机的参数,重新送入 3D GAN 模型,就可以渲染得到一张新的相机参数下的图像。

Geometry-aware stitching

对人脸区域通过 3D GAN inversion 处理之后,接下来需要将人脸区域与背景区域进行融合。

  • Reprojection 这部分需要对整图基于同样的相机参数进行重投影。这个需要对整图的深度图与人脸区域的深度图进行对齐,文章先用一个单目深度估计模型,对原始的整图以及 3D GAN 渲染之后的人脸部分进行深度估计,然后通过如下的损失函数进行参数的优化:

arg min ⁡ s , b ∑ ∥ s × C r o p ( d n e a r f u l l ⊙ Ψ ) + b − d n e a r G A N ∥ 2 2 (9) \argmin_{s, b} \sum \left \| s \times Crop(\mathbf{d}_{near}^{full} \odot \Psi) + b - \mathbf{d}_{near}^{GAN} \right \|_{2}^{2} \tag{9} s,bargmin s×Crop(dnearfullΨ)+bdnearGAN 22(9)

其中 s , b s, b s,b 表示表示待优化的尺度与平移参数, ⊙ \odot 表示点乘操作, d n e a r G A N \mathbf{d}_{near}^{GAN} dnearGAN 表示经过 3D GAN 生成的人脸对应的深度图, Ψ \Psi Ψ 表示原始图像人脸的区域 mask, d n e a r f u l l \mathbf{d}_{near}^{full} dnearfull 表示原始输入图的深度图。

不过,单纯依靠这个尺度与平移参数还不能很好的对深度图进行融合,所以文章中还用到了 Poisson blending 做进一步的处理。

  • Stitch tuning 接下来文章还进一步对生成器做了 fine tune,将重投影得到的图像 I w a r p r e a l \mathbf{I}_{warp}^{real} Iwarpreal去监督人脸的 generator,修正边界区域的生成效果:

L b o r d e r = ∥ I n o v e l r e f i n e ⊙ Ψ ~ − C r o p ( I r e a l w a r p ) ⊙ Ψ ~ ∥ 2 2 (10) L_{border} = \left \| \mathbf{I}_{novel}^{refine} \odot \tilde{\Psi} - Crop( \mathbf{I}_{real}^{warp}) \odot \tilde{\Psi} \right \|_{2}^{2} \tag{10} Lborder= InovelrefineΨ~Crop(Irealwarp)Ψ~ 22(10)

同时,也对人脸内部区域进行约束:

L b o r d e r = ∥ I n o v e l r e f i n e ⊙ Ψ ^ − I n o v e l ⊙ Ψ ^ ∥ 2 2 (11) L_{border} = \left \| \mathbf{I}_{novel}^{refine} \odot \hat{\Psi} - \mathbf{I}_{novel} \odot \hat{\Psi} \right \|_{2}^{2} \tag{11} Lborder= InovelrefineΨ^InovelΨ^ 22(11)

上面的 Ψ ~ \tilde{\Psi} Ψ~ 表示人脸边界区域, Ψ ^ \hat{\Psi} Ψ^ 表示人脸内部区域。

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

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

相关文章

【3维视觉】20230922_网格编码最新进展

网格编码技术研究进展 1. VDMC编码技术 1.1 VDMC介绍 1.1.1 编码对象 具有时变拓扑的动态网格 1.1.2 技术细节 VDMC的编码和解码过程的高层框图如图2所示[4][5]。预处理模块提供了更好的率失真( Rate-Distortion,RD )性能,支持可伸缩解码和渐进传输…

Minecraft 1.20.x Forge模组开发 06.建筑生成

我们本次尝试在主世界生成一个自定义的建筑。 效果展示 效果展示 效果展示 由于版本更新缘故,1.20的建筑生成将不涉及任何Java包的代码编写,只需要在数据包中对建筑生成进行自定义。 1.首先我们要使用游戏中的结构方块制作一个建筑,结构方块使用教程参考1.16.5自定义建筑生…

记一次hyperf框架封装swoole自定义进程

背景 公司准备引入swoole和rabbitmq来处理公司业务。因此&#xff0c;我引入hyperf框架&#xff0c;想用swoole的多进程来实现。 自定义启动服务封装 <?php /*** 进程启动服务【manager】*/ declare(strict_types1);namespace App\Command;use Swoole; use Swoole\Proce…

软考知识产权基础知识

商标权可以根据需要无限延长 根据《商标法》的规定&#xff0c;商标的有效期为10年&#xff0c;自商标注册之日起计算。有效期届满后&#xff0c;可以递交商标续展申请。每次续展的有效期为10年。但是&#xff0c;商标续展仅限于最后一年有效期也就是期满前六个月内提交申请。…

服务注册发现_actuator微服务信息完善

SpringCloud体系里的&#xff0c;服务实体向eureka注册时&#xff0c;注册名默认是IP名:应用名:应用端口名。 问题&#xff1a; 自定义服务在Eureka上的实例名怎么弄呢 在服务提供者pom中配置Actuator依赖 <!-- actuator监控信息完善 --> <dependency><groupId…

011_第一代软件开发(三)

第一代软件开发(三) 文章目录 第一代软件开发(三)项目介绍带下知识点系统日志滤波器陷波滤波器带通滤波器 打印初始化调用打印机打印文件保存到PDF 总结一下 关键字&#xff1a; Qt、 Qml、 日志、 打印、 滤波器 项目介绍 欢迎来到我们的 QML & C 项目&#xff01;这…

排序算法:非比较排序(计数排序)

朋友们、伙计们&#xff0c;我们又见面了&#xff0c;本期来给大家解读一下有关排序算法的相关知识点&#xff0c;如果看完之后对你有一定的启发&#xff0c;那么请留下你的三连&#xff0c;祝大家心想事成&#xff01; C 语 言 专 栏&#xff1a;C语言&#xff1a;从入门到精通…

2018 国际AIOps挑战赛单指标数据集分析

关于数据集 2018年国际AIOps 由中国建设银行、清华大学以及必示科技公司联合举办&#xff0c;尽管已经过去了这么长时间&#xff0c;其提供的比赛数据依然被用于智能运维相关算法的研究。这里我们对此数据集做简单的分析&#xff0c;把一些常用的数据分析方法在这里进行略微地…

Spring面试题13:Spring中ApplicationContext实现有哪些?Bean工厂和Applicationcontext有什么区别

该文章专注于面试,面试只要回答关键点即可,不需要对框架有非常深入的回答,如果你想应付面试,是足够了,抓住关键点 面试官:Spring中ApplicationContext实现有哪些? 在Spring框架中,有以下几种ApplicationContext的实现: ClassPathXmlApplicationContext:从类路径下的…

基于springboot消防员招录系统

博主主页&#xff1a;猫头鹰源码 博主简介&#xff1a;Java领域优质创作者、CSDN博客专家、公司架构师、全网粉丝5万、专注Java技术领域和毕业设计项目实战 主要内容&#xff1a;毕业设计(Javaweb项目|小程序等)、简历模板、学习资料、面试题库、技术咨询 文末联系获取 项目介绍…

​Segment-and-Track Anything——通用智能视频分割、跟踪、编辑算法解读与源码部署

一、 万物分割 随着Meta发布的Segment Anything Model (万物分割)的论文并开源了相关的算法&#xff0c;我们可以从中看到&#xff0c;SAM与GPT-4类似&#xff0c;这篇论文的目标是&#xff08;零样本&#xff09;分割一切&#xff0c;将自然语言处理&#xff08;NLP&#xff…

【数据结构】二叉排序树;平衡二叉树的知识点学习总结

目录 1、二叉排序树 1.1 定义 1.2 查找操作 1.3 插入操作 1.4 删除操作 1.5 C语言实现二叉排序树的基本操作 2、平衡二叉树的知识点总结 2.1 定义 2.2 插入操作 2.3 调整“不平衡” 2.4 删除操作 1、二叉排序树 1.1 定义 二叉排序树&#xff08;Binary Search …

云计算与大数据——部署Hadoop集群并运行MapReduce集群(超级详细!)

云计算与大数据——部署Hadoop集群并运行MapReduce集群(超级详细&#xff01;) Linux搭建Hadoop集群(CentOS7hadoop3.2.0JDK1.8Mapreduce完全分布式集群) 本文章所用到的版本号&#xff1a; CentOS7 Hadoop3.2.0 JDK1.8 基本概念及重要性 很多小伙伴部署集群用hadoop用mapr…

C++设计模式_06_Decorator 装饰模式

本篇将会介绍Decorator 装饰模式&#xff0c;它是属于一个新的类别&#xff0c;按照C设计模式_03_模板方法Template Method中介绍的划分为“单一职责”模式。 “单一职责”模式讲的是在软件组件的设计中&#xff0c;如果责任划分的不清晰&#xff0c;使用继承得到的结果往往是随…

HT for Web (Hightopo) 使用心得(2)- 2D 图纸、节点、连线 与基本动画

概括来说&#xff0c;用 HT for Web 做可视化主要分为两部分&#xff0c;也就是 2D 和 3D。这两部分需要单独创建。在它们被创建完成后&#xff0c;我们再把它们集成到一起。 HT for Web 的 2D 部分主要是指 ht.graph.GraphView (简称 GraphView&#xff0c;也就是 2D 图纸)。…

Java项目:SSM的食堂点餐系统

作者主页&#xff1a;Java毕设网 简介&#xff1a;Java领域优质创作者、Java项目、学习资料、技术互助 文末获取源码 一、相关文档 系统中的核心用户是系统管理员&#xff0c;管理员登录后&#xff0c;通过管理员菜单来管理后台系统。主要功能有&#xff1a;个人中心、用户管理…

自动发现、zabbix_proxy代理

自动发现&#xff1a;自己去发现被监控的主机 它能够根据用户事先定义的规则自动添加监控的主机或服务等。 优点 加快Zabbix部署&#xff08;agent&#xff09; 简化管理 在快速变化的环境中使用Zabbix&#xff0c;而不需要过度管理 部署自动发现(新机子) rpm -Uvh https://re…

OSI 七层网络协议最全的图

OSI 七层网络协议最全的图 文章出处&#xff1a;https://www.shuzhiduo.com/A/RnJWawowdq/

DINO(ICLR 2023)

DINO&#xff08;ICLR 2023&#xff09; DETR with Improved deNoising anchOr box DINO发展&#xff1a; Conditional DETR->DAB-DETR&#xff08;4D,WH修正&#xff09; DN-DETR&#xff08;去噪训练&#xff0c;deNoising 稳定匹配过程&#xff09; Deformable DETR&…

后端大厂面试-16道面试题

1 java集合类有哪些&#xff1f; List是有序的Collection&#xff0c;使用此接口能够精确的控制每个元素的插入位置&#xff0c;用户能根据索引访问List中元素。常用的实现List的类有LinkedList&#xff0c;ArrayList&#xff0c;Vector&#xff0c;Stack。 ArrayList是容量…