CVPR 2017|SfMLearner:单目视频中深度和姿态估计的无监督算法

news2024/10/6 10:34:44

🏆作者提出了一个单目相机的视频序列进行深度估计与运动估计,作者的方法是完全无监督的,端到端的学习,作者使用了单视角深度网络和多姿态网络,提出了一个图像(predict)与真实的下一帧(goundturth)计算loss,作为无监督的依据,实现无监督学习。使用KITTI数据集证明了他们的有效性:1.合成的深度图与监督学习的方法是可比的;2. 在可比较的输入设置下,姿势估计与已建立的SLAM系统相比性能优越

文章目录

    • 原理分析
    • 实施细节
    • 限制条件

image-20221228161301139

会议/期刊:CVPR2017

论文题目:《Unsupervised Learning of Depth and Ego-Motion from Video》

论文链接:Unsupervised Learning of Depth and Ego-Motion from Video (arxiv.org)

开源代码:tinghuiz/SfMLearner: An unsupervised learning framework for depth and ego-motion estimation from monocular videos (github.com)

原理分析

image-20221228161620944

SfMLearner算法的原理:

  • 利用Depth CNN对当前图像进行深度估计,得到当前图像的深度图

  • 将相邻帧(包括当前帧、上一帧、下一帧)输入Pose CNN,得到旋转矩阵R和平移矩阵T,预测相机的位姿变化

  • 将1、2得到的当前深度图和相邻帧对的R、T矩阵,计算出当前帧和下一帧的映射关系,然后将当前帧warp到下一帧

    深度学习论文中的warp是指什么?
    warp就是将一个图像上的点变换到另一张图像上

  • 最后将warp出来的图像(predict)与真实的下一帧(goundturth)计算loss,作为无监督的依据,实现无监督学习

实施细节

