25/2/16 <算法笔记> DirectPose

DirectPose 是一种直接从图像中预测物体的 6DoF(位姿:6 Degrees of Freedom)姿态 的方法,包括平移和平面旋转。它在目标检测、机器人视觉、增强现实(AR)和自动驾驶等领域中具有广泛应用。相比于传统的位姿估计方法,DirectPose 试图简化复杂的处理流程,采用端到端的方式直接从图像中输出位姿参数。

1. DirectPose 是什么?

DirectPose 是一种端到端的神经网络方法,旨在直接从输入图像获取目标对象的 6DoF 位姿

  • 6DoF 位姿: 位姿是 3D 空间中一个物体的位置和姿态的完整描述,由 3 个平移(Position,x, y, z) 和 3 个旋转(Orientation,旋转角度 roll, pitch, yaw 或四元数表示) 构成。

相比传统流程(例如先目标检测,再通过点云或关键点匹配生成位姿估计),DirectPose 直接将任务简化为:输入图像后端到端预测出物体的平移和旋转参数,无需中间步骤。

2. 它解决了什么问题?

DirectPose 的提出旨在解决如下问题:

  1. 传统方法依赖多步骤处理:
    传统的位姿估计方法需要以下步骤:

    • 目标检测:找到目标物体的 2D 边界框。
    • 特征提取:提取物体的形状特征或关键点。
    • 位姿计算:通过几何算法求解 6DoF 位姿,比如 PnP 或 ICP。
      这种分割式流程容易积累误差,尤其是在特征提取和位姿计算中。
  2. 需要强鲁棒性:
    传统方法在低光照、遮挡、纹理缺失或目标外观变化等情况下性能较差,这使得它们在实际应用中不够稳定。

  3. 速度较慢:
    多阶段处理意味着更多时间成本,而 DirectPose 作为端到端方法,能够显著压缩推理时间。

3. 工作原理:如何实现端到端的位姿估计?

DirectPose 的架构可以分为以下几个关键步骤:

(1) 图像输入与特征提取
  • 输入的 RGB 图像经由一个 特征提取网络(通常是一个预训练的 CNN 模块,比如 ResNet 或 Transformer),提取到高质量的多尺度特征。这些特征包含了物体的纹理、结构、边界和姿态信息。
(2) 目标检测+位姿回归
  • DirectPose 同时执行目标检测和物体的 6DoF 位姿预测:
    • 目标检测部分: 检测物体的 2D 边界框。例如,使用类似 YOLO 的单阶段检测机制预测目标所在位置。
    • 位姿回归部分: 基于目标检测位置,通过一个全连接层或回归头直接预测 6DoF 参数(平移和旋转,具体形式后文详述)。
(3) 输出 6DoF 位姿结果
  • 最终输出物体的位姿:
    • 平移 (x,y,z)(x,y,z):物体在 3D 空间中的位置。
    • 旋转 (qw,qx,qy,qz)(qw​,qx​,qy​,qz​):通常用四元数表示物体旋转,避免欧拉角的万向节锁问题。

损失函数

DirectPose 使用多种损失函数来监督模型的预测结果:

平移误差:

旋转误差:

其中 q^是预测四元数,q是 Ground Truth 四元数,⟨⋅,⋅⟩ 表示点积运算。这种方法的目标是最大化两者之间的相似性。

联合损失:
平移误差和旋转误差通常会联合优化:

这里 λpos​ 和 λrot 是权重,分别调整平移与旋转误差的平衡。

模型构建

DirectPose 的模型包含两个主要分支:

  • 目标检测分支: 用于预测目标的 2D 边界框(类似于 YOLO 的检测头)。
  • 姿态估计分支: 用于回归平移 (x,y,z) 和旋转 (qw​,qx​,qy​,qz​)。

整个模型可以是基于一个 YOLO-like 的单阶段目标检测模型,加入姿态回归分支。

import torch
import torch.nn as nn
import torchvision.models as models

