PVN3D 训练与评估代码流程详解

PVN3D:最详细的来了,对PVN3D的总结与理解 摘要:从单个RGBD图像得到对象的6DoF对象姿态估计。使用了一种深度霍夫投票网络,以检测对象的3D关键点,然后以最小二乘法拟合的方式估计6D姿态参数。 6DoF:即物体在空间中具有6个自由度,3D平移和3D旋转。6DoF姿态就是说,已知物体在世界坐标系的坐标,求物体在相机坐标系的姿态。即物体从世界系到相机系所需的3D旋转和3D平移。 1.介绍 由于光线,传感器噪声,场景的遮挡和物体的截断等原因,6DoF估计已被证明是一个极具挑战性的问题。有人提出直接使用DNN(深度神经网络)回归对象的旋转和平移,由于所解 阅读详情

这篇文章面向仓库中的实际代码,不是论文复述。我会把 PVN3D 的训练和评估流程,从最外层的入口一路拆解到最内层的网络结构和姿态恢复逻辑,最后再说说这个项目当前实现上的一些问题。
在这里插入图片描述

1. 先说说整体思路

PVN3D 在这个仓库里的核心流程可以概括成这样:

  1. 从 RGB-D 数据中采样一批 3D 点。
  2. RGB 分支给每个采样点提取图像上的语义特征,点云分支提取几何特征。
  3. 两路特征通过 DenseFusion 融合到一起。
  4. 网络对每个点同时预测三样东西:
    • 点级别的语义分割类别 pred_rgbd_seg
    • 指向多个关键点的偏移 pred_kp_of
    • 指向目标中心的偏移 pred_ctr_of
  5. 训练时直接监督这三个输出。
  6. 评估时,用“点坐标减去预测偏移”得到每个点对关键点和中心的投票,然后用 MeanShift 聚类得到最终的关键点位置,最后通过刚体配准算出位姿 RT。

从代码的角度看,有三个层次比较重要:

  1. 外层驱动:训练脚本、参数配置、DataLoader、Trainer。
  2. 中间层:数据集的张量构造、model_fn_decorator、损失和评估的分发逻辑。
  3. 内层:PVN3D 网络结构、PSPNet、PointNet2MSG、DenseFusion、MeanShift 投票和 best_fit_transform。

2. 入口在哪里:train 和 eval 怎么启动

2.1 脚本入口

仓库最外层的 shell 脚本很薄,只是把命令转发给 Python 训练脚本:

  • pvn3d/train_linemod.sh
  • pvn3d/eval_linemod.sh
  • pvn3d/train_ycb.sh
  • pvn3d/eval_ycb.sh

有个地方需要注意:这个项目没有单独的 eval.py,训练和评估用的是同一个主程序,通过 -eval_net --test 来切换模式。

具体来说:

  • LineMOD 训练:python3 -m train.train_linemod_pvn3d --cls <obj>
  • LineMOD 评估:python3 -m train.train_linemod_pvn3d -checkpoint <pth> -eval_net --test --cls <obj>
  • YCB 也是类似的模式。

2.2 训练脚本在做什么

train/train_linemod_pvn3d.py 和 train/train_ycb_pvn3d.py 做的事情基本一样:

  1. 解析命令行参数。
  2. 构建 Config 配置对象。
  3. 创建 train、val、test 的数据集和 DataLoader。
  4. 构建 PVN3D 网络。
  5. 包装 SyncBN、DataParallel,设置优化器和 scheduler。
  6. 用 model_fn_decorator 封装前向、损失和评估的逻辑。
  7. 交给 Trainer.train() 或 Trainer.eval_epoch() 执行。

有个工程细节值得注意:Trainer 本身不知道数据的具体业务含义,所有的业务逻辑都被塞进了 model_fn_decorator。也就是说,这个项目真正的“训练语义”不在 Trainer 里,而在那个装饰器里。

3. 配置层:训练依赖哪些全局设置

配置都在 common.py 的 Config 类里。

3.1 Config 负责什么

它定义了:

  • 数据集路径
  • 日志路径
  • checkpoint 保存位置
  • 采样点数 n_sample_points
  • 关键点数量 n_keypoints
  • batch size
  • 测试集预处理的缓存位置
  • 类别映射和对称物体类别列表
  • 相机内参

3.2 几个关键默认值