image-20221228103846238
  1. 将当前帧 𝐼 𝑡 𝐼_𝑡 It 输入到 Depth CNN 并预测出当前帧的深度图 D t D_t Dt

  2. 将其与邻近帧 𝐼 𝑡 − 1 𝐼_{𝑡−1} It1 𝐼 𝑡 + 1 𝐼_{𝑡+1} It+1 组成邻近帧对 { 𝐼 𝑡 , 𝐼 𝑡 − 1 𝐼_𝑡 , 𝐼_{𝑡−1} It,It1} 和 { 𝐼 𝑡 , 𝐼 𝑡 + 1 𝐼_𝑡 , 𝐼_{𝑡+1} It,It+1} 分别输入到 Pose CNN,预测出六个自由度的帧间位姿变化( r x , r y , r z , t x , t y , t z r_x,r_y,r_z,t_x,t_y,t_z rx,ry,rz,tx,ty,tz)。可以得到旋转矩阵 𝑹 和平移矩阵 𝒕。

    其中 R 为 3*3 的旋转矩阵,𝑡 = [ 𝑡 𝑥 , 𝑡 𝑦 , 𝑡 𝑧 ] [𝑡_𝑥 , 𝑡_𝑦 , 𝑡_𝑧 ] [tx,ty,tz],𝑹 和 𝒕 合成为一个 4 *4 位姿变化矩阵 𝑇 𝑡 → 𝑠 𝑇_{𝑡→𝑠} Tts
    T = ∣ R t 0 T 1 ∣ T=\left|\begin{array}{ll} \boldsymbol{R} & \boldsymbol{t} \\ \mathbf{0}^{T} & 1 \end{array}\right|{\color{Red} } T= R0Tt1

  3. 现在令 𝑝 𝑡 𝑝_𝑡 pt 为当前帧齐次像素坐标系下的坐标, 𝑝 𝑠 𝑝_𝑠 ps 为邻近 帧齐次像素坐标系下的坐标,根据 CNN 预测出的当前帧深度图 𝑫 𝑡 𝑫_𝑡 Dt 和帧间位姿 变化矩阵 𝑻 𝑡 → 𝑠 𝑻_{𝑡→𝑠} Tts,可以得到 𝐼 𝑡 , 𝐼 𝑠 𝐼_𝑡 , 𝐼_𝑠 It,Is 帧间映射关系:
    p s ∼ K T t → s D t ( p t ) K − 1 p t p_{s} \sim \boldsymbol{K} \boldsymbol{T}_{t \rightarrow s} \boldsymbol{D}_{t}\left(p_{t}\right) \boldsymbol{K}^{-1} p_{t}{\color{Purple} } psKTtsDt(pt)K1pt
    其中𝑲 为相机内参矩阵,在本文实验中相机内参矩阵 𝑲 是已知的。下面对该映射关系公式进行分析

    当前帧的像素坐标系下坐标为 p t p_t pt,首先要将坐标从像素坐标系转换到成像坐标系,成像坐标系: 𝑝 𝑡 ’ 𝑝_𝑡 ’ pt 𝑲 − 1 𝑝 𝑡 𝑲^{−1}𝑝_𝑡 K1pt,然后要将坐标从成像坐标系转换成相机坐标系,相机坐标系: 𝑝 𝑡 ’’ ∼ 𝑫 𝑡 ( 𝑝 𝑡 ) 𝑝 𝑡 ’ 𝑝_𝑡 ’’ ∼ 𝑫_𝑡 (𝑝_𝑡 )𝑝_𝑡 ’ pt’’Dt(pt)pt,即 𝑝 𝑡 ’’ ∼ 𝑫 𝑡 ( 𝑝 𝑡 ) 𝑲 − 1 𝑝 𝑡 𝑝_𝑡 ’’ ∼ 𝑫_𝑡 (𝑝_𝑡 )𝑲^{−1}𝑝_𝑡 pt’’Dt(pt)K1pt;此时坐标是三维坐标, 左乘位姿变化坐标就可以得到变换后的三维坐标: 𝑝 𝑠 ’ = 𝑻 𝑡 → 𝑠 𝑝 𝑡 ’’ 𝑝_𝑠 ’ = 𝑻_{𝑡→𝑠}𝑝_𝑡 ’’ ps=Ttspt’’;最后将变换后的三维坐标从相机坐标系转换到像素坐标系: 𝑝 𝑠 ∼ 𝑲 𝑝 𝑠 ’ 𝑝_𝑠 ∼ 𝑲𝑝_𝑠 ’ psKps,即:
    p s ∼ K T t → s D t ( p t ) K − 1 p t p_{s} \sim \boldsymbol{K} \boldsymbol{T}_{t \rightarrow s} \boldsymbol{D}_{t}\left(p_{t}\right) \boldsymbol{K}^{-1} p_{t} psKTtsDt(pt)K1pt
    image-20221228205746276

    参考链接:https://blog.csdn.net/qq_46058802/article/details/126227358

    像素坐标系:像素坐标系的原点在左上角,并且单位为像素。比如一张224*224的图片,它的原点就在左上角的地方,然后x轴长224,y轴长224

    成像坐标系:图像坐标系的坐标原点是成像平面的中心。例如:红色圈出来的区域,即是图像坐标系, 红色的原点,可以记为图像坐标系的原点

    image-20221228204245125

    相机坐标系:下图红色坐标轴表示的,即是一个相机坐标。 与世界坐标非常像,只是世界坐标的原点是固定的,而相机坐标的原点,可以是任意的相机位置

    passat_sensors_920

    😎世界坐标、相机坐标、图像坐标和像素坐标的关系:

    img

  4. 最后,得到了帧间的像素级映射关系后,我们就可以像光流一样进行帧间的 warp 操作

    image-20221228210223193

    图中当前帧 𝐼 𝑡 𝐼_𝑡 It 上的像素点 𝑝 𝑡 𝑝_𝑡 pt 可以根据预测出的深度图和位姿变化矩阵,映射到 邻近帧 𝐼 𝑠 𝐼_𝑠 Is 上的 𝑝 𝑠 𝑝_𝑠 ps 点。该映射后的点不一定会刚好映射到 𝐼 𝑠 𝐼_𝑠 Is 的像素点上,而是大概率如图中一样,映射到由 𝐼 𝑠 𝐼_𝑠 Is 上的 𝑝 𝑠 𝑡 𝑙 𝑝^{𝑡𝑙}_𝑠 pstl , 𝑝 𝑠 𝑡 𝑟 𝑝^{𝑡𝑟}_𝑠 pstr , 𝑝 𝑠 𝑏 𝑙 𝑝^{𝑏𝑙} _𝑠 psbl , 𝑝 𝑠 𝑏 𝑟 𝑝^{𝑏𝑟}_𝑠 psbr 四个像素点组成的方格里。因 此这里和 DFF 的 warp 操作一样,要用双线性插值算法,求出 𝑝 𝑠 𝑝_𝑠 ps 的值,再将此值 返回给当前帧 𝐼 𝑡 𝐼_𝑡 It 的像素点 𝑝 𝑡 𝑝_𝑡 pt,从而完成 warp 操作

