MVSNet(ECCV2018)是使用神经网络做三维重建的一篇经典论文,但大部分讲解其实都是翻译…看来看去最重要的网络训练各步骤原理和作用都是朦朦胧胧,感谢@朽一的博文用书来比喻特征图让我大致理解了整个过程。
下边结合我自己的理解做了图示来逐流程介绍,个人认为是比较易懂的,当然也欢迎讨论交流!

与传统三维重建方法类似,第一步是提取图像特征(SIFT等特征子),不同点在于本文使用8层的卷积网络从图像当中提取更深层的图像特征表示,网络结构如下图所示:
输入:N张3通道的图像,宽高为W,H
输出:N组32通道图,每通道尺度为,H/4,W/4

单应性变换简单来说,对于3D空间的点X,我们通过相机1拍照,得到照片1上的对应二维像素点P(x,y);在另一个位置用相机2拍照,得到照片2上的对应二维像素点P’(x’,y’)——通过一个正确的单应矩阵H(包含相机1,2的位置转换参数R,T、相机1到点X的距离d),可以实现P’ = HP。即在已经提前获取相机的内外参数前提下,因此只需要一个深度值变量,就可以找到参考图像上点P对应在源图像上点P’的位置。

若我们已知两个位姿的相机参数(相机1,2的位置转换参数),现在设置一个深度区间[d1,d2],并设置分辨率为Δd,由此得到D=(d2-d1)/Δd个平面,那么每个d都对应了一个单应变换矩阵h。
如果对一张图片上每个像素点,使用di对应的矩阵hi进行变换可以得到一张变换后的图片,意义为假设各个像素点真实深度都为d时,在另一位姿下各像素点的应有的对应特征值。
而我们假设了D个深度,也即将得到D幅变换后的图像,各图代表了其像素点真实深度为当前深度时变换对应的特征值,即可理解为上图中各层蓝色由深变浅的图层。
为什么是“锥形视锥”,因为当单应矩阵对应的真实深度不同时,由近大远小原理可知能被当前位置的相机看到的特征点数量随着深度减小而减小,因而出现锥形。(在下一步构建特征体时使用了双线性插值来保证所有深度的特征图尺寸一致)

在本文当中,我们通过特征提取得到的是N个特征图(1个参考图、N-1个原图),每个特征图有32通道。
每个特征图可以理解为一本书,有32页,每页尺寸是HxW
那么,一本书(一个特征体)通过2.1中的单应变换就变成了一摞书,等于将原来第一页通过深度为[d1,d2]的矩阵[h1,h2]变换成n个深度下的第一页,将原来第二页变成n个深度下的第二页……
此时,一本书 = 某深度d
书的某页 = 某深度下某特征通道
书的某页上某字 = 某深度下某特征通道某点的特征
需要注意的是,对于Ref的特征图则是直接在每个深度下复制,因为多个Src都是要变换到这个参考图下的

通过第2步我们得到了N摞书,现在竖着看每摞书的第一本,代表了假设深度为d1时,各特征图上各像素经过变换后的特征值——若某个像素真实深度接近d1的话,那变换后该列该处的特征值应该是近似的。
基于这样的想法,对每一列书的每一页上的每个像素计算方差,代表了假设深度为di时,各图像特征图的各通道各特征点的差异情况,方差越小,越相似,该特征点真实深度就越可能是di。
该步得到了一摞书,每本书 = 一个深度
每页 = 某深度下特征图一个通道
页上的点 = 该深度下特征图某通道上点的相似程度,方差越小越相似
这里就是论文所说能够接受任意N个输入的原因,因为是取方差所以输入几个都一样。
在第3步中得到了代价体,但论文说 “The raw cost volume computed from image features could be noise-contaminated” ,即这个代价体由于非朗伯面、遮挡等原因是包含噪声的,要通过正则化来得到一个概率体P(probability volume),具体采用了一个类似UNet的网络结构,对原代价体进行编码和解码,并最终将各通道数压缩为1,即将一摞书变成了一本书

