assignement of bboxes to tracks complete. Correct assignement of chirpt start still necessary... increase to >37% of f1-f0 range suggested

This commit is contained in:
Till Raab 2023-11-30 15:19:33 +01:00
parent 866fd3081d
commit 5c74ac463b

View File

@ -50,46 +50,69 @@ def load_wavetracker_data(raw_path):
return fund_v, ident_v, idx_v, times return fund_v, ident_v, idx_v, times
def assign_rises_to_ids(raw_path, time_frequency_bboxes, overlapping_boxes, bbox_groups): def assign_rises_to_ids(raw_path, time_frequency_bboxes, bbox_groups):
def identify_most_likely_rise_id(possible_ids, t0, t1, f0, f1, fund_v, ident_v, times, idx_v):
mean_id_box_f_rel_to_bbox = []
for id in possible_ids:
id_box_f = fund_v[(ident_v == id) & (times[idx_v] >= t0) & (times[idx_v] <= t1)]
id_box_f_rel_to_bbox = (id_box_f - f0) / (f1 - f0)
mean_id_box_f_rel_to_bbox.append(np.mean(id_box_f_rel_to_bbox))
# print(id, np.mean(id_box_f), f0, f1, np.mean(id_box_f_rel_to_bbox))
most_likely_id = possible_ids[np.argsort(mean_id_box_f_rel_to_bbox)[0]]
return most_likely_id
fund_v, ident_v, idx_v, times = load_wavetracker_data(raw_path) fund_v, ident_v, idx_v, times = load_wavetracker_data(raw_path)
# rise_id = np.full(len(time_frequency_bboxes), np.nan)
# embed()
# quit()
fig, ax = plt.subplots() fig, ax = plt.subplots()
ax.plot(times[idx_v[~np.isnan(ident_v)]], fund_v[~np.isnan(ident_v)], '.') ax.plot(times[idx_v[~np.isnan(ident_v)]], fund_v[~np.isnan(ident_v)], '.')
mask = time_frequency_bboxes['file_name'] == raw_path.parent.name mask = time_frequency_bboxes['file_name'] == raw_path.parent.name
for index, bbox in time_frequency_bboxes[mask].iterrows(): for index, bbox in time_frequency_bboxes[mask].iterrows():
name, t0, f0, t1, f1 = (bbox[0], *bbox[1:-1].astype(float)) name, t0, f0, t1, f1, score = (bbox[0], *bbox[1:-1].astype(float))
if bbox_groups[index] == 0: if bbox_groups[index] == 0:
color = 'tab:green' color = 'tab:green'
elif bbox_groups[index] > 0:
color = 'tab:red'
else: else:
color = 'k' color = 'k'
# if overlapping_boxes[index] == 0:
# color='tab:green'
# elif overlapping_boxes[index] == 1:
# color = 'tab:olive'
# elif overlapping_boxes[index] == 2:
# color = 'tab:orange'
# elif overlapping_boxes[index] == 3:
# color = 'tab:red'
# color = 'tab:green' if overlapping_boxes[index] == 0 else 'tab:orange'
ax.add_patch( ax.add_patch(
Rectangle((t0, f0), Rectangle((t0, f0),
(t1 - t0), (t1 - t0),
(f1 - f0), (f1 - f0),
fill=False, color=color, linestyle='--', linewidth=2, zorder=10) fill=False, color=color, linestyle='--', linewidth=2, zorder=10)
) )
plt.show() ax.text(t1, f1, f'{score:.1%}', ha='right', va='bottom')
# if np.any(overlapping_boxes[mask] >= 2):
# print('yay') possible_ids = np.unique(
# embed() ident_v[~np.isnan(ident_v) &
# quit() (t0 <= times[idx_v]) &
# ToDo: eliminate double rises -- overlap (t1 >= times[idx_v]) &
# ToDo: double detections -- non overlap --> the one with higher probability ?! (f0 <= fund_v) &
# ToDo: assign rises to traces --> who is at lower right corner (f1 >= fund_v)]
)
if len(possible_ids) == 1:
time_frequency_bboxes.at[index, 'id'] = possible_ids[0]
# rise_id[index] = possible_ids[0]
elif len(possible_ids) > 1:
time_frequency_bboxes.at[index, 'id']= identify_most_likely_rise_id(possible_ids, t0, t1, f0, f1, fund_v, ident_v, times, idx_v)
# rise_id[index] = identify_most_likely_rise_id(possible_ids, t0, t1, f0, f1, fund_v, ident_v, times, idx_v)
# time_frequency_bboxes['id'] = rise_id
# embed()
plt.close()
return time_frequency_bboxes
def find_overlapping_bboxes(df_collect): def find_overlapping_bboxes(df_collect):
file_names = np.array(df_collect)[:, 0] file_names = np.array(df_collect)[:, 0]
bboxes_overlapping_mask = np.zeros(len(df_collect))
bboxes = np.array(df_collect)[:, 1:].astype(float) bboxes = np.array(df_collect)[:, 1:].astype(float)
overlap_bbox_idxs = [] overlap_bbox_idxs = []
@ -119,12 +142,9 @@ def find_overlapping_bboxes(df_collect):
if freq_helper[0] == freq_helper[1]: if freq_helper[0] == freq_helper[1]:
continue continue
bboxes_overlapping_mask[ind0] +=1
bboxes_overlapping_mask[ind1] +=1
overlap_bbox_idxs.append((ind0, ind1)) overlap_bbox_idxs.append((ind0, ind1))
return bboxes_overlapping_mask, np.asarray(overlap_bbox_idxs) return np.asarray(overlap_bbox_idxs)
def main(args): def main(args):
@ -143,40 +163,39 @@ def main(args):
df_collect = np.array(df_collect) df_collect = np.array(df_collect)
bbox_overlapping_mask, overlap_bbox_idxs = find_overlapping_bboxes(df_collect) overlap_bbox_idxs = find_overlapping_bboxes(df_collect)
bbox_groups = delete_double_boxes(bbox_overlapping_mask, overlap_bbox_idxs, df_collect) bbox_groups = delete_double_boxes(overlap_bbox_idxs, df_collect)
print('got here')
time_frequency_bboxes = pd.DataFrame(data= np.array(df_collect), columns=['file_name', 't0', 'f0', 't1', 'f1', 'score']) time_frequency_bboxes = pd.DataFrame(data= np.array(df_collect), columns=['file_name', 't0', 'f0', 't1', 'f1', 'score'])
time_frequency_bboxes['id'] = np.full(len(time_frequency_bboxes), np.nan)
########################################### ###########################################
colors = np.random.rand(np.max(bbox_groups).astype(int), 3) # for file_name in time_frequency_bboxes['file_name'].unique():
for file_name in time_frequency_bboxes['file_name'].unique(): # fig, ax = plt.subplots()
fig, ax = plt.subplots() #
# mask = time_frequency_bboxes['file_name'] == file_name
mask = time_frequency_bboxes['file_name'] == file_name # for index, bbox in time_frequency_bboxes[mask].iterrows():
for index, bbox in time_frequency_bboxes[mask].iterrows(): # name, t0, f0, t1, f1 = (bbox[0], *bbox[1:-1].astype(float))
name, t0, f0, t1, f1 = (bbox[0], *bbox[1:-1].astype(float)) # if bbox_groups[index] == 0:
if bbox_groups[index] == 0: # color = 'tab:green'
color = 'tab:green' # elif bbox_groups[index] > 0:
elif bbox_groups[index] > 0: # color = 'tab:red'
color = 'tab:red' # else:
else: # color = 'k'
color = 'k' #
# ax.add_patch(
ax.add_patch( # Rectangle((t0, f0),
Rectangle((t0, f0), # (t1 - t0),
(t1 - t0), # (f1 - f0),
(f1 - f0), # fill=False, color=color, linestyle='--', linewidth=2, zorder=10)
fill=False, color=color, linestyle='--', linewidth=2, zorder=10) # )
) # # ax.set_xlim(float(time_frequency_bboxes[mask]['t0'].min()), float(time_frequency_bboxes[mask]['t1'].max()))
# ax.set_xlim(float(time_frequency_bboxes[mask]['t0'].min()), float(time_frequency_bboxes[mask]['t1'].max())) # ax.set_xlim(0, float(time_frequency_bboxes[mask]['t1'].max()))
ax.set_xlim(0, float(time_frequency_bboxes[mask]['t1'].max())) # # ax.set_ylim(float(time_frequency_bboxes[mask]['f0'].min()), float(time_frequency_bboxes[mask]['f1'].max()))
# ax.set_ylim(float(time_frequency_bboxes[mask]['f0'].min()), float(time_frequency_bboxes[mask]['f1'].max())) # ax.set_ylim(400, 1200)
ax.set_ylim(400, 1200) # plt.show()
plt.show() # exit()
exit()
########################################### ###########################################
if args.tracking_data_path: if args.tracking_data_path:
@ -184,11 +203,16 @@ def main(args):
for raw_path in file_paths: for raw_path in file_paths:
if not raw_path.parent.name in time_frequency_bboxes['file_name'].to_list(): if not raw_path.parent.name in time_frequency_bboxes['file_name'].to_list():
continue continue
assign_rises_to_ids(raw_path, time_frequency_bboxes, bbox_overlapping_mask, bbox_groups) time_frequency_bboxes = assign_rises_to_ids(raw_path, time_frequency_bboxes, bbox_groups)
for raw_path in file_paths:
pass # mask = (time_frequency_bboxes['file_name'] == raw_path.parent.name)
mask = ((time_frequency_bboxes['file_name'] == raw_path.parent.name) & (~np.isnan(time_frequency_bboxes['id'])))
def delete_double_boxes(bbox_overlapping_mask, overlap_bbox_idxs, df_collect, overlap_th = 0.2): save_df = pd.DataFrame(time_frequency_bboxes[mask][['t0', 't1', 'f0', 'f1', 'score', 'id']].values, columns=['t0', 't1', 'f0', 'f1', 'score', 'id'])
save_df['label'] = np.ones(len(save_df), dtype=int)
save_df.to_csv(raw_path.parent / 'risedetector_bboxes.csv', sep = ',', index = False)
quit()
def delete_double_boxes(overlap_bbox_idxs, df_collect, overlap_th = 0.2):
def get_connected(non_regarded_bbox_idx, overlap_bbox_idxs): def get_connected(non_regarded_bbox_idx, overlap_bbox_idxs):
mask = np.array((np.array(overlap_bbox_idxs) == non_regarded_bbox_idx).sum(1), dtype=bool) mask = np.array((np.array(overlap_bbox_idxs) == non_regarded_bbox_idx).sum(1), dtype=bool)
affected_bbox_idxs = np.unique(overlap_bbox_idxs[mask]) affected_bbox_idxs = np.unique(overlap_bbox_idxs[mask])
@ -196,7 +220,7 @@ def delete_double_boxes(bbox_overlapping_mask, overlap_bbox_idxs, df_collect, ov
handled_bbox_idxs = [] handled_bbox_idxs = []
bbox_groups = np.zeros(len(df_collect)) bbox_groups = np.zeros(len(df_collect))
detele_bbox_idxs = [] # detele_bbox_idxs = []
for Coverlapping_bbox_idx in tqdm(np.unique(overlap_bbox_idxs)): for Coverlapping_bbox_idx in tqdm(np.unique(overlap_bbox_idxs)):
if Coverlapping_bbox_idx in handled_bbox_idxs: if Coverlapping_bbox_idx in handled_bbox_idxs:
@ -219,8 +243,6 @@ def delete_double_boxes(bbox_overlapping_mask, overlap_bbox_idxs, df_collect, ov
bbox_idx_group = np.array(regarded_bbox_idxs) bbox_idx_group = np.array(regarded_bbox_idxs)
bbox_scores = df_collect[bbox_idx_group][:, -1].astype(float) bbox_scores = df_collect[bbox_idx_group][:, -1].astype(float)
# bbox_idx_group = bbox_idx_group[bbox_scores.argsort()]
# bbox_scores = bbox_scores[bbox_scores.argsort()]
bbox_groups[bbox_idx_group] = np.max(bbox_groups) + 1 bbox_groups[bbox_idx_group] = np.max(bbox_groups) + 1
@ -231,19 +253,10 @@ def delete_double_boxes(bbox_overlapping_mask, overlap_bbox_idxs, df_collect, ov
remove_idx_combinations_scores.extend(list(itertools.combinations(bbox_scores, r=r))) remove_idx_combinations_scores.extend(list(itertools.combinations(bbox_scores, r=r)))
for enu, combi_score in enumerate(remove_idx_combinations_scores): for enu, combi_score in enumerate(remove_idx_combinations_scores):
remove_idx_combinations_scores[enu] = np.sum(combi_score) remove_idx_combinations_scores[enu] = np.sum(combi_score)
if len(bbox_idx_group) > 2: if len(bbox_idx_group) > 1:
print(remove_idx_combinations)
print(remove_idx_combinations_scores)
print('')
remove_idx_combinations = [remove_idx_combinations[ind] for ind in np.argsort(remove_idx_combinations_scores)] remove_idx_combinations = [remove_idx_combinations[ind] for ind in np.argsort(remove_idx_combinations_scores)]
remove_idx_combinations_scores = [remove_idx_combinations_scores[ind] for ind in np.argsort(remove_idx_combinations_scores)] remove_idx_combinations_scores = [remove_idx_combinations_scores[ind] for ind in np.argsort(remove_idx_combinations_scores)]
print(remove_idx_combinations)
print(remove_idx_combinations_scores)
print('')
# time_overlap_pct, freq_overlap_pct = compute_time_frequency_overlap_for_bbox_group(bbox_idx_group, df_collect)
for remove_idx in remove_idx_combinations: for remove_idx in remove_idx_combinations:
select_bbox_idx_group = list(set(bbox_idx_group) - set(remove_idx)) select_bbox_idx_group = list(set(bbox_idx_group) - set(remove_idx))
@ -252,8 +265,7 @@ def delete_double_boxes(bbox_overlapping_mask, overlap_bbox_idxs, df_collect, ov
if np.all(np.min([time_overlap_pct, freq_overlap_pct], axis=0) < overlap_th): if np.all(np.min([time_overlap_pct, freq_overlap_pct], axis=0) < overlap_th):
break break
#embed()
#quit()
if len(remove_idx) > 0: if len(remove_idx) > 0:
bbox_groups[np.array(remove_idx)] *= -1 bbox_groups[np.array(remove_idx)] *= -1