单阶段 vs 双阶段目标检测:从候选集合到 NMS 的工程算账

从工程视角系统对比 one-stage 与 two-stage 检测:把它们统一成‘生成候选→打分→去重’的流程,然后用可复制的数字(anchors 数量、top-k、NMS 最坏复杂度)解释速度差异,并用 focal loss vs 采样策略解释训练差异。文末提供纯 NumPy 可运行的 NMS 与候选规模算账代码,帮助你做选型与排查。

2026年1月24日 · 8 分钟 · map[name:Jeanphilo]

Anchor-Based vs Anchor-Free:目标检测两条路线

副标题 / 摘要 Anchor-based 依赖预设锚框,Anchor-free 直接预测中心或边界。本文用 ACERS 框架对比两条路线的原理、优缺点与工程实践。 预计阅读时长:15~18 分钟 标签:object-detection、anchor-based、anchor-free SEO 关键词:Anchor-Based, Anchor-Free, 目标检测 元描述:系统对比 anchor-based 与 anchor-free 的核心差异与工程取舍。 目标读者 想理解检测框架差异的初学者 需要做检测模型选型的工程实践者 关注推理速度与精度权衡的开发者 背景 / 动机 目标检测发展出了两条主路线: 一条是预设锚框(anchor-based),一条是直接预测(anchor-free)。 理解它们的本质差异,有助于工程选型与调参策略。 核心概念 Anchor:预设的候选框模板。 Anchor-based:预测 anchor 的偏移与类别。 Anchor-free:直接预测中心点/边界或关键点。 正负样本分配:训练时匹配策略不同。 A — Algorithm(题目与算法) 用通俗语言说明主题内容 Anchor-based:先铺满锚框,再回归偏移。 Anchor-free:不需要锚框,直接预测目标位置。 基础示例(1) Faster R-CNN/YOLOv2:典型 anchor-based。 基础示例(2) FCOS/CenterNet:典型 anchor-free。 实践指南 / 步骤 数据集目标尺度多样 → anchor-based 更稳。 追求简化后处理 → anchor-free 更简洁。 先做小规模对比实验,再决定路线。 可运行示例(最小框编码示意) import torch # anchor-based: 预测偏移 anchor = torch.tensor([10.0, 10.0, 50.0, 50.0]) target = torch.tensor([12.0, 14.0, 52.0, 56.0]) delta = target - anchor print(delta) # anchor-free: 直接预测中心与宽高 center = torch.tensor([(target[0]+target[2])/2, (target[1]+target[3])/2]) wh = torch.tensor([target[2]-target[0], target[3]-target[1]]) print(center, wh) 解释与原理 Anchor-based 需要精心设计 anchor 尺度与比例。 Anchor-free 省掉 anchor 设计,但依赖中心点分配策略。 C — Concepts(核心思想) 方法类型 Anchor-based 与 anchor-free 都属于密集检测框架,差异在于候选框设计。 ...

2026年1月24日 · 2 分钟 · map[name:Jeanphilo]

IoU 是什么:目标检测评估的核心指标

副标题 / 摘要 IoU(Intersection over Union)衡量两个边界框的重叠程度,是目标检测评估的核心指标。本文用 ACERS 框架拆解公式、计算步骤与工程应用。 预计阅读时长:12~16 分钟 标签:iou、object-detection、bbox SEO 关键词:IoU, 交并比, 目标检测, BBox 元描述:讲清 IoU 的计算方法、阈值含义与工程实践。 目标读者 想快速理解 IoU 公式与计算的入门读者 需要调试检测指标的工程实践者 关注视觉评估标准的开发者 背景 / 动机 目标检测不仅要“找对类别”,还要“框得准确”。 IoU 是衡量框是否准确的标准指标,直接影响 AP、mAP 等评估结果。 理解 IoU 的定义与阈值意义,是检测工程的基本功。 核心概念 BBox(边界框):用 (x1, y1, x2, y2) 表示左上与右下坐标。 交集面积:两个框重叠部分的面积。 并集面积:两个框面积之和减去交集。 A — Algorithm(题目与算法) 用通俗语言说明主题内容 IoU 就是“重叠面积 / 总面积”。 重叠越大,IoU 越接近 1;完全不相交则为 0。 基础示例(1) 框 A:[(0,0),(2,2)] 框 B:[(1,1),(3,3)] 交集面积 = 1,A 面积 = 4,B 面积 = 4 → IoU = 1 / (4 + 4 - 1) = 1/7。 基础示例(2) IoU ≥ 0.5 → 常视为检测正确(TP)。 IoU ≥ 0.75 → 更严格的高质量检测。 实践指南 / 步骤 计算交集框坐标。 得到交集面积。 计算两框面积。 交并比 = 交集 / 并集。 可运行示例(最小 IoU 计算) def iou(box1, box2): x1 = max(box1[0], box2[0]) y1 = max(box1[1], box2[1]) x2 = min(box1[2], box2[2]) y2 = min(box1[3], box2[3]) inter_w = max(0, x2 - x1) inter_h = max(0, y2 - y1) inter = inter_w * inter_h area1 = (box1[2] - box1[0]) * (box1[3] - box1[1]) area2 = (box2[2] - box2[0]) * (box2[3] - box2[1]) union = area1 + area2 - inter return inter / union if union > 0 else 0.0 box_a = (0, 0, 2, 2) box_b = (1, 1, 3, 3) print(iou(box_a, box_b)) 解释与原理 IoU 是一个归一化指标,与尺度无关。 交集为 0 时,IoU 为 0。 在训练时常用 IoU 作为正负样本匹配标准。 C — Concepts(核心思想) 方法类型 IoU 属于几何评估指标,用于衡量两个区域的重叠程度。 ...

