【6D位姿估计】ZebraPose 层次化分组策略 由粗到细的表面编码

前言

本文介绍6D位姿估计的方法ZebraPose,也可以称为六自由度物体姿态估计,输入单张图片,输出物体的三维位置和三维方向。

它来自CVPR2022的论文,通过层次化分组策略,高效地编码物体表面的信息。

ZebraPose提出了一种从粗糙到精细的训练策略,使得模型能够预测更为精细的2D-3D对应关系。

论文地址:ZebraPose: Coarse to Fine Surface Encoding for 6DoF Object Pose Estimation

代码地址:https://github.com/suyz526/ZebraPose

 一、核心创新点——层次化分组

ZebraPose通过层次化分组,将物体分为多组,逐渐细化,精准表达物体表面信息。

如下图所示,一物体的CAD模型,采用逐渐层次化分组,将物体表面分为2、4、8。

  • 使用二进制编码,来标识3D模型的每一个顶点。
  • 这种编码为模型的每个表面顶点赋予一个唯一的标识符,编码的每个部分代表了模型的一个特定面
  • 红线标出的编码“0110”对应于模型上的一个特定特征。
  • 通过这种方法,每个顶点的表面属性可以被精确地编码和学习,而无需复杂的几何处理。

  • 这种编码策略通过深度神经网络来学习,使每个顶点的表面都有一个唯一的对应编码,从而实现精确的姿态估计。
  • 这种密集的编码策略有助于在存在遮挡的情况下进行更准确的姿态估计,因为即便部分顶点被遮挡,其他顶点的编码仍然可以为姿态估计提供信息。 

二、模型框架

模型的框架结构,如下图所示。

  1. 输入单张图像,普通的彩色图片,即RGB图片。
  2. 通过2D检测器,检测物体所在区域,得到ROI区域图像。
  3. 将物体所在区域,送入到编码器-解码器中提取图像特征。
  4. 预测出多组编码特征,这是2D图像编码,对应于3D表面编码表中的编码,用于匹配2D图像和3D模型之间的对应点。
  5. 结合2D图像编码和3D表面编码表,进行对应点匹配;实现2D图像中的点与3D模型中的顶点匹配。
  6. 输出位姿信息,使用RANSAC和PnP来估计物体的姿态,三维方向R和三维位置t。

关键点:

  • 表面编码方法:提出了一种从粗到细的表面编码方法,这种方法不仅为每个顶点分配了一个高效的密集顶点描述符,还充分利用了计算机视觉任务中常用的传统异常值过滤器。
  • 层次化训练损失:采用了一种新颖的层次化训练损失和策略,自动地调整训练过程,以更有效地处理密集的2D-3D对应关系的预测。

三、深入分析——层次化学习策略

  • 采用了一种层次化学习策略,初期重点是大范围的粗略区域,随后逐渐细化到更精确的位置。
  • 这种方法利用了多标签分类问题的策略,提高了学习的效率和精度。
  • 这种分层的学习策略允许模型在早期阶段快速学习大致的结构,然后逐步细化到具体的表面细节,这有助于提高整体的学习速度和精度。

模型层次化分组,如下图所示:

1)物体顶点编码方式

  • 使用二进制数对每个顶点进行编码,vi​表示CAD模型的一个顶点, ci​ 为该顶点的编码
  • ci​ 属于N^{d},其中d是编码的长度。
  • 通过这种编码方式,可以将顶点属性简化为一个数值序列,便于后续的处理和分组。

2)分组迭代

  • 首先将所有顶点分为一个初始组 G0​。
  • 随后进行d次迭代分组,每次迭代都将前一次的组进一步细分,每个组被分成r^{j}个小组(𝑟是基数设置为2,𝑗是当前的迭代次数)
  • 即每个组被分成2^{j}个小组,1,2,4,8,16,32,64等等。
  • 这种分组策略使得每个顶点都能逐渐被划分到越来越具体的小组中

3)顶点分类

  • 在每次迭代中,每个顶点都根据其所在的组被赋予一个类别标签 𝑚𝑖,𝑗,其中 𝑚𝑖,𝑗是一个0到1的二进制数。
  • 这个过程从全局到局部逐步精细化顶点的分类。

4)顶点编码生成

  • 最终,每个顶点的编码 ci​ 是通过叠加每次迭代中顶点的类别标签来生成的,形成一个包含d位的编码。
  • 这种编码策略的应用在构建2D-3D对应关系和解决姿态问题中。
  • 其中,使用k-means算法进行分组,以及利用每个组的质心来进一步构建2D-3D对应关系,这是进行姿态估计的关键步骤。

