ES6D: 利用对称性进行高效的6D姿态检测

news2024/9/23 3:16:27

利用对称性进行高效的6D姿态检测

本文参考自CVPR2022的这篇文章:ES6D: A Computation Efficient and Symmetry-Aware 6D Pose Regression Framework

Github链接为:https://github.com/GANWANSHUI/ES6D

介绍

在6D姿态检测中,一些具备对称性的物体,比如球、圆盘等,有着多个等价的姿态

那么能否利用这种对称性,对计算精度进行提升呢?

该文章提出了一个全卷积的特征提取网络 XYZNet,比 PVN3D[1] 以及 DenseFusion[2] 要更加高效

[1] Pvn3d: A deep point-wise 3d keypoints voting network for 6dof pose estimation.

[2] Densefusion: 6d object pose estimation by iterative dense fusion.

这个工作主要是两个特点:

(1)使用了2D卷积来统一处理深度和RGB信息

(2)考虑了物体的对称性,引入新的误差

技术细节

首先,来看一看整体的计算流程

image-20230509155113378

如上图所示,可以将整个计算流程分成三个部分:

  • 局部特征提取
  • 空域信息编码
  • 特征聚合
局部特征提取 Local Feature Extraction

文章的图示中,RGB图像和XYZ映射是一起送到CNN中得到特征,并没给出十分具体的张量形状,通过分析代码,我们找到以下的相关代码:

class XYZNet(nn.Module):
    def __init__(self,
                 in_channel=3,
                 strides=[2, 2, 1],
                 pn_conv_channels=[128, 128, 256, 512]):
        super(XYZNet, self).__init__()
        self.ft_1 = resnet_extractor(in_channel, strides)
        self.ft_2 = spatial_encoder(1024, pn_conv_channels)

    def forward(self, xyzrgb):
        ft_1 = self.ft_1(xyzrgb)
        b, c, h, w = ft_1.size()
        rs_xyz = F.interpolate(xyzrgb[:, :3], (h, w), mode='nearest')
        ft_2 = self.ft_2(ft_1, rs_xyz)
        ft_3 = torch.cat([ft_1, ft_2], dim=1)
        return ft_3, rs_xyz


class ES6D(nn.Module):
    def __init__(self, num_class=21):
        super(ES6D, self).__init__()
        self.num_class = num_class
        self.xyznet = XYZNet(6)
        self.trans = get_header(1024 + 512 + 512, 3 * num_class)
        self.prim_x = get_header(1024 + 512 + 512, 4 * num_class)
        self.score = get_header(1024 + 512 + 512, num_class)
    
    def forward(self, rgb, xyz, cls_ids):
        xyzrgb = torch.cat([xyz, rgb], dim=1)
        ft, rs_xyz = self.xyznet(xyzrgb)
        b, c, h, w = ft.size()
        # ...

可以看到,其中的XYZNet有两个主要部分,一个是resnet_extractor, 一个是spatial_encode

而且在初始化的时候,in_channel被设置成6,很明显,就是将rgb彩色图像和xyz深度图像的通道进行连接

在xyz里面,每一个像素的三个通道内容,便是x和y的像素坐标,以及z的深度

根据代码,这里应该使用的是resnet18作为特征提取器,最红输出一个1024通道的向量

我们不妨记,输入的大小为 [ B , 6 , H , W ] [B, 6, H, W] [B,6,H,W], 特征提取的输出则为 [ B , 1024 , H 1 , W 1 ] [B, 1024, H_1, W_1] [B,1024,H1,W1]

空域信息编码

在得到 [ B , 1024 , H 1 , W 1 ] [B, 1024, H_1, W_1] [B,1024,H1,W1] 的输出 f t 1 ft_1 ft1 之后,首先对原来的xyz深度图像进行降采样,变成 [ B , 3 , H 1 , W 1 ] [B, 3, H_1, W_1] [B,3,H1,W1]

使用PointNet,以上面两个不同大小的张量作为输入,最终得到 [ B , 1024 , H 1 , W 1 ] [B, 1024, H_1, W_1] [B,1024,H1,W1] 形状的张量 f t 2 ft_2 ft2

这边的结果是笔者测试了其部分代码得到的,具体的计算流程请查看

https://github.com/GANWANSHUI/ES6D/blob/master/models/pointnet.py

随后,将 f t 1 ft_1 ft1 f t 2 ft_2 ft2 连接起来,得到 [ B , 2048 , H 1 , W 1 ] [B, 2048, H_1, W_1] [B,2048,H1,W1] 的张量

特征聚合

继续看ES6D的代码,主要看他的forward函数,如下所示

