首页 > 其他分享 >Ⅶ. ngp_pl

Ⅶ. ngp_pl

时间:2024-05-28 20:13:28浏览次数:25  
标签:采样 box frac Loss 渲染 ngp pl NeRF

作者实现的 ngp_pl 代码还存在的两个问题:

  1. 收敛后的采样点数比NGP多(这导致计算量变大,渲染帧率下降);
  2. 有些场景会失败;

一、数据准备

代码都在 dataset 文件夹下面。

作者支持大部分算法的数据集格式,包括:

  1. NSVF:讲解的时候展示了 nsvf.py 这个文件,但是自己没找到它
  2. NeRF++
  3. COLMAP data
  4. RTMV: NeRF专用数据集,600个场景,但是因为下载贼慢,导致很少人用;

720ae158f76d0c8b66fd5e37144d0da7.png

补充:创建自己的数据集可以参考 _synth_nerf_dataset_creator 这个项目。

补充说明

第一:作者默认所有相机的内参一致,如果需要支持多个相机,需要自己在数据集读取代码中添加多个K。

第二:坐标系的转换。作者把NeRF的坐标系改成了常见的相机坐标系(都是右手系,只不过z轴的方向不同,如下图左侧所示)。

第三:范围的修改。以NSVF的合成数据集(SYN)为例,合成数据集是指定了 bounding box 的范围,但是物体不一定处于坐标系正中心,所以需要使用 shift 操作使之置于原点,此外还需要使用 scale 操作把范围值归一化到 \([-0.5, 0.5]\) 内。如下图所示:
830f323e1750dabdff0d68d4e8b54a93.png
但是真实场景(real)中,box 的范围其实是不确定的,此时需要调整 scale 进行试错(trial and error)达到最好的效果(也不一定能训练成功,太大的场景需要借鉴 MipNeRF360 的 contraction 想法,把无限远的场景“投影”到比较近的地方)。

第四:采样策略。要么从所有图片中取采样点,要么只从一幅图片中取,这两种和NeRF一脉相承,分别是下面代码中的 all_imagessame_image 两种策略。
815d4b2127c3042db26fb5a4516518a9.png

还有一种做法是:从一幅图片中取某个小区域,因为所有点都在小区域内,所以它们之间是存在某种联系的,从而引入 perceptual similarity,这样会对最后的 Loss 计算提供帮助(因为现阶段所有的 Loss 计算都是二范数的形式,只是据说采取这种做法效果可能会更好,作者没有实现这种做法)。
189d123ea70c3954c10e66ebc17db7cd.png

二、模型构造

(一)训练

训练部分代码在 models/networks.py

网络结构:总共可以分成三大部分。xyz 输入到 HashGrid 中得到 16 维特征向量,它的第一个位元使用 \(e^x\) 作为 \(\sigma\) ;方向向量通过Spherical harmonics(一系列的正余弦计算),生成16维向量,二者 concat 后输入神经网络,得到最后的 RGB 值。
09fbb3f64c6e33adfe50c09ef1a1e5b3.png

如果得到/实时更新 occupancy grid ?
以训练是否超过256步为界:前256步阶段会取得所有的格子 get_all_cells,从cell中随机取一个点作为 xyz 投入上图中,计算其 \(\sigma\) 值,以此判断该 cell 为 0 or 1(threshold,预设值是 0.01);超过256步后,减少取样的程度,uniform 是随机取样(取所有格子的 \(\frac{1}{4}\) 出来),或者只从有东西的 cell 取 \(\frac{1}{4}\) 出来。
0c43d125776270de2685c3dbf2f60e5f.png

(二)渲染

代码在 models/rendering.py

如何进行渲染?volume Rendering
首先计算射线和 box 的交点(有现成的方法,速度其实很快)。根据训练和测试两个阶段的任务需求不同,具体做法也不同。

(1)render_ray_train

对于 syn 合成数据,box 的边长是 1,步长是 \(\frac{\sqrt{3}}{1024}\)(对角线长度);对于 real 真实场景,离光心越远,步长越大,这样既加快计算,又把关注点放在最近的物体中,范围是 \(\frac{\sqrt{3}}{1024}\) 到 \(\frac{1}{256}\)。并且,每走一步要根据 occupancy field 是否有东西,决定是否放置采样点。
412cc8d82b46f412217f8f34ea1b93fc.png

(2)render_ray_test

判断射线是否和 box 有交点,逐步向前 marching,直到遇到 occupancy filed 中有东西的交点,如果没有交点那么说明这条射线不用渲染,就可以把计算资源分配给其他射线;其他射线便继续往前 marching 重复这个过程,直到走完。并且,采样点数是逐步分配、增加的。

如果 transimitance 已经很小了(几乎所有的颜色都被决定了,没必要再继续了),就可以停止渲染。early ray termination

三、定义Loss

