ECCV 2018论文解读 | 基于三维重建的全新相机姿态估计方法

本文主要是介绍ECCV 2018论文解读 | 基于三维重建的全新相机姿态估计方法,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

区别于先前的方法都在关注点特征和相机自运动模型,本文作者提出了一个关于 RS 相片形变的比喻:

刚体的 3D template 在 RS 相机中的形变,可以被看作一个非刚体可形变的 3D template 被 GS 相机所捕捉。从而将 2D 照片中的形变等效到了 3D 空间中,进而使用 Shape-from-Template 技术实时重建这个一直处于形变中的虚拟 3D template,最后使用已知的 template 和每一帧重建的形变 template 做 3d-3d 注册,从而求解出了 RS 相机的姿态和瞬时自运动参数。

本文提出的这个等效比喻第一次将 RS 姿态估计问题(RS pose estimation problem)和 非刚体三维重建(Non-rigid scene reconstructution)联系起来。

■ 论文 | Rolling Shutter Pose and Ego-motion Estimation using Shape-from-Template

■ 链接 | https://www.paperweekly.site/papers/2281

■ 源码 | Yizhen Lao / Omar Ait-Aider / Adrien Bartoli

一些关于RS的题外话

Rolling Shutter(卷帘快门, 下文简称 RS)是目前 CMOS 相机的标配快门方式。顾名思义,其快门的模式是一个卷帘式的连续过程。这和在传统 CCD 上的 Global Shutter(GS)快门模式有很大的不同。GS 快门拍出的相片的所有像素都是在同一个时刻曝光的,而 RS 通常则是逐行扫描的。

2f902901e6c18f06af0e00ad5f3bae75b04ac8d1

如果在拍摄瞬间,被拍摄的物体和你的相机都是静止的,RS 拍出来的照片和 GS 当然是一样的。但是我们可以想象一下,如果你在拍摄时移动你的 RS 相机(或者相机静止,被拍物体在运动),那么你拍出来的 RS 照片的每一行其实都处于不同的姿态。一个最直接的弊端就是影像中的形变(distortions, 我们也称之为 RS effect)。

30f6295f4bd35c8fb43e301beef722331c18b37f

上面这幅图(Cenek ALbl, CVPR’16)描述了拍摄瞬间不同的自运动(ego-motion)模式所带来的不同的形变类型。

形变首先影响了你所拍摄照片的美观,但更要命的是,这种形变会严重影响使用了 RS 相片的几何算法的精度。熟悉传统 3D vision 的朋友一定读过 Multiple View Geometry,在 MVG 中所有的相片都有一个前提假设,同一张相片上的每个像素都具有相同的 pose。所以我们可以用经典的 P3P 解相机的绝对姿态,可以用五点或者八点法解相对位置。

现在你应该发现问题了,运动的 RS 相机不符合这个前提假设。一旦这个 RS effect 很强的话,你算什么位置都会出问题的。如果这些基础问题的解都不可靠的话,那你基于 RS 玩的 AR/VR,Structure from Motion (SfM),Visual Odometry (VO) 和 SLAM 都得受到影响。

那又有朋友要问了:”我不用 RS 只用 GS 不就完了嘛,我从来都没听说过这种相机,实际应用中肯定很少用到啊”。实际上呢,大家离 RS 相机都不远,大概就是你到你手机的距离,因为目前市售的智能手机摄像头都装备的是 RS 相机。

为什么大家都要用 RS 相机呢?这就要说到 RS 的几大优势了:便宜、体积小、功耗低、更高帧率。甚至很多不缺钱的平台也都在用 RS 拍东西,比如 Google 街景车(Klingner Bryan, ICCV’13)。

总结一下,RS 的优势让它非常适合在移动平台上应用,比如手机,机器人,无人机,无人车。但是,它的逐行扫描模式又让它非常不适合在移动平台上做应用。

正是基于这个矛盾点,针对 RS 相机在 CV 领域的研究越来越多。从 06 年 ECCV 上一篇关于 RS 的文章拿了 Honorable Mention Award 开始,到今年的 ECCV 为止,共有 33 篇关于 RS 的文章发表在 CVPR/ICCCV/ECCV 上,分别涉及 SfM、Pose Estimation 和 Rectification 等 7 大主题。

d69f4e945d0d543fa913fa038dcafd94bf6a14b5

从 15 年开始,关于 RS 的顶会文章稳定在了每年五篇。但是其实关于 RS 的 CV 应用的坑还有很多很多。像是 SLAM with RS 现在都还没有一个非常 work 的工作出现。目前还没有看到国内高校或者企业的同行们关注 RS 相关的工作,所以也欢迎大家能更关注甚至投身到 RS 的 CV 应用研发中去。

论文介绍

RS Pose and Ego-motion问题

言归正传到这篇论文上,我们在这篇文章中主要解决的是利用已知的 3D 点(又称 template)来估计相机姿态的问题。

