FoundationPose 测试记录

https://github.com/NVlabs/FoundationPose?tab=readme-ov-file

FoundationPose

安装

conda环境下搞了一下午,自己电脑的cuda版本太低了,放弃了,就直接装docker环境了。

docker要注意的是,docker要安装GPU版的,否则会报错。

bash 复制代码
docker: Error response from daemon: could not select device driver "" with capabilities: [[gpu]].

参考解决方案

解析

1. 显示模型

为了显示3D模型,需要重新装下 pyglet的版本,

pip install pyglet==1.5.28

然后运行下面的代码。

bash 复制代码
import trimesh

mesh = trimesh.load('demo_data/mustard0/mesh/textured_simple.obj')

attributes = dir(mesh)
#attributes 中能包含所有类的所有属性和函数
print(attributes)

print(len(mesh.vertices)) #打印顶点数

scene = trimesh.Scene()
# 添加模型到场景
scene.add_geometry(mesh)

# 显示场景
scene.show()

2. run_demo 用于有模型的6D姿态估计

python 复制代码
mesh = trimesh.load(args.mesh_file) #读取mesh

to_origin, extents = trimesh.bounds.oriented_bounds(mesh)
#to_origin是方向和位置,extents是尺寸大小
bbox = np.stack([-extents/2, extents/2], axis=0).reshape(2,3)

...

#初始化四个模块
scorer = ScorePredictor()
refiner = PoseRefinePredictor()
glctx = dr.RasterizeCudaContext()
est = FoundationPose(model_pts=mesh.vertices, model_normals=mesh.vertex_normals, mesh=mesh, scorer=scorer, refiner=refiner, debug_dir=debug_dir, debug=debug, glctx=glctx)

#初始化数据
reader = YcbineoatReader(video_dir=args.test_scene_dir, shorter_side=None, zfar=np.inf)

FoundationPose函数是主要进行6D 姿态估计的函数,

model_pts=mesh.vertices #是mesh的顶点坐标

model_normals=mesh.vertex_normals #是mesh的顶点法线方向,是3D向量

mesh=mesh, #载入 3D 模型

scorer=scorer, #应该是对应论文3.4章节的打分预测

refiner=refiner, #应该对应论文3.3章的精细化预测部分

glctx=glctx,#RasterizeCudaContext函数是使用nvdiffrast库中的RasterizeCudaContext类,用于光栅化CUDA上下文(将3D场景转换为2D图像)


RasterizeCudaContext 的使用,解析了一下nvdiffrast_render, 光栅化就是将3D模型向不同的2D图像方向投影。

主要使用dr.rasterize 这一步进行具体执行

复制代码
rast_out, _ = dr.rasterize(glctx, pos_clip, pos_idx, resolution=np.asarray(output_size))

mustard0 的demo为例

glctx 是dr.RasterizeCudaContext()类

pos_clip 维度 [252, 10983, 4] , 252个方向,顶点数10983个len(mesh.vertices),4个通道?

pos_idx 维度 [15728, 3], ,15728是网格面的数量len(mesh.faces) ,每行表示形成面的顶点的索引,意思是三个点成一个面

resolution = [160,160] , 期望输出的2D图像维度

得到的 rast_out 维度 (252, 160, 160, 4), 252个光栅化后的方向,每个图160*160, 4个通道(RGB +透明)

代码中进行了252个方向的光栅化投影,可能就是论文中提到的,粗略姿态方向。

以下是其中3个方向

颜色通道暂时没查出来在mesh中是怎么个储存形式,有个这:

复制代码
mesh.visual.material.image 如下所示,RGB和BGR反了

后面就是正常的输入图片和预测姿态,如果是第一帧 ,会使用物体的mask信息进行register

bash 复制代码
    if i==0:
      mask = reader.get_mask(0).astype(bool)
      pose = est.register(K=reader.K, rgb=color, depth=depth, ob_mask=mask, iteration=args.est_refine_iter)

如果不是第一帧 ,会使用track_one ,根据前面的估计结果进行调整

相关推荐
NQBJT1 分钟前
万字拆解 NeckFix:AI 脖子前倾检测的算法原理与工程实现
人工智能·算法
jaychouchannel6 分钟前
Python 常用排序算法详解
算法
数智工坊7 分钟前
【Inner Monologue论文阅读】: 首次将大语言模型嵌入机器人控制闭环,实现自我反思和动态行为调整
论文阅读·人工智能·算法·语言模型·机器人·无人机
为何创造硅基生物43 分钟前
C 语言 typedef 结构体私有化
c语言·开发语言·算法
yzx9910131 小时前
递归算法入门:像俄罗斯套娃一样思考
人工智能·算法
心中有国也有家1 小时前
从零上手 CANN 学习中心:像逛技术便利店一样学昇腾
学习·算法·开源
oo哦哦1 小时前
搜索矩阵系统的最短路密码:用Dijkstra算法和网络流理论,解释为什么你做了1000个关键词,流量还不如别人30个
网络·算法·矩阵
Matlab程序猿小助手1 小时前
【MATLAB源码-第319期】基于matlab的帝王蝶优化算法(MBO)无人机三维路径规划,输出做短路径图和适应度曲线.
开发语言·算法·matlab
图码1 小时前
二分查找进阶:如何在有序数组中快速找到Upper Bound?
数据结构·算法·面试·分类·柔性数组
试剂界的爱马仕1 小时前
《古董局·终局5:潮生》第 2 章:镜子的天赋
大数据·人工智能·算法