for detection in results: class_scores = detection[5:] max_score = np.amax(class_scores) if max_score >= conf_threshold: class_id = np.argmax(class_scores) x, y, w, h = detection[:4] boxes.append([x - w/2, y - h/2, w, h]) scores.append(max_score) class_ids.append(class_id)
ifnot boxes: return YoloResult.empty()
# 类别 → 组索引 agnostic_map = {} if agnostic_nms_groups: for gi, group inenumerate(agnostic_nms_groups): for cid in group: agnostic_map[cid] = gi
# 分桶 grouped = {} for i, cid inenumerate(class_ids): if cid in agnostic_map: key = ("agnostic", agnostic_map[cid]) else: key = ("class", int(cid)) grouped.setdefault(key, []).append(i)
# 每个桶独立 NMS final_indices = [] for indices_in_group in grouped.values(): group_boxes = [boxes[i] for i in indices_in_group] group_scores = [scores[i] for i in indices_in_group]
if keep isnotNone: keep = keep.flatten() for idx in keep: final_indices.append(indices_in_group[idx])
return YoloResult( boxes=np.array([boxes[i] for i in final_indices]), scores=np.array([scores[i] for i in final_indices]), class_ids=np.array([class_ids[i] for i in final_indices]), )