有几个值对理解流程很重要:

  • n_sample_points = 8192 + 4096 = 12288
  • n_keypoints = 8
  • YCB 有 22 个类别(包括背景)
  • LineMOD 在单类训练模式下只有 2 类(背景 + 当前物体)

这意味着每个 batch 里,网络要在 12288 个采样点上做预测,每个点要输出:

  • 一个分割类别
  • 8 个关键点的 3D 偏移
  • 1 个中心点的 3D 偏移

4. 数据层:数据集到底输出什么

4.1 训练样本的返回结构

不管是 LM_Dataset 还是 YCB_Dataset,__getitem__ 返回的都是同一套东西:

rgb,
pcld,
cld_rgb_nrm,
choose,
kp_targ_ofst,
ctr_targ_ofst,
cls_ids,
RTs,
labels,
kp_3ds,
ctr_3ds

理解这组张量是搞懂整个项目的前提。

4.2 每个张量的含义

rgb

  • 形状大概是 (3, H, W)
  • 原始 RGB 图像,给 CNN 用的

pcld

  • 形状 (N, 3)
  • 从深度图反投影得到的采样点云

cld_rgb_nrm

  • 形状 (N, 9)
  • 由三部分拼接:xyz 坐标、rgb 颜色、法向量
  • 这就是点云分支的输入

choose

  • 形状 (1, N)
  • 表示这 N 个采样点在图像上对应哪些像素索引
  • 这个张量很关键,因为 RGB 分支要靠它把 2D 特征图上的像素特征“捞”到每个 3D 点上

labels

  • 形状 (N,)
  • 每个采样点的语义类别标签
  • LineMOD 单类训练时:0 是背景,1 是目标物体
  • YCB 时:0 是背景,1-21 是各个物体

kp_targ_ofst

  • 形状 (N, 8, 3)
  • 每个采样点到各个 3D 关键点的偏移
  • 计算方式是:point_xyz - keypoint_xyz

ctr_targ_ofst

  • 形状 (N, 3)
  • 每个采样点到目标中心点的偏移
  • 计算方式同上

cls_ids / RTs / kp_3ds / ctr_3ds
这几个主要用于评估:

  • cls_ids:当前图里有哪些物体类别
  • RTs:真实的位姿
  • kp_3ds:真实关键点在相机坐标系下的 3D 坐标
  • ctr_3ds:真实中心点在相机坐标系下的 3D 坐标

4.3 数据预处理流程

从代码看,数据集里的处理顺序大致是:

  1. 读取 RGB、深度图、mask、位姿数据。
  2. 训练时做颜色抖动、模糊、加噪、背景混合等数据增强。
  3. 深度图补全。
  4. 用相机内参把深度图转成点云。
  5. 计算每个点的法向量。
  6. 根据 mask 和深度有效区域采样点。
  7. 如果点数不够就 wrap 补齐,太多就随机下采样。
  8. 构造每个点的类别标签。
  9. 构造关键点和中心点的偏移监督信号。

这一步做完之后,训练样本已经从“图像+深度+标注”变成了“固定长度的点级监督任务”。

5. 训练主循环:从 batch 到 loss 的路径

5.1 Trainer.train() 只负责调度

Trainer.train() 的逻辑很常规:

  1. 从 DataLoader 取一个 batch。
  2. 调用 self.model_fn(self.model, batch)。
  3. loss.backward()。
  4. optimizer.step()。
  5. 每隔一定 iteration 跑验证。
  6. 保存 checkpoint。

真正决定损失怎么算、评估怎么触发的是 model_fn_decorator。

5.2 model_fn_decorator 是核心胶水层

它做了三件事:

  1. 把 batch 里的所有张量搬到 GPU。
  2. 调用模型前向:
pred_kp_of, pred_rgbd_seg, pred_ctr_of = model(cld_rgb_nrm, rgb, choose)
  1. 计算三个损失:
    • loss_rgbd_seg
    • loss_kp_of
    • loss_ctr_of

总损失是:

loss = 2.0 * loss_rgbd_seg + 1.0 * loss_kp_of + 1.0 * loss_ctr_of

5.3 三个监督目标分别约束什么

语义分割损失 loss_rgbd_seg
用的是 FocalLoss,监督每个点的类别预测。目标是让网络知道哪些点属于物体、哪些属于背景,因为后续姿态恢复只会在预测为物体的点上进行。

