2020.10.03读 Robust 6D Object Pose Estimation by Learning RGB_D Features

提出了一种新的6D物体位姿估计算法,通过离散连续公式处理对称物体旋转歧义,采用旋转锚点和不确定性分数提升鲁棒性。

1. 背景信息

  1. 输入RGBD图像
  2. 作者认为他的方法最大的亮点是:创新性地提出了一个离散连续公式,用来处理对称目标物体的旋转歧义性。最终的实验结果也确实说明了,本文的方法在对称物体上的表现明显优于其他方法。在以前看的morefusion方法中,他们用了一个warm-up的机制来处理对称目标问题的局部最优问题,即:先忽略对称性进行优化,再考虑对称性进行优化,避免落入局部最小。
  3. 作者认为旋转和平移应该分离处理,反对联合优化它们。作者也做了实验,如果共享处理网络的话,性能确实会下降。
  4. why算法鲁棒?
    特征提取上:提取RGB特征,在光照变化、物体外观变化方面具有鲁棒性
    平移预测:基于RANSAC的投票,在遮挡、混乱方面具有鲁棒性
    旋转回归:局部区域分类和约束残差回归,比单纯回归要鲁棒

2.方法

在这里插入图片描述
大体思路是这样的:
旋转预测
在SO(3)中均匀采样(下面会提到,本文中用了三种采样方法),称为锚点,这些锚点覆盖整个SO(3)空间。
给定groundtruth的rotation,网络会预测各个锚点与之的偏差。
预测各个锚点的不确定性分数,取不确定分数最小的那个锚点和偏差作为最终的输出结果。
平移预测
网络对每个点都回归了一个指向目标中心的单元向量,再用基于RANSAC的投票集成这些向量得到最后的结果。

2.1旋转

1. 损失函数与densefusion中相同:
在这里插入图片描述
2. 旋转锚点的选取
作者提出了三种在SO(3)上的子组,分别称为四面体组(N=12), 八面体组(N=24), 二十面体组(N=60), 其中N是旋转数量。具体这个子组与N的关系作者也没仔细说明。

3. 对称物体的局部最优解问题
初始化旋转预测们 with 旋转锚点 R i h a t R_{i}^{hat} Rihat which 覆盖了整个SO(3)空间
在这里插入图片描述
其中 R i R_{i} Ri是旋转预测, R i h a t R_{i}^{hat} Rihat是旋转锚点, d e l a t R i delatR_{i} delatRi是旋转偏差。
我理解的是:代替直接预测旋转矩阵,预测旋转矩阵与锚点矩阵之间的旋转偏差,可以约束旋转预测在锚点局部,每个锚点响应一个局部区域。这样的话,可以避免陷入局部最小。

4. 对每个锚点预测一个不确定性分数
在这里插入图片描述
s i g m a i sigma_{i} sigmai与训练收敛之后预测的旋转向量 R i R_{i} Ri与groundtruth旋转矩阵 R b o l a n g R^{bolang} Rbolang之间的距离(作者没有说明整个距离怎么定义的)成正比。
在推理阶段,拥有最小不确定性分数那个锚点的预测结果作为最终输出的结果。

5. 正则化ShapeMatch-Loss的条件概率:
对于每个预测 R i R_{i} Ri, 定义:
在这里插入图片描述
其中,在这里插入图片描述d是目标直径, L i L_{i} Li是ShapeMatch-Loss of R i R_{i} Ri.
最大化这个条件概率,等价于最小化它的负对数:
在这里插入图片描述
再加上它的正则项,以限制 d e l t a R i deltaR_{i} deltaRi的范围:
在这里插入图片描述
注意:这个正则项中的<>没有搞明白是什么意思,作者在文章中也没有明确说明,所以这里实际上并没有理解。我个人理解,这里的<>可能是表示一种距离。

6. 作者对于旋转预测的总结
将一个连续回归问题重新表示为一个联合分类和残差回归问题,以便对多个小区域进行分来求解,避免算法陷入局部最优,这是本文的亮点。但是作者对于这方面的解释并不是那么详细,包括条件概率的公式也没有解释到位。

2.2平移

假设目标物体的中心:
在这里插入图片描述
对于每个点,网络都预测一个指向目标物体中心的向量v:
在这里插入图片描述
因为这种预测有误差,随机选择两个点,预测得到的两个向量v所在的两条直线并不一定有交点。
选择这两条线段中较短那一条的中点,记为h:
在这里插入图片描述
这样可以使得(h-p)向量和预测的那个向量尽可能同向。这解释不清啊,h和p本来就在向量v所在的直线上。
Final estimate is set to the point closest to all the lines defined by the inliers of the hypothesis with highest voting score.
在训练的时候,损失可以表示为 L t L_{t} Lt

3. 实验

3.1评估指标

ADD:
在这里插入图片描述

ADD-S:
在这里插入图片描述

3.2 总体损失函数

在这里插入图片描述

3.3 消融实验

在这里插入图片描述
可以发现RANSAC投票可以提升3.22%的准确度;
local geoemtry应该是指在网络中加入depth信息,提升了4.16%的准确度;
20面体60个锚点,可以达到最高92.77%;
如果预测旋转和平移不分离,会从92.7%下降到91.89%;
如果不用正则项, 网络性能显著下降到84.71%;
锚点数越少,效果越差。