class DirectPoseModel(nn.Module):
    def __init__(self, num_classes=1):
        super(DirectPoseModel, self).__init__()
        # 基础特征提取网络(可以替换成 ResNet、EfficientNet 等)
        self.backbone = models.resnet50(pretrained=True)
        self.backbone = nn.Sequential(*list(self.backbone.children())[:-2])  # 去除分类层
        
        # 检测头:预测物体 2D 边界框 (x_min, y_min, x_max, y_max)
        self.det_head = nn.Sequential(
            nn.Conv2d(2048, 512, kernel_size=3, stride=1, padding=1),
            nn.ReLU(),
            nn.Conv2d(512, 4, kernel_size=1)  # 输出 4 个数值
        )
        
        # 位姿参数头:回归平移 (x, y, z) 和旋转 (q_w, q_x, q_y, q_z)
        self.pose_head = nn.Sequential(
            nn.Conv2d(2048, 512, kernel_size=3, stride=1, padding=1),
            nn.ReLU(),
            nn.AdaptiveAvgPool2d((1, 1)),  # 全局池化
            nn.Flatten(),
            nn.Linear(512, 7)  # 输出 (x, y, z, q_w, q_x, q_y, q_z)
        )

    def forward(self, x):
        # 特征提取
        features = self.backbone(x)
        
        # 检测分支
        bbox = self.det_head(features)  # Shape: [B, 4, H, W]
        
        # 位姿分支
        pose = self.pose_head(features)  # Shape: [B, 7]
        
        return bbox, pose

损失函数定义

DirectPose 使用多任务损失:

  • 检测损失: 用于边界框的预测(如 L1 损失或 GIoU 损失)。
  • 姿态损失: 用于回归物体的平移和平面旋转。
# 平移损失
def translation_loss(pred_translation, gt_translation):
    # 使用 L2 范数
    return torch.nn.functional.mse_loss(pred_translation, gt_translation)

# 旋转损失
def rotation_loss(pred_rotation, gt_rotation):
    # 使用四元数点积计算相似性
    pred_rotation = pred_rotation / torch.norm(pred_rotation, dim=-1, keepdim=True)  # 归一化
    gt_rotation = gt_rotation / torch.norm(gt_rotation, dim=-1, keepdim=True)
    return 1 - (torch.sum(pred_rotation * gt_rotation, dim=-1) ** 2).mean()

# 总损失
def total_loss(pred_bbox, gt_bbox, pred_translation, gt_translation, pred_rotation, gt_rotation):
    # 检测损失
    det_loss = torch.nn.functional.mse_loss(pred_bbox, gt_bbox)

    # 位姿损失
    trans_loss = translation_loss(pred_translation, gt_translation)
    rot_loss = rotation_loss(pred_rotation, gt_rotation)
    
    # 加权组合
    return det_loss + 10 * trans_loss + rot_loss

实现端到端的目标检测和位姿估计(即 DirectPose),核心在于利用一个模型同时完成多个任务,比如检测物体位置、预测物体的三维平移和旋转,所有步骤都是自动化的“端到端”处理。

DirectPose的端到端实现思路

  1. 输入一张图片,输出完整检测和位姿信息:

    • 输入: 一张普通 RGB 图片。
    • 输出:
      • 边界框(2D位置): 物体在图片中框起来的位置。
      • 位姿参数(3D信息): 物体相对于相机的三维位置 (x,y,z)(x,y,z) 和朝向(旋转,用四元数 (qw,qx,qy,qz)(qw​,qx​,qy​,qz​) 表示)。
  2. 用一个单模型完成所有任务:

    • 使用一个类似 YOLO 的目标检测模型,但在最终输出中,增加了位姿参数的预测。模型在学习“检测边界框”的同时,也学会“估计物体的三维信息”。
    • 这通过在底层共享同样的特征,同时给不同任务设计 “不同的输出分支” 实现。
  3. 模型的结构:

    • 图片特征提取: 模型会从输入图片中学习到各种特征(比如物体的形状、边界、纹理等)。
    • 分支1——用于检测: 一部分特征被用来预测物体在图片中的二维位置(边界框 (xmin​,ymin​,xmax​,ymax​))。
    • 分支2——用于估计位姿: 另一部分特征被用来预测物体的位置和朝向(平移 (x,y,z)(x,y,z) 和旋转 (qw,qx,qy,qz))。
  4. 训练模型时,设计任务的“学习目标”:

    • 模型会通过“损失函数”告诉自己哪些输出是对的,哪些是错的。
    • 定义了两个主要的学习目标:
      • 检测损失: 学会画出更准确的边界框(比如用 L1 或 IOU 损失计算真实框和预测框的偏差)。
      • 位姿损失: 学会输出更准确的平移和旋转(通过计算它们的误差,让小数值不断改进)。
    • 最终,这些学习目标会自动反馈到模型的所有部分,优化整个模型。
  5. 整个流程是自动化的:

    • 数据输入 -> 模型处理(提取特征 + 分支输出) -> 损失反馈 -> 模型权重调整 -> 输出最终结果。
    • 只需要给模型输入一张图片,它就可以完成从图片到目标检测和位姿估计的所有步骤,而不需要再手动分步骤处理。