关键点偏移损失 loss_kp_of
用的是 OFLoss,本质是 masked L1。只在前景点上计算(背景点没有对应的关键点)。这个损失让每个前景点学会回答:“从我这个点走到物体关键点,需要移动多少?”

中心偏移损失 loss_ctr_of
也是 OFLoss,只是目标换成了物体中心。这个分支在评估时有两个作用:一是帮助找到物体中心的投票,二是作为关键点投票的过滤参考。

6. 网络内部:PVN3D 的结构

6.1 整体架构

lib/pvn3d.py 里的 PVN3D 可以这样理解:

RGB backbone (ModifiedResnet / PSPNet)
        +
Point backbone (PointNet2MSG)
        +
DenseFusion
        +
3 个预测头

6.2 RGB 分支:ModifiedResnet

这里的 ModifiedResnet 实际包装的是 Modified_PSPNet(resnet34)。计算流程是:

  1. 用 extractors.resnet34 提取特征。
  2. 经过 PSPModule 做金字塔池化。
  3. 连续三次上采样。
  4. 输出一个 128 通道的稠密特征图。

返回值有两个:x(用于融合的 dense feature map)和 x_seg(分割图的输出)。但在 PVN3D 主流程里,真正用的是前者,rgb_seg 实际上没参与训练。

6.3 choose 的作用:把 2D 特征对齐到 3D 点

RGB 特征图是规则的网格,点云采样点是离散的像素反投影结果。两者之间的桥梁就是 choose。

代码逻辑是:

  1. 把 CNN 的输出展平成 (B, C, H*W)。
  2. 用 choose 在第三维上做 gather。
  3. 得到 (B, C, N) 的、每个点对应的 RGB embedding。

这一步很关键,实现了“每个 3D 点都能拿到对应像素的 2D 语义特征”。

6.4 点云分支:Pointnet2MSG

点云分支的输入是 cld_rgb_nrm,每个点 9 维信息:

  • xyz 坐标 3 维
  • rgb 颜色 3 维
  • 法向量 3 维

构造时 input_channels=6,因为 PointNet2 内部约定把 xyz 单独拿出来,其余 6 维作为特征描述子。

6.4.1 Set Abstraction 层

Pointnet2MSG 用了四层 SA 逐步下采样和局部聚合:

  1. 2048 个点
  2. 1024 个点
  3. 512 个点
  4. 128 个点

每层都用了 MSG(多尺度分组),不同半径和采样数,本质上在做:

  • FPS 采样中心点
  • ball query 邻域分组
  • 每个尺度独立 MLP
  • max pooling 得到局部几何特征
6.4.2 Feature Propagation 层

后面四层 FP 把粗层的特征逐步插值回原始点集,最终输出和输入采样点一一对应的点特征,形状大概是 (B, 128, N)。

6.5 融合层:DenseFusion

DenseFusion 是这个项目最关键的部分。输入是:

  • rgb_emb: (B, 128, N)
  • cld_emb: (B, 128, N)

输出拼接了三类信息:

  1. 局部拼接 feat_1 = [rgb_emb, cld_emb],256 通道
  2. 分别卷积后增强的局部拼接 feat_2,512 通道
  3. 通过 1D conv 后做全局平均池化得到的全局特征,1024 通道,再 broadcast 回每个点

最终输出 256 + 512 + 1024 = 1792 通道。这个设计的直觉是:点级预测既需要局部外观,也需要局部几何,还需要全局上下文来避免歧义。

6.6 三个预测头

DenseFusion 后面接了三个并行的 head:

SEG_layer
输出 (B, N, num_classes),用于点级分割。

KpOF_layer
输出 (B, num_kps, N, 3),每个点指向每个关键点的偏移向量。

CtrOf_layer
输出 (B, 1, N, 3),每个点指向物体中心的偏移向量。

7. 评估流程:为什么偏移能恢复姿态

7.1 评估不是直接回归 RT

PVN3D 不直接输出旋转矩阵和平移向量,而是走一条几何链路:

  1. 分割出属于物体的点。
  2. 每个点投票出物体中心和关键点的位置。
  3. 聚类得到最终的关键点 3D 坐标。
  4. 用已知的模型关键点和预测的关键点做刚体配准,算出位姿。

这也是 PVN3D 比直接回归 6D 位姿更稳定的原因之一。

7.2 中心投票与关键点投票

在 pvn3d_eval_utils.py 里,先把网络输出的偏移转回绝对坐标:

pred_ctr = pcld - ctr_of
pred_kp  = pcld - kp_of