总结 :

  • 这种从粗到细的表面编码方法非常适合处理复杂的3D对象表面,它通过分层精细化的方式允许算法逐步识别和适应对象的细节特征。
  • 此外,这种方法在处理大规模顶点数据时能够提高处理速度和准确性。
  • 在学习过程中,粗略级别的编码会被共享到更广泛的物体区域,而当网络学会区分这些粗略分割后,会集中在更细的位置编码上。
  • 这种策略确保了学习过程的高效性,并最终实现了对细粒度表面对应关系的精确预测。

四、3D模型中顶点类别ID渲染到2D图像

在3D对象的每个顶点上,通过先前描述的层次化分组方法,网络为每个顶点预测一个类别ID。

在训练期间,这些3D顶点的类别信息需要被映射到2D图像平面上,以便网络可以学习从2D图像预测3D顶点类别的关系。

  • 3D模型中顶点类别ID渲染到2D图像

    • 渲染过程包括将3D模型中顶点的类别ID转移到2D图像中对应的像素上。
    • 为了实现这一点,需要模型预测一个的姿态,来将3D信息投影到2D平面。
    • 对于3D模型的每个面(由顶点组成),如果面的两个顶点拥有相同的类别ID,则该面被赋予这个类别ID。
    • 如果顶点的类别ID不同,则选择第一个顶点的类别ID作为整个面的类别。
  • 迭代渲染过程

    • 这个过程需要重复d次,对应于在顶点编码中提到的每一层分组。
    • 每个分组迭代都有自己的一组类别ID,这些ID需要被独立地渲染到2D图像上。
    • 这种方法确保了训练数据中类别标签的一致性和准确性,允许网络学习如何从2D图像有效地推断出对应3D顶点的精确类别。

五、模型细节设计

  • 详细模型参数: 
  1. 类别数量匹配:为了和DPOD方法保持一致,实验首先通过每个面的中点细分来上采样网格,直到顶点数量超过256²,以确保类别数K=256²。

  2. 顶点分组:使用二进制编码(基数𝑟=2,深度𝑑=16)对3D模型的顶点进行分组。通过多次迭代分组,直到不能再细分为止。为了解决分组大小不均匀的问题,采用改进的k-means++聚类算法确保输出组的点数均匀。

  3. 网络架构调整:使用修改过的DeepLabv3作为主干网络,增加了跳跃连接以提高特征传递效率。同时,调整了ROI至256x256x3的形状,并设置CNN输出的分辨率为128x128。

  4. 训练细节:应用动态缩放策略生成噪声ROI,用于训练阶段。此外,设置层次化损失的参数σ=0.5 和α=3,以平衡掩码和顶点编码预测的训练。

  5. 优化器和训练周期:使用Adam优化器,批量大小为32,学习率为0.0002,总共训练了380k步。

  6. 在推理阶段:使用Faster R-CNN和FCOS检测的边界框来提取ROI。

  • 网络架构和输出

    • 网络采用编码器-解码器架构,可以生成d+1 个输出,其中 d 代表二进制顶点编码的长度,额外的一个输出用于预测物体的可见性掩模(object mask)。
    • 这样的设计允许网络同时学习顶点编码和物体的边界,有助于更精确地估计姿态。
    • 输出的概率值在网络的最终阶段被四舍五入,从而表示离散的顶点编码,这一步骤是为了从网络预测中得到清晰的分类结果。
  • 训练数据的渲染

    • 利用物体姿态标注,训练标签被渲染为分层的黑白图,这些图对应于图像坐标中的位置。
    • 这种方法确保了每个像素点都有一个明确的顶点编码,以及一个指示该点是否属于物体的二进制掩模。
    • 这些分层标签(d 个顶点编码层加上一个可见性掩模层)为网络提供了必要的地面真值(ground truth),使其能够有效学习如何将2D图像映射到3D顶点上。
  • 区域兴趣(ROI)处理

    • 网络训练和预测集中于图像中检测到的物体的ROI。
    • 通过使用现有的2D检测器确定ROI,然后将这些ROI裁剪并调整到固定的维度H×W。
    • 这种处理方式确保了网络只关注物体本身,减少了背景噪声的干扰,同时也减小了处理的数据量,提高了运算效率。

六、模型效果

 使用二进制顶点编码进行3D顶点预测,在LM-O数据集测试,看一下实验分析:

a) 二进制顶点编码的可视化和错误示例

  • 左边图顶部行展示了钻机模型上一个特定的顶点(黄点),这个顶点有一个预定的二进制编码(例如000)。
  • 如果预测的编码错误(例如100,如红色标记所示),那么黄点的位置会错误地估计在钻机的头部(蓝色标记位置),远离其原始相邻位置。
  • 这显示了二进制编码预测的敏感性和精确性,即一个小的错误(一个位的错误)可能导致顶点位置的显著偏差。

b) ADD评分的比较

  • 中间图显示了不同位数(从6位到16位)在二进制顶点编码中用于推断时的ADD得分。
  • 得分越高,表示姿态估计的精度越高。
  • 可以看出,随着位数的增加,大部分对象的ADD得分逐渐趋于稳定,这表明更多的位数能提供更精确的3D顶点预测。

c) 不同位位置的平均错误率

  • 右侧图展示了LM-O数据集上不同位位置的平均错误率。
  • 图中显示,随着位数的增加,错误率逐渐减少并趋于稳定,这反映了更高位在编码中的增加对于准确性的贡献。

“鸭子”模型在LM-O数据集中的二进制顶点编码,可视化以及预测姿态的实际效果

LM-O数据集的检测效果:

与 YCB-V数据集上进行比较。以 % 为单位报告 ADD(-S) 的平均召回率,并与最新成果进行比较。

(*) 表示对称对象,(-) 表示原始论文中缺失的结果。

YCB-V数据集的检测效果:

分享完成~

本文先介绍到这里,后面会分享“6D位姿估计”的其它数据集、算法、代码、具体应用示例。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

运维自动化之 ansible

目录 一 常见的自动化运维工具 (一)有哪些常见的 自动化运维工具 (二)为什么后面都变成用 ansible 二 ansible 基本介绍 1, ansible 是什么 2,ansible能干什么 3,ansible 工作原…

Linux网络—PXE高效批量网络装机

目录 一、部署PXE远程安装服务 1、搭建PXE远程安装服务器 1)安装并启用 TFTP 服务 2)安装并启用 DHCP 服务 3)准备 Linux 内核、初始化镜像文件 4)准备 PXE 引导程序 5)安装FTP服务,准备CentOS 7 安…

OpenCV 入门(一) —— OpenCV 基础

OpenCV 入门系列: OpenCV 入门(一)—— OpenCV 基础 OpenCV 入门(二)—— 车牌定位 OpenCV 入门(三)—— 车牌筛选 OpenCV 入门(四)—— 车牌号识别 OpenCV 入门&#xf…

Springboot框架web开发实用功能-02

在些模块中汇总了一些web开发常用的配置和功能。 涉及的模块 springboot-common-config, 端口号:17000 Springboot框架web开发常用功能 Restful接口定义 查询参数 Data public class QueryParam {private String key;private String value; }Control…

MATLAB实现杜拉德公式和凯夫公式的计算固液混合料浆临界流速

MATLAB实现杜拉德公式和凯夫公式的计算固液混合料浆临界流速: 杜拉德公式是用来计算非均质固液混合料浆在输送管中的临界速度的公式,具体形式为: uL FL (2gD / (ρ0 - ρ1))^(1/2) 其中: uL:表示料浆的临界速度,…

Hbase 常用shell操作

目录 1、创建表 1.1、启动HBase Shell 1.2、创建表 1.3、查看表 1.4、删除表 2、插入数据 2.1、put命令 3、查看数据 3.1、get命令 3.2、查询数据中文显示 4、更新数据 4.1、使用put来更新数据 5、删除数据 5.1、delete命令 5.2、删除指定列的数据 5.3、delete…

Pycharm debug 运行报错 (RuntimeError: cannot release un-acquired lock)

问题描述: 最近再跑一个 flask应用,Pycharm 运行没问题,debug断点启动时报错 如下: 解决方案: 在环境变量中增加 GEVENT_SUPPORTTrue 启动成功!

libcity笔记:添加新模型(以RNN.py为例)

创建的新模型应该继承AbstractModel或AbstractTrafficStateModel 交通状态预测任务——>继承 AbstractTrafficStateModel类轨迹位置预测任务——>继承AbstractModel类 1 AbstractTrafficStateModel 2 RNN 2.1 构造函数 2.2 predict 2.3 calculate_loss

博客系统项目测试报告

文章目录 一.报告概要二.测试环境三.手工测试用例四.编写测试用例五.自动化测试Selenium测试项目主要特点 一.报告概要 项目概要 本项目是一个全功能的个人博客系统,旨在提供一个用户友好、功能全面的平台,允许用户注册、登录、浏览博客、查看详细内容、…

