def NMS(boxes,scores, thresholds): x1 = boxes[:,0] y1 = boxes[:,1] x2 = boxes[:,2] y2 = boxes[:,3] areas = (x2-x1)*(y2-y1) _,order = scores.sort(0,descending=True) keep = [] while order.numel() > 0: i = order[0] keep.append(i) if order.numel() == 1: break xx1 = x1[order[1:]].clamp(min=x1[i]) yy1 = y1[order[1:]].clamp(min=y1[i]) xx2 = x2[order[1:]].clamp(max=x2[i]) yy2 = y2[order[1:]].clamp(max=y2[i]) w = (xx2-xx1).clamp(min=0) h = (yy2-yy1).clamp(min=0) inter = w*h ovr = inter/(areas[i] + areas[order[1:]] - inter) ids = (ovr<=thresholds).nonzero().squeeze() if ids.numel() == 0: break order = order[ids+1] return torch.LongTensor(keep)