论文阅读笔记本

Wed Oct 30 2024
13 分钟

LRM: Large Reconstruction Model for Single for Single Image to 3D#

主要贡献是image2triplane,2024ICLR oral,似乎是没有赶上用3DGS。

技术上,确实就是使用了标准的Transformer,首先将输入单视图卷积得到feature送入grounding DINO encoder,然后decoder中得到Triplane Token反卷积得到三平面,此后是常规的NeRF类方法渲染。

训练的重点是Decoder。Decoder中嵌入了规范化的相机特征,目的是更好收敛。相机特征是20维度,4x4的外参,focal和主点坐标,归一化,然后用MLP抬到高维嵌入,然后计算scale和shift计算adaLN。

我认为对于有关相机的操作存疑。理想情况下,要求所有训练object都定义了良好的正面,比如同为车辆类,正面定义相同。而如果正面定义是完全随机的,优化可能就和固定视角初始化区别不大了。不过考虑到实际上,建模时对正面定义大致类似,结论还是可以接受的。

训练目标是非常简单的MSE+LPIPS渲染Loss。训练数据是大量三维模型和真实物体视频。可以获得多视图(用于训练)和视角的数据都可以用。

LGM: Large Multi-View Gaussian Model for High-Resolution 3D Content Creation#

ECCV 2024 oral。总体上和LRM目的一致,主要还是用上了GS。但是GS非常离散,之前的三平面feature并不能用,所以很自然的直接生成某一视角下的GS feature然后类似点云特征直接fuse在一起。这就引入了多视角的要求,需要和以往的text23d方法一样使用Diffusion辅助生成多视角,而LRM可以纯单视图。

本文作为一篇3D生成,居然没有坤坤,显得不够专业。

本文参考以往方法使用了普吕克光场拼接,直接将像素和位姿作为直线表示{ci,oi×di,di}\{c_i, o_i\times d_i, d_i\},有利于空间关系对齐。主网络是Unet,仅深层具有Self Attention。将直线直接作为特征输入就输出稍微低resolution的GS点图。fuse过程是简单的合并在一起。。我还以为会用光场拼接操作或者有拼接网络。。

感觉本文全是Following…,Inspired by…,然后生成模型也是现成的。Mesh方法则似乎也不是重点,作为Optional。相比之下,个人认为其Follow的Splatter Image的文章看起来数学思路和贡献更加明显清晰。

32卡A100 4天,good bye。

PhysMotion: Physics-Grounded Dynamics From a Single Image#

NeuMA: Neural Material Adaptor for Visual Grounding of Intrinsic Dynamics#

Free-DyGS: Camera-Pose-Free Scene Reconstruction based on Gaussian Splatting for Dynamic Surgical Videos#

pose-free的动态重建,和动态SLAM任务非常相像,但是本文没有强调SLAM。

重点在于利用了GRN初始化Gaussian而不是简单的投射,类似LGM的Unet特征生成网络。

可以学习的优化思路:1. 考虑到内镜不总是在移动,以及移动速度有时候很慢,expension在动得快的时候才做,计算invisible的比重触发。2. 长段序列按时间切分为多个模型。这好像是wildnerf还是哪个的做法,这样做的话不好做回环检测以及来回伸缩的场景好像不太合理。

Visual Autoregressive Modeling: Scalable Image Generation via Next-Scale Prediction#

Neurips 2024 Best Paper,其背后的故事也是比较逆天。考虑到没有200+张A100,这篇只简单看一下大致思路和可能的使用方法。

RTG-SLAM: Real-time 3D Reconstruction at Scale Using Gaussian Splatting#

SIGGRAPH 2024。是GS+SLAM,注重加速。

两个主要内容,一个是二极化的场景表示,一个是tracking方面的优化。场景表示使用透明和不透明的两种GS,其中不透明的用于表示几何和渲染深度,但不是使用2DGS的平面GS,而是在渲染的时候将3DGS的覆盖区域视为同一个深度值,以免球形导致不平。思路上还是希望做表面重建,考虑到室内几何场景平面表面居多,这样处理几何可以减少构建集合所需的点数,渲染深度也更加快,会加速优化。透明的GS用于纠正深度。看正文汇报的Mapping速度是50ms左右,和EndoGLSAM通过调参达到的速度处于同一个量级。而且根据我的复现结果和论文原图放大可见其相比于Splatam虽然确实快了,但明显牺牲了渲染质量。这个二极化表示没有起到明显的加速效果,本文速度上的提升仍然是牺牲质量带来的。但是,根据文中结果,提出的表示的确带来了更好的几何,但几何上没有比过PointSLAM。