Mac跑llama.cpp过程中遇到的问题

原repo 在华为手机上安装termux、下载库:顺利在电脑上安装Android NDK:先下载Android Studio,再在里面下载Android SDK 安装Android Studio时,SDK的某些组件总是下载不成功。后来关了梯子、改了hosts,重新安装就成功了…

Golang | Leetcode Golang题解之第73题矩阵置零

题目&#xff1a; 题解&#xff1a; func setZeroes(matrix [][]int) {n, m : len(matrix), len(matrix[0])col0 : falsefor _, r : range matrix {if r[0] 0 {col0 true}for j : 1; j < m; j {if r[j] 0 {r[0] 0matrix[0][j] 0}}}for i : n - 1; i > 0; i-- {for …

Go实现树莓派控制舵机

公式说明 毫秒&#xff08;ms&#xff09;是时间的单位&#xff0c;赫兹&#xff08;Hz&#xff09;是频率的单位&#xff0c;而DutyMax通常是一个PWM&#xff08;脉冲宽度调制&#xff09;信号中表示最大占空比的值。以下是它们之间的关系和一些相关公式&#xff1a; 频率&…

【华为】路由策略小实验

【华为】软考中级-路由策略实验 实验需求拓扑配置AR1AR2需求1需求2 AR3 检验 实验需求 1、让 R3 可以学到R1的 192.168.10.0/24和192.168.20.0/24的 路由&#xff0c;不能学到192.168.30.0/24。 2、让 R1可以学到 R3 的 172.16.20.0/24和172.16.30.0/24的路由&#xff0c;不能…

opencv图像处理详细讲(二)

联通组件分析 联通组件定义&#xff1a;像素值相同&#xff0c;通过四邻域或者八邻域相互连通的像素块。 换句话说&#xff0c;就是使用四邻域或八邻域的连通性&#xff0c;遍历图像的像素&#xff0c;并确定像素值相同并且连通的像素块&#xff0c;将它们标记为一个联通组件 两…

虚拟机VM VirtualBox安装openEuler+UKUI的安装和卸载_2024

虚拟机VM VirtualBox安装openEuler ps. 建议先看最后的其他 下载openEuler openEuler官网下载 一般来说标准版就够用了 使用虚拟机VM VirtualBox安装openEuler 新建虚拟机 修改用户名密码&#xff0c;建议修改&#xff0c;虽然之后还可以通过命令行修改&#xff08;注意密…

pyecharts绘制世界动态轨迹图(v0.5.X与v1.X版本对比)

一、问题引入 pyecharts官网&#xff1a;https://pyecharts.org/#/zh-cn/intro 在使用Geo或者GeoLines绘制动态轨迹图时&#xff0c;如果所选地区是中国的省份或者城市&#xff0c;是能够匹配到对应的经纬度并且正常绘制的&#xff1b;如果所选地区涉及到其他国家或者国外城市&…

Docker-harbor

一、搭建本地私有仓库 1.1 下载Registry镜像 1.2 添加本地私有仓库配置 1.3 重启服务并运行Registry容器 1.4.容器的操作 1.4.1 拉取Nginx镜像并为镜像打标签 1.4.2 上传到私有仓库 1.4.3 列出私有仓库所有镜像 1.4.4 列出私有仓库的镜像的所有标签 1.4.5 先删除原有…

Anaconda删除虚拟环境目录pkgs和envs|conda瘦身

这个文件夹里面是专门放不同环境中的包的&#xff0c;只是没有区分环境&#xff0c;都混在一起了&#xff0c; 一般在想要删除一个虚拟环境&#xff0c;除了在命令行中输入conda remove -n your_env_name(虚拟环境名称) --all 然后在envs中删除虚拟环境的文件夹&#xff0c; 还…

企业微信hook接口协议,ipad协议http,客户群发送任务,获取要发送的客户群列表

客户群发送任务&#xff0c;获取要发送的客户群列表 参数名必选类型说明uuid是String每个实例的唯一标识&#xff0c;根据uuid操作具体企业微信 请求示例 {"uuid": "1688853790533324","id":1101292747044333637, //群发任务id"keyword…

【Unity】如何获得TMP Button下的text内容

【背景】 unity项目中使用了TMP命名空间的Button UI组件。脚本中需要获得Button下Text的内容,但是发现用TextMeshPro仍然无法获得button下的text对象。 【分析】 Hierarchy结构上看明确Button下是有Text组件的: 括号里是TMP,所以理论上用TextMeshPro类型去FindComponent…
最新文章