2026年1月24日 · 2 分钟 · map[name:Jeanphilo]

NMS 描述:非极大值抑制的原理与工程实践

副标题 / 摘要 NMS(Non-Maximum Suppression)是目标检测后处理的核心步骤。本文用 ACERS 框架拆解 NMS 的原理、流程与工程实践,并提供可运行的 PyTorch 示例。 预计阅读时长:14~18 分钟 标签:nms、object-detection、iou SEO 关键词:NMS, 非极大值抑制, IoU, 目标检测 元描述:讲清 NMS 的核心算法、复杂度与工程取舍。 目标读者 想理解目标检测后处理的初学者 需要调参 IoU 阈值的工程实践者 关注推理速度与精度平衡的开发者 背景 / 动机 检测模型通常会输出多个重叠框。 如果不做抑制,会出现“同一目标被重复检测”。 NMS 用最简单的规则实现去重,是工业界的标准方案。 核心概念 IoU(Intersection over Union):衡量两个框重叠程度。 score:置信度分数,决定优先保留的框。 阈值:IoU 超过阈值则抑制。 A — Algorithm(题目与算法) 用通俗语言说明主题内容 NMS 的逻辑很直观: 选出最高分的框。 删除与它重叠度过高的框。 重复直到没有框。 基础示例(1) 两个高度重叠的人脸框,只保留分数更高的一个。 基础示例(2) 多个类别的检测结果,先按类别分开再做 NMS(class-wise)。 实践指南 / 步骤 对检测框按 score 排序。 取最高分框作为保留结果。 计算 IoU,过滤高重叠框。 重复直到框集合为空。 可运行示例(最小 PyTorch NMS) import torch def iou(box, boxes): x1 = torch.maximum(box[0], boxes[:, 0]) y1 = torch.maximum(box[1], boxes[:, 1]) x2 = torch.minimum(box[2], boxes[:, 2]) y2 = torch.minimum(box[3], boxes[:, 3]) inter = torch.clamp(x2 - x1, min=0) * torch.clamp(y2 - y1, min=0) area1 = (box[2] - box[0]) * (box[3] - box[1]) area2 = (boxes[:, 2] - boxes[:, 0]) * (boxes[:, 3] - boxes[:, 1]) union = area1 + area2 - inter return inter / (union + 1e-6) def nms(boxes, scores, thresh=0.5): idx = scores.argsort(descending=True) keep = [] while idx.numel() > 0: i = idx[0] keep.append(i.item()) if idx.numel() == 1: break rest = idx[1:] ious = iou(boxes[i], boxes[rest]) idx = rest[ious <= thresh] return keep boxes = torch.tensor([ [0.0, 0.0, 1.0, 1.0], [0.1, 0.1, 1.1, 1.1], [2.0, 2.0, 3.0, 3.0], ]) scores = torch.tensor([0.9, 0.8, 0.7]) print(nms(boxes, scores, thresh=0.5)) 解释与原理 NMS 的核心是“先保留最可信框”。 IoU 阈值越大,保留框越多;越小,抑制越强。 C — Concepts(核心思想) 方法类型 NMS 属于后处理过滤算法,用局部贪心策略去重。 ...

2026年1月24日 · 2 分钟 · map[name:Jeanphilo]