注意,数据集的监督定义本来就是 point - target,所以预测出来后直接用 point - offset 就能得到 target 的绝对位置。这样每个前景点都能对物体中心和每个关键点投出一个 3D 位置猜测。

7.3 MeanShift 聚类

同一个物体上的很多点会给同一个关键点投票,理论上这些投票应该聚在一起。代码用 MeanShiftTorch 做聚类:

  1. 对中心投票聚类,得到中心估计。
  2. 必要时根据中心聚类结果过滤点。
  3. 对每个关键点的投票再做一次聚类,得到稳定的关键点位置。

这一步把“稠密的点级预测”压缩成了“少量结构化的关键点”。

7.4 刚体拟合恢复位姿

有了预测的关键点坐标,就能和 CAD 模型上的模板关键点做配准。具体由 Basic_Utils.best_fit_transform() 完成:

  1. 取模型坐标系下的关键点 mesh_kps
  2. 取相机坐标系下的预测关键点 cls_kps
  3. 用 SVD 求解最小二乘刚体变换
  4. 输出 3x4 的 RT

这一层是纯几何计算,不再依赖神经网络。

7.5 评估指标

YCB 和 LineMOD 都用 ADD / ADD-S,但输出组织略有不同:

  • YCB 最终统计每类的 AUC 和总体 AUC
  • LineMOD 额外统计 ADD < 0.1 * diameter

对称物体用 ADD-S,非对称物体用 ADD。

8. 流程图怎么读

看 pvn3d_train_eval_flow.dot 的时候,建议按这个顺序:

  1. Entry Layer:看命令落到哪个 Python 主程序
  2. Config + Dataset:看训练样本怎么组织和采样
  3. Batch Tensors:明确每个张量的形状和含义
  4. PVN3D Forward:理解 RGB / point / fusion / heads 四段式结构
  5. Training Loop:理解损失怎么汇总和反传
  6. Evaluation / Pose Recovery:理解 offset 投票、聚类和刚体配准

如果后面要单步调试,这也是最合理的断点顺序。

9. 推荐的代码阅读顺序

如果想深入源码,建议按这个顺序读:

  1. train/train_linemod_pvn3d.py
  2. datasets/linemod/linemod_dataset.py
  3. lib/pvn3d.py
  4. lib/pspnet.py
  5. lib/extractors.py
  6. lib/pointnet2_utils/pointnet2_modules.py
  7. lib/loss.py
  8. lib/utils/pvn3d_eval_utils.py
  9. lib/utils/basic_utils.py

这样读的好处是:先建立全局调用链,再深入每层的张量变换,最后看几何后处理和指标。

10. 这个项目目前的不足

这部分不讨论论文本身,只从“当前仓库代码实现”的角度说。

10.1 训练与评估耦合太重

好处是代码少,坏处是职责不清。表现为:

  • 没有独立的评估程序
  • 训练脚本承担了参数解析、数据构建、模型构建、训练、验证、测试、指标汇总全部职责

后果是调试路径长、复用困难,想做独立的 benchmark、profiling、ablation 都不太方便。

10.2 model_fn_decorator 塞了太多业务逻辑

Trainer 很薄,model_fn_decorator 把好几件事绑在一起:

  • batch 解包
  • 前向调用
  • 损失计算
  • 精度统计
  • 测试时的位姿评估

这导致单元测试不好写,前向调试和评估调试耦合在一起,想替换 loss 或者只跑推理也比较别扭。

10.3 数据集层用裸 except,错误会被吞掉

LM_Dataset.get_item() 和 YCB_Dataset.get_item() 最后都有:

except:
    return None

这挺危险的。文件路径错误、标注格式错误、深度转点云失败、法向量计算失败这些本应暴露的问题,都会被静默吞掉,只表现为“偶尔 sample 是 None”。排查训练不稳定、数据损坏、偶发崩溃的时候,会非常头疼。

10.4 验证/测试集对 None 样本不够稳健

训练集在拿到 None 时会继续随机重采,但验证/测试集可能直接把 None 返回给 DataLoader,默认的 collate_fn 对 None 并不友好,坏样本可能直接导致评估崩溃。

10.5 工程参数和路径硬编码比较多

比如 DataLoader worker 数、eval_frequency、训练总 epoch、各种路径和目录结构、LineMOD/YCB 的专有路径布局,都写死在代码里。这带来两个问题:一是迁移到新环境容易踩路径坑,二是做实验对比时不够声明式和可追踪。

