返回列表

44th Place Solution: [BYU - Locating Bacterial Flagellar Motors 2025]

653. BYU - Locating Bacterial Flagellar Motors 2025 | byu-locating-bacterial-flagellar-motors-2025

开始: 2025-03-05 结束: 2025-06-04 医学影像分析 数据算法赛
第 44 名解决方案:[BYU - 定位细菌鞭毛马达 2025]

第 44 名解决方案:[BYU - 定位细菌鞭毛马达 2025]

作者: IBUKI
发布日期: 2025 年 6 月 6 日
比赛排名: 44

首先,我要感谢 @playwithme 分享了一个优秀的 Notebook。这是我在比赛期间参考的 Notebook。

Notebook 中使用的模型是预训练且公开的。

我的主要改进相当简单——我只修改了其中一个函数:

def perform_3d_nms(detections, iou_threshold):
    """
    考虑空间距离和 Z 切片厚度的 3D NMS 类似聚类。

    参数:
        detections (list of dict): 检测信息列表 [{'z': int, 'y': int, 'x': int, 'confidence': float}, ...]
        iou_threshold (float): 用于缩放 XY 空间距离限制的阈值 (例如 0.2)

    返回:
        list of dict: NMS 后的代表性检测结果 (可以包含多个簇)
    """

    if not detections:
        return []

    # 聚类条件
    xy_distance_threshold = 24 * iou_threshold  # 24 是假设的框边长
    z_distance_threshold = 10                   # Z 切片方向的可接受范围
    min_z_span = 3                              # 视为有效簇的最小 Z 切片数量

    # 按置信度降序排序检测结果
    detections = sorted(detections, key=lambda d: d['confidence'], reverse=True)
    final_detections = []

    while detections:
        base = detections.pop(0)
        group = [base]
        z_set = {base['z']}
        rest = []

        for d in detections:
            dz = abs(d['z'] - base['z'])
            dy = abs(d['y'] - base['y'])
            dx = abs(d['x'] - base['x'])
            if dz <= z_distance_threshold and dy <= xy_distance_threshold and dx <= xy_distance_threshold:
                group.append(d)
                z_set.add(d['z'])
            else:
                rest.append(d)

        # 如果该组跨越了足够的 Z 切片,则取置信度最高的检测结果
        if len(z_set) >= min_z_span:
            best = max(group, key=lambda g: g['confidence'])
            final_detections.append(best)

        detections = rest

    return final_detections

函数概述

perform_3d_nms 函数执行检测点的 3D 聚类,模拟跨越 3D 空间的非极大值抑制 (NMS) 机制。它通过识别跨 Z 切片的空间接近点来过滤冗余检测,并仅保留每个有效簇中置信度最高的检测。


参数

  • detections: 检测字典列表,每个字典包含键 'z', 'y', 'x', 和 'confidence'。
  • iou_threshold: XY 距离阈值的缩放因子 (例如 0.2)。

工作原理

  1. 阈值定义:
    • XY 距离阈值 = 24 * iou_threshold
    • Z 切片范围阈值 = 10
    • 成为有效簇的最小 Z 切片跨度 = 3
  2. 按置信度对检测结果进行排序 (降序)
  3. 聚类过程:
    • 使用置信度最高的检测作为基准。
    • 将 Z、Y 和 X 方向上接近的检测分组在一起。
    • 如果该组跨越至少 3 个 Z 切片,则保留置信度最高的一个。
  4. 移除已处理的检测并重复

返回

  • 来自有效 3D 簇的代表性检测列表 (具有最高置信度)。

使用的超参数

CONFIDENCE_THRESHOLD = 0.7  # 降低阈值以捕获更多潜在的马达
MAX_DETECTIONS_PER_TOMO = 1  # 跟踪每个断层扫描图的前 N 个检测结果
NMS_IOU_THRESHOLD = 0.7  # 3D 聚类的非极大值抑制阈值
CONCENTRATION = 1 # 仅处理 1/20 的切片以快速提交
SIZE = 1024
同比赛其他方案