相机跟踪上,文中主要讲述的是利用可微方法进行位姿优化,然后文中轻描淡写的说使用类似Orb-SLAM进行后端优化。在EndoGSLAM的工作中有过关于使用可微优化位姿和使用现成SLAM作为后端的讨论,但本文就非常鸡贼,看似两者兼用规避问题,实则几乎还是使用现成SLAM为主。实现上,如果启用后端,每次进行可微优化,会根据图像重叠指标计算可微优化出来的位姿是否成功,如果不成功,就直接由ORB接管了,直接使用ORB出来的位姿,而如果优化出来的还可以,就将优化得到的位姿作为ORB的初始化,结果还是使用ORB。也就是说,无论如何位姿都是走的ORBSLAM,区别只是如果优化的好,就用优化结果来初始化ORB。如果设置非常小的优化论述,优化时间就会缩短,导致直接使用ORBSLAM,得到比优化更精确的结果,也就是说,优化越快,优化越好。文中给出的结果来看,如果不使用后端,ate会很差,而且复现老哥给出的结果比原文中还要差。

如果直接使用ORB,本文速度和渲染质量可以和基于Splatam改进的方法比较接近。可微渲染的作用和意义存疑。

另,在非docker直接配ORB是真麻烦,依赖库有几处需要手改include然后还需要注意版本关系,而且牵一发动全身改一个版本需要全部重新编译。在这之前还有cuda版本、torch版本和torch3d版本需要手动匹配,不过从源码编译基本解决大部分问题。

X-SLAM: Scalable Dense SLAM for Task-aware Optimization using CSFD#

ToG。好数学,慢慢看。

RP-SLAM: Real-time Photorealistic SLAM with Efficient 3D Gaussian Splatting#

[Endomapper dataset of complete calibrated endoscopy procedures]#

Nature Scientific Data,数据集,虽然申请批准有点慢,但是东西是真家伙。有大量完整的胃镜肠镜片段,操作属于比较理想的,然后相机有标定。使用的是EVIS EXERA III这套系统,镜头是190。国内医院也会用这套系统。里面还有个仿真数据集,仿真就什么gt都有了,可惜场景是同一个,区别主要是场景形变程度,而且形变还是个正弦。顺便把下载的脚本放这里。

PYTHON
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
import os
import synapseclient
from synapseclient import Synapse
from synapseclient import File, Folder
import logging

logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(levelname)s - %(message)s')

def login_to_synapse(email: str, auth_token: str) -> Synapse:

    syn = synapseclient.Synapse()
    try:
        syn.login(email=email, authToken=auth_token)
        logging.info("成功登录到 Synapse。")
    except Exception as e:
        logging.error(f"登录失败: {e}")
        raise e
    return syn

def download_files(syn: Synapse, folder_id: str, local_dir: str):

    try:
        entity = syn.get(folder_id, downloadFile=False)
        if not isinstance(entity, Folder):
            logging.warning(f"{folder_id} 不是一个文件夹。跳过。")
            return
        
        if not os.path.exists(local_dir):
            os.makedirs(local_dir)
            logging.info(f"创建目录: {local_dir}")
        
        children = syn.getChildren(folder_id)

        for child_metadata in children:
            child = syn.get(child_metadata['id'], downloadFile=False)

            if isinstance(child, File):
                file_path = os.path.join(local_dir, child.name)
                if not os.path.exists(file_path):
                    logging.info(f"正在下载文件: {child.name}")
                    syn.get(child, downloadLocation=local_dir)
                else:
                    logging.info(f"文件已存在,跳过下载: {child.name}")
            elif isinstance(child, Folder):
                subfolder_path = os.path.join(local_dir, child.name)
                logging.info(f"进入子文件夹: {child.name}")
                download_files(syn, child.id, subfolder_path)
            else:
                logging.warning(f"未知的 Synapse 实体类型: {child_metadata['id']} - {child_metadata['name']}")
    except Exception as e:
        logging.error(f"下载过程中出错: {e}")

def main():
    email = '...'
    auth_token = '...'
    
    syn = login_to_synapse(email, auth_token)
    
    base_local_download_path = './EndoMapper'
    
    synapse_project_ids = [
      ...
    ]
    
    for project_id in synapse_project_ids:
        project = syn.get(project_id, downloadFile=False)
        project_name = project.name or project_id
        local_download_path = os.path.join(base_local_download_path, project_name)
        logging.info(f"开始下载项目: {project_name} (ID: {project_id})")
        download_files(syn, project_id, local_download_path)
    
    logging.info("所有下载任务已完成!")

if __name__ == '__main__':
    main()

