update task error
This commit is contained in:
parent
b765fa9340
commit
10874caea0
@ -25,7 +25,7 @@ class EvalKitti:
|
||||
CLUSTERS = ('easy', 'moderate', 'hard', 'all', '6', '10', '15', '20', '25', '30', '40', '50', '>50')
|
||||
METHODS = ['m3d', 'geom', 'task_error', '3dop', 'our']
|
||||
HEADERS = ['method', '<0.5', '<1m', '<2m', 'easy', 'moderate', 'hard', 'all']
|
||||
CATEGORIES = ['pedestrian', 'cyclist']
|
||||
CATEGORIES = ['pedestrian']
|
||||
|
||||
def __init__(self, thresh_iou_our=0.3, thresh_iou_m3d=0.3, thresh_conf_m3d=0.3, thresh_conf_our=0.3,
|
||||
verbose=False, stereo=False):
|
||||
@ -100,15 +100,14 @@ class EvalKitti:
|
||||
if out_gt[0]:
|
||||
out_m3d = self._parse_txts(path_m3d, category, method='m3d')
|
||||
out_3dop = self._parse_txts(path_3dop, category, method='3dop')
|
||||
# out_md = self._parse_txts(path_md, category, method='md')
|
||||
out_md = out_m3d
|
||||
out_md = self._parse_txts(path_md, category, method='md')
|
||||
out_our = self._parse_txts(path_our, category, method='our')
|
||||
out_our_stereo = self._parse_txts(path_our_stereo, category, method='our') if self.stereo else []
|
||||
|
||||
# Compute the error with ground truth
|
||||
self._estimate_error(out_gt, out_m3d, method='m3d')
|
||||
self._estimate_error(out_gt, out_3dop, method='3dop')
|
||||
# self._estimate_error(out_gt, out_md, method='md')
|
||||
self._estimate_error(out_gt, out_md, method='md')
|
||||
self._estimate_error(out_gt, out_our, method='our')
|
||||
if self.stereo:
|
||||
self._estimate_error(out_gt, out_our_stereo, method='our_stereo')
|
||||
@ -126,6 +125,9 @@ class EvalKitti:
|
||||
print('\n' + category.upper() + ':')
|
||||
self.show_statistics()
|
||||
|
||||
# Show/save results
|
||||
self.printer(show=False)
|
||||
|
||||
def printer(self, show):
|
||||
print_results(self.dic_stats, show)
|
||||
|
||||
@ -214,7 +216,7 @@ class EvalKitti:
|
||||
if method == 'our':
|
||||
self.update_errors(dds_geom[idx], dds_gt[idx_gt], cat, self.errors['geom'])
|
||||
self.update_uncertainty(stds_ale[idx], stds_epi[idx], dds[idx], dds_gt[idx_gt], cat)
|
||||
dd_task_error = dds_gt[idx_gt] + (get_task_error(dds_gt[idx_gt], mode='mad'))**2
|
||||
dd_task_error = dds_gt[idx_gt] + (get_task_error(dds_gt[idx_gt]))**2
|
||||
self.update_errors(dd_task_error, dds_gt[idx_gt], cat, self.errors['task_error'])
|
||||
|
||||
elif method == 'our_stereo':
|
||||
@ -248,8 +250,7 @@ class EvalKitti:
|
||||
|
||||
self.update_errors(dds_our[idx], dd_gt, cat, self.errors['our_merged'])
|
||||
self.update_errors(dds_geom[idx], dd_gt, cat, self.errors['geom_merged'])
|
||||
self.update_errors(dd_gt + get_task_error(dd_gt, mode='mad'),
|
||||
dd_gt, cat, self.errors['task_error_merged'])
|
||||
self.update_errors(dd_gt + get_task_error(dd_gt), dd_gt, cat, self.errors['task_error_merged'])
|
||||
self.update_errors(dds_m3d[indices[0]], dd_gt, cat, self.errors['m3d_merged'])
|
||||
self.update_errors(dds_3dop[indices[1]], dd_gt, cat, self.errors['3dop_merged'])
|
||||
self.update_errors(dds_md[indices[2]], dd_gt, cat, self.errors['md_merged'])
|
||||
|
||||
@ -5,4 +5,4 @@ from .kitti import check_conditions, get_category, split_training, parse_ground_
|
||||
from .camera import xyz_from_distance, get_keypoints, pixel_to_camera, project_3d
|
||||
from .logs import set_logger
|
||||
from .stereo import depth_from_disparity
|
||||
from ..utils.nuscenes import select_categories
|
||||
from ..utils.nuscenes import select_categories
|
||||
@ -26,7 +26,7 @@ def append_cluster(dic_jo, phase, xx, dd, kps):
|
||||
|
||||
def get_task_error(dd):
|
||||
"""Get target error not knowing the gender, modeled through a Gaussian Mixure model"""
|
||||
mm = 0.0459
|
||||
mm = 0.046
|
||||
return dd * mm
|
||||
|
||||
|
||||
|
||||
@ -62,8 +62,8 @@ def paper():
|
||||
plt.plot(xx, yy_female, '-.', linewidth=1.7, color='darkorange', label='Adult female')
|
||||
plt.plot(xx, yy_male, '-.', linewidth=1.7, color='b', label='Adult male')
|
||||
plt.xlim(np.min(xx), np.max(xx))
|
||||
plt.xlabel("Distance from the camera [m]")
|
||||
plt.ylabel("Localization error due to human height variation [m]")
|
||||
plt.xlabel("Ground-truth distance from the camera $d_{gt}$ [m]")
|
||||
plt.ylabel("Localization error $\hat{e}$ due to human height variation [m]")
|
||||
plt.legend(loc=(0.01, 0.55)) # Location from 0 to 1 from lower left
|
||||
plt.savefig(os.path.join('docs', 'task_error.png'))
|
||||
|
||||
@ -74,6 +74,7 @@ def target_error(xx, mm):
|
||||
|
||||
def gmm():
|
||||
dist_gmm, dist_male, dist_female = height_distributions()
|
||||
# get_percentile(dist_gmm)
|
||||
mu_gmm = np.mean(dist_gmm)
|
||||
mm_gmm = np.mean(np.abs(1 - mu_gmm / dist_gmm))
|
||||
mm_male = np.mean(np.abs(1 - np.mean(dist_male) / dist_male))
|
||||
@ -136,10 +137,12 @@ def plot_dist(dist_gmm, dist_men, dist_women):
|
||||
|
||||
|
||||
def get_percentile(dist_gmm):
|
||||
dd_gt = 100
|
||||
dd_gt = 1000
|
||||
mu_gmm = np.mean(dist_gmm)
|
||||
dist_d = dd_gt * mu_gmm / dist_gmm
|
||||
perc_d, _ = np.nanpercentile(dist_d, [18.5, 81.5]) # Laplace bi => 63%
|
||||
perc_d, _ = np.nanpercentile(dist_d, [18.5, 81.5]) # Laplace bi => 63%
|
||||
perc_d2, _ = np.nanpercentile(dist_d, [23, 77])
|
||||
mu_d = np.mean(dist_d)
|
||||
mm_bi = (mu_d - perc_d) / mu_d
|
||||
mad_d = np.mean(np.abs(dist_d - mu_d))
|
||||
# mm_bi = (mu_d - perc_d) / mu_d
|
||||
# mm_test = (mu_d - perc_d2) / mu_d
|
||||
# mad_d = np.mean(np.abs(dist_d - mu_d))
|
||||
|
||||
@ -6,6 +6,8 @@ import numpy as np
|
||||
import matplotlib.pyplot as plt
|
||||
from matplotlib.patches import Ellipse
|
||||
|
||||
from ..utils import get_task_error
|
||||
|
||||
|
||||
def print_results(dic_stats, show=False):
|
||||
|
||||
@ -22,14 +24,13 @@ def print_results(dic_stats, show=False):
|
||||
x_min = 0
|
||||
x_max = 38
|
||||
xx = np.linspace(0, 60, 100)
|
||||
mm_gender = 0.0556
|
||||
excl_clusters = ['all', '50', '>50', 'easy', 'moderate', 'hard']
|
||||
clusters = tuple([clst for clst in dic_stats[phase]['our'] if clst not in excl_clusters])
|
||||
yy_gender = target_error(xx, mm_gender)
|
||||
yy_gender = get_task_error(xx)
|
||||
yy_gps = np.linspace(5., 5., xx.shape[0])
|
||||
|
||||
plt.figure(0)
|
||||
fig_name = 'results.png'
|
||||
plt.grid(linewidth=0.2)
|
||||
plt.xlabel("Distance [meters]")
|
||||
plt.ylabel("Average localization error [m]")
|
||||
plt.xlim(x_min, x_max)
|
||||
@ -52,7 +53,7 @@ def print_results(dic_stats, show=False):
|
||||
if show:
|
||||
plt.show()
|
||||
else:
|
||||
plt.savefig(os.path.join(dir_out, fig_name))
|
||||
plt.savefig(os.path.join(dir_out, 'results.png'))
|
||||
plt.close()
|
||||
|
||||
# SPREAD b Figure
|
||||
@ -67,7 +68,7 @@ def print_results(dic_stats, show=False):
|
||||
|
||||
bbs = np.array([dic_stats[phase]['our'][key]['std_ale'] for key in clusters])
|
||||
xxs = get_distances(clusters)
|
||||
yys = target_error(np.array(xxs), mm_gender)
|
||||
yys = get_task_error(np.array(xxs))
|
||||
ax[1].plot(xxs, bbs, marker='s', color='b', label="Spread b")
|
||||
ax[1].plot(xxs, yys, '--', color='lightgreen', label="Task error", linewidth=2.5)
|
||||
yys_up = [rec_c + ar/2 * scale * yy for yy in yys]
|
||||
@ -76,8 +77,8 @@ def print_results(dic_stats, show=False):
|
||||
bbs_down = [rec_c - ar/2 * scale * bb for bb in bbs]
|
||||
|
||||
if plots_line:
|
||||
ax[0].plot(xxs, yys_up, '--', color='lightgreen', markersize=5, linewidth=1)
|
||||
ax[0].plot(xxs, yys_down, '--', color='lightgreen', markersize=5, linewidth=1)
|
||||
ax[0].plot(xxs, yys_up, '--', color='lightgreen', markersize=5, linewidth=1.4)
|
||||
ax[0].plot(xxs, yys_down, '--', color='lightgreen', markersize=5, linewidth=1.4)
|
||||
ax[0].plot(xxs, bbs_up, marker='s', color='b', markersize=5, linewidth=0.7)
|
||||
ax[0].plot(xxs, bbs_down, marker='s', color='b', markersize=5, linewidth=0.7)
|
||||
|
||||
@ -94,14 +95,11 @@ def print_results(dic_stats, show=False):
|
||||
plt.legend()
|
||||
if show:
|
||||
plt.show()
|
||||
else:
|
||||
plt.savefig(os.path.join(dir_out, 'spread_bi.png'))
|
||||
plt.close()
|
||||
|
||||
|
||||
def target_error(xx, mm):
|
||||
"""Multiplication"""
|
||||
return mm * xx
|
||||
|
||||
|
||||
def get_distances(clusters):
|
||||
"""Extract distances as intermediate values between 2 clusters"""
|
||||
|
||||
|
||||
Loading…
Reference in New Issue
Block a user