在 GS 中,比较有名的有利用三个已知的 3D 点来求解相机 6 dof 的 p3p (Xiao-shan Gao, PAMI’2003)。当然对于 RS,不只有相机姿态的六个参数,还会有拍摄瞬间的 ego-motion(角速度/线速度)的参数。

这就牵扯出了关于 RS ego-motion 模型的假设。如果我们假设相片中的每一行都有一个独立的 pose,那么 n 行的照片就得求解 6n 个参数,这显然是不可能实现的。有一个很好的解决方法是,为快门时间内相机的 ego-motion 设计动力学模型,这就相当于给每一行的 pose 之间设计了时空上的联系,从而有效地降低了要求解得参数个数。

由于快门时间其实非常非常的短,最简单的模型就是匀速模型,假设 RS 相机在快门时间内只做匀速运动(加速度为 0)。 例如在 Omar Ait-Aider, ECCV’06 中:

4219fb5f716802e4f81ce455797a9ee5c92218a7

将一张相片第一行的 pose 设为 [R T],则第 vi 行的 pose 应为:

f2d1fbc84abe4e501d004e33824262696f952468

我们可以发现在这个模型中,对于一个影像来说 ego-motion 也有六个参数,分别是角速度三个和线速度三个。所以对于此模型的 RS pose and ego-motion 问题来说,求解的就是 12 dof 而不是传统 GS pn p问题中的 6 dof 了。

相关研究

关于 RS 的 pose 求解方法可分为两类:

1. 以 Omar Ait-Aider, ECCV’06Ludovic Magerand, ECCV’12 为代表的迭代优化求解方法。此类方法最大的缺点就是慢,也没办法用 ransac 去过滤outliers;

2. 以 R6P (Cenek ALbl, CVPR’15) 为代表的 minimal solution 方法。这个是当年的 CVPR oral,作者首先对上面的匀速模型做了进一步简化。在角速度上,假设了一张相片的 ego-motion 不超过 30 度,因此上文的罗德里德公式只取一级泰勒展开。这个近似让整个 ego-motion 模型的先行性大大提高,他们又进一步对旋转公式进行了线性化,这个 double-linearized model 是这样的:

819f091c9c180448284502c503814ea65e683719

感兴趣的朋友可以去读原论文。总而言之,R6P 是一个需要六对 3D-2D matches 的线性方法,需要用 p3p 初始化,但是运行速度还是非常快,可以结合在 RANSAC 中进行 outlier 剔除。

无形变的 Template 在 RS 相机中形变?还是一个会形变的 Template 被 GS 相机拍下来了?

这一节的标题很长,但也阐述了这篇论文的核心思想:我们认为 RS 相片中物体的 2D 形变,可以看成是这个物体在 3D 中形变了、并被一个 GS 相机给拍下。

没太理解这句话?没关系,我们一步一步来看:

67853dff4962ebada455fb3f1bdbc40f6617828d

一个已知的 3D surface 被我们称作 template,它被一个移动的 GS 相机拍到了。因为是 GS,毫无意外的,照片 I1 里没有任何形变。

7670513d3a59ed2a41ac06f07c98dd4eb6fd3de7

如果同一个 3D surface (template) 被一个移动中的 RS 相机拍到。无意外的,这时候我们拍出来的照片 I2 就是一个形变的 surface 了。

这个时候,我们来做一个思想实验。能不能用一台 GS 相机拍出和 I2 相片一样的形变呢?答案是可以的,只要把那个 3D surface 掰扯变形,我们也可以用 GS 相机拍出一模一样的形变照片:

8972882dd679f4529308fed6125c11d304dea008

但其实这一切都停留在想象之中,这个掰扯的形变完全是虚拟的。因此我们先暂时称这个幻想的形变为 Virtual Deformation。这个等价性在论文中有详细的证明过程。

等等,你为什么要建立这个等价关系?有什么意义呢?

当然是有的,其中一个原因是在非刚体场景三维重建的技术中,有一个叫 shape-from-template(SfT)的成熟方法,它要解决的问题和这个关于 3D template 的形变幻想有很大的相似性,其他的原因会在后面章节提到。

Shape-from-Template

SfT 是一种针对非刚体场景(non-rigid),根据已知 t0 时刻的 3D template 和 tn时刻的 2D image,来恢复 tn 时刻的 3D 模型的技术(Adrien Bartoli, PAMI’2015)。

比如,医生可以在手术前用 CT 或者 NMRI 来获取患者心脏的 3D 模型,但在手术中,医生却无法借助各类大型仪器实时恢复心脏的 3D 形态。对于医生而言,如果仅借助 2D 内窥镜实施微创手术,那无疑对其操作技术存在较高要求。这时候 SfT 就能大显身手了,它通过术前重建 t0 时刻的 3D 模型和手术中内窥镜的 2D 影像,就能实时重建出跳动中的心脏三维模型。

SfT 目前已有高速的 real-time 版本(Toby Collins, ISMAR’15),并且有成熟的 outliers 剔除算法(Daniel Pizarro, IJCV’12)。