此时书 = 概率体
每页 = 某深度
页上的点 = 该点在该深度的概率
如对(H,W)平面上的一点(x,y),若在深度d处值最大,该点深度为d
个人感觉把多个通道特征压缩成一个通道,直观想法是保留其中方差最小(最可能属于当前深度)的那个通道的特征,然后方差越小说明这个像素点的深度越可能是当前层深度;但文章说是出于噪声目的试用网络来正则化获得最终的概率体,不太理解为什么要用这个UNet网络。

利用第4步的概率体,沿深度d方向求期望,就得到对应像素点的初始深度值;
对每个像素点求期望,即将概率体变成了一张概率图。


论文在摘要中提到*“With simple post-processing”*之后模型效果很好,这个post-processing主要包括深度图滤波和深度图融合两部分。

深度图滤波主要提出了两个约束,光度约束和几何约束。
首先几何约束比较简单,就是说将参考点p1通过其估计深度d1投影至源视角pi点,再将pi点通过其深度估计di重投影至参考视角preproj点,这个重投影后的preproj点深度估计为dreproj,若满足

则说是满足几何约束的,论文里保证三视图满足该几何约束一致性。
光度约束,其实是在通过概率体得到初始深度图的同时计算了一个概率图
各像素点的深度越集中在某个深度附近,则该点深度判断的准确概率越高,最后过滤掉概率小于0.8的点。

即在多个视角下推测深度图,并采取特定融合算法融合;其中每个深度图的像素深度选择是使用了几何约束时计算的重投影的均值作为最终深度估计。

