| import numpy as np
|
|
|
| def non_max_suppression(proposals, overlapThresh=0.3):
|
|
|
| if len(proposals) == 0:
|
| return []
|
|
|
|
|
| pick = []
|
|
|
| sorted_proposal = sorted(proposals, key=lambda proposal:proposal['score'], reverse=True)
|
| idx=0
|
| total_proposal= len(sorted_proposal)
|
| while idx < total_proposal:
|
| proposal = sorted_proposal[idx]
|
| st = proposal['segment'][0]
|
| ed = proposal['segment'][1]
|
| label = proposal['label']
|
|
|
| delete_item = []
|
| for j in range(idx+1, total_proposal):
|
| target_proposal = sorted_proposal[j]
|
| target_st = target_proposal['segment'][0]
|
| target_ed = target_proposal['segment'][1]
|
| target_label = target_proposal['label']
|
|
|
| if(label == target_label):
|
| sst = np.minimum(st, target_st)
|
| led = np.maximum(ed, target_ed)
|
| lst = np.maximum(st, target_st)
|
| sed = np.minimum(ed, target_ed)
|
|
|
| iou = (sed-lst) / max(led-sst,1)
|
| if(iou > overlapThresh):
|
| delete_item.append(target_proposal)
|
|
|
| for item in delete_item:
|
| sorted_proposal.remove(item)
|
| total_proposal=len(sorted_proposal)
|
| idx+=1
|
|
|
| return sorted_proposal
|
|
|
|
|
| def check_overlap_proposal(proposal_list, new_proposal, overlapThresh=0.3):
|
| for proposal in proposal_list:
|
| st = proposal['segment'][0]
|
| ed = proposal['segment'][1]
|
| label = proposal['label']
|
|
|
| new_st = new_proposal['segment'][0]
|
| new_ed = new_proposal['segment'][1]
|
| new_label = new_proposal['label']
|
|
|
| if(label == new_label):
|
| sst = np.minimum(st, new_st)
|
| led = np.maximum(ed, new_ed)
|
| lst = np.maximum(st, new_st)
|
| sed = np.minimum(ed, new_ed)
|
|
|
| iou = (sed-lst) / max(led-sst,1)
|
| if(iou > overlapThresh):
|
| return proposal
|
|
|
| return None
|
|
|