[EndoSLAM Dataset and An Unsupervised Monocular Visual Odometry and Depth Estimation Approach for Endoscopic Videos: Endo-SfMLearner]#

MIA,也是数据集,开放下载。相比之下这个文章明显有侧重点,侧重点是定位,切入点是癌症和肠胃疾病,当医生观察到病变时,知道病变在哪里非常重要。实际的数据包括几个体外数据集,2结肠1小肠3胃,缝在模版上,然后用机械臂举着相机过一遍。视角总是侧面的,这让SLAM任务极度简化了,和现实情况相差较多。数据集里包含了仿真,有3个场景,但是静态的。还追加了一套使用常规Olympus系统的假体数据,然后假体也不会动。假体这套丧心病狂的给了CT扫描作为GT,没有pose。机械臂的和仿真的有6DoF的Pose。

[DG-SLAM: Robust Dynamic Gaussian Splatting SLAM with Hybrid Pose Optimization]#

复旦+蔚来,第一眼鉴定为自动驾驶场景中的仿真,他的D是Dynamic而不是Deformable,估计场景中只有部分物体在做类刚性形变。

输入是RGBD的,对车来说不是什么难事。通过语义分割和深度残差定位运动的物体(如人,摆灯)。这部分似乎就是所谓的Dynamic了,剩下的部分其实还是静态的SLAM。tracking是Visual Odometry+Bundle Adjustment,再用GS进行一些refine。我觉得这样做是比较合理的,就应该先基于经典方法得到位姿,然后再用可微优化进行微调。直接用可微往往会fail,参考对RTG—SLAM的评论。再者毕竟目的是重建,利用可微减小重投影误差会带来更好的效果,但生产中可能就不是必须的了。地图构建就是插入删除GS然后RGBD优化,没有突出特别的。测试指标,很流氓的用Dynamic数据集测试,那完全就是暴打Splatam那些。时间没有实时,但是突破1fps大关。考虑到毕竟用了几何方法tracking,也符合预期。

最后吐槽下et5t这车减震感觉有点过于差了,加上学校附近的路修的特别不好,每周都要来几次摇摇乐。

[NR-SLAM: Non-Rigid Monocular SLAM]#

TOR 2024,动态内镜SLAM,当时仔细读了,再复习一下。主题就是为了攻克内窥镜,主要是胃肠镜SLAM。这个task可以说是过去几十年悬而未决,主要是内窥镜场景太恐怖了,见过数据集应该都能理解。

出发点是动态问题,主要采取了弹簧阻尼物理模型做相机优化。使用Shi-Tomasi特征(暂时不明白选取的理由),然后L-K匹配。跟踪步会同时更新位姿和型变量。DDG是一个近邻连接图,但即时这样优化目标仍然非常多,预计是时间开销大户。基于DDG会进行Deformable Bundle Adjustment,还是使用弹簧阻尼模型来优化。

[VidSfM: Robust and Accurate Structure-From-Motion for Monocular Videos]#

TIP 2022,如标题做了单目视频sfm。sfm任务有一些思路可以用在slam上,但两者区别包括能否在线运行。这篇文章的循环匹配方法需要全局的匹配,slam无法使用。这篇文章还使用了聚类相机方法,对相机进行时间上的聚类,然后使用PnP和聚类中已经注册的相机来注册新的相机,用旋转平均来平滑。还有一个部分是异常处理。

[SLAM3R: Real-Time Dense Scene Reconstruction from Monocular RGB Videos]#

这篇里Dust3R作者被拉来了。基本思路就是利用feed forward network直出3D点,但是这一篇不需要depth,弄了一个Local to World网络。decoder方面比Spann3R暴力得多,直接n并行cross attention。视频会被sliding window分成n个窗,每个窗有一个keyframe,但stride=1也就是说信息是大量重复的。特征会被集中在一起,基于keyframe的坐标形成一个local点云。Local点云的生成网络I2P和后续步骤无关,是可以单独训练的。训练是低分辨率8卡4090D。L2W网络输入全局点云和局部点云,然后把局部点云定位到全局中。说实话按理说用Spann3R也可以做SLAM任务,像这样做法直觉上有点大力出奇迹的感觉。论文和Spann3R进行了对比,速度上没有比过,性能上在一个数据集上有来有回,Replica上暴打。

[Spann3R 3D Reconstruction with Spatial Memory]#

UCL,看SLAM3R的时候看了眼,发现没看过。50fps+的扫描式3D生成。相比于Dust3R,如果想要两两配准,需要n^2匹配(其实顺序匹配也行?虽然效果应该更差),引入了时空记忆,对于顺序扫描的查询进行优化,任务就是扫描重建,的确非常快。