Improved tracking (new params)

This commit is contained in:
AlexeyAB
2020-07-08 00:08:45 +03:00
parent ccb392ddf2
commit 37753e0cb4
4 changed files with 44 additions and 17 deletions

View File

@ -305,6 +305,9 @@ struct layer {
int embedding_size; int embedding_size;
float sim_thresh; float sim_thresh;
int track_history_size; int track_history_size;
int dets_for_track;
int dets_for_show;
float track_ciou_norm;
int coords; int coords;
int background; int background;
int rescore; int rescore;
@ -1068,7 +1071,7 @@ void stop_timer_and_show();
void stop_timer_and_show_name(char *name); void stop_timer_and_show_name(char *name);
void show_total_time(); void show_total_time();
void set_track_id(detection *new_dets, int new_dets_num, float thresh, float sim_thresh, int deque_size); void set_track_id(detection *new_dets, int new_dets_num, float thresh, float sim_thresh, float track_ciou_norm, int deque_size, int dets_for_track, int dets_for_show);
int fill_remaining_id(detection *new_dets, int new_dets_num, int new_track_id, float thresh); int fill_remaining_id(detection *new_dets, int new_dets_num, int new_track_id, float thresh);

View File

@ -265,7 +265,7 @@ void demo(char *cfgfile, char *weightfile, float thresh, float hier_thresh, int
else diounms_sort(local_dets, local_nboxes, l.classes, nms, l.nms_kind, l.beta_nms); else diounms_sort(local_dets, local_nboxes, l.classes, nms, l.nms_kind, l.beta_nms);
} }
if (l.embedding_size) set_track_id(local_dets, local_nboxes, demo_thresh, l.sim_thresh, l.track_history_size); if (l.embedding_size) set_track_id(local_dets, local_nboxes, demo_thresh, l.sim_thresh, l.track_ciou_norm, l.track_history_size, l.dets_for_track, l.dets_for_show);
//printf("\033[2J"); //printf("\033[2J");
//printf("\033[1;1H"); //printf("\033[1;1H");

View File

