diff --git a/rpt/tracker.hpp b/rpt/tracker.hpp index 3d42643..b791f1b 100644 --- a/rpt/tracker.hpp +++ b/rpt/tracker.hpp @@ -24,7 +24,7 @@ struct Track class PoseTracker { public: - PoseTracker(float fps); + PoseTracker(float max_movement_speed, float max_distance); std::vector>>> track_poses( const std::vector>> &poses_3d, @@ -35,15 +35,9 @@ public: private: float max_distance; + float max_movement_speed; size_t history_size = 3; - // Approach speed of EN ISO 13855 with 2000 mm/sec for hand speed - // and an additional factor to compensate for noise-based jumps - float max_movement_speed = 2.0 * 1.5; - - // The size of an A4 sheet of paper which is assumed to fit between two different persons - float max_base_distance = 0.3; - std::vector timestamps; std::vector pose_tracks; @@ -70,9 +64,10 @@ private: // ================================================================================================= // ================================================================================================= -PoseTracker::PoseTracker(float fps) +PoseTracker::PoseTracker(float max_movement_speed, float max_distance) { - this->max_distance = max_base_distance + max_movement_speed / fps; + this->max_movement_speed = max_movement_speed; + this->max_distance = max_distance; } // ================================================================================================= diff --git a/scripts/test_skelda_dataset.cpp b/scripts/test_skelda_dataset.cpp index c823fd9..e93ce50 100644 --- a/scripts/test_skelda_dataset.cpp +++ b/scripts/test_skelda_dataset.cpp @@ -123,6 +123,8 @@ int main(int argc, char **argv) const size_t min_group_size = config["min_group_size"]; const int take_interval = config["take_interval"]; const float ifps = config["fps"]; + const float max_movement_speed = config["max_movement_speed"]; + const float max_track_distance = config["max_track_distance"]; // Load 2D model bool use_wb = utils_pipeline::use_whole_body(whole_body); @@ -134,7 +136,7 @@ int main(int argc, char **argv) std::unique_ptr tri_model = std::make_unique( min_match_score, min_group_size); std::unique_ptr pose_tracker = std::make_unique( - ifps); + max_movement_speed, max_track_distance); // Timers size_t time_count = dataset.size(); @@ -216,7 +218,7 @@ int main(int argc, char **argv) auto &item = dataset[i]; auto &poses_2d = all_poses_2d[i]; - if (old_scene != item["scene"] || old_id + take_interval < item["index"]) + if (old_scene != item["scene"] || old_id + take_interval != item["index"]) { // Reset last poses if scene changes tri_model->reset(); @@ -248,7 +250,7 @@ int main(int argc, char **argv) elapsed = std::chrono::high_resolution_clock::now() - stime; times_pose3d.push_back(elapsed.count()); - if (ifps < 1) + if (ifps <= 0) { // Disable pose tracking if frame rate is too low times_tracks.push_back(0.0); diff --git a/scripts/test_skelda_dataset.py b/scripts/test_skelda_dataset.py index 4c69657..e016121 100644 --- a/scripts/test_skelda_dataset.py +++ b/scripts/test_skelda_dataset.py @@ -51,6 +51,15 @@ default_min_group_size = 1 # If most of the time only one person is in a image, disable it, because it is slightly slower then default_batch_poses = True +# Approach speed of EN ISO 13855 with 2000 mm/sec for hand speed +# and an additional factor to compensate for noise-based jumps +default_max_movement_speed = 2.0 * 1.5 + +# The size of an A4 sheet of paper which is assumed to fit between two different persons +# and additionally the distance a person can move between two frames (here at 10 fps) +default_max_track_distance = 0.3 + default_max_movement_speed / 10 + + datasets = { "human36m": { "path": "/datasets/human36m/skelda/pose_test.json", @@ -61,6 +70,8 @@ datasets = { "min_bbox_score": 0.4, "min_bbox_area": 0.1 * 0.1, "batch_poses": False, + "max_movement_speed": 2.0 * 1.5, + "max_track_distance": 0.3 + default_max_movement_speed / (50 / 5), }, "panoptic": { "path": "/datasets/panoptic/skelda/test.json", @@ -69,16 +80,19 @@ datasets = { # "cams": ["00_03", "00_06", "00_12", "00_13", "00_23", "00_15", "00_10", "00_21", "00_09", "00_01"], # "cams": [], "take_interval": 3, + "fps": 30, "min_match_score": 0.95, "use_scenes": ["160906_pizza1", "160422_haggling1", "160906_ian5"], "min_group_size": 1, # "min_group_size": 4, # "min_group_size": 11, "min_bbox_area": 0.05 * 0.05, + "max_track_distance": 0.3 + default_max_movement_speed / (30 / 3), }, "mvor": { "path": "/datasets/mvor/skelda/all.json", "take_interval": 1, + "fps": -1, "with_depth": False, "min_match_score": 0.85, "min_bbox_score": 0.25, @@ -89,6 +103,7 @@ datasets = { "take_interval": 1, "min_match_score": 0.92, "min_bbox_score": 0.5, + "max_track_distance": 0.3 + default_max_movement_speed / 25, }, "shelf": { "path": "/datasets/shelf/skelda/test.json", @@ -96,82 +111,108 @@ datasets = { "fps": 25, "min_match_score": 0.95, "min_group_size": 2, + "max_track_distance": 0.3 + default_max_movement_speed / 25, }, "ikeaasm": { "path": "/datasets/ikeaasm/skelda/test.json", "take_interval": 2, + "fps": -1, "min_match_score": 0.92, "min_bbox_score": 0.20, }, "chi3d": { "path": "/datasets/chi3d/skelda/all.json", "take_interval": 5, + "fps": 50, + "max_track_distance": 0.3 + default_max_movement_speed / (50 / 5), }, "tsinghua": { "path": "/datasets/tsinghua/skelda/test.json", "take_interval": 3, + "fps": 30, "min_match_score": 0.95, "min_group_size": 2, + "max_track_distance": 0.3 + default_max_movement_speed / (30 / 3), }, "human36m_wb": { "path": "/datasets/human36m/skelda/wb/test.json", "take_interval": 100, + "fps": -1, "min_bbox_score": 0.4, "batch_poses": False, }, "egohumans_tagging": { "path": "/datasets/egohumans/skelda/all.json", "take_interval": 2, + "fps": 20, "subset": "tagging", "min_match_score": 0.92, "min_group_size": 2, "min_bbox_score": 0.2, "min_bbox_area": 0.05 * 0.05, + "max_movement_speed": 4.0 * 1.5, + "max_track_distance": 0.3 + (4.0 * 1.5) / (20 / 2), }, "egohumans_legoassemble": { "path": "/datasets/egohumans/skelda/all.json", "take_interval": 2, + "fps": 20, "subset": "legoassemble", "min_group_size": 2, + "max_track_distance": 0.3 + default_max_movement_speed / (20 / 2), }, "egohumans_fencing": { "path": "/datasets/egohumans/skelda/all.json", "take_interval": 2, + "fps": 20, "subset": "fencing", "min_group_size": 7, "min_bbox_score": 0.5, "min_bbox_area": 0.05 * 0.05, + "max_track_distance": 0.3 + default_max_movement_speed / (20 / 2), }, "egohumans_basketball": { "path": "/datasets/egohumans/skelda/all.json", "take_interval": 2, + "fps": 20, "subset": "basketball", "min_group_size": 7, "min_bbox_score": 0.25, "min_bbox_area": 0.025 * 0.025, + "max_movement_speed": 4.0 * 1.5, + "max_track_distance": 0.3 + (4.0 * 1.5) / (20 / 2), }, "egohumans_volleyball": { "path": "/datasets/egohumans/skelda/all.json", "take_interval": 2, + "fps": 20, "subset": "volleyball", "min_group_size": 11, "min_bbox_score": 0.25, "min_bbox_area": 0.05 * 0.05, + "max_movement_speed": 4.0 * 1.5, + "max_track_distance": 0.3 + (4.0 * 1.5) / (20 / 2), }, "egohumans_badminton": { "path": "/datasets/egohumans/skelda/all.json", "take_interval": 2, + "fps": 20, "subset": "badminton", "min_group_size": 7, "min_bbox_score": 0.25, "min_bbox_area": 0.05 * 0.05, + "max_movement_speed": 4.0 * 1.5, + "max_track_distance": 0.3 + (4.0 * 1.5) / (20 / 2), }, "egohumans_tennis": { "path": "/datasets/egohumans/skelda/all.json", "take_interval": 2, + "fps": 20, "subset": "tennis", "min_group_size": 11, "min_bbox_area": 0.025 * 0.025, + "max_movement_speed": 4.0 * 1.5, + "max_track_distance": 0.3 + (4.0 * 1.5) / (20 / 2), }, } @@ -338,6 +379,12 @@ def main(): min_bbox_score = datasets[dataset_use].get("min_bbox_score", default_min_bbox_score) min_bbox_area = datasets[dataset_use].get("min_bbox_area", default_min_bbox_area) batch_poses = datasets[dataset_use].get("batch_poses", default_batch_poses) + max_movement_speed = datasets[dataset_use].get( + "max_movement_speed", default_max_movement_speed + ) + max_track_distance = datasets[dataset_use].get( + "max_track_distance", default_max_track_distance + ) # Save config config_path = tmp_export_dir + "config.json" @@ -347,6 +394,8 @@ def main(): "min_bbox_score": min_bbox_score, "min_bbox_area": min_bbox_area, "batch_poses": batch_poses, + "max_movement_speed": max_movement_speed, + "max_track_distance": max_track_distance, "whole_body": whole_body, "take_interval": datasets[dataset_use]["take_interval"], "fps": datasets[dataset_use]["fps"],