Repaint123:通过渐近可控的 2D 重绘实现 image-to-3D

Paper: Zhang J, Tang Z, Pang Y, et al. Repaint123: Fast and high-quality one image to 3d generation with progressive controllable 2d repainting[J]. arXiv preprint arXiv:2312.13271, 2023.
Introduction: https://pku-yuangroup.github.io/repaint123/
Code: https://github.com/PKU-YuanGroup/repaint123

在这里插入图片描述

一. 研究思路

现有的 image-to-3D 方法大多采用 diffusion 模型生成多视角图像,并使用 SDS Loss 以保证多视角的一致性。然而还是存在多视角的不连续性、过度饱和与过度平滑的纹理、以及较慢的生成速度等问题。

Repaint123 结合了 diffusion 模型强大的图像生成能力和 repaint 方法优秀的纹理对齐能力,以生成高质量的多视角一致的视图。在 repaint 的过程中,Repaint123 能够针对重叠区域调整重绘强度,进一步提高了生成图像的质量。有了多视角一致的高质量图像,就可以使用 MSE Loss 快速地进行 3D 生成。

Repaint123 的 image-to-3D 过程分为三阶段:

  • 第一阶段 (coarse):使用 SDS Loss 监督 diffusion 生成的图像优化 GS 场景以生成粗略的场景表示;
  • 第二阶段 (fine):从 GS 中提取 mesh 表示,然后提出了一种可控的重绘策略渐近地细化纹理;
  • 第三阶段 (train):使用 MSE Loss 监督细化后的图像优化 GS 场景;

在这里插入图片描述

二. 粗 GS 生成

和 DreamGaussian 一样,使用 SDS Loss 监督 diffusion 生成的图像来优化 GS 场景。本阶段生成了一个具有粗糙几何和纹理的 GS 场景,整个过程大致需要 1 分钟。

三. 纹理细化

为了保证多视角视图的连续性,Repaint123 在细化图像的纹理时,选取一张细化后的图像作为参考,考虑其纹理和深度信息,然后逐步细化相邻视角的图像。为了保证较高的图像质量,Repaint123 使用了一个预训练的 2D diffusion 模型,可以接受图像作为 prompt 进行引导。并且可以对新视角中的未细化区域(即参考图像中的遮挡区域)自适应调整修复强度,以实现更加流畅的修复效果。整个纹理细化分为 3 个步骤:DDIM 反演、可控去噪、重绘:
在这里插入图片描述

1. 遮挡部分 mask 获取

在细化图像前,需要先考虑如何通过参考图像和当前视图获得当前视图中的重叠 (overlap) 区域和遮挡 (occlusion) 区域。记参考图像为 I r I_r Ir,其深度图为 D r D_r Dr,视角为 V r V_r Vr;当前视图为 I n I_n In,深度图为 D n D_n Dn,视角为 V n V_n Vn

首先将参考视角 V r V_r Vr 下的深度图 D r D_r Dr 逆向投影到三维空间中得到三维点云 P r P_r Pr,然后将 P r P_r Pr 向视角 V n V_n Vn 投影得到深度图 D n ′ D_n' Dn。随后只要比较 D n D_n Dn D n ′ D_n' Dn,深度值不同的像素就是当前视图在参考视图中的被遮挡区域,可以得到 mask M n M_n Mn

2. DDIM 反演

为了保留 coarse 阶段生成的三维场景多视角一致的颜色信息,通过 DDIM 反演将粗糙的视图 I I I 映射回隐空间得到隐变量 x i n v x^{inv} xinv,为后续去噪生成多视角一致的图像奠定基础。

3. 可控去噪

重绘当前视图被遮挡区域的过程中,使用重叠区域的隐变量 x i n v x^{inv} xinv 替换去噪阶段生成的隐变量以保证重叠区域的几何和纹理保持不变:
x t − 1 = x t − 1 i n v ⊙ ( 1 − M ) + x t − 1 r e v ⊙ M x_{t-1}=x_{t-1}^{\mathrm{inv}} \odot(1-M)+x_{t-1}^{\mathrm{rev}} \odot M xt1=xt1inv(1M)+xt1revM

其中 x t − 1 r e v x_{t-1}^{\mathrm{rev}} xt1rev 是 diffusion 在时间步长 t t t 时刻的隐变量。此外,Repaint123 还使用了 ControlNet 根据粗糙的深度图施加额外的几何约束,以确保图像的几何一致性。