限制条件

  1. 图片中没有运动的对象,场景是静态的

  2. 目标视图和源视图之间没有遮挡

  3. 表面是朗伯型的,使得光一致性误差是有意义的

    朗伯面是指在一个固定的照明角度下从所有视场方向上观测都具有相同亮度的表面,也就是反射亮度是一个常数。理想朗伯面是物体表面对入射光进行完全的反射,吸收率为0

为了提高对第一点因素(图片中没有运动的对象,场景是静态的)的抗性,作者额外训练了一个解释模型。输出一个像素级的粗糙蒙版(掩码),用来过滤掉会运动的物体,该 mask 用于 loss 计算的时候,对运动 的物体赋予一个较小的权重,对背景区域赋予一个较大的权重,以实现让网络自动屏蔽掉对场景变换估计有干扰的区域

在下图中,Pose CNN和解释模型共享前面的解码器流程,然后分别扩展到预测6-DOF相对姿势和多尺度可解释性掩码两个分支网络。经过红色网络的即是解释模型

image-20221228211454714

高亮的部分就是估计出来运动的对象,该块像素会被赋予一个比较低的权重计算loss

image-20221228211802739

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/124246.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

09---Vue使用路由

由于之前数据、主页全部放在Home.vue中,不能够实现复用,于是,现在进行拆分,拆分出数据主体(user.vue),侧边栏(aside),顶部栏(Header)&…

SpringCloudAlibaba 学习笔记

❤ 作者主页:Java技术一点通的博客 ❀ 个人介绍:大家好,我是Java技术一点通!( ̄▽ ̄)~* 🍊 记得关注、点赞、收藏、评论⭐️⭐️⭐️ 📣 认真学习,共同进步!&am…

疫情卷土重来,如何利用SRM系统打造数字化的“免疫系统”

2022年末,国内疫情再次卷土重来,形势严峻。国内企业也再次面临业务发展的压力。但实际上,在疫情常态化后,我国许多大中型企业都建立了全面的数字化“免疫系统”,增强了抗风险和跨周期的能力,大大增强了抵御…

【B站】Presto + Alluxio:B站数据库系统性能提升实践

欢迎来到【微直播间】,2min纵览大咖观点 在日常线上生产环境中有大量的数据需要被访问,为了保证数据同步以及查询效率,需要耗费较大的资源,同时,很多被查询和访问的数据是重复的,这对数据库系统造成极大压…

C++类和对象概念及实现详解(下篇)

文章目录 一、类的六个默认成员函数详解 1、拷贝构造 1、1 拷贝构造的引入及概念 1、2 拷贝构造函数的特征 2、赋值运算符重载 2、1 运算符重载 2、2 赋值运算符重载 3、普通对象取地址 4、const对象取地址 二、类和对象重点知识点 1、初始化列表 2、static成员 3、友元函数 4、…

一文带你走进MySQL索引

文章目录索引1. 索引的介绍2. 索引的本质3. 索引的结构3.1 Hash3.2 B树3.3 常见面试题之为什么用B树4. 索引的分类4.1 功能逻辑层次4.2 存储形式层次5. 索引的失效5.1 最左前缀原则5.2 索引失效的场景6. 索引常见面试题7. 总结及参考文献索引 1. 索引的介绍 索引是通过某种算…

潘多拉-视频播放器,一个轻量的视频播放器

潘多拉-视频播放器 轻量视频播放器,该项目是从https://github.com/getActivity/AndroidProject-Kotlin 中抽离出的一个视频播放器,之前没有 单独设置项目,我在使用过程中觉得这个挺方便好用的,所以为了方便使用,单独剥离出来,可以单独在项目中使用,后续我也会基于这个项目进行…

【数据结构】Leetcode旋转数组