10.6 评估的线程模型有风险

TorchEval.eval_pose_parallel() 用 ThreadPoolExecutor,在每个线程里继续操作 CUDA tensor 和 torch 逻辑。这类设计不是一定错,但可预测性差、调试困难,对 CUDA 上下文和线程调度不够透明。在吞吐上未必总有收益,但出错时排查成本会很高。

10.7 Point normal 依赖较重,YCB 没有退化路径

当前实现高度依赖 python-pcl:

  • LineMOD 数据集做了 fallback,没有 PCL 时返回零法向量
  • YCB 数据集没有对应的 fallback

这会导致环境部署不统一、数据集间行为不一致,某些环境下 YCB 更容易直接失败。

10.8 一些实现细节不够干净

举几个例子:

  • DenseFusion_1 里 super(DenseFusion, self).__init__() 明显不规范,虽然当前没被使用
  • of_l1_loss() 里 if reduce: torch.mean(in_loss) 没有把结果赋回去,分支逻辑实际上无效
  • 训练脚本里大量用 os.system('mkdir -p ...')、os.system('echo ...'),可维护性较差
  • rgb_seg 在主流程里基本没用,说明 RGB backbone 里有部分冗余输出

这些问题不一定马上导致结果错误,但会降低代码可信度。

10.9 模块边界不够清晰,不利于替换 backbone 或 head

从设计上看,PVN3D 很适合做结构替换实验:换 RGB backbone、换 point backbone、换 fusion、换 pose voting 策略。但当前代码把很多行为写死在 lib/pvn3d.py 和训练脚本里,模块接口不够抽象。这会影响做 ablation study、接入新 backbone、做 transformer / sparse convolution 替换实验。

11. 从调试角度,最值得下断点的位置

如果想真正“深入剖析”,建议按下面顺序打断点:

数据是否正确

  • LM_Dataset.get_item 或 YCB_Dataset.get_item
  • 重点检查:choose 和 cld 是否一一对应,labels 是否只有预期类别,kp_targ_ofst / ctr_targ_ofst 是否真的是 point - target

前向 shape 是否匹配

  • PVN3D.forward
  • 重点检查:out_rgb 的空间分辨率,choose.repeat(1, di, 1) 后的 gather 是否越界,pcld_emb 和 rgb_emb 的点数维度是否一致

loss 是否只在前景点生效

  • of_l1_loss
  • 重点确认:labels > 1e-8 形成的 mask 是否符合数据定义,LineMOD 单类时前景标签是否确实为 1

评估恢复的几何链条是否自洽

  • cal_frame_poses、cal_frame_poses_lm、best_fit_transform
  • 重点确认:offset 的正负号、坐标系是否一致、模型关键点和预测关键点的顺序是否一致

12. 最后一层理解:PVN3D 的本质

把实现细节都剥掉,PVN3D 的本质其实是:

点级实例分割
+ 点到结构关键点的几何投票
+ 基于 3D 对应点的刚体配准

它不是“直接回归位姿”,而是在学习一个更容易监督、更符合几何约束的中间表示:点属于谁,点指向哪。只要这两个问题回答得足够好,最终位姿就能通过传统几何方法稳定恢复出来。

所以理解 PVN3D 的时候,不能只盯着网络结构,必须同时看数据监督的定义、offset 的几何意义、MeanShift 投票、SVD 刚体拟合,这四者缺一不可。

13. 总结

这个仓库里的 PVN3D 代码虽然年代感比较强,但主线很清晰:

  1. 数据集把 RGB-D 样本变成固定长度的点级监督任务。
  2. PVN3D 用 RGB backbone 和 PointNet2 分别提取外观和几何特征。
  3. DenseFusion 把局部和全局信息拼起来。
  4. 网络对每个点同时预测类别、关键点偏移、中心偏移。
  5. 评估时通过点级投票、MeanShift 聚类和刚体拟合恢复位姿。

它的优势不在网络特别深,而在于把神经网络输出和几何恢复链条绑得很自然。

但从工程实现看,这个仓库有明显的“老代码”特征:train/eval 耦合、错误处理粗糙、配置硬编码、模块边界不清晰、一些实现细节不够干净。

PVN3D学习(一):跑通PVN3D PVN3D 阅读详情

相关推荐

PVN3D论文翻译

