2020.10.14重读 PVNet:Pixel-wise Voting Network for 6DoF Pose Estimation

PVNet是一种两阶段的6自由度(6DoF)姿态估计方法,它首先通过像素级预测关键点的方向,然后利用RANSAC投票找到关键点位置。这种方法证明了比端到端方法更具优势,特别是在处理遮挡和不可见关键点时。此外,通过引入不确定性到PnP公式中,提高了位姿估计的准确性。网络采用单位矢量场表示方向特征,并使用密集预测和投票策略来增强对目标局部特征的关注。尽管舍弃了向量大小信息,但简化了学习和优化过程。实验表明,PVNet在实例分割和关键点定位方面表现出色。

1.背景信息

  1. 输入单张RGB图像
  2. 隔壁实验室的成果
  3. 最大的亮点:
    (1)证明了两阶段(先求关键点再用PnP求解位姿)比end to end的方法具有优势。直接求解非线性旋转空间,会带来优化上的困难。
    (2)使用unit vector filed来表示方向特征,这被证明是更利于学习和优化的。这里没有用offset,失去了特征大小信息,我觉得是个可以改进的地方。
    (3)使用dense的方法,pixel-wise预测unit vector,并且用基于RANSAC的投票方法进行投票。
    (4)改进的PnP,在PnP公式中引入了不确定性,协方差矩阵,使得位姿估计更准确。

2.方法

在这里插入图片描述
在这里插入图片描述

2.1基于投票的关键点定位

预测逐像素方向的好处:
增强网络关注更多目标局部特征的能力
可以表示优于遮挡和截断不可见的关键点

流程:

  1. 预测每个点相对于第k个关键点的vector:
    在这里插入图片描述
    这里的 x k x_{k} xk显然是最本质的预测值。

  2. 对第k个关键点,随机选择所在目标中的两个点p1,p2,计算 v k ( p 1 ) v_{k}(p1) vk(p1) x k ( p 2 ) x_{k}(p2) xk(p2)方向的交点,将其记为假设 h k , i h_{k,i} hk,i,这样进行N次,就可以得到一个假设集:在这里插入图片描述
    这个假设集中就包含了可能的关键点位置,这是RANSAC方法在这里的应用。

  3. 对每个假设 h k , i h_{k,i} hk,i计算投票分数 w k , i w_{k,i} wk,i
    在这里插入图片描述
    我个人的理解,并举了个例子:
    在这里插入图片描述

  4. 计算第k个关键点预测假设的统计量
    在这里插入图片描述
    关键点选择:FPS,K=8
    **handle多个实例:**语义分割+中心点预测=实例分割

2.2不确定性驱动的PnP

PnP+confidences:
在这里插入图片描述
这个公式添加了协方差矩阵,考虑了信息的不确定性。

原始PnP公式:
在这里插入图片描述

3.实现细节

在这里插入图片描述
FCN具体实现:
在这里插入图片描述
具体有三点不同,我没细究。
训练loss:
在这里插入图片描述
实验结果略。

4.读后感

1. 应该将一些公认测试有效的好的模块和思想集成起来,以期待得到更好的效果。
2. PVNet用的unit vector只取方向信息,而忽略了向量大小的信息。虽然理论上多加信息会有助于性能提升,但是作者这样选择,有可能是加了向量大小的信息在实现上性能会退化。
3. 输出 H ∗ W ∗ ( K ∗ 2 ∗ C ) H*W*(K*2*C) HW(K2C),这里将C引入的原因是这个预测vector的分支还没有接受到语义信息,个人猜想将语义分割的结果引入到vector预测中会提升性能。

在使用 Caffe 进行模型训练时,如果遇到如下错误: ``` [libprotobuf ERROR ...] Error parsing text-format caffe.SolverParameter: 25:1: Expected identifier, got: - ``` 这表明 Caffe 在解析 `solver.prototxt` 文件时遇到了语法问题,具体在文件的第 25 行第 1 列。此类错误通常由配置文件格式不规范或字段不兼容引起。 ### 错误原因分析 - **非法字符或格式错误**:在 `solver.prototxt` 文件中,如果某一行以非法字符(如 `-`)开头,或者字段名称拼写错误,会导致解析失败。例如,误将 `base_lr` 写成 `-base_lr`,这会导致 Caffe 无法识别该字段,并报 `Expected identifier, got: -` 的错误 [^1]。 - **缩进格式不一致**:Protobuf 配置文件对缩进敏感,若使用了不一致的缩进方式(如混用空格和 Tab),也可能导致解析失败 [^1]。 - **注释导致解析失败**:Caffe 的 `prototxt` 文件不支持注释(如 `#` 或 `//`),任何注释内容都会导致解析失败 。 - **字段名称使用了不支持的标识符**:某些字段可能在当前 Caffe 版本中不支持,例如 `lr_policy` 的某些新选项,或使用了错误的优化器类型(如 `type: "UnknowOptimizer"`)。 - **路径或文件名错误**:若 `solver.prototxt` 文件路径不正确,或文件名拼写错误,也可能导致 Caffe 无法正确读取配置文件 [^1]。 ### 解决方案 1. **检查字段拼写与格式** 确保 `solver.prototxt` 文件中的字段名称拼写正确,且格式规范。例如: ```protobuf base_lr: 0.001 momentum: 0.9 weight_decay: 0.0005 ``` 避免出现如下错误格式: ```protobuf -base_lr: 0.001 # 错误:以 '-' 开头 ``` 2. **统一缩进格式** 确保所有行的缩进使用相同的格式(推荐使用 2 或 4 个空格),避免混用空格和 Tab [^1]。 3. **移除注释内容** 删除 `prototxt` 文件中的所有注释内容,如 `#` 或 `//`,以避免解析失败 。 4. **确认字段值合法** 确保所有字段值在 Caffe 中有定义,如 `type` 字段应使用合法的优化器类型(如 `"SGD"`、`"Adam"`)。 5. **验证文件路径** 检查命令行参数中 `--solver` 指向的文件路径是否正确。例如: ```bash caffe train --solver=X:\Deep_Learning\_1.PalmVein\3.caffe_train\PvNet\solver-only10.prototxt ``` 6. **检查 Caffe 与 Protobuf 兼容性** 若使用了非官方 Caffe 分支(如 Faster R-CNN 的定制分支),需确保其支持所有使用的层和参数。某些分支引入了自定义层(如 `roi_pooling_layer`),若在主分支中运行,会导致解析失败 [^3]。 7. **统一 Python 文件编码与缩进(如涉及 PyCaffe)** 若使用了自定义 Python 层(PyCaffe),需确保 Python 文件的缩进格式统一,且编码为 UTF-8。混用 Tab 和空格可能导致 Caffe 在加载模型时失败 [^1]。 ### 示例修复 假设 `solver.prototxt` 中存在如下错误内容: ```protobuf -base_lr: 0.001 # 注释导致解析失败 momentum: 0.9 ``` 修复后应为: ```protobuf base_lr: 0.001 momentum: 0.9 ``` ### 总结 此类错误通常由配置文件格式不规范或字段不兼容引起。建议逐步排查上述可能原因,确保配置文件语法正确、字段合法,并与当前 Caffe 版本兼容。
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值