目录 一、题目说明 二、题目解析 一、题目说明 题目链接:leetcode旋转数组 给你一个数组,将数组中的元素向右轮转k个位置,其中k是非负数。 示例1: 输入:nums [1,2,3,4,5,6,7],k 3 输出:[5,6,7,1,2,3,4…

给大家分享5款轻便小巧的好软件

随着网络信息技术的发展,越来越多的人在办公时需要用到电脑了。如果你想提高办公效率,那么就少不了工具的帮忙,今天给大家分享5款办公必备的好软件。 1.开源分享工具——ShareX ShareX 是一款 Windows 上开源的截图、文件共享和生产力工具&…

IB 生申请德国大学的条件

Hallo! 你是IB生吗?是否有去德国读大学的意愿?来看看IB生申请德国大学的条件吧~ 01IB课程简介 IB课程包括六个学科组,其中一个必须从 IBO 指定的第 1 到第 5 个科目组中选修,另外还有一个可选科目,可以从六个科目组中选…

华为智能基座【计算机组成原理】

华为智能基座【计算机组成原理】前言推荐华为智能基座实验1 基于QEMU的鲲鹏开发环境搭建1.1 QEMU的安装配置1.1.1 QEMU下载安装1.1.2 环境变量配置1.2 openEuler操作系统安装1.2.1 环境准备1.2.2 openEuler虚拟机创建1. 打开虚拟机2. 修改串口并登录1.3 网络配置1.3.1 参数设置…

骨传导耳机到底好不好用,五款好用的骨传导蓝牙耳机分享

很多人刚接触骨传导耳机,都会有一个疑问,骨传导耳机到底好不好用,下面我就为大家解答疑惑,骨传导耳机开放式的佩戴方式,更加舒适,使用更加安全,在平常使用都是很好用的,还不知道选择…

JAVA生成二维码QRcode

JAVA生成二维码QRcode1 : 配置集成1.1、配置maven1.2、配置文件1.3、logo文件2 : 代码集成2.1、加载配置文件2.2、工具类2.3、测试类3 : 测试结果3.1、生成二维码3.2、扫描结果3.3、资源1 : 配置集成 1.1、配置maven pom文件中添加一下配置 <!-- QR code --> <depe…

立根铸魂 崛起数智时代 欧拉部署超300万套

操作系统产业峰会2022于12月28日在线上举办。本次峰会由开放原子开源基金会、中国软件行业协会、CCF&#xff08;中国计算机学会&#xff09;开源专委会、绿色计算产业联盟、中关村科学城管委会共同主办&#xff0c;以“立根铸魂 崛起数智时代”为主题&#xff0c;汇聚全产业链…

Day842.Future -Java 并发编程实战

Future Hi&#xff0c;我是阿昌&#xff0c;今天学习记录的是关于Future的内容。 ThreadPoolExecutor 的 void execute(Runnable command) 方法&#xff0c;利用这个方法虽然可以提交任务&#xff0c;但是却没有办法获取任务的执行结果&#xff08;execute() 方法没有返回值&…

Java Web高级面试题(二)

✅作者简介&#xff1a;热爱国学的Java后端开发者&#xff0c;修心和技术同步精进。 &#x1f34e;个人主页&#xff1a;Java Fans的博客 &#x1f34a;个人信条&#xff1a;不迁怒&#xff0c;不贰过。小知识&#xff0c;大智慧。 &#x1f49e;当前专栏&#xff1a;Java面试题…

总体分布、样本分布、抽样分布的区别

总体分布、样本分布、抽样分布的区别 参考自&#xff1a;THREE DISTRIBUTIONS 1.总体分布 The population is the whole set of values, or individuals, you are interested in. The population which consists of a set of scores (5, 6, 7, 8) which distribute around a …

比Hive还快10倍的大数据计算引擎

最近几年&#xff0c;Presto这个大数据组件越来越多地出现在程序员的岗位需求中&#xff0c;很多应届同学一番自我检查后发现&#xff0c;在学校都没怎么接触过&#xff0c;更不用说了解了。 某游戏公司岗位需求 Presto到底是个啥&#xff1f; 有什么用&#xff1f; 适合哪些…

月薪9K!前台测试男生偷偷努力,工资翻倍转行5G网络优化工程师,“卷死”所有人!

你是否有过这样的生活&#xff1f; 每天重复着外场测试&#xff0c;抱着电脑&#xff0c;手机在户外验证基站信号;长期的出差&#xff0c;频繁的更换城市;每个月领着3500块钱的工资&#xff0c;可能再工作2-3年会涨到4000元&#xff0c;技术也不可能有任何的突破。生活重复单调…

Ubuntu 上安装conan + Cmake

目录 1. 在用户目录下创建共享目录&#xff0c;然后将共享目录挂载到上去 2. 安装新版本的cmake 3. 安装conan 4. 配置CONAN环境 5. 配置conan的访问服务器URL 6. Linux 平台需要切换gcc编译器版本为c11以及version 7. 安装opengl开发库 1. 在用户目录下创建共享目录&…