CVPR2020旷视提出PVN3D:针对6D位姿估计的3D关键点投票网络 Abstract 在这项工作中,我们提出了一种新的数据驱动方法,用于从单个RGBD图像进行鲁棒的6DoF对象姿态估计。与直接回归姿态参数的先前方法不同,我们使用基于关键点的方法来解决这一具有挑战性的任务。具体而言,我们提出了一种深度霍夫投票网络,以检测对象的3D关键点,然后以最小二乘拟合的方式估算6D姿态参数。我们的方法是2Dkeypoint方法的自然扩展,该方法成功地用于基于RGB的6DoF估计。它使我们能够利用额外的深度信息充分利

cocool的博客 1755

PVN3D——WIN10 PyTorch1.8 Linemod-render最全复现

研究6d位姿估计,复现经典代表性论文pvn3d,在win10和Ubuntu20.04两个平台上实现,遇到数不清的bug,凭借记忆对bug进行记录。

CHONGjjj的博客 4258

从零构建PVN3D位姿估计训练数据集:BOP格式全流程指南

6D位姿估计是机器人抓取、增强现实和工业自动化中的核心技术,而训练可靠模型离不开结构严谨的数据集。基于点云与深度图的位姿估计网络,如PVN3D,不仅需要RGB图像,还需深度图、实例掩码及精确的6D位姿真值。公开数据集虽可复用,但面对自研物体或特殊场景时,自建数据管线成为必然。BOP格式作为位姿估计领域的通用基准,提供了清晰目录、统一命名和标准位姿表示,能大幅降低数据加载与评测的对接成本。本文从概念与原理切入,说明BOP格式的核心规范及其在真实采集和合成渲染两条路线中的应用,并给出数据校验、训练配置衔接和常见

weixin_33046983的博客 275

【干货速览】PVN3D: A Deep Point-wise 3D Keypoints Voting Network for 6DoF PoseEstimation

论文干货速览 PVN3D: A Deep Point-wise 3D Keypoints Voting Network for 6DoF PoseEstimation

Freak16的博客 755

【6Dof位姿估计】PVN3D: A Deep Point-wise 3D Keypoints Voting Network for 6DoF Pose Estimation 论文理解

https://github.com/ethnhe/PVN3D.git

给时光以生命 2307

46、机器人抓取技术:PVN3D与6 - DOF GraspNet解析

本文深入解析了机器人抓取领域的两种先进深度学习方法:PVN3D用于6自由度物体姿态估计,6-DOF GraspNet用于直接从点云数据生成抓取结果。文章详细介绍了两种方法的网络结构、工作原理、实验评估及性能对比,并探讨了各自的优缺点与适用场景。通过模拟实验数据分析了姿态估计精度、抓取成功率及放置误差,揭示了当前技术在实时性、稳定性及真实环境适应性方面的挑战。同时,文章展望了融合多传感器、提升实时性与智能化抓取策略等未来发展趋势,并结合工业应用案例说明了技术落地路径。最后通过mermaid流程图总结了整体技术

win55的博客 192

配置PVN3D