¥def forward(self, rgb, xyz, cls_ids):
        # 连接RGB图像和深度图像的通道
        xyzrgb = torch.cat([xyz, rgb], dim=1)
        ft, rs_xyz = self.xyznet(xyzrgb)
        b, c, h, w = ft.size()  # 得到特征提取后的张量形状
        # 使用多个1x1的卷积+ReLU+BN的序列,不改变张量宽高,只改变通道数
        px = self.prim_x(ft)
        tx = self.trans(ft)
        sc = F.sigmoid(self.score(ft))

        cls_ids = cls_ids.view(b).long()
        obj_ids = torch.tensor([i for i in range(b)]).long().cuda()
        px = px.view(b, -1, 4, h, w)[obj_ids, cls_ids]
        tx = tx.view(b, -1, 3, h, w)[obj_ids, cls_ids]
        sc = sc.view(b, -1, h, w)[obj_ids, cls_ids]
        # pr[bs, 4, h, w], tx[bs, 3, h, w], xyz[bs, 3, h, w]
        
        tx = tx + rs_xyz
        # res is the final result
        return {'pred_r': px.contiguous(),
                'pred_t': tx.contiguous(),
                'pred_s': sc.contiguous(),
                'cls_id': cls_ids.contiguous()}

可以看到,在使用 XYZNet 之后,得到了两个返回,一个是降采样后的深度图,一个是拼接后的特征

经过三个分支,分别预测物体的旋转,平移,以及类别分数

这里使用四元数对旋转进行建模,所以输出是4个通道的

对称性关联的误差

经过上述的技术细节分析之后,我们其实已经能够对旋转、平移等信息去做回归的训练,

这里文章引入一种新的对称性关联的误差。首先,由于物体的对称特征,我们可以构建出多个群

image-20230509164357796

首先找到对称轴,然后构建出一些原语(primitives),代表一些基础的姿态,然后利用旋转90度、180度去构造群

那么这些个群有什么用呢?我们在计算姿态估计误差的时候,有时候真实的姿态标记忽略了对称性,这样我们的误差就可能过度估计了

因此,只需要在计算姿态误差的时候,查找每一个群,并且只算误差最小的那个姿态即可

也就是文章给出的 Maximum Grouped Primitives Distance

image-20230509165002317

实验分析

首先在YCB-Video数据集上进行测试,可以看到,相比较PVN3D以及DenseFusion其精度具备优势, 但是这里比较的都是一些有对称性的物体

image-20230509165142216

在T-Less数据集上,和StablePose互有胜负(但是StablePose是只有深度信息),速度也很快,70ms就可以实现推断

image-20230509165437736

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

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

相关文章

米哈游的春招实习面经,问的很基础

米哈游的春招实习面经,主要考察了java操作系统mysql网络,这四个方面。 面试流程,共1小时,1min自我介绍,20min写题,剩下问题基础知识。 Java String,StringBuilder, StringBuffer区…

注意力模型

如果拿机器翻译来解释这个分心模型的Encoder-Decoder框架更好理解,比如输入的是英文句子:Tom chase Jerry,Encoder-Decoder框架逐步生成中文单词:“汤姆”,“追逐”,“杰瑞”。 在翻译“杰瑞”这个中文单词…

低代码/0代码(无代码)开发平台如何选型?这篇文章告诉你

随着数字化转型的加速,越来越多的企业开始寻求低代码或零代码开发平台来加速应用程序的开发和部署。选对合适的平台是至关重要的,因为这将决定企业能否在数字化转型中保持竞争优势。 市面上的低/零代码平台五花八门,在选型的时候需要考虑哪些…

搭建本地仓库源

一、如何搭建仓库源 之前讲了定制ISO的方法:使用chroot定制系统,但有时候我们想自定义的安装包不在上游的仓库源中,在我们本地应该怎么办呢?如果我们将deb包拷贝到iso目录再安装有点过于麻烦了,而且还可能需要手动处理…

Linux 常见命令与常见问题解决思路

Linux 常见命令 Linux 基础命令目录相关查看文件(日志)查看普通的文件查看压缩的文件 解压压缩Linux 系统调优topvmstatpidstatps vi/vim 编辑文件查找文件属性相关定时任务scp 复制文件和目录awk 分隔cutsort 与 uniq常见问题处理思路CPU 高系统平均负载…

数组存储与指针学习笔记(一)数据类型与存储、数据对齐、数据移植、typedef

数据类型与存储 一、数据类型与存储1.1 大端模式与小端模式1.2 有符号数和无符号数1.3 数据溢出1.4 数据类型转换 二、数据对齐2.1 为什么非要地址对齐2.2 结构体对齐2.3 联合体对齐 三、数据的可移植性四、Linux内核中的size_t类型五、typedef5.1 typedef的基本用法5.2 typede…

python操作集合

# 集合 l{1,2,1} print(l) sset(range(5)) print(s)# 判断in 或 not in print(5 not in l) # 集合元素新增操作 l.add(4) l.update(1,3,6) print(l) l.update((1,3,5)) l.update([4,4,6]) # 删除集合元素 l.remove(2) l.discard(2) # 无目的的删除 自己不带参数 l.pop() l.cl…

