如何使用 KITTI 里程计数据集评估单眼视觉里程计结果
How to evaluate Monocular Visual Odometry results used the KITTI odometry dataset
我正在尝试使用 KITTI 开放数据集进行深度单目视觉里程计
我试着用这个 repo
它使用此代码将姿势转换为 6DoF
def get6DoFPose(self, p):
pos = np.array([p[3], p[7], p[11]])
R = np.array([[p[0], p[1], p[2]], [p[4], p[5], p[6]], [p[8], p[9], p[10]]])
angles = self.rotationMatrixToEulerAngles(R)
return np.concatenate((pos, angles))
def isRotationMatrix(self, R):
Rt = np.transpose(R)
shouldBeIdentity = np.dot(Rt, R)
I = np.identity(3, dtype=R.dtype)
n = np.linalg.norm(I - shouldBeIdentity)
return n < 1e-6
def rotationMatrixToEulerAngles(self, R):
assert (self.isRotationMatrix(R))
sy = math.sqrt(R[0, 0] * R[0, 0] + R[1, 0] * R[1, 0])
singular = sy < 1e-6
if not singular:
x = math.atan2(R[2, 1], R[2, 2])
y = math.atan2(-R[2, 0], sy)
z = math.atan2(R[1, 0], R[0, 0])
else:
x = math.atan2(-R[1, 2], R[1, 1])
y = math.atan2(-R[2, 0], sy)
z = 0
return np.array([x, y, z], dtype=np.float32)
模型输出也是相同的格式 (6DoF)
问题是如何评估 6DoF 结果,因为此评估工具 (kitti-odom-eval) 仅支持以下两种格式
# First format: skipping frames are allowed
99 T00 T01 T02 T03 T10 T11 T12 T13 T20 T21 T22 T23
# Second format: all poses should be included in the file
T00 T01 T02 T03 T10 T11 T12 T13 T20 T21 T22 T23
您的模型输出是与平移相关的旋转欧拉角的相对位置。
要进行评估,您必须:
将您的旋转和平移转换为齐次矩阵 4x4 -> 为此,您必须将欧拉角转换为旋转矩阵,然后将旋转矩阵 3x3 与平移向量 1x3 连接起来,并追加一个额外的行[0 ,0,0,1]矩阵的一端得到齐次矩阵。
将您的相对位置 4x4 转换为绝对位置-> 您在 Tk 中的绝对位置是相对位置 Trel[=35 的点积=] 到先前的绝对位置 Tk-1 其中 T 是帧索引为 k
的齐次矩阵
Tk = Trel @ Tk-1
第一个绝对位置取决于你的数据集和你想做的工作。
默认情况下,基本绝对位置是 4x4 二维数组,对角线为 1,其他位置为 0(在 numpy np.eye(4) 中)
因此,要转换序列中的整个相对位置,您需要乘法
基础绝对位置到所有相对位置
Tk5 = Trel @ Tk4 # where Trel is relative position between frame 4 and 5
- 当第 2 步完成后,您将拥有包含 Tn 绝对位置的绝对位置。那么您必须展平每个齐次 4x4 矩阵并获得一个包含 12 个元素的向量,并将每个展平的齐次 4x4 矩阵作为结果写入文件!
KITTI 是视觉里程计中必须流行的数据集我认为阅读此主题和参考链接可以帮助您:视觉里程计,Kitti 数据集
我正在尝试使用 KITTI 开放数据集进行深度单目视觉里程计 我试着用这个 repo
它使用此代码将姿势转换为 6DoF
def get6DoFPose(self, p):
pos = np.array([p[3], p[7], p[11]])
R = np.array([[p[0], p[1], p[2]], [p[4], p[5], p[6]], [p[8], p[9], p[10]]])
angles = self.rotationMatrixToEulerAngles(R)
return np.concatenate((pos, angles))
def isRotationMatrix(self, R):
Rt = np.transpose(R)
shouldBeIdentity = np.dot(Rt, R)
I = np.identity(3, dtype=R.dtype)
n = np.linalg.norm(I - shouldBeIdentity)
return n < 1e-6
def rotationMatrixToEulerAngles(self, R):
assert (self.isRotationMatrix(R))
sy = math.sqrt(R[0, 0] * R[0, 0] + R[1, 0] * R[1, 0])
singular = sy < 1e-6
if not singular:
x = math.atan2(R[2, 1], R[2, 2])
y = math.atan2(-R[2, 0], sy)
z = math.atan2(R[1, 0], R[0, 0])
else:
x = math.atan2(-R[1, 2], R[1, 1])
y = math.atan2(-R[2, 0], sy)
z = 0
return np.array([x, y, z], dtype=np.float32)
模型输出也是相同的格式 (6DoF)
问题是如何评估 6DoF 结果,因为此评估工具 (kitti-odom-eval) 仅支持以下两种格式
# First format: skipping frames are allowed
99 T00 T01 T02 T03 T10 T11 T12 T13 T20 T21 T22 T23
# Second format: all poses should be included in the file
T00 T01 T02 T03 T10 T11 T12 T13 T20 T21 T22 T23
您的模型输出是与平移相关的旋转欧拉角的相对位置。
要进行评估,您必须:
将您的旋转和平移转换为齐次矩阵 4x4 -> 为此,您必须将欧拉角转换为旋转矩阵,然后将旋转矩阵 3x3 与平移向量 1x3 连接起来,并追加一个额外的行[0 ,0,0,1]矩阵的一端得到齐次矩阵。
将您的相对位置 4x4 转换为绝对位置-> 您在 Tk 中的绝对位置是相对位置 Trel[=35 的点积=] 到先前的绝对位置 Tk-1 其中 T 是帧索引为 k
的齐次矩阵
Tk = Trel @ Tk-1
第一个绝对位置取决于你的数据集和你想做的工作。 默认情况下,基本绝对位置是 4x4 二维数组,对角线为 1,其他位置为 0(在 numpy np.eye(4) 中) 因此,要转换序列中的整个相对位置,您需要乘法 基础绝对位置到所有相对位置
Tk5 = Trel @ Tk4 # where Trel is relative position between frame 4 and 5
- 当第 2 步完成后,您将拥有包含 Tn 绝对位置的绝对位置。那么您必须展平每个齐次 4x4 矩阵并获得一个包含 12 个元素的向量,并将每个展平的齐次 4x4 矩阵作为结果写入文件!
KITTI 是视觉里程计中必须流行的数据集我认为阅读此主题和参考链接可以帮助您:视觉里程计,Kitti 数据集