一、环境配置 本人按照官方给出的“pytorch-1.5”版本进行配置—>官方链接 1.在任意caonda环境中安装pythonl-pcl的方法 这里是在Ubuntu20安装python-pcl的教程。 2.修改系统配置及代码部分 (1)GCC版本回退到GCC7; (2)更改cuda版本为10.2 (3) 将pvn3d/_ext-src/include/*.h 复制到 pvn3d/_ext-src/src 3.构建conda虚拟环境 (1)创建conda虚拟环境 conda create -n pvn

weixin_41837701的博客 3247

在Ubuntu20.04-Python3.8环境配置PVN3D并跑通linemod数据集

此文章为在Ubuntu20.04-Python3.8环境下复现PVN3D的笔记过程

用PVN3D训练自制LINEMOD数据集过程记录

用PVN3D训练自制LINEMOD数据集过程记录

weixin_41837701的博客 4715

pvn3d详解汇报ppt.pptx

详细介绍了6D位姿估计和pvn3d算法的实现原理

UMI刷盘机器人代码实战:从SLAM到Diffusion Policy的完整部署流程

本文详细解析了UMI(Universal Manipulation Interface)刷盘机器人从数据准备到真实部署的完整实战流程。通过SLAM处理视频数据生成三维轨迹,并训练Diffusion Policy模型,最终将策略部署到UR5机械臂与WSG50夹爪上,实现从模仿学习到物理执行的闭环。

weixin_29042035的博客 460

PVN3D 模型训练 Bug 调试指南

本文针对PVN3D模型在LINEMOD数据集训练过程中出现的显存不足问题进行分析和修复。首先确认了主因是默认配置(batch size=24,采样点数12288)对7.62GiB显存过大,导致前向传播时CUDA OOM错误。同时发现了学习率调度器调用顺序不当和DenseFusion模块对采样点数假设过强的问题。修复方案包括:新增可覆盖训练参数的命令行选项、调整学习率调度顺序、改用自适应池化替代固定池化、确保数据集与模型配置一致。推荐的重试参数将batch size降至2、采样点数降至8192,并设置CUDA

豆破苍琼 639

innovus 命令每日精要 | 掌控Innovus布线的利器——setNanoRouteMode详解

在数字IC后端设计的复杂世界里,布线优化是至关重要的一步。今天,我来给大家深入讲解Innovus工具中setNanoRouteMode命令的精妙之处,让你轻松驾驭布线策略,提升设计质量。setNanoRouteMode是Innovus中用于配置NanoRoute绕线行为的关键命令。通过其丰富的参数,你可以精细控制布局后阶段的绕线策略、信号完整性优化、工艺适配及设计规则修复等流程。下面,我将按功能分类总结其核心选项,并针对不同场景给出建议。

weixin_50820814的博客 3524

pvn3d笔记

3、拟议方法 6Dof位姿估计目的:通过RGBD图像,估计对象从对象世界坐标系到相机世界坐标系的刚性变换,包括3D rotation和3D translation。 3.1 总体方案 特点:全新的基于深度3D Hough投票网络的方法。 整个方案分两阶段:1、全新的基于深度3D Hough投票网络的方法,实现3D 关键点检测;2、最小二乘法姿态拟合。 M_k:检测3D关健点,预测从可见点到目标关键点的欧式偏移量。 目标关键点是每个物体预先选定的点。 pii=1N{{p_i}^N_{i=1}}pi​i=1N

qq_43056684的博客 1349

【架构师面试-缓存与搜索-1】-缓存与缓存置换策略源码实现

1:什么是缓存 缓存:加速数据访问的存储,降低延迟(latency),提升吞吐量(Throughput)的利器。 1:缓存演进历史 1. 查库 2. ConcurrentHashMap 3. LRU 4. Guava Cache 5. 分布式缓存(redis,MemCache) 6. 多级缓存 2:在什么地方加缓存 缓存对于每个开发者来说是相当熟悉了,为了提高程序的性能我们会去加缓存,但是在什么地方加缓存,如何加缓存呢? 举个栗子:假设一个网站,需要提高性能,缓存可以放在浏览器,可以放

chongfa2008的博客 6437

HWSD全球土壤数据下载处理

下载地址: http://www.fao.org/soils-portal/soil-survey/soil-maps-and-databases/harmonized-world-soil-database-v12/en/

江北20190411的博客 3万+

PLY 文件格式与 PVN3D 中的使用说明

PLY 是一种通用 3D 数据格式,理论上可以存储顶点坐标、法线、颜色、面片拓扑、纹理及其他自定义属性。一个 .ply 文件通常由文件头和数据区组成,文件头定义顶点数、属性类型、面片数 以及存储格式,数据区则保存具体的顶点和面片内容。 在当前 PVN3D 项目中,.ply 并没有被当作完整网格资源来使用,而主要被当作物体几何点集的来源。代码实际核心读取的几乎只有顶点坐标 x y z,没有依赖法线、颜色、材质或面片拓扑。 LINEMOD 路径下会从 models/obj_xx.ply 中读取顶点

豆破苍琼 470

PoP(Package on Package)封装技术探讨

PoP(Package on Package)封装技术摘要 PoP是一种3D封装技术,通过垂直堆叠已完成封装的器件(如SoC+DRAM)实现高密度集成,典型应用于智能手机等空间受限场景。其核心优势包括:节省主板面积(垂直堆叠)、优化高速信号完整性(短互连路径)、提升供应链灵活性(独立测试与选型)。PoP结构分为底封装(通常为Flip-Chip BGA的SoC)和顶封装(如FBGA存储芯片),通过焊球阵列互连,一次回流焊完成组装。

sinat_15150363的博客 365

LINEMOD BOP 转 PVN3D 测试实操指南

本文提供了从BOP格式LineMOD数据集到PVN3D测试的完整转换流程指南。主要内容包括:1)数据准备,需下载lm_models.zip和lm_test_all.zip;2)目录结构转换,使用仓库脚本将BOP格式转为PVN3D所需的Linemod_preprocessed结构;3)关键检查点,如验证ape类别转换结果和确认checkpoint存在;4)注意事项,如路径设置和类别映射关系。文档旨在帮助用户快速跑通LineMOD测试链路,特别推荐以ape类别作为最小验证对象。

豆破苍琼 636

Debezium报错处理系列之二十八: Expiring 1 record(s) for test-ts-0:120001 ms has passed since batch creation

Debezium报错处理系列之二十八: Expiring 1 record(s) for test-ts-0:120001 ms has passed since batch creation

zhengzaifeidelushang的博客 3290

基于Simulink的四足机器人关节力矩优化仿真建模示例

高自由度:每个腿至少有3个自由度(DOF),增加了控制的复杂性。非线性动力学:涉及多体系统的相互作用,包括接触力、摩擦力等。能量消耗:减少不必要的能量消耗是提升续航能力和效率的关键。可以是最小化能量消耗或最大化稳定性等。matlab深色版本% 示例代码通过本指南,我们介绍了如何基于Simulink搭建一个四足机器人的关节力矩优化模型,并进行了仿真以验证其基本功能。

amy_mhd的博客 171

基于 BOP 格式构建 PVN3D 自定义训练数据集技术文档

本文档详细说明了如何基于BOP格式为PVN3D构建自定义训练数据集。主要分为两种情况:A)使用现有LINEMOD类别时,只需准备BOP格式数据并转换;B)训练全新类别时,还需补充类别映射、模型文件、关键点文件等。文档分析了PVN3D训练所需的最小数据集结构,包括每帧样本的RGB、深度图、mask、位姿等,以及每个类别必须的3D模型和关键点文件。同时介绍了现有转换脚本的功能限制,指出测试集转换脚本不足以支持训练,而训练集转换脚本可以处理真实训练数据和PBR合成数据。最终提供了PVN3D训练目录的标准结构说明,

豆破苍琼 465

【推荐系统】推荐算法:冷启动-召回-粗排-精排-重排 解读

【推荐系统】推荐算法:冷启动-召回-粗排-精排-重排 解读

Danger的博客 3760

PVN3D终极指南:如何快速实现高精度6D物体位姿估计

在机器人抓取、增强现实和自动驾驶等前沿领域中,准确估计物体在三维空间中的位置和姿态(6D位姿)是核心技术难题。今天我要为你介绍一个革命性的解决方案——PVN3D,这是一个基于深度学习的点云关键点投票网络,能够实现高效、精确的6D物体位姿估计。 ## 🚀 为什么PVN3D是你的最佳选择? PVN3D(Point-wise Voting Network for 3D Keypoints)是CVP

gitblog_01052的博客 888

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

PVN3D TensorRT 环境配置指南

本文为PVN3D模型在容器环境中的TensorRT部署提供配置方案,重点解决RGB Backbone和Fusion Head的ONNX/TensorRT导出问题,同时保留PointNet2的PyTorch原生执行。当前容器环境已具备PyTorch 1.10.0+cu113、Python 3.8.20等基础组件,但缺少ONNX/TensorRT相关工具链。建议补充安装ONNX 1.14.1、ONNX Runtime 1.16.3和TensorRT 8.6.1,采用分层部署策略:宿主机构建NVIDIA驱动,容器

豆破苍琼 545

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

学习总结《PVN3D: A Deep Point-wise 3D Keypoints Voting Network for 6DoF Pose》

本文提出了一个Deep Point-wise 3D关键点投票的网络,来进行六自由度估计 什么是六自由度? 六自由度:物体在空间具有六个自由度,即沿x、y、z三个直角坐标轴方向的移动自由度和绕这三个坐标轴的转动自由度 。因此,要完全确定物体的位置,就必须清楚这六个自由度。 任何一个没有受约束的物体,在空间均具有6个独立的运动。 ...

lord0555的博客 4311

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

上一篇: Dify 本地运行实操笔记
下一篇: PVN3D TensorRT 环境配置指南
Yao.Li
博客等级 码龄10年 405粉丝 110原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Yao.Li

爱的魔力,一被卡布奇诺~

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值