为了缓解迭代过程中累积的纹理偏差,Repaint123 引入了一个相互自注意力机制 (mutual self-attention mechanism),在去噪的过程中将参考图像的注意力特征注入新视图重新绘制过程中。具体来说,将空间特征投影到新视图上得到查询特征 Q t Q_t Qt,然后使用 Q t Q_t Qt 查询参考图像的注意力特征 K r K_r Kr V r V_r Vr 就能够得到高质量的纹理参考特征:
Attention ( Q t , K r , V r ) = Softmax ( Q t K r T d ) V r \text{Attention}(Q_t, K_r, V_r) = \text{Softmax} \left( \frac{Q_t K_r^T}{\sqrt{d}} \right) V_r Attention(Qt,Kr,Vr)=Softmax(d QtKrT)Vr

4. 逐步重绘

为了重绘 360° 全景 3D 物体,Repaint123 交替选取参考视角顺时针和逆时针的相邻机位进行重绘(即图中的 ①~⑥),这样渐近地获取遮挡区域的 mask 并进行重绘,可以最大限度地保证多视角一致性和纹理质量:
在这里插入图片描述

四. 图像质量提升

尽管逐步重绘策略能够保持整个三维场景的多视角一致性,但机位在渐近的过程中累积的纹理偏差会导致后面的视图质量下降。其中,重叠区域和遮挡区域都会降低图像质量。1

1. 重叠区域

对于重叠区域,当斜视视角变成正视视角时,纹理的分辨率会降低,导致当前视图使用参考视图的纹理进行渲染时会出现失真。因此,Repaint123 提出了一种可见性感知的自适应重绘过程 (visibility-aware adaptive repainting process),即根据该区域之前的最佳视角自动调整重绘强度。

在这里插入图片描述

可见性感知的自适应重绘时,需要根据区域情况调整去噪强度,因为过度的强度会产生不一致的结果,强度不足则会限制图像质量的提升。为了选择合适的细化强度,考虑将去噪强度与 Visibility Map 关联起来:对于遮挡区域,将 Visibility Map 中的值设为 0,表示需要细化;对于当前视角的渲染角度比之前视角差的重叠区域,将 Visibility Map 中的值设为 1,表示不需要进一步细化;对于其他区域,将 Visibility Map 中的值设为 cosθ*,取先前所有视角中的最大 cosθ。

在这里插入图片描述

在每个去噪步骤中,根据当前的时间步长,将 Visibility Map 二值化为 mask:
M t i , j = { 1 , if  V i , j > 1 − t T 0 , else M_t^{i,j} = \begin{cases} 1, & \text{if } V^{i,j} > 1 - \frac{t}{T} \\ 0, & \text{else} \end{cases} Mti,j={1,0,if Vi,j>1Ttelse

上述方法可以在渲染过程中根据不同区域的可见性和时间步长自适应地调整重绘强度,从而提高重叠区域的纹理质量,减少失真现象,达到更真实的渲染效果。

2. 遮挡区域

对于遮挡区域,视图质量较低是因为缺少了 prompt 文本作为引导。为了提升遮挡区域的图像质量,采用 CLIP 编码器将参考图像编码为图像 prompt 进行引导:
在这里插入图片描述

五. 实验

在这里插入图片描述

六. 总结

七. 复现

Unreleased


  1. 北大提出Repaint123:2分钟内单视图生成接近2D质量的3D物体! ↩︎

资源下载链接为: https://pan.quark.cn/s/67c535f75d4c 在Android开发中,为了提升用户体验和视觉效果,背景模糊化处理是一种常用的设计手段。它可以为应用界面增添层次感,同时突出显示主要内容。本文将详细介绍如何在Android中实现背景模糊化功能。 首先,我们需要获取当前设备的壁纸作为背景。这可以通过WallpaperManager类来完成。调用WallpaperManager.getInstance(this.getContext())可以获取壁纸管理器实例,然后通过getDrawable()方法获取当前壁纸的Drawable对象。接下来,需要将壁纸Drawable转换为Bitmap对象,因为模糊处理通常需要在Bitmap上进行。可以通过((BitmapDrawable) wallpaperDrawable).getBitmap()来完成这一转换。 模糊处理的核心是使用Android的RenderScript API。RenderScript是一种高效的并行计算框架,特别适合处理图像操作。在blur()方法中,我们创建了一个RenderScript实例,并利用ScriptIntrinsicBlur类来实现模糊效果。ScriptIntrinsicBlur提供了设置模糊半径(setRadius(radius))和执行模糊操作(forEach(output))的方法。模糊半径radius可以根据需求调整,以达到期望的模糊程度。 然而,仅依赖ScriptIntrinsicBlur可能无法达到理想的模糊效果,因此我们还需要对原始图片进行缩放处理。为此,我们设计了small()和big()方法。先将图片缩小(small()),然后执行模糊操作,最后再将图片放大(big())。这种方式不仅可以增强模糊效果,还能在一定程度上提高处理速度。在small(
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值