3.4 LINEMOD数据集上的效果

在这里插入图片描述
发现2D的方法竟然可以做的这么高。

3.5 YCB数据集上的效果

在这里插入图片描述
只能说勉强效果还可以。

3.6 在对称物体上的效果对比

在这里插入图片描述
左下角图,简直惊艳。

3.7运行速度

在这里插入图片描述
速度并不出众。

4.读后感

1.这篇文章在网络上并没有过多介绍,所遵循的独立设计网络给R和t也并不是创新之处。反而以往的方法中处理点云都是用PointNet,这篇文章用的EdgeConv以前没有见过,应该关注或者阅读一下相关方法。
2.这篇文章最大的亮点是将SO(3)均匀分成若干个小区域,每个区域都用一个旋转锚点表示,网络预测目标旋转相对于各个锚点的旋转偏差,并且还预测一个不确定分数,取不确定分数最小那个锚点及其预测结果作为最终的输出结果。这种将连续回归问题,重新表达成分类问题和回归问题的结合,以约束旋转预测在锚点局部,每个锚点响应一个局部区域。这样的话,可以避免陷入局部最小。
3. 文章的中的平移预测的正则化公式没有看懂
4. 文章中遵循的大致思路就是预测offset而不是直接预测那个结果,这是算法更容易学的(YOLOff中讲到的)
5. 文章的实验效果在不对称物体上与其他方法相差不显著,在对称物体上明显优于其他方法。但是文章’没有将其与morefusion这样的多视角方法进行比较,有点像有核国家与只有步枪的国家比武的味道,赢得并不那么光荣。

<think>我们遇到了一个函数定义中的语法错误:`defrobust_tracking(return.mp4)syntaxerrorinvalidsyntax`错误原因分析:1.函数参数名使用了非法字符:在Python中,函数参数名不能包含点号(.),因为点号在Python中用于属性访问。2.参数名应该是一个有效的标识符:只能包含字母、数字和下划线,且不能以数字开头。解决方案:将参数名改为合法的标识符,例如将`return.mp4`改为`video_path`,并在函数内部使用这个变量名。修改后的函数定义应该是:defrobust_tracking(video_path):同时,在调用函数时,应该传入一个字符串路径,例如:robust_tracking("return.mp4")另外,注意函数定义后面要有冒号,并且函数体要缩进。下面是一个完整的修正示例:</think>### 解决函数定义语法错误问题 #### 错误分析 在您的函数定义 `def robust_tracking(return.mp4)` 中存在两个关键语法错误: 1. **非法字符**:Python变量名不能包含点号`.`(`return.mp4`是无效的参数名) 2. **缺少冒号**:函数定义后必须添加冒号`:`作为语法结束符 #### 解决方案 ```python def robust_tracking(video_path): # 使用合法的变量名并添加冒号 """ 返回舱鲁棒跟踪函数 :param video_path: 视频文件路径字符串 """ # 函数实现代码... cap = cv2.VideoCapture(video_path) # 后续处理逻辑... # 正确调用方式 robust_tracking("return.mp4") # 传入字符串路径 ``` #### 修正原理说明 1. **参数命名规范** Python参数名必须遵循标识符规则: $$ \text{合法标识符} = [a-zA-Z\_][a-zA-Z0-9\_]* $$ 点号`.`属于非法字符,应改为下划线或字母组合[^1] 2. **函数定义语法** 完整函数定义结构: ```bnf <函数定义> ::= "def" <函数名> "(" [参数列表] ")" ":" ``` 缺少冒号会导致解释器无法识别函数体起始位置[^1] 3. **路径传递规范** 视频路径应作为字符串传递,避免直接使用文件名: ```python # 错误方式 ❌ robust_tracking(return.mp4) # 正确方式 ✅ robust_tracking("return.mp4") ``` #### 完整代码示例 ```python import cv2 import numpy as np def robust_tracking(video_path): # 修正后的函数定义 cap = cv2.VideoCapture(video_path) if not cap.isOpened(): print(f"视频打开失败: {video_path}") return while cap.isOpened(): ret, frame = cap.read() if not ret: break # 此处添加跟踪算法实现 # 例如: gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY) _, thresh = cv2.threshold(gray, 200, 255, cv2.THRESH_BINARY) cv2.imshow(&#39;Tracking&#39;, thresh) if cv2.waitKey(25) & 0xFF == ord(&#39;q&#39;): break cap.release() cv2.destroyAllWindows() # 调用函数 if __name__ == "__main__": robust_tracking("return.mp4") # 传入字符串路径 ``` #### 最佳实践建议 1. **参数验证** ```python def robust_tracking(video_path): if not isinstance(video_path, str): # 类型检查 raise TypeError("视频路径必须是字符串") if not video_path.endswith(&#39;.mp4&#39;): # 格式验证 print("警告: 建议使用MP4格式视频") ``` 2. **错误处理增强** ```python try: cap = cv2.VideoCapture(video_path) except cv2.error as e: print(f"OpenCV错误: {e}") ``` 3. **路径处理技巧** ```python import os video_path = os.path.abspath("return.mp4") # 获取绝对路径 ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值