我是一名决定学习Ruby和RubyonRails的ASP.NETMVC开发人员。我已经有所了解并在RoR上创建了一个网站。在ASP.NETMVC上开发,我一直使用三层架构:数据层、业务层和UI(或表示)层。尝试在RubyonRails应用程序中使用这种方法,我发现没有关于它的信息(或者也许我只是找不到它?)。也许有人可以建议我如何在RubyonRails上创建或使用三层架构?附言我使用ruby1.9.3和RubyonRails3.2.3。 最佳答案 我建议在制作RoR应用程序时遵循RubyonRails(RoR)风格。Rails
一、什么是MQTT协议MessageQueuingTelemetryTransport:消息队列遥测传输协议。是一种基于客户端-服务端的发布/订阅模式。与HTTP一样,基于TCP/IP协议之上的通讯协议,提供有序、无损、双向连接,由IBM(蓝色巨人)发布。原理:(1)MQTT协议身份和消息格式有三种身份:发布者(Publish)、代理(Broker)(服务器)、订阅者(Subscribe)。其中,消息的发布者和订阅者都是客户端,消息代理是服务器,消息发布者可以同时是订阅者。MQTT传输的消息分为:主题(Topic)和负载(payload)两部分Topic,可以理解为消息的类型,订阅者订阅(Su
TCL脚本语言简介•TCL(ToolCommandLanguage)是一种解释执行的脚本语言(ScriptingLanguage),它提供了通用的编程能力:支持变量、过程和控制结构;同时TCL还拥有一个功能强大的固有的核心命令集。TCL经常被用于快速原型开发,脚本编程,GUI和测试等方面。•实际上包含了两个部分:一个语言和一个库。首先,Tcl是一种简单的脚本语言,主要使用于发布命令给一些互交程序如文本编辑器、调试器和shell。由于TCL的解释器是用C\C++语言的过程库实现的,因此在某种意义上我们又可以把TCL看作C库,这个库中有丰富的用于扩展TCL命令的C\C++过程和函数,所以,Tcl是
我尝试用Ruby设计一个基于Web的应用程序。我开发了一个简单的核心应用程序,在没有框架和数据库的情况下在六边形架构中实现DCI范例。核心六边形中有小六边形和网络,数据库,日志等适配器。每个六边形都在没有数据库和框架的情况下自行运行。在这种方法中,我如何提供与数据库模型和实体类的关系作为独立于数据库的关系。我想在将来将框架从Rails更改为Sinatra或数据库。事实上,我如何在这个核心Hexagon中实现完全隔离的rails和mongodb的数据库适配器或框架适配器。有什么想法吗? 最佳答案 ROM呢?(Ruby对象映射器)。还有
开门见山|拉取镜像dockerpullelasticsearch:7.16.1|配置存放的目录#存放配置文件的文件夹mkdir-p/opt/docker/elasticsearch/node-1/config#存放数据的文件夹mkdir-p/opt/docker/elasticsearch/node-1/data#存放运行日志的文件夹mkdir-p/opt/docker/elasticsearch/node-1/log#存放IK分词插件的文件夹mkdir-p/opt/docker/elasticsearch/node-1/plugins若你使用了moba,直接右键新建即可如上图所示依次类推创建
文章目录概念索引相关操作创建索引更新副本查看索引删除索引索引的打开与关闭收缩索引索引别名查询索引别名文档相关操作新建文档查询文档更新文档删除文档映射相关操作查询文档映射创建静态映射创建索引并添加映射概念es中有三个概念要清楚,分别为索引、映射和文档(不用死记硬背,大概有个印象就可以)索引可理解为MySQL数据库;映射可理解为MySQL的表结构;文档可理解为MySQL表中的每行数据静态映射和动态映射上面已经介绍了,映射可理解为MySQL的表结构,在MySQL中,向表中插入数据是需要先创建表结构的;但在es中不必这样,可以直接插入文档,es可以根据插入的文档(数据),动态的创建映射(表结构),这就
HTTP缓存是指浏览器或者代理服务器将已经请求过的资源保存到本地,以便下次请求时能够直接从缓存中获取资源,从而减少网络请求次数,提高网页的加载速度和用户体验。缓存分为强缓存和协商缓存两种模式。一.强缓存强缓存是指浏览器直接从本地缓存中获取资源,而不需要向web服务器发出网络请求。这是因为浏览器在第一次请求资源时,服务器会在响应头中添加相关缓存的响应头,以表明该资源的缓存策略。常见的强缓存响应头如下所述:Cache-ControlCache-Control响应头是用于控制强制缓存和协商缓存的缓存策略。该响应头中的指令如下:max-age:指定该资源在本地缓存的最长有效时间,以秒为单位。例如:Ca
“架设一个亿级高并发系统,是多数程序员、架构师的工作目标。许多的技术从业人员甚至有时会降薪去寻找这样的机会。但并不是所有人都有机会主导,甚至参与这样一个系统。今天我们用12306火车票购票这样一个业务场景来做DDD领域建模。”开篇要实现软件设计、软件开发在一个统一的思想、统一的节奏下进行,就应该有一个轻量级的框架对开发过程与代码编写做一定的约束。虽然DDD是一个软件开发的方法,而不是具体的技术或框架,但拥有一个轻量级的框架仍然是必要的,为了开发一个支持DDD的框架,首先需要理解DDD的基本概念和核心的组件。一.什么是领域驱动设计(DDD)首先要知道DDD是一种开发理念,核心是维护一个反应领域概
如何用IDEA2022创建并初始化一个SpringBoot项目?目录如何用IDEA2022创建并初始化一个SpringBoot项目?0. 环境说明1. 创建SpringBoot项目 2.编写初始化代码0. 环境说明IDEA2022.3.1JDK1.8SpringBoot1. 创建SpringBoot项目 打开IDEA,选择NewProject创建项目。 填写项目名称、项目构建方式、jdk版本,按需要修改项目文件路径等信息。 选择springboot版本以及需要的包,此处只选择了springweb。 此处需特别注意,若你使用的是jdk1
CSDN优秀解读:https://blog.csdn.net/jiaoyangwm/article/details/1266387752021https://arxiv.org/pdf/2103.14259.pdf关键解读在目标检测中标签分配的最新进展主要寻求为每个GT对象独立定义正/负训练样本。在本文中,我们创新性地从全局的角度重新审视标签分配,并提出将分配程序制定为一个最优传输(OT)问题——优化理论中一个被充分研究的课题。具体来说,我们将每个需求方(锚框)和供应商(GT标签)的单位传输成本定义为他们的分类和回归损失加权之和。在公式化后,找到最好的分配方案即为最小传播成本解决最优传输方案,