@ -775,13 +775,15 @@ int check_prob(detection det, float thresh)
return 0; return 0;
} }
int fill_remaining_id(detection *new_dets, int new_dets_num, int new_track_id, float thresh) int fill_remaining_id(detection *new_dets, int new_dets_num, int new_track_id, float thresh, int detection_count)
{ {
for (int i = 0; i < new_dets_num; ++i) { for (int i = 0; i < new_dets_num; ++i) {
if (new_dets[i].track_id == 0 && check_prob(new_dets[i], thresh)) { if (new_dets[i].track_id == 0 && check_prob(new_dets[i], thresh)) {
//printf(" old_tid = %d, new_tid = %d, sim = %f \n", new_dets[i].track_id, new_track_id, new_dets[i].sim); //printf(" old_tid = %d, new_tid = %d, sim = %f \n", new_dets[i].track_id, new_track_id, new_dets[i].sim);
new_dets[i].track_id = new_track_id; if (new_dets[i].sort_class > detection_count) {
new_track_id++; new_dets[i].track_id = new_track_id;
new_track_id++;
}
} }
} }
return new_track_id; return new_track_id;
@ -795,7 +797,8 @@ float *make_float_array(float* src, size_t size)
} }
struct detection_t : detection { struct detection_t : detection {
detection_t(detection det) : detection(det) int det_count;
detection_t(detection det) : detection(det), det_count(0)
{ {
if (embeddings) embeddings = make_float_array(det.embeddings, embedding_size); if (embeddings) embeddings = make_float_array(det.embeddings, embedding_size);
if (prob) prob = make_float_array(det.prob, classes); if (prob) prob = make_float_array(det.prob, classes);
@ -818,7 +821,7 @@ struct detection_t : detection {
void set_track_id(detection *new_dets, int new_dets_num, float thresh, float sim_thresh, int deque_size) void set_track_id(detection *new_dets, int new_dets_num, float thresh, float sim_thresh, float track_ciou_norm, int deque_size, int dets_for_track, int dets_for_show)
{ {
static int new_track_id = 1; static int new_track_id = 1;
static std::deque<std::vector<detection_t>> old_dets_dq; static std::deque<std::vector<detection_t>> old_dets_dq;
@ -858,26 +861,44 @@ void set_track_id(detection *new_dets, int new_dets_num, float thresh, float sim
const int new_id = sim_det[index].new_id; const int new_id = sim_det[index].new_id;
const int old_id = sim_det[index].old_id; const int old_id = sim_det[index].old_id;
const int track_id = old_dets[old_id].track_id; const int track_id = old_dets[old_id].track_id;
if (check_prob(new_dets[new_id], thresh) && track_idx[track_id] && new_idx[new_id] && old_idx[old_id] && sim_thresh < sim_det[index].sim) { const int det_count = old_dets[old_id].sort_class;
new_dets[new_id].sim = sim_det[index].sim; if (check_prob(new_dets[new_id], thresh) && track_idx[track_id] && new_idx[new_id] && old_idx[old_id]) {
new_dets[new_id].track_id = track_id; float sim = sim_det[index].sim;
new_idx[new_id] = 0; float ciou = box_ciou(new_dets[new_id].bbox, old_dets[old_id].bbox);
old_idx[old_id] = 0; sim = sim * (1 - track_ciou_norm) + ciou * track_ciou_norm;
track_idx[track_id] = 0; if (sim_thresh < sim) {
new_dets[new_id].sim = sim;
new_dets[new_id].track_id = track_id;
new_dets[new_id].sort_class = det_count + 1;
new_idx[new_id] = 0;
old_idx[old_id] = 0;
if(track_id) track_idx[track_id] = 0;
}
} }
} }
// set new track_id // set new track_id
new_track_id = fill_remaining_id(new_dets, new_dets_num, new_track_id, thresh); new_track_id = fill_remaining_id(new_dets, new_dets_num, new_track_id, thresh, dets_for_track);
// store new_detections to the queue of vectors // store new_detections to the queue of vectors
std::vector<detection_t> new_det_vec; std::vector<detection_t> new_det_vec;
for (int i = 0; i < new_dets_num; ++i) { for (int i = 0; i < new_dets_num; ++i) {
if(check_prob(new_dets[i], thresh)) if (check_prob(new_dets[i], thresh)) {
new_det_vec.push_back(new_dets[i]); new_det_vec.push_back(new_dets[i]);
}
} }
old_dets_dq.push_back(new_det_vec); // add new // add new
if (old_dets_dq.size() > deque_size) old_dets_dq.pop_front(); // remove old old_dets_dq.push_back(new_det_vec);
// remove old
if (old_dets_dq.size() > deque_size) old_dets_dq.pop_front();
// remove detection which were detected only on few frames
for (int i = 0; i < new_dets_num; ++i) {
if (new_dets[i].sort_class < dets_for_show)
for (int j = 0; j < new_dets[i].classes; ++j) {
new_dets[i].prob[j] = 0;
}
}
} }

View File

@ -489,6 +489,9 @@ layer parse_yolo(list *options, size_params params)
l.track_history_size = option_find_int_quiet(options, "track_history_size", 5); l.track_history_size = option_find_int_quiet(options, "track_history_size", 5);
l.sim_thresh = option_find_int_quiet(options, "sim_thresh", 0.8); l.sim_thresh = option_find_int_quiet(options, "sim_thresh", 0.8);
l.dets_for_track = option_find_int_quiet(options, "dets_for_track", 1);
l.dets_for_show = option_find_int_quiet(options, "dets_for_show", 1);
l.track_ciou_norm = option_find_float_quiet(options, "track_ciou_norm", 0.01);
int embedding_layer_id = option_find_int_quiet(options, "embedding_layer", 999999); int embedding_layer_id = option_find_int_quiet(options, "embedding_layer", 999999);
if (embedding_layer_id < 0) embedding_layer_id = params.index + embedding_layer_id; if (embedding_layer_id < 0) embedding_layer_id = params.index + embedding_layer_id;
if (embedding_layer_id != 999999) { if (embedding_layer_id != 999999) {