作者在 MSE 的基础上(渲染的 RGB 和原始 RGB 的差值的平方),还引入了:

  • opacity loss: 让 opacity 的值要么是 0 要么是 1,避免出现小数值,而且还能减少漂浮物。这样做是忽略了透明的物体,所以会对透明物体的效果不太好(Depth NeRF 针对透明物体做了优化);
  • distortion Loss:MipNeRF360 中提出的新算法。原始NeRF会更倾向于所有的都是半透明的,累加在一起成为不透明,导致有很多没有用的“云”(漂浮物);当加了这个Loss后,最后的结果更倾向于只有表面一层,而没有后面那些半透明的云,从而减少采样、加快计算。

标签:采样,box,frac,Loss,渲染,ngp,pl,NeRF
From: https://www.cnblogs.com/7ytr5/p/18218730

相关文章

  • 在Spring Boot应用中使用RestTemplate类发送不同的HTTP GET请求(带请求头、不带请求头)
    原文链接:https://www.cnblogs.com/windyWu/p/16872871.html在本文中,你将学会在SpringBoot应用中使用RestTemplate类发送不同的HTTPGET请求。简单GET请求发送GETHTTP请求,可以使用getForObject()或getForEntity()方法。如下示例,使用getForObject()方法获取JSON字符串形式的用......
  • 调用mybatisPlus的 Iservice中的save方法,后台日志打印出来Insert语句,但是没插入到数据
    问题:调用mybatisPlus的Iservice中的save方法,后台日志打印出来Insert语句,但是没插入到数据库表中;一共向两个表中插入数据;weather,向天气表中插入数据成功,但是在异步任务中向三方同步日志表中 third_request_log是只打印出了成功Insert语句和参数,但是实际未插入成功:代码如下:......
  • uboot-spl 编译流程
    以下例子都以projectX项目tiny210(s5pv210平台,armv7架构)为例[uboot]uboot流程系列:[projectX]tiny210(s5pv210)上电启动流程(BL0-BL2)建议先看《[projectX]tiny210(s5pv210)上电启动流程(BL0-BL2)》,根据例子了解一下上电之后的BL0\BL1\BL2阶段,以及各个阶段的运行位置,功能。=......
  • Mybatis-Plus 实现 jsonb类型的数据存取
    1、自定义类型处理器importcom.alibaba.fastjson.JSON;importcom.alibaba.fastjson.serializer.SerializerFeature;importorg.apache.ibatis.type.BaseTypeHandler;importorg.apache.ibatis.type.JdbcType;importorg.postgresql.util.PGobject;importjava.sql.Calla......
  • MapLibre踩坑之官网demo
    第一步,下载工程gitclonehttps://github.com/maplibre/maplibre-react-native.git第二步,运行工程cdmaplibre-react-native/exampleyarninstall #多次执行,直到没有错误提示yarnreact-nativerun-android第三步,排错Didn'tfindclass"com.facebook.drawee.backends.p......
  • 小米万兆路由器(AX10000)SimpleDocker部署alist+aria2,实现离线下载
     从镜像管理中拉取p3terx/aria2-pro和xhofe/alist: 输入镜像名称后点击OK,出现成功提示后关闭拉取窗口: 等镜像拉取完毕后,创建alist容器: 选择简单模式:alist容器参数:端口映射:5244:5244环境变量:PUID=0;PGID=0;UMASK_SET=022; 复制alist的宿主目录: 创建aria......
  • C++Primer Plus对象和类的练习,练习10.10类和对象 练习2默认参数和重载
    2.下面是一个非常简单的类定义:classPerson{private:staticconstLIMIT=25;stringlname;//Person’slastnamecharfname[LIMIT];//Person’sfirstnamepublic:Person()(lname=“”;fname[0]=0’;}//#1Person(conststring&ln,constchar*fn=“Heyyou”);//......
  • c# 文件压缩DotNetZip和SharpZipLib
     SharpZipLib和DotNetZip  DotNetZip示例usingSystem;usingSystem.IO;usingIonic.Zip;classProgram{staticvoidMain(string[]args){stringfolderToCompress=@"C:\path\to\your\folder";//要压缩的文件夹路径stringzi......
  • 创建一个配置为信任所有HTTPS连接的RestTemplate实例,不验证服务器的SSL证书。这个示
    这个配置类使用背景:可参考博客:springboot使用restTemplate发送https请求忽略ssl证书https://jsonll.blog.csdn.net/article/details/129191580?spm=1001.2101.3001.6650.1&utm_medium=distribute.pc_relevant.none-task-blog-2%7Edefault%7EBlogCommendFromBaidu%7ERate-1-1......
  • 回顾二分答案 例题分析(D. Fast and Fat 和 I.Path Planning)
    对于二分答案的引述来自:二分查找&二分答案万字详解,超多例题,带你学透二分。_c++二分答案怎么确定是l<r还是l<=r-CSDN博客概念:二分答案:答案有一个区间,在这个区间中二分,直到找到最优答案。什么时候用二分答案?答案属于一个区间,当这个区间很大时,暴力超时。但重要的是——这......