【跟着陈七一起学C语言】今天总结:C预处理器和C库

友情链接:专栏地址 知识总结顺序参考C Primer Plus(第六版)和谭浩强老师的C程序设计(第五版)等,内容以书中为标准,同时参考其它各类书籍以及优质文章,以至减少知识点上的错误&#x…

大语言模型(LLM)和基于人类反馈的强化学习(RLHF)

只需三步,构建你的LLM 预训练语言模型 L L M S S L LLM^{SSL} LLMSSL(self-supervised-learning)(指令)监督微调预训练模型 L L M S F T LLM^{SFT} LLMSFT(supervised-fine-tuning)基于人类反馈的强化学习微调 L L M R L LLM^{RL} LLMRL&…

K8s常用命令

Namespace 默认情况下,kubernetes集群中的所有的Pod都是可以相互访问的。但是在实际中,可能不想让两个Pod之间进行互相的访问,那此时就可以将两个Pod划分到不同的namespace下。kubernetes通过将集群内部的资源分配到不同的Namespace中&#…

猪场规模怎样划分?类型都有哪些?

养猪场按照经营方式分为大中小猪场(猪场规模)和集团猪场。集团猪场是指集团化发展与管理的养猪企业,或者简称为集团化养猪企业,重点在于“集团化”。猪场规模则是按照年出栏数量划分。 小规模猪场:年出栏3000头以下&a…

加密芯片在GCP系统的应用方案

物联网(IoT)设备正在迅速发展,越来越多的设备连接到互联网并与其他设备进行通信。这使得设备的安全变得更加重要,因为它们可能会暴露敏感的数据和功能。Google Cloud IoT Core(GCP)是一个完全托管的服务&am…

Easydict 简洁易用的翻译词典,带你轻松优雅地查找单词或翻译文本。

Easydict Easydict 是一个简洁易用的翻译词典 macOS App,能够轻松优雅地查找单词或翻译文本。Easydict 开箱即用,能自动识别输入文本语言,支持输入翻译,划词翻译和 OCR 截图翻译,可同时查询多个翻译服务结果&#xff…

喜报丨迪捷软件荣获浙江省专精特新荣誉称号

近日,根据工业和信息化部《优质中小企业梯度培育管理暂行办法》(工信部企业〔2022〕63号)和《浙江省经济和信息化厅关于印发浙江省优质中小企业梯度培育管理实施细则(暂行)的通知》(浙经信企业〔2022〕197号…

光耦合器的输入电路及重要参数

光耦合器是一种通过使用光能将输入控制信号耦合到输出或负载的器件,其方式使得输入信号和负载(输出)之间的电气隔离也保持不变。光耦合器的基本功能是通过光能耦合输入和输出电路(因此称为光耦合器),并在输…

Monaco Editor编辑器教程(三十):将vue文件作为一种编程语言集成到monaco editor中,实现vue组件的语法,标签高亮。

前言 最近在使用gitlab的web ide时发现当编写一个 vue组件时,文件的后缀名为.vue。在编辑器的右上角会显示当前的编程语言时vue,并且高亮语法或标签,格式化,折叠都表现很优秀。但是其实monaco是不支持vuejs的,作为一名前端开发者,我们有时需要在monaco编辑器中编写vue组…

操作系统学习02

!!!由于感冒和出去玩,好几天没学这些计算机基础知识了!!! 抓紧跟上嘿嘿嘿 1、内存管理主要做了什么 操作系统的内存管理非常重要,主要负责下面这些事情: 内存的分配与…

Windows服务器配置开机自启动

有两种简单实现的方式。 第一种,直接将可执行文件或脚本的快捷方式放置到 C:\ProgramData\Microsoft\Windows\Start Menu\Programs\StartUp 这个文件夹里,服务器在启动的时候会自动执行。 第二种,配置为windows系统服务 利用winsw来将可…

HMC408LP3ETR-ASEMI代理亚德诺HMC408LP3ETR原厂芯片

编辑-Z HMC408LP3ETR参数描述: 型号:HMC408LP3ETR 频率范围:5.1 - 5.9 GHz 增益:20 dB 输入回波损耗:8 dB 输出回波损耗:6 dB 1dB压缩的输出功率:27 dBm 饱和输出功率:31 dB…

鬼畜提问变身指南:ChatGPT十个打破常规的提问公式

Chatgpt的恐怖之处不在于它有多么的准确,很多时候它的回答甚至充满常识性错误,比如你问美国为什么轰炸珍珠岛它都能一本正经的回答你(这当然也有中文语料数据投喂不足和中文本身就复杂而难以理解的原因,听说用英文提问的准确性会提…