|
function evaluate_poses_keyframe
|
|
|
|
opt = globals();
|
|
|
|
|
|
fid = fopen('classes.txt', 'r');
|
|
C = textscan(fid, '%s');
|
|
object_names = C{1};
|
|
fclose(fid);
|
|
|
|
|
|
num_objects = numel(object_names);
|
|
models = cell(num_objects, 1);
|
|
for i = 1:num_objects
|
|
filename = fullfile(opt.root, 'models', object_names{i}, 'points.xyz');
|
|
disp(filename);
|
|
models{i} = load(filename);
|
|
end
|
|
|
|
|
|
fid = fopen('keyframe.txt', 'r');
|
|
C = textscan(fid, '%s');
|
|
keyframes = C{1};
|
|
fclose(fid);
|
|
|
|
|
|
distances_sys = zeros(100000, 5);
|
|
distances_non = zeros(100000, 5);
|
|
errors_rotation = zeros(100000, 5);
|
|
errors_translation = zeros(100000, 5);
|
|
results_seq_id = zeros(100000, 1);
|
|
results_frame_id = zeros(100000, 1);
|
|
results_object_id = zeros(100000, 1);
|
|
results_cls_id = zeros(100000, 1);
|
|
|
|
|
|
count = 0;
|
|
for i = 1:numel(keyframes)
|
|
|
|
|
|
name = keyframes{i};
|
|
pos = strfind(name, '/');
|
|
seq_id = str2double(name(1:pos-1));
|
|
frame_id = str2double(name(pos+1:end));
|
|
|
|
|
|
filename = sprintf('results_PoseCNN_RSS2018/%06d.mat', i - 1);
|
|
result = load(filename);
|
|
filename = sprintf('Densefusion_iterative_result/%04d.mat', i - 1);
|
|
result_my = load(filename);
|
|
filename = sprintf('Densefusion_wo_refine_result/%04d.mat', i - 1);
|
|
result_mygt = load(filename);
|
|
|
|
|
|
filename = sprintf('results_3DCoordinate/%04d.mat', i - 1);
|
|
result_3DCoordinate = load(filename);
|
|
|
|
|
|
filename = fullfile(opt.root, 'data', sprintf('%04d/%06d-meta.mat', seq_id, frame_id));
|
|
disp(filename);
|
|
gt = load(filename);
|
|
|
|
|
|
for j = 1:numel(gt.cls_indexes)
|
|
count = count + 1;
|
|
cls_index = gt.cls_indexes(j);
|
|
RT_gt = gt.poses(:, :, j);
|
|
|
|
results_seq_id(count) = seq_id;
|
|
results_frame_id(count) = frame_id;
|
|
results_object_id(count) = j;
|
|
results_cls_id(count) = cls_index;
|
|
|
|
|
|
roi_index = find(result.rois(:, 2) == cls_index);
|
|
if isempty(roi_index) == 0
|
|
RT = zeros(3, 4);
|
|
|
|
|
|
RT(1:3, 1:3) = quat2rotm(result_my.poses(roi_index, 1:4));
|
|
RT(:, 4) = result_my.poses(roi_index, 5:7);
|
|
distances_sys(count, 1) = adi(RT, RT_gt, models{cls_index}');
|
|
distances_non(count, 1) = add(RT, RT_gt, models{cls_index}');
|
|
errors_rotation(count, 1) = re(RT(1:3, 1:3), RT_gt(1:3, 1:3));
|
|
errors_translation(count, 1) = te(RT(:, 4), RT_gt(:, 4));
|
|
|
|
|
|
RT(1:3, 1:3) = quat2rotm(result.poses_icp(roi_index, 1:4));
|
|
RT(:, 4) = result.poses_icp(roi_index, 5:7);
|
|
distances_sys(count, 2) = adi(RT, RT_gt, models{cls_index}');
|
|
distances_non(count, 2) = add(RT, RT_gt, models{cls_index}');
|
|
errors_rotation(count, 2) = re(RT(1:3, 1:3), RT_gt(1:3, 1:3));
|
|
errors_translation(count, 2) = te(RT(:, 4), RT_gt(:, 4));
|
|
|
|
|
|
RT(1:3, 1:3) = quat2rotm(result_mygt.poses(roi_index, 1:4));
|
|
RT(:, 4) = result_mygt.poses(roi_index, 5:7);
|
|
distances_sys(count, 3) = adi(RT, RT_gt, models{cls_index}');
|
|
distances_non(count, 3) = add(RT, RT_gt, models{cls_index}');
|
|
errors_rotation(count, 3) = re(RT(1:3, 1:3), RT_gt(1:3, 1:3));
|
|
errors_translation(count, 3) = te(RT(:, 4), RT_gt(:, 4));
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
else
|
|
distances_sys(count, 1:4) = inf;
|
|
distances_non(count, 1:4) = inf;
|
|
errors_rotation(count, 1:4) = inf;
|
|
errors_translation(count, 1:4) = inf;
|
|
end
|
|
|
|
|
|
|
|
roi_index = find(result_3DCoordinate.rois(:, 2) == cls_index);
|
|
if isempty(roi_index) == 0
|
|
RT = zeros(3, 4);
|
|
RT(1:3, 1:3) = quat2rotm(result_3DCoordinate.poses(roi_index, 1:4));
|
|
RT(:, 4) = result_3DCoordinate.poses(roi_index, 5:7);
|
|
distances_sys(count, 5) = adi(RT, RT_gt, models{cls_index}');
|
|
distances_non(count, 5) = add(RT, RT_gt, models{cls_index}');
|
|
errors_rotation(count, 5) = re(RT(1:3, 1:3), RT_gt(1:3, 1:3));
|
|
errors_translation(count, 5) = te(RT(:, 4), RT_gt(:, 4));
|
|
else
|
|
distances_sys(count, 5) = inf;
|
|
distances_non(count, 5) = inf;
|
|
errors_rotation(count, 5) = inf;
|
|
errors_translation(count, 5) = inf;
|
|
end
|
|
end
|
|
end
|
|
distances_sys = distances_sys(1:count, :);
|
|
distances_non = distances_non(1:count, :);
|
|
errors_rotation = errors_rotation(1:count, :);
|
|
errors_translation = errors_translation(1:count, :);
|
|
results_seq_id = results_seq_id(1:count);
|
|
results_frame_id = results_frame_id(1:count);
|
|
results_object_id = results_object_id(1:count, :);
|
|
results_cls_id = results_cls_id(1:count, :);
|
|
save('results_keyframe.mat', 'distances_sys', 'distances_non', 'errors_rotation', 'errors_translation',...
|
|
'results_seq_id', 'results_frame_id', 'results_object_id', 'results_cls_id');
|
|
|
|
function pts_new = transform_pts_Rt(pts, RT)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
n = size(pts, 2);
|
|
pts_new = RT * [pts; ones(1, n)];
|
|
|
|
function error = add(RT_est, RT_gt, pts)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
pts_est = transform_pts_Rt(pts, RT_est);
|
|
pts_gt = transform_pts_Rt(pts, RT_gt);
|
|
diff = pts_est - pts_gt;
|
|
error = mean(sqrt(sum(diff.^2, 1)));
|
|
|
|
function error = adi(RT_est, RT_gt, pts)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
pts_est = transform_pts_Rt(pts, RT_est);
|
|
pts_gt = transform_pts_Rt(pts, RT_gt);
|
|
|
|
|
|
MdlKDT = KDTreeSearcher(pts_est');
|
|
[~, D] = knnsearch(MdlKDT, pts_gt');
|
|
error = mean(D);
|
|
|
|
function error = re(R_est, R_gt)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
error_cos = 0.5 * (trace(R_est * inv(R_gt)) - 1.0);
|
|
error_cos = min(1.0, max(-1.0, error_cos));
|
|
error = acos(error_cos);
|
|
error = 180.0 * error / pi;
|
|
|
|
function error = te(t_est, t_gt)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
error = norm(t_gt - t_est); |