好,回到 RS 的问题上来,大家有没有发现 SfT 和上述思想实验的共同点:都有一个 3D template 当 reference,然后每一张照片都对应了一个 template 的形变。因此,我们可以用 3D template 和 RS image 去重建这个 Virtual Deformed Template。

3D-3D Registration

在用 SfT 重建好这个形变了的 template 之后,我们可以使用已知的未形变的 template 做一个递归的 3d-3d registration。这一步给整个 proposed 的方法带来了两个好处:

1. 将之前的 3D-2D 问题转换为了 3D-3D 问题,这对于 RS pose 问题来说可以规避掉大量的退化配置风险,例如 R6P 在 plane scene 上就有 degeneracy case;

2. 在 3d-3d registration 中,可以非常容易地结合各式各样的 ego-motion model,包括匀速的、加速的等等。

整体流程

edc4d6efd961aba0504dd965845375a94af65e20

整个方法非常简单,就分为两步:

1. 用 SfT 重建虚拟形变的 template;

2. 用形变的 template 和未形变的 template 做 3D-3Dregistration,解出 pose 和 ego-motion。


原文发布时间为:2018-09-12

本文作者:劳奕臻

本文来自云栖社区合作伙伴“PaperWeekly”,了解相关信息可以关注“PaperWeekly”。

这篇关于ECCV 2018论文解读 | 基于三维重建的全新相机姿态估计方法的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/273473

相关文章

Java中流式并行操作parallelStream的原理和使用方法

《Java中流式并行操作parallelStream的原理和使用方法》本文详细介绍了Java中的并行流(parallelStream)的原理、正确使用方法以及在实际业务中的应用案例,并指出在使用并行流... 目录Java中流式并行操作parallelStream0. 问题的产生1. 什么是parallelS

MySQL数据库双机热备的配置方法详解

《MySQL数据库双机热备的配置方法详解》在企业级应用中,数据库的高可用性和数据的安全性是至关重要的,MySQL作为最流行的开源关系型数据库管理系统之一,提供了多种方式来实现高可用性,其中双机热备(M... 目录1. 环境准备1.1 安装mysql1.2 配置MySQL1.2.1 主服务器配置1.2.2 从

Linux jq命令的使用解读

《Linuxjq命令的使用解读》jq是一个强大的命令行工具,用于处理JSON数据,它可以用来查看、过滤、修改、格式化JSON数据,通过使用各种选项和过滤器,可以实现复杂的JSON处理任务... 目录一. 简介二. 选项2.1.2.2-c2.3-r2.4-R三. 字段提取3.1 普通字段3.2 数组字段四.

Python版本信息获取方法详解与实战

《Python版本信息获取方法详解与实战》在Python开发中,获取Python版本号是调试、兼容性检查和版本控制的重要基础操作,本文详细介绍了如何使用sys和platform模块获取Python的主... 目录1. python版本号获取基础2. 使用sys模块获取版本信息2.1 sys模块概述2.1.1

Python实现字典转字符串的五种方法

《Python实现字典转字符串的五种方法》本文介绍了在Python中如何将字典数据结构转换为字符串格式的多种方法,首先可以通过内置的str()函数进行简单转换;其次利用ison.dumps()函数能够... 目录1、使用json模块的dumps方法:2、使用str方法:3、使用循环和字符串拼接:4、使用字符

Python版本与package版本兼容性检查方法总结

《Python版本与package版本兼容性检查方法总结》:本文主要介绍Python版本与package版本兼容性检查方法的相关资料,文中提供四种检查方法,分别是pip查询、conda管理、PyP... 目录引言为什么会出现兼容性问题方法一:用 pip 官方命令查询可用版本方法二:conda 管理包环境方法

Linux云服务器手动配置DNS的方法步骤

《Linux云服务器手动配置DNS的方法步骤》在Linux云服务器上手动配置DNS(域名系统)是确保服务器能够正常解析域名的重要步骤,以下是详细的配置方法,包括系统文件的修改和常见问题的解决方案,需要... 目录1. 为什么需要手动配置 DNS?2. 手动配置 DNS 的方法方法 1:修改 /etc/res

JavaScript对象转数组的三种方法实现

《JavaScript对象转数组的三种方法实现》本文介绍了在JavaScript中将对象转换为数组的三种实用方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友... 目录方法1:使用Object.keys()和Array.map()方法2:使用Object.entr

SpringBoot中ResponseEntity的使用方法举例详解

《SpringBoot中ResponseEntity的使用方法举例详解》ResponseEntity是Spring的一个用于表示HTTP响应的全功能对象,它可以包含响应的状态码、头信息及响应体内容,下... 目录一、ResponseEntity概述基本特点:二、ResponseEntity的基本用法1. 创

java中判断json key是否存在的几种方法

《java中判断jsonkey是否存在的几种方法》在使用Java处理JSON数据时,如何判断某一个key是否存在?本文就来介绍三种方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的... 目http://www.chinasem.cn录第一种方法是使用 jsONObject 的 has 方法