Improved tracker parametrization.
This commit is contained in:
@ -24,7 +24,7 @@ struct Track
|
||||
class PoseTracker
|
||||
{
|
||||
public:
|
||||
PoseTracker(float fps);
|
||||
PoseTracker(float max_movement_speed, float max_distance);
|
||||
|
||||
std::vector<std::tuple<size_t, std::vector<std::array<float, 4>>>> track_poses(
|
||||
const std::vector<std::vector<std::array<float, 4>>> &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<double> timestamps;
|
||||
std::vector<Track> 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;
|
||||
}
|
||||
|
||||
// =================================================================================================
|
||||
|
||||
@ -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<Triangulator> tri_model = std::make_unique<Triangulator>(
|
||||
min_match_score, min_group_size);
|
||||
std::unique_ptr<PoseTracker> pose_tracker = std::make_unique<PoseTracker>(
|
||||
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);
|
||||
|
||||
@ -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"],
|
||||
|
||||
Reference in New Issue
Block a user