举个例子直观感受:

如果这个系统用于检测一辆车的三维位姿,那么它做的事情就是:

  1. 看图片: 假如输入了一张有汽车的图片。
  2. 自动框住汽车: 模型会输出汽车在图片中的位置(比如左上角和右下角的像素点坐标)。
  3. 给出汽车的位置信息: 模型还会告诉这辆车在三维空间中的位置,比如离摄像头的距离 3 米,正对摄像头。
  4. 输出汽车的朝向: 最后,模型会计算这辆车的旋转,比如车头稍微向右偏转了 45 度。

用户只需要提供一张标注好的图片,使用 DirectPose 就能完成所有这些任务!

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

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

相关文章

企业级API集成方案:基于阿里云函数计算调用DeepSeek全解析

解决方案链接:https://www.aliyun.com/solution/tech-solution/deepseek-r1-for-platforms?utm_contentg_1000401616 何为DeepSeek R1 DeepSeek R1模型有诸多技术优势。高效架构设计使其能更高效提取特征,减少冗余计算,提升数据处理速度、…

137,【4】 buuctf web [SCTF2019]Flag Shop

进入靶场 都点击看看 发现点击work会增加¥ 但肯定不能一直点下去 抓包看看 这看起来是一个 JWT(JSON Web Token)字符串。JWT 通常由三部分组成,通过点(.)分隔,分别是头部(Header&…

ThinkPHP8视图赋值与渲染

【图书介绍】《ThinkPHP 8高效构建Web应用》-CSDN博客 《2025新书 ThinkPHP 8高效构建Web应用 编程与应用开发丛书 夏磊 清华大学出版社教材书籍 9787302678236 ThinkPHP 8高效构建Web应用》【摘要 书评 试读】- 京东图书 在控制器操作中,使用view函数可以传入视图…

渗透利器:YAKIT 工具-基础实战教程.

YAKIT 工具-基础实战教程. YAKIT(Yak Integrated Toolkit)是一款基于Yak语言开发的集成化网络安全单兵工具,旨在覆盖渗透测试全流程,提供从信息收集、漏洞扫描到攻击实施的自动化支持。其核心目标是通过GUI界面降低Yak语言的使用…

Fiori APP配置中的Semantic object 小bug

在配置自开发程序的Fiori Tile时,需要填入Semantic Object。正常来说,是需要通过事务代码/N/UI2/SEMOBJ来提前新建的。 但是在S4 2022中,似乎存在一个bug,即无需新建也能输入自定义的Semantic Object。 如下,当我们任…

shell——分支语句

文章目录 基本语法常用判断条件(1)两个整数之间比较(2)按照文件权限进行判断(3)按照文件类型进行判断(4)多条件判断(&& 表示前一条命令执行成功时,才执行后一条命令&#xf…

Ubuntu 连接 air pods

1. sudo vim /etc/bluetooth/main.conf , 修改蓝牙模式为blder 2.sudo /etc/init.d/bluetooth restart, 重启蓝牙,即可连接成功

机器学习:k近邻

所有代码和文档均在golitter/Decoding-ML-Top10: 使用 Python 优雅地实现机器学习十大经典算法。 (github.com),欢迎查看。 K 邻近算法(K-Nearest Neighbors,简称 KNN)是一种经典的机器学习算法,主要用于分类和回归任务…

低空经济:开启未来空中生活的全新蓝海

引言 随着科技的进步,我们不再仅仅依赖地面交通和传统物流。你是否曾幻想过,未来的某一天,快递、外卖可以像魔法一样直接从空中送到你手中?或者,你能乘坐小型飞行器,快速穿梭于城市之间,告别拥堵…

DeepSeek核心算法解析:如何打造比肩ChatGPT的国产大模型

注:此文章内容均节选自充电了么创始人,CEO兼CTO陈敬雷老师的新书《自然语言处理原理与实战》(人工智能科学与技术丛书)【陈敬雷编著】【清华大学出版社】 文章目录 DeepSeek大模型技术系列一DeepSeek核心算法解析:如何…

苍穹外卖day4 redis相关简单知识 店铺营业状态设置

内存存储 键值对 key-value 一般用于处理突发性大量请求数据操作(暂时浅显理解) 读写速度极快,常用于缓存数据,减少对数据库的访问压力,提高系统性能。例如,可以缓存用户会话、商品信息、页面数据 设置默…

API 接口自动化

HTTP协议 - 白月黑羽 HTTP协议简介 如果客户端是浏览器,如何在chrome浏览器中查看 请求和响应的HTTP消息?按f12-》network 清除当前信息 响应的消息体在Response里看 点preview,可以看响应的消息体展开的格式 HTTP请求消息 请求头 reques…

Oracle序列(基础操作)

序列概念 序列是用于生成唯一、连续序号的对象。 序列可以是升序的,也可以是降序的。 使用CREATE SEQUENCE语句创建序列。 start with 1 指定第一个序号从1开始 increment by 1 指定序号之间的间隔为1 increment by -1 降序1000 999 998这样 maxvalue 2000 表…

【pytorch】weight_norm和spectral_norm

apply_parametrization_norm 和spectral_norm是 PyTorch 中用于对模型参数进行规范化的方法,但它们在实现和使用上有显著的区别。以下是它们的主要区别和对比: 实现方式 weight_norm: weight_norm 是一种参数重参数化技术,将权…

unity学习44:学习Animator 的一个动作捕捉网站,实测好用

目录 1 动作捕捉网站 2 注册和下载 3 比如首页的内容,可以直接下载为fbx模型文件 4 上传并修改 5 在 unity里使用 5.1 下载的fbx文件直接拖入到unity 5.2 动画修改 5.3 游戏里播放 1 动作捕捉网站 一个动作捕捉网站 AI神器集合网站 千面视频动捕 | AI神器…

云原生(五十五) | ECS中自建数据库迁移到RDS

文章目录 ECS中自建数据库迁移到RDS 一、场景说明 二、ECS中自建数据库迁移到RDS实现步骤 三、 创建wordpress数据库 四、登录ECS导出wordpress数据库 五、返回RDS数据库管理控制台 六、开启外网地址并设置白名单 七、获取RDS外网访问地址 八、重新设置wordpress的wp-…

【NLP 22、语言模型 language model】

有时候我也想听听,我在你心里,是什么样子 —— 25.1.12 一、什么是语言模型 语言是灵活的,也是有规律的 了解一门语言的人可以判断一句话是否“合理” 通俗来讲,语言模型用来评价一句话(句子可以看作是字的组合)是否“合理”或…

qt + opengl 给立方体增加阴影

在前几篇文章里面学会了通过opengl实现一个立方体,那么这篇我们来学习光照。 风氏光照模型的主要结构由3个分量组成:环境(Ambient)、漫反射(Diffuse)和镜面(Specular)光照。下面这张图展示了这些光照分量看起来的样子: 1 环境光照(Ambient …

【鱼眼镜头12】Scaramuzza的鱼眼相机模型实操,不依赖于具体的相机几何结构,直接从图像数据出发,因此更具灵活性。

文章目录 Scaramuzza相机模型标定效果2、原理和代码代码1、 2D映射到3D,函数输入为2D点坐标OCAM参数代码功能详解2、3D --> 2D 3、总结Scaramuzza 模型的核心思想Scaramuzza 模型的核心思想与 Kannala-Brandt 模型的对比Scaramuzza 模型的独特之处Scaramuzza 的意…

【Linux】【进程】epoll内核实现总结+ET和LT模式内核实现方式

【Linux】【网络】epoll内核实现总结ET和LT模式内核实现方式 1.epoll的工作原理 eventpoll结构 当某一进程调用epoll_create方法时,Linux内核会创建一个eventpoll结构体,这个结构体中有两个成员与epoll的使用方式密切相关. struct eventpoll{..../*红…