-
Notifications
You must be signed in to change notification settings - Fork 28
/
EvaluationOnRegistration.py
153 lines (110 loc) · 5.37 KB
/
EvaluationOnRegistration.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
Created on Wed Nov 20 10:11:15 2019
@author: rain
"""
import os
import numpy as np
from scipy import io
import math
from numpy import linalg as LA
from Dirs import *
from Transformations import *
from Visualization import *
NUM_METHODS = 3
t_RRE = 1.0 # degrees
t_RTE = 0.5
AllErrors_Eulers = []
AllErrors_T = []
AllProportions = []
AllTrailCounts = []
iFrameStep = 1
for iKeyPt in range(NUM_METHODS):
AllErrors_Eulers.append([])
AllErrors_T.append([])
AllProportions.append([])
AllTrailCounts.append([])
for iDesc in range(NUM_METHODS):
AllErrors_Eulers[iKeyPt].append([])
AllErrors_T[iKeyPt].append([])
AllProportions[iKeyPt].append([])
AllTrailCounts[iKeyPt].append([])
for iKeyPt in range(NUM_METHODS):
for iDesc in range(NUM_METHODS):
#for iKeyPt in [0,1]:
# for iDesc in [0,1]:
CurAllErrorAngles = np.zeros((1,3), dtype=np.float32)
CurAllErrorTs = np.zeros((1,3), dtype=np.float32)
CurAllProportions = np.zeros((1,1), dtype=np.float32)
CurAllTrailCounts = np.zeros((1,1), dtype=np.float32)
for iSequence in range(0, 11, 1):
print(iKeyPt, iDesc, iSequence)
strSequence = str(iSequence).zfill(2)
# calib data
calibFileFullPath = str(strCalibDataDir + strSequence + '/calib_.txt')
calib=np.loadtxt(calibFileFullPath)
Tr=np.array(calib[4,:].reshape(3,4),dtype=np.float32)
# load poses
poses = np.loadtxt(strGroundTruthPosesDir+strSequence+'.txt') # ground truth
strFileName = str(iFrameStep) + '_' + str(iKeyPt) + '-' + str(iDesc) + '_' + strSequence + '.txt'
# strFileName = strSequence + '.txt'
posePath = os.path.join(strEstimatedPosesDir, strFileName)
poses_ = np.loadtxt(posePath)
# get errors
GroundTruthRels, EstimatedRels, errorRelEulers, errorRelTs = GetErrorRTs(poses, poses_, Tr, isPlot=0)
## inlier rage and avarange iterations
strFileName = 'Matchablity_' + str(iFrameStep) + '_' + str(iKeyPt) + '-' + str(iDesc) + '_' + strSequence + '.mat'
matchablityPath = os.path.join(strBaseDir, strFileName)
mat = io.loadmat(matchablityPath)
proportions = mat['AllProportions'].T
trailCounts = mat['AllTrialCounts'].T
# append to current arrays
CurAllErrorAngles = np.r_[CurAllErrorAngles, errorRelEulers]
CurAllErrorTs = np.r_[CurAllErrorTs, errorRelTs]
CurAllProportions = np.r_[CurAllProportions, proportions]
CurAllTrailCounts = np.r_[CurAllTrailCounts, trailCounts]
CurAllErrorAngles = np.delete(CurAllErrorAngles, 0, axis=0)
CurAllErrorTs = np.delete(CurAllErrorTs, 0, axis=0)
CurAllProportions = np.delete(CurAllProportions, 0, axis=0)
CurAllTrailCounts = np.delete(CurAllTrailCounts, 0, axis=0)
AllErrors_Eulers[iKeyPt][iDesc].append(CurAllErrorAngles)
AllErrors_T[iKeyPt][iDesc].append(CurAllErrorTs)
AllProportions[iKeyPt][iDesc].append(CurAllProportions)
AllTrailCounts[iKeyPt][iDesc].append(CurAllTrailCounts)
EvaluationResults = np.zeros((NUM_METHODS*NUM_METHODS, 7), dtype=np.float32)
successIdx = np.zeros((NUM_METHODS*NUM_METHODS, AllErrors_Eulers[0][0][0].shape[0]), dtype=np.bool)
for iKeyPt in range(NUM_METHODS):
for iDesc in range(NUM_METHODS):
Errors_Eulers = np.squeeze(np.array(AllErrors_Eulers[iKeyPt][iDesc], dtype=np.float32))
Errors_T = np.squeeze(np.array(AllErrors_T[iKeyPt][iDesc], dtype=np.float32))
Proportions = np.squeeze(np.array(AllProportions[iKeyPt][iDesc], dtype=np.float32))
TrailCounts = np.squeeze(np.array(AllTrailCounts[iKeyPt][iDesc], dtype=np.float32))
# RRE and RTE (relative rotation error and relative translation error)
RREs = np.sum(np.abs(Errors_Eulers), axis=1)
RTEs = LA.norm(Errors_T, axis=1)
RRE = np.mean(RREs)
RTE = np.mean(RTEs)
stdRRE = np.std(RREs)
stdRTE = np.std(RTEs)
# registration success rate
idx_RRE = (RREs < t_RRE)
idx_RTE = (RTEs < t_RTE)
finalIdx = idx_RRE * idx_RTE
successIdx[iKeyPt*3+iDesc,:] = finalIdx
cntSuccesses = np.sum(finalIdx)
SuccessRate = cntSuccesses/RREs.shape[0]
# inlier ratio
InlierRatio = np.mean(Proportions)
# average iterations
AverageIterations = np.mean(TrailCounts)
EvaluationResults[iKeyPt*3+iDesc,:] = [RRE, stdRRE, RTE, stdRTE, SuccessRate, InlierRatio, AverageIterations]
# print(EvaluationResults[iKeyPt*3+iDesc,:])
print(RRE, RTE)
# # display results
# print('RRE =', RRE)
# print('RTE =', RTE)
# print('SuccessRate =', SuccessRate)
# print('InlierRatio =', InlierRatio)
# print('AverageIterations =', AverageIterations)
io.savemat(os.path.join(strBaseDir, 'EvaluationResults.mat'), {'EvaluationResults':EvaluationResults})