Gen6D代码框架分析
Gen6D代码框架分析
输出格式
同机械臂DH矩阵
pose_pr = [[r11, r12, r13, tx], # 旋转矩阵X轴分量 + X平移[r21, r22, r23, ty], # 旋转矩阵Y轴分量 + Y平移[r31, r32, r33, tz], # 旋转矩阵Z轴分量 + Z平移[ 0, 0, 0, 1] # 齐次坐标补全
]
具体解释
各分量详细说明:
-
旋转分量 (r11-r33)
- 构成3x3正交旋转矩阵,表示物体坐标系到相机坐标系的旋转变换
- 具体参数计算路径:
-
平移分量 (tx, ty, tz)
- 单位:毫米(根据database.py中3D点云数据的单位约定)
- 物理意义:物体中心在相机坐标系中的坐标
- 计算公式:
t = -R^T * camera_center
amera_center = ref_cam * (que_f / ref_f) / scale_r2q + 光心补偿项 -
具体代码定位
- utils/pose_utils.py 第132-135行:通过反解相机中心验证平移分量
- estimator.py 第195行:使用look_at_rotation确保旋转矩阵正交性
- predict.py 第59行:应用pose_pr进行3D边界框投影验证
-
示例数值解(位置:Gen6D/data/custom/具体对象/test/images_out/xxx-pose.npy):
假设某物体位姿如下:
- 距离相机约621mm(tz值)
- 相对相机向右152mm,向上87mm
- 绕X轴旋转约30度,Y轴45度,Z轴10度(通过旋转矩阵换算欧拉角)
表示如下:
[[ 0.874, 0.433,-0.193, 152.1], # X轴:主视角方向[-0.482, 0.796,-0.361, 86.7], # Y轴:物体竖直方向[ 0.052, 0.422, 0.905, 621.3], # Z轴:深度方向[ 0.000, 0.000, 0.000, 1.0] ]
得到pose_pr的完整数据流
-
数据输入源:
当前帧图像(img)来自视频分解:predict.py第45行 video2image处理
参考视图数据库:通过estimator.build()加载(database.py提供3D点云数据)
相机内参K:根据图像尺寸动态计算(predict.py第50-52行) -
核心计算链路:
-
关键变换矩阵M_q2r的构成(utils/pose_utils.py第109-113行):
平移分量:position(检测器输出)
缩放因子:1/scale_r2q(检测器输出的倒数)
平面旋转:-angle_r2q(选择器输出的视角旋转)
参考视图投影中心:ref_cen(通过project_points计算) -
三维位姿合成细节:
- 使用estimate_pose_from_similarity_transform将2D相似变换提升到3D空间:
- 基于参考视图位姿ref_pose(来自数据库)
- 通过object_center建立3D-2D对应关系
- 使用look_at_rotation计算视角对齐旋转(pose_utils.py第35行)
- 优化阶段实现:
- Refiner网络通过深度学习优化位姿:
- 输入:原始图像、初始位姿、相机参数
- 输出:精细化位姿(estimator.py第199-202行)
- 采用迭代优化机制(默认3次迭代)
-
数学表达:
# 伪代码 pose_pr = refine( T_optimize( compose( T_translate(position), T_scale(1/scale_r2q), T_rotate(angle_r2q), project(ref_pose) ) ) # 其中T_optimize由refiner网络实现非线性优化