Improved tracker parametrization.
This commit is contained in:
@ -24,7 +24,7 @@ struct Track
|
|||||||
class PoseTracker
|
class PoseTracker
|
||||||
{
|
{
|
||||||
public:
|
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(
|
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,
|
const std::vector<std::vector<std::array<float, 4>>> &poses_3d,
|
||||||
@ -35,15 +35,9 @@ public:
|
|||||||
|
|
||||||
private:
|
private:
|
||||||
float max_distance;
|
float max_distance;
|
||||||
|
float max_movement_speed;
|
||||||
size_t history_size = 3;
|
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<double> timestamps;
|
||||||
std::vector<Track> pose_tracks;
|
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 size_t min_group_size = config["min_group_size"];
|
||||||
const int take_interval = config["take_interval"];
|
const int take_interval = config["take_interval"];
|
||||||
const float ifps = config["fps"];
|
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
|
// Load 2D model
|
||||||
bool use_wb = utils_pipeline::use_whole_body(whole_body);
|
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>(
|
std::unique_ptr<Triangulator> tri_model = std::make_unique<Triangulator>(
|
||||||
min_match_score, min_group_size);
|
min_match_score, min_group_size);
|
||||||
std::unique_ptr<PoseTracker> pose_tracker = std::make_unique<PoseTracker>(
|
std::unique_ptr<PoseTracker> pose_tracker = std::make_unique<PoseTracker>(
|
||||||
ifps);
|
max_movement_speed, max_track_distance);
|
||||||
|
|
||||||
// Timers
|
// Timers
|
||||||
size_t time_count = dataset.size();
|
size_t time_count = dataset.size();
|
||||||
@ -216,7 +218,7 @@ int main(int argc, char **argv)
|
|||||||
auto &item = dataset[i];
|
auto &item = dataset[i];
|
||||||
auto &poses_2d = all_poses_2d[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
|
// Reset last poses if scene changes
|
||||||
tri_model->reset();
|
tri_model->reset();
|
||||||
@ -248,7 +250,7 @@ int main(int argc, char **argv)
|
|||||||
elapsed = std::chrono::high_resolution_clock::now() - stime;
|
elapsed = std::chrono::high_resolution_clock::now() - stime;
|
||||||
times_pose3d.push_back(elapsed.count());
|
times_pose3d.push_back(elapsed.count());
|
||||||
|
|
||||||
if (ifps < 1)
|
if (ifps <= 0)
|
||||||
{
|
{
|
||||||
// Disable pose tracking if frame rate is too low
|
// Disable pose tracking if frame rate is too low
|
||||||
times_tracks.push_back(0.0);
|
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
|
# If most of the time only one person is in a image, disable it, because it is slightly slower then
|
||||||
default_batch_poses = True
|
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 = {
|
datasets = {
|
||||||
"human36m": {
|
"human36m": {
|
||||||
"path": "/datasets/human36m/skelda/pose_test.json",
|
"path": "/datasets/human36m/skelda/pose_test.json",
|
||||||
@ -61,6 +70,8 @@ datasets = {
|
|||||||
"min_bbox_score": 0.4,
|
"min_bbox_score": 0.4,
|
||||||
"min_bbox_area": 0.1 * 0.1,
|
"min_bbox_area": 0.1 * 0.1,
|
||||||
"batch_poses": False,
|
"batch_poses": False,
|
||||||
|
"max_movement_speed": 2.0 * 1.5,
|
||||||
|
"max_track_distance": 0.3 + default_max_movement_speed / (50 / 5),
|
||||||
},
|
},
|
||||||
"panoptic": {
|
"panoptic": {
|
||||||
"path": "/datasets/panoptic/skelda/test.json",
|
"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": ["00_03", "00_06", "00_12", "00_13", "00_23", "00_15", "00_10", "00_21", "00_09", "00_01"],
|
||||||
# "cams": [],
|
# "cams": [],
|
||||||
"take_interval": 3,
|
"take_interval": 3,
|
||||||
|
"fps": 30,
|
||||||
"min_match_score": 0.95,
|
"min_match_score": 0.95,
|
||||||
"use_scenes": ["160906_pizza1", "160422_haggling1", "160906_ian5"],
|
"use_scenes": ["160906_pizza1", "160422_haggling1", "160906_ian5"],
|
||||||
"min_group_size": 1,
|
"min_group_size": 1,
|
||||||
# "min_group_size": 4,
|
# "min_group_size": 4,
|
||||||
# "min_group_size": 11,
|
# "min_group_size": 11,
|
||||||
"min_bbox_area": 0.05 * 0.05,
|
"min_bbox_area": 0.05 * 0.05,
|
||||||
|
"max_track_distance": 0.3 + default_max_movement_speed / (30 / 3),
|
||||||
},
|
},
|
||||||
"mvor": {
|
"mvor": {
|
||||||
"path": "/datasets/mvor/skelda/all.json",
|
"path": "/datasets/mvor/skelda/all.json",
|
||||||
"take_interval": 1,
|
"take_interval": 1,
|
||||||
|
"fps": -1,
|
||||||
"with_depth": False,
|
"with_depth": False,
|
||||||
"min_match_score": 0.85,
|
"min_match_score": 0.85,
|
||||||
"min_bbox_score": 0.25,
|
"min_bbox_score": 0.25,
|
||||||
@ -89,6 +103,7 @@ datasets = {
|
|||||||
"take_interval": 1,
|
"take_interval": 1,
|
||||||
"min_match_score": 0.92,
|
"min_match_score": 0.92,
|
||||||
"min_bbox_score": 0.5,
|
"min_bbox_score": 0.5,
|
||||||
|
"max_track_distance": 0.3 + default_max_movement_speed / 25,
|
||||||
},
|
},
|
||||||
"shelf": {
|
"shelf": {
|
||||||
"path": "/datasets/shelf/skelda/test.json",
|
"path": "/datasets/shelf/skelda/test.json",
|
||||||
@ -96,82 +111,108 @@ datasets = {
|
|||||||
"fps": 25,
|
"fps": 25,
|
||||||
"min_match_score": 0.95,
|
"min_match_score": 0.95,
|
||||||
"min_group_size": 2,
|
"min_group_size": 2,
|
||||||
|
"max_track_distance": 0.3 + default_max_movement_speed / 25,
|
||||||
},
|
},
|
||||||
"ikeaasm": {
|
"ikeaasm": {
|
||||||
"path": "/datasets/ikeaasm/skelda/test.json",
|
"path": "/datasets/ikeaasm/skelda/test.json",
|
||||||
"take_interval": 2,
|
"take_interval": 2,
|
||||||
|
"fps": -1,
|
||||||
"min_match_score": 0.92,
|
"min_match_score": 0.92,
|
||||||
"min_bbox_score": 0.20,
|
"min_bbox_score": 0.20,
|
||||||
},
|
},
|
||||||
"chi3d": {
|
"chi3d": {
|
||||||
"path": "/datasets/chi3d/skelda/all.json",
|
"path": "/datasets/chi3d/skelda/all.json",
|
||||||
"take_interval": 5,
|
"take_interval": 5,
|
||||||
|
"fps": 50,
|
||||||
|
"max_track_distance": 0.3 + default_max_movement_speed / (50 / 5),
|
||||||
},
|
},
|
||||||
"tsinghua": {
|
"tsinghua": {
|
||||||
"path": "/datasets/tsinghua/skelda/test.json",
|
"path": "/datasets/tsinghua/skelda/test.json",
|
||||||
"take_interval": 3,
|
"take_interval": 3,
|
||||||
|
"fps": 30,
|
||||||
"min_match_score": 0.95,
|
"min_match_score": 0.95,
|
||||||
"min_group_size": 2,
|
"min_group_size": 2,
|
||||||
|
"max_track_distance": 0.3 + default_max_movement_speed / (30 / 3),
|
||||||
},
|
},
|
||||||
"human36m_wb": {
|
"human36m_wb": {
|
||||||
"path": "/datasets/human36m/skelda/wb/test.json",
|
"path": "/datasets/human36m/skelda/wb/test.json",
|
||||||
"take_interval": 100,
|
"take_interval": 100,
|
||||||
|
"fps": -1,
|
||||||
"min_bbox_score": 0.4,
|
"min_bbox_score": 0.4,
|
||||||
"batch_poses": False,
|
"batch_poses": False,
|
||||||
},
|
},
|
||||||
"egohumans_tagging": {
|
"egohumans_tagging": {
|
||||||
"path": "/datasets/egohumans/skelda/all.json",
|
"path": "/datasets/egohumans/skelda/all.json",
|
||||||
"take_interval": 2,
|
"take_interval": 2,
|
||||||
|
"fps": 20,
|
||||||
"subset": "tagging",
|
"subset": "tagging",
|
||||||
"min_match_score": 0.92,
|
"min_match_score": 0.92,
|
||||||
"min_group_size": 2,
|
"min_group_size": 2,
|
||||||
"min_bbox_score": 0.2,
|
"min_bbox_score": 0.2,
|
||||||
"min_bbox_area": 0.05 * 0.05,
|
"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": {
|
"egohumans_legoassemble": {
|
||||||
"path": "/datasets/egohumans/skelda/all.json",
|
"path": "/datasets/egohumans/skelda/all.json",
|
||||||
"take_interval": 2,
|
"take_interval": 2,
|
||||||
|
"fps": 20,
|
||||||
"subset": "legoassemble",
|
"subset": "legoassemble",
|
||||||
"min_group_size": 2,
|
"min_group_size": 2,
|
||||||
|
"max_track_distance": 0.3 + default_max_movement_speed / (20 / 2),
|
||||||
},
|
},
|
||||||
"egohumans_fencing": {
|
"egohumans_fencing": {
|
||||||
"path": "/datasets/egohumans/skelda/all.json",
|
"path": "/datasets/egohumans/skelda/all.json",
|
||||||
"take_interval": 2,
|
"take_interval": 2,
|
||||||
|
"fps": 20,
|
||||||
"subset": "fencing",
|
"subset": "fencing",
|
||||||
"min_group_size": 7,
|
"min_group_size": 7,
|
||||||
"min_bbox_score": 0.5,
|
"min_bbox_score": 0.5,
|
||||||
"min_bbox_area": 0.05 * 0.05,
|
"min_bbox_area": 0.05 * 0.05,
|
||||||
|
"max_track_distance": 0.3 + default_max_movement_speed / (20 / 2),
|
||||||
},
|
},
|
||||||
"egohumans_basketball": {
|
"egohumans_basketball": {
|
||||||
"path": "/datasets/egohumans/skelda/all.json",
|
"path": "/datasets/egohumans/skelda/all.json",
|
||||||
"take_interval": 2,
|
"take_interval": 2,
|
||||||
|
"fps": 20,
|
||||||
"subset": "basketball",
|
"subset": "basketball",
|
||||||
"min_group_size": 7,
|
"min_group_size": 7,
|
||||||
"min_bbox_score": 0.25,
|
"min_bbox_score": 0.25,
|
||||||
"min_bbox_area": 0.025 * 0.025,
|
"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": {
|
"egohumans_volleyball": {
|
||||||
"path": "/datasets/egohumans/skelda/all.json",
|
"path": "/datasets/egohumans/skelda/all.json",
|
||||||
"take_interval": 2,
|
"take_interval": 2,
|
||||||
|
"fps": 20,
|
||||||
"subset": "volleyball",
|
"subset": "volleyball",
|
||||||
"min_group_size": 11,
|
"min_group_size": 11,
|
||||||
"min_bbox_score": 0.25,
|
"min_bbox_score": 0.25,
|
||||||
"min_bbox_area": 0.05 * 0.05,
|
"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": {
|
"egohumans_badminton": {
|
||||||
"path": "/datasets/egohumans/skelda/all.json",
|
"path": "/datasets/egohumans/skelda/all.json",
|
||||||
"take_interval": 2,
|
"take_interval": 2,
|
||||||
|
"fps": 20,
|
||||||
"subset": "badminton",
|
"subset": "badminton",
|
||||||
"min_group_size": 7,
|
"min_group_size": 7,
|
||||||
"min_bbox_score": 0.25,
|
"min_bbox_score": 0.25,
|
||||||
"min_bbox_area": 0.05 * 0.05,
|
"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": {
|
"egohumans_tennis": {
|
||||||
"path": "/datasets/egohumans/skelda/all.json",
|
"path": "/datasets/egohumans/skelda/all.json",
|
||||||
"take_interval": 2,
|
"take_interval": 2,
|
||||||
|
"fps": 20,
|
||||||
"subset": "tennis",
|
"subset": "tennis",
|
||||||
"min_group_size": 11,
|
"min_group_size": 11,
|
||||||
"min_bbox_area": 0.025 * 0.025,
|
"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_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)
|
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)
|
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
|
# Save config
|
||||||
config_path = tmp_export_dir + "config.json"
|
config_path = tmp_export_dir + "config.json"
|
||||||
@ -347,6 +394,8 @@ def main():
|
|||||||
"min_bbox_score": min_bbox_score,
|
"min_bbox_score": min_bbox_score,
|
||||||
"min_bbox_area": min_bbox_area,
|
"min_bbox_area": min_bbox_area,
|
||||||
"batch_poses": batch_poses,
|
"batch_poses": batch_poses,
|
||||||
|
"max_movement_speed": max_movement_speed,
|
||||||
|
"max_track_distance": max_track_distance,
|
||||||
"whole_body": whole_body,
|
"whole_body": whole_body,
|
||||||
"take_interval": datasets[dataset_use]["take_interval"],
|
"take_interval": datasets[dataset_use]["take_interval"],
|
||||||
"fps": datasets[dataset_use]["fps"],
|
"fps": datasets[dataset_use]["fps"],
|
||||||
|
|||||||
Reference in New Issue
Block a user