Mip-NeRF学习

Mip-NeRF: A Multiscale Representation for Anti-Aliasing Neural Radiance Fields**:抗混叠神经辐射场的多尺度表示**
这篇论文中提出了NeRF在渲染中会出现的一个问题:当训练或测试图像以不同分辨率观察场景内容时,可能会产生过度模糊或混叠的渲染。NeRF中可以通过每个像素渲染多条光线来进行超级采样的方案,但是这是很浪费的,需要使用很多次网络。所以本文提出了利用圆锥来代替光线,圆台代替采样点,对每一部分的圆台进行编码,将NeRF扩展为以连续值的比例表示场景。可以有效解决分辨率不同时出现的模糊等。

对出现混叠现象的解释可以看这篇博客

Mip-NeRF中将像素点看为一个锥体的圆形截面
原始nerf的一个像素点对应mip-nerf的一块区域
原始nerf的一条射线对应mip-nerf 的一个圆锥
原始nerf的一个采样点对应mip-nerf的一个圆台
如下图
在这里插入图片描述
所以需要解决的就是原来的位置编码需要修改成对圆台进行位置编码,将圆台设置成服从高维的高斯分布(高斯分布表示圆台),在进行积分求期望编码,然后将位置与观看方向输入MLP得到颜色和密度,接着沿着这些圆台进行积分或加权平均。

位置编码

在圆台里则是直接对位置编码求了个积分(类似于求积分),称为IPE,也就是积分位置编码。
求期望时积分必须有概率密度,这里定义的是一个三维的高斯分布,在一个圆台中,去设定好中心点和方差,构建一个三维的高斯分布,然后再去做积分。
NeRF中的位置编码,由于是均匀采样,所以对高分辨率的信号就会延长为低分辨率,造成模糊
在这里插入图片描述
Mip-NeRF中的被积函数就是上图的位置编码函数,服从三维高斯分布,详细推导可以看相关博客
在这里插入图片描述

**当考虑更宽阔的区域时(远景),高频信息会自动收缩到零,从而为网络提供更多低频信息。随着区域缩小(近景),这些位置特征信号会接近经典位置编码。**这种动态的设置,使得nerf处理远景自动过滤高频信息,缓解了锯齿现象(即去除了景象中的高频分量),处理近景时恢复对高频信息的处理。

在这里插入图片描述
从上图的对比中,高斯分布更关注集中区域的信号,高频信号选择性过滤掉,类似的,积分得到的圆台区域,如果某个频率的周期大于IPE构造出来的区域,该频率的编码不会影响,如果周期小于间隔(高频率),这种频率的编码就会缩小接近于0

IPE每次采样都能确保相对于IPE特征间隔的高频特征被弱化,因为每个圆锥截锥体的高斯分布总是跟随IPE特征间隔动态变化的
这里只是用了一个MLP网络进行训练,因为这里的位置编码能够自适应的获取位置信号,进行不同尺度的采样。
损失函数如下,损失函数还是分成了粗糙和精细,参数 λ \lambda λ=0.1
在这里插入图片描述

学习参考链接

https://zhuanlan.zhihu.com/p/532337023
https://blog.csdn.net/qq_40943760/article/details/125238788
  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
对于流水车间调度问题的求解,可以使用python-mip库来实现。python-mip是一个基于MIP(Mixed Integer Programming,混合整数规划)的数学优化库,它可以用来解决各种优化问题。 在流水车间调度问题中,我们需要考虑各个工序的顺序和时间,以及机器的可用性等因素,以最小化总的完成时间或最大化生产效率为目标。 以下是一个简单的示例代码,使用python-mip库来求解流水车间调度问题: ```python from mip import Model, xsum, minimize, ConstrsGenerator # 定义工序数量、机器数量和工序时间 num_jobs = 3 num_machines = 2 job_times = [[2, 3], [4, 2], [3, 1]] # 创建模型 m = Model() # 创建变量 x = [[m.add_var(var_type='B') for _ in range(num_machines)] for _ in range(num_jobs)] # 创建约束条件 for j in range(num_jobs): m.add_constr(xsum(x[j][k] for k in range(num_machines)) == 1) # 每个工序只能在一个机器上执行 for k in range(num_machines): m.add_constr(xsum(x[j][k] * job_times[j][k] for j in range(num_jobs)) <= 8) # 每个机器的总执行时间不能超过8 # 定义目标函数 m.objective = minimize(xsum(x[j][k] * job_times[j][k] for j in range(num_jobs) for k in range(num_machines))) # 求解模型 m.optimize() # 输出结果 print('Optimal schedule:') for j in range(num_jobs): for k in range(num_machines): if x[j][k].x >= 0.99: print(f'Job {j+1} on machine {k+1}') ``` 在上述代码中,我们首先定义了工序数量、机器数量和每个工序在每台机器上的执行时间。然后创建模型,并创建变量和约束条件。最后定义目标函数为最小化总的执行时间,并求解模型。 这是一个简单的示例,实际的流水车间调度问题可能更加复杂,需要根据具体情况进行调整和扩展。希望对你有所帮助!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值