想象一条商业街上有两种餐厅:法式正餐厅需要你先点开胃菜、再选主菜、最后上甜点,每道菜都精雕细琢但等待漫长;快餐店则完全不同——厨师一眼扫过整个操作台,同时处理所有订单,三分钟就能把汉堡、薯条和可乐端到你面前。目标检测领域恰好也有类似的“餐饮流派”:两阶段检测器(Faster R-CNN)像法餐厅,先圈出候选区域再逐一分类;单阶段检测器(YOLO、SSD)像快餐店,看一眼整张图,直接输出所有目标的位置和类别。YOLO是“网格派”——把图像切成小格子,每格负责找自己的目标;SSD是“多层派”——在不同尺度的特征图上同时开窗,大小目标一网打尽。这篇文章带你走进这两家“快餐店”的后厨,看看它们如何用极致的速度换来看得见的精度,又各有什么独门绝活。

岗位关联

目标检测是计算机视觉的基建能力,理解YOLO与SSD的架构与权衡,能帮你在自动驾驶、安防监控、工业质检等场景中做出正确的模型选型和优化决策。

目录
  1. 可视化演示
  2. 单阶段与两阶段:快餐与正餐之争
  3. YOLO核心思想:一格一厨各司其职
  4. SSD多尺度特色:多层自助餐台
  5. 锚框设计对比:餐盘尺寸的智慧
  6. 效果速度对比:出餐速度与菜品质量
  7. 演进与选型:从网红小店到连锁中央厨房
  8. AI 应用场景
  9. Python 演示
  10. 常见误区
  11. 面试题

可视化演示

本节配有交互动效(进入视口后自动加载,约 3KB)。

YOLO网格检测 S×S网格:每格预测B个框 单尺度特征图输出 输出:S×S×(B×5+C) 极致速度优先的单次检测

单阶段与两阶段:快餐与正餐之争

设想一个周末的晚上,你走进一家法式餐厅:侍者先端来开胃菜,你从中挑选喜欢的,主厨再根据你的选择精心烹制主菜,最后才端上餐桌。这套“先选后烹”的流程虽然精致,却要等待很久。而街角的快餐店完全不同——点餐员一眼扫过菜单,三分钟就能把汉堡和薯条端到你面前。在目标检测的世界里,Faster R-CNN 就是那家法餐厅,YOLO 和 SSD 则是生意火爆的快餐店。

在计算机视觉中,目标检测要回答两个问题:“东西在哪儿?”和“东西是什么?”。两阶段检测先派出“点餐员”——区域提议网络(RPN)——在图像上圈出几百个可能是目标的候选区域,再让“主厨”(分类器和回归器)逐个确认类别并精修位置。单阶段检测则跳过了“点餐”环节,直接用卷积网络在整张图上一次性输出所有目标的位置和类别。这种省去中间环节的设计,让单阶段模型在速度上遥遥领先,却也在精度上付出了一点代价。

评价检测质量最基础的指标是 IoU(交并比),它衡量预测框与真实框的贴合程度——就像比较快餐店做的汉堡和菜单照片上的汉堡有多像:

快餐店牺牲了“精致”换来了“快捷”,单阶段检测也抛弃了候选区域提取,换来了毫秒级的推理速度。理解了“正餐 vs 快餐”的流程差异,就抓住了单阶段与两阶段对立的本质——这也决定了后续 YOLO 和 SSD 各自的技术走向。

IoU=∣A∩B∣∣A∪B∣\text{IoU} = \frac{|A \cap B|}{|A \cup B|}
IoU 是目标检测世界的“距离尺”:预测框与真实框重叠比例越高,检测越精准。后面讲锚框匹配、NMS 去重、mAP 计算,都离不开这把尺子。
  1. 交集面积$|A \cap B|$ 表示两个边界框重叠区域的面积,好比两个餐盘叠在一起重合的那部分。
    ∣A∩B∣|A \cap B|
  2. 并集面积$|A \cup B|$ 表示两个边界框覆盖的总面积,好比两个餐盘各自铺开后加在一起的地盘。
    ∣A∪B∣|A \cup B|
  3. 两者相除$\frac{|A \cap B|}{|A \cup B|}$ 得到 0 到 1 的 IoU 值,1 表示完全重合,0 表示毫无重叠。
    ∣A∩B∣∣A∪B∣\frac{|A \cap B|}{|A \cup B|}

YOLO核心思想:一格一厨各司其职

快餐店能快速出餐,靠的是把操作台划分成多个工位:备料区、煎烤区、饮料区各司其职。YOLO 正是借鉴了这种“分而治之”的思路——它把输入图像划分成 $S \times S$ 个网格(典型的是 7×7),每个网格就像一个工位,只负责检测中心点落在自己区域内的目标。如果某个目标的中心恰好落在某个格子里,这个格子就要“认领”它。

每个网格需要输出两类信息:一是边界框,包括中心坐标 $(x, y)$、宽高 $(w, h)$ 和置信度 $C$;二是该网格属于各个类别的概率。YOLOv1 每个网格预测 $B$ 个边界框(默认 2 个),每个框还要判断里面有没有目标。由于整个模型是一个端到端的卷积网络,YOLO 在推理时只需一次前向传播,就能从整张图直接得到所有检测结果——这就是“全图回归”的含义。

为了让模型既关心框的位置准不准,又关心框里有没有东西、东西类别对不对,YOLO 设计了一个多任务损失函数:

网格划分让每个“厨师”只盯自己的一亩三分地,训练目标清晰、分工明确。但工位划分太粗也有隐患:7×7 网格对密集小目标不友好,两个目标挤在同一格时,YOLOv1 只能“抓大放小”——这个缺陷,恰好给了 SSD 展示多尺度才华的机会。

L=λcoord∑i=0S2∑j=0B1ijobj[(xi−x^i)2+(yi−y^i)2]+λcoord∑i=0S2∑j=0B1ijobj[(wi−w^i)2+(hi−h^i)2]+∑i=0S2∑j=0B1ijobj(Ci−C^i)2L = \lambda_{coord}\sum_{i=0}^{S^2}\sum_{j=0}^{B}\mathbb{1}_{ij}^{obj}\left[(x_i - \hat{x}_i)^2 + (y_i - \hat{y}_i)^2\right] + \lambda_{coord}\sum_{i=0}^{S^2}\sum_{j=0}^{B}\mathbb{1}_{ij}^{obj}\left[(\sqrt{w_i} - \sqrt{\hat{w}_i})^2 + (\sqrt{h_i} - \sqrt{\hat{h}_i})^2\right] + \sum_{i=0}^{S^2}\sum_{j=0}^{B}\mathbb{1}_{ij}^{obj}(C_i - \hat{C}_i)^2
第一个求和项管“框的位置”,第二个管“框的大小”,第三个管“框里有没有目标”。$\lambda_{coord}$ 是坐标损失的加权系数,让模型更重视定位准确性。
  1. 定位损失$\sum\sum\mathbb{1}^{obj}(x_i - \hat{x}_i)^2$ 对包含目标的格子,惩罚预测中心点与真实中心点的偏离,让“工位”把目标认得更准。
    λcoord∑i=0S2∑j=0B1ijobj[(xi−x^i)2+(yi−y^i)2]\lambda_{coord}\sum_{i=0}^{S^2}\sum_{j=0}^{B}\mathbb{1}_{ij}^{obj}\left[(x_i - \hat{x}_i)^2 + (y_i - \hat{y}_i)^2\right]
  2. 尺寸损失$\mathbb{1}^{obj}(\sqrt{w_i} - \sqrt{\hat{w}_i})^2$ 用根号压缩大框与小框的误差差距,避免大目标垄断误差、小目标被忽视。
    λcoord∑i=0S2∑j=0B1ijobj[(wi−w^i)2+(hi−h^i)2]\lambda_{coord}\sum_{i=0}^{S^2}\sum_{j=0}^{B}\mathbb{1}_{ij}^{obj}\left[(\sqrt{w_i} - \sqrt{\hat{w}_i})^2 + (\sqrt{h_i} - \sqrt{\hat{h}_i})^2\right]
  3. 置信度损失$\mathbb{1}^{obj}(C_i - \hat{C}_i)^2$ 让包含目标的网格输出的置信度接近 1,不包含的接近 0,相当于工位明确“我这儿有没有菜”。
    ∑i=0S2∑j=0B1ijobj(Ci−C^i)2\sum_{i=0}^{S^2}\sum_{j=0}^{B}\mathbb{1}_{ij}^{obj}(C_i - \hat{C}_i)^2

SSD多尺度特色:多层自助餐台

自助餐厅之所以能同时满足大胃王和甜品控,是因为它设了多个餐台:热菜区、冷拼区、甜品区一字排开,每个餐台陈列不同分量的食物。SSD 的设计哲学如出一辙——它不满足于只用最后一层特征图做检测,而是把卷积网络多个层的特征图都拿出来,每一层都设置一组锚框进行预测,形成“多尺度特征融合”的检测结构。

为什么多层特征图有效?卷积网络有一个众所周知的特点:浅层特征图分辨率高、保留了丰富的边缘和纹理细节,适合捕捉小目标;深层特征图分辨率低、语义信息强,适合识别大目标。SSD 让 conv4_3、fc7、conv8_2 等不同层次的特征图各管一段尺度范围,小目标交给浅层“甜品台”,大目标交给深层“热菜区”,各层互补,覆盖更全面的目标尺寸。

为了让每层特征图知道自己该管多大尺度的目标,SSD 按线性递增的规则给每一层分配锚框尺度:

SSD 用“多餐台”策略解决了 YOLOv1 对小目标力不从心的痛点,但也带来了新问题:锚框数量激增、正负样本严重失衡,以及浅层特征图语义信息不足。这些问题又催生了锚框设计的各种改良——下一节我们看看两家餐厅如何定制自己的“餐盘”。

sk=smin+smax−sminm−1(k−1),k=1,2,…,ms_k = s_{min} + \frac{s_{max} - s_{min}}{m - 1}(k - 1), \quad k = 1, 2, \ldots, m
$s_{min}$ 是最小尺度(默认 0.2),$s_{max}$ 是最大尺度(默认 0.9),$m$ 是参与预测的特征图层数。第 $k$ 层的锚框尺度随编号线性增大。
  1. 最小与最大尺度$s_{min}$ 和 $s_{max}$ 规定了锚框尺寸的上下限,相当于自助餐台最小的甜品碟和最大的主菜盘。
    smin,smaxs_{min}, \quad s_{max}
  2. 均匀间隔$\frac{s_{max} - s_{min}}{m - 1}$ 把尺度范围均分成 $m-1$ 段,让每层特征图“认领”一段大小区间。
    smax−sminm−1\frac{s_{max} - s_{min}}{m - 1}
  3. 层索引缩放$(k - 1)$ 表示第 $k$ 层比第 1 层多走了 $k-1$ 个步长,层数越深、锚框尺度越大。
    sk=smin+smax−sminm−1(k−1)s_k = s_{min} + \frac{s_{max} - s_{min}}{m - 1}(k - 1)

锚框设计对比:餐盘尺寸的智慧

快餐店用的餐盘可不是随便买的:装汉堡的用圆盘、放薯条的用纸盒、盛饮料的用纸杯,每种容器都贴合食材的形状。目标检测也有同样的需求——预置的“餐盘”就是锚框(Anchor),模型在锚框的基础上微调位置和大小,比从零回归要容易得多。

YOLOv1 诞生时还没有锚框概念,它直接预测边界框坐标,像厨师徒手捏汉堡,全靠手感。YOLOv2 引入了锚框,并且用 K-means 聚类算法统计训练数据中所有真实框的宽高比,自动学出最适合数据集的几种锚框形状——相当于给快餐店定制了标准模具。K-means 使用的距离不是欧氏距离,而是基于 IoU 的“形状距离”:

SSD 走的则是“均匀预设”路线:它在每层特征图的每个像素位置铺上多种固定比例和尺度的锚框,像自助餐台上一排排码好的餐盘,规格统一、数量惊人。训练时用 IoU 匹配锚框与真实框——IoU 大于 0.5 的锚框被选为正样本(“这道菜正好盛进这个盘子”),小于 0.3 的作为负样本(“盘子太大/太小不合适”)。这套匹配机制,正是锚框能否发挥效用的关键。

d(box,centroid)=1−IoU(box,centroid)d(\text{box}, \text{centroid}) = 1 - \text{IoU}(\text{box}, \text{centroid})
两个框形状越像、IoU 越大,距离就越近,聚类时更容易归为同一类。这样聚类出来的锚框,比人工凭经验指定的锚框更贴合实际数据分布。
  1. IoU 相似度$\text{IoU}(\text{box}, \text{centroid})$ 计算候选框与聚类中心框的 IoU,衡量两者形状有多接近。
    IoU(box,centroid)\text{IoU}(\text{box}, \text{centroid})
  2. 距离转换$1 - \text{IoU}$ 将 IoU 反转为距离,IoU 越大距离越近,完全重合时距离为 0。
    1−IoU(box,centroid)1 - \text{IoU}(\text{box}, \text{centroid})
  3. 聚类目标$d$ 作为聚类距离度量,把宽高比相近的边界框聚到一起,中心点就是学到的锚框尺寸。
    d(box,centroid)=1−IoU(box,centroid)d(\text{box}, \text{centroid}) = 1 - \text{IoU}(\text{box}, \text{centroid})

效果速度对比:出餐速度与菜品质量

每家餐厅都有自己的定位:街角快餐店追求翻台率,精品法餐厅追求米其林星级。目标检测模型同样面临速度与精度的天平,两把秤分别是 FPS(每秒处理帧数)和 mAP(平均精度均值)。FPS 衡量“出餐速度”——1 秒能处理多少张图像;mAP 衡量“菜品质量”——检测得有多准、有多全。

mAP 的计算需要先对每个类别画出 Precision-Recall 曲线(横轴召回率、纵轴精确率),再求曲线下面积得到该类的 AP,最后对所有类别取平均:

从实测数据看,YOLO 系列在 FPS 上长期领先,特别适合每秒处理几十帧的视频流;SSD 在同代际、同骨干网络下,mAP 往往略高于 YOLO,尤其是小目标检测——因为多尺度特征图天然覆盖了更广的尺寸范围。如果把目标比作不同大小的餐品,YOLO 是“一个窗口统一出餐,量大管饱”,SSD 是“多个餐台各管一段,小甜点也绝不漏掉”。

mAP=1C∑c=1C∫01pc(r) dr\text{mAP} = \frac{1}{C}\sum_{c=1}^{C} \int_0^1 p_c(r) \, dr
$p_c(r)$ 是类别 $c$ 的精确率随召回率变化的曲线。mAP 越高,说明模型在所有类别上整体“又准又全”。
  1. 单类平均精度$\int_0^1 p_c(r) dr$ 求类别 $c$ 的精确率–召回率曲线下面积,面积越大说明该类检测越好。
    ∫01pc(r) dr\int_0^1 p_c(r) \, dr
  2. 类别间求平均$\frac{1}{C}\sum_{c=1}^{C}$ 把 $C$ 个类别的 AP 加起来除以 $C$,得到整体平均精度 mAP。
    1C∑c=1CAPc\frac{1}{C}\sum_{c=1}^{C} \text{AP}_c

演进与选型:从网红小店到连锁中央厨房

单阶段检测技术的发展像极了一家网红快餐店的扩张:YOLOv1 靠“网格划分”的创新一炮而红,YOLOv2 用聚类锚框和批归一化打磨了招牌菜,YOLOv3 引入多尺度预测和更强的骨干网络,把小店升级成连锁品牌,到了 YOLOv5 和 YOLOv8 时代,已经形成一套覆盖训练、部署、工程化的“中央厨房”生态。FPN(特征金字塔)、CSP 结构、Mosaic 数据增强等技巧不断注入,让 YOLO 系列在速度和精度的平衡上越走越远。

SSD 家族则像深耕特定菜系的精品连锁:DSSD 用反卷积增强浅层语义信息,FSSD 在特征融合上做文章,RetinaNet 提出的 Focal Loss 更是从损失函数层面解决了正负样本失衡问题。虽然 SSD 后续版本迭代不如 YOLO 频繁,但它开创的“多尺度特征图预测”思想已经融入几乎所有现代检测器。衡量推理速度的公式如图所示:

工程选型没有“最好”只有“最合适”:自动驾驶等实时场景优先选 YOLO 系列,追求毫秒级响应;安防监控等小目标密集场景可以选 SSD 变体或引入 FPN 的 YOLOv8;边缘部署则考虑 YOLO-Tiny、SSD-Lite 等轻量版本。菜单上每道菜都有它的客人,检测器也一样。

FPS=1000Tinfer+Tpre+Tpost\text{FPS} = \frac{1000}{T_{\text{infer}} + T_{\text{pre}} + T_{\text{post}}}
一帧图像的预处理耗时、网络推理耗时和后处理(如 NMS)耗时相加,就是单帧总耗时。1000 毫秒除以总耗时,就是每秒能处理的帧数。任何环节耗时飙升,FPS 都会立刻下降。
  1. 单帧总耗时$T_{\text{infer}} + T_{\text{pre}} + T_{\text{post}}$ 依次是模型推理、图像预处理、后处理的时间,三者共同决定端到端延迟。
    Tinfer+Tpre+TpostT_{\text{infer}} + T_{\text{pre}} + T_{\text{post}}
  2. 换算帧率$\frac{1000}{T_{\text{总}}}$ 把毫秒耗时换算成每秒帧数,总耗时越短,FPS 越高。
    1000Tinfer+Tpre+Tpost\frac{1000}{T_{\text{infer}} + T_{\text{pre}} + T_{\text{post}}}

AI 应用场景

自动驾驶实时感知

阶段:模型部署与推理优化

解决的问题:自动驾驶车辆需要以每秒 30 帧以上的速度检测前方车辆、行人、骑车人,传统两阶段检测器在车载嵌入式平台上单帧推理耗时超过 200 毫秒,无法满足实时刹车决策。YOLO 系列单阶段检测以极快的推理速度著称,配合 TensorRT 量化加速,可在毫秒级完成全图目标定位与分类。

具体案例:某自动驾驶初创公司在 L2+ 级辅助驾驶系统中部署 YOLOv8,搭载一颗 Orin 芯片,将摄像头数据以 1080p 分辨率送入模型,端到端延迟控制在 50 毫秒内,同时用多目标跟踪算法对检测框进行时序关联,实现了对前方 200 米内车辆和行人的稳定感知。

智慧安防监控小目标检测

阶段:模型设计与数据适配

解决的问题:安防摄像头视野广、目标小,一个行人可能只有几十个像素。YOLOv1 的 7×7 粗网格几乎不可能召回这种微小目标,而 SSD 的多尺度特征图让浅层高分辨率特征图直接参与预测,天然更适合小目标场景。

具体案例:某智慧园区安防系统在周界布设了 200 路枪机,采用 SSD 作为主力检测器,并在训练阶段对远处行人、车辆的小样本做了针对性过采样。上线后,对 50 米外行人的召回率从 YOLOv5 的 62% 提升到 84%,误报率下降 40%。

工业质检流水线

阶段:端到端训练与多尺度适配

解决的问题:流水线上的产品缺陷种类多、尺寸差异大——划痕可能是细长的线状缺陷,污渍可能是小圆斑,破损则是大面积异常。单阶段检测的“一步出框”特性让检测速度跟得上产线节拍,SSD 的多尺度锚框设计则能同时覆盖不同尺寸的缺陷。

具体案例:某 3C 电子工厂在手机外壳质检工位部署 SSD-Lite 模型,对 500 万像素图像中 8 类缺陷进行实时检测,单帧推理 15 毫秒,替代了原本 3 名目检工人,漏检率从人工的 2.1% 降至 0.6%。

Python 演示

python70 行
import random  def calculate_iou(box_a, box_b):    """计算两个边界框的IoU, box格式为[x, y, w, h]"""    ax1, ay1, aw, ah = box_a    bx1, by1, bw, bh = box_b    ax2, ay2 = ax1 + aw, ay1 + ah    bx2, by2 = bx1 + bw, by1 + bh    inter_w = max(0.0, min(ax2, bx2) - max(ax1, bx1))    inter_h = max(0.0, min(ay2, by2) - max(ay1, by1))    inter_area = inter_w * inter_h    union_area = aw * ah + bw * bh - inter_area    return inter_area / union_area if union_area > 0 else 0.0  def nms(boxes, iou_threshold=0.5):    """非极大值抑制: 按置信度排序后贪心去重"""    boxes = sorted(boxes, key=lambda b: b['score'], reverse=True)    keep = []    while boxes:        best = boxes.pop(0)        keep.append(best)        boxes = [b for b in boxes                 if calculate_iou(b['box'], best['box']) < iou_threshold]    return keep  def decode_yolo_output(pred, grid_size=7, num_boxes=2, num_classes=20,                       conf_threshold=0.4):    """将YOLO网络的原始输出解码为检测框列表"""    detected = []    for row in range(grid_size):        for col in range(grid_size):            for b_idx in range(num_boxes):                base = b_idx * 5                x = (col + pred[row][col][base + 0]) / grid_size                y = (row + pred[row][col][base + 1]) / grid_size                w = pred[row][col][base + 2]                h = pred[row][col][base + 3]                obj_conf = pred[row][col][base + 4]                class_probs = pred[row][col][5:]                class_id = max(range(num_classes),                               key=lambda c: class_probs[c])                score = obj_conf * class_probs[class_id]                if score >= conf_threshold:                    detected.append({                        'box': [max(0.0, x - w / 2), max(0.0, y - h / 2), w, h],                        'score': score,                        'class_id': class_id                    })    return nms(detected)  if __name__ == '__main__':    random.seed(2024)    fake_output = [        [            [random.random() for _ in range(2 * 5 + 20)]            for _ in range(7)        ]        for _ in range(7)    ]    results = decode_yolo_output(fake_output)    print('detected objects:', len(results))    for r in results:        print('class {}, confidence {:.3f}, box {}'.format(            r['class_id'], r['score'],            [round(v, 3) for v in r['box']]        ))
目的:模拟 YOLO 网络输出(7×7 网格、每格 2 个框、20 个类别),演示如何将原始张量解码为边界框列表,并通过 IoU 计算和 NMS 去重得到最终检测结果。
  1. inter_w = max(0.0, min(ax2, bx2) - max(ax1, bx1))计算两个框交集宽度的经典写法,取右边界的较小值减去左边界的较大值
  2. union_area = aw * ah + bw * bh - inter_area并集面积等于两个框面积之和减去交集面积,避免重复计算
  3. x = (col + pred[row][col][base + 0]) / grid_sizeYOLO 输出的坐标是“格子内的相对偏移”,加上格子索引再除以网格数才能换回全图坐标
  4. score = obj_conf * class_probs[class_id]最终的检测分数 = 框置信度 × 类别概率,两者都高才能入选
  5. boxes = sorted(boxes, key=lambda b: b['score'], reverse=True)NMS 前先按置信度降序排列,让最可靠的目标优先保留
  6. boxes = [b for b in boxes if calculate_iou(b['box'], best['box']) < iou_threshold]过滤掉与当前最优框重叠度超过阈值的框,完成去重

常见误区

误区经常听人说 YOLO 是“无锚框检测器”,我就以为 YOLO 全系列都不用锚框,做项目时直接套用无锚框的检测头。

正解实际上只有 YOLOv1 没有锚框——它直接回归边界框坐标。从 YOLOv2 开始采用聚类锚框,YOLOv3、v4、v5 都在使用锚框策略,直到 YOLOv8 又转向 anchor-free 设计。锚框的引入和退出,本质上是“预置餐盘”与“徒手捏制”两种路线在不同时期的胜负,不能一刀切。

为何常见:大家只记住了“YOLO 是单阶段代表”这个标签,忽略了 YOLO 家族内部经历了从 anchor-free 到 anchor-based 再到 anchor-free 的螺旋演进。

误区听说 SSD 用多尺度特征图检测小目标很厉害,就想当然认为 SSD 在所有数据集上 mAP 都碾压 YOLO,选型时闭眼选 SSD。

正解SSD 在相同骨干网络、相同输入分辨率下,mAP 可能略高于同时期的 YOLOv1/v2,但 YOLOv3 之后引入了 FPN、更强的骨干网络和更精细的训练技巧,mAP 已全面反超。模型精度取决于骨干网络、训练策略、数据增强等多重因素,不能只看“是不是 SSD”。

为何常见:拿十几年前 YOLOv1 和 SSD 的对比结论套用到今天的 YOLOv8 上,忽略了技术迭代的幅度。

误区锚框就像渔网,网眼越多越密,应该能捞到更多鱼。所以我把每层特征图的锚框数量翻了三倍,期望 mAP 大幅提升。

正解锚框增多意味着正负样本比例进一步失衡——绝大多数预设框与真实目标的重叠很低,被划为负样本。模型把大量精力花在“判别背景”上,训练变慢、收敛困难。YOLOv2 的聚类锚框和 SSD 的尺度分配,目的都是在“够用”和“高效”之间找平衡,而不是盲目加密度。

为何常见:锚框数量是看得见的超参数,容易让人误以为“资源越多结果越好”,忽略了目标检测的样本匹配机制。

误区单阶段没有 RPN 候选区域提取,肯定永远比两阶段快十倍以上,嵌入式部署闭眼选单阶段。

正解单阶段模型省去了候选区域提取和二次采样,结构确实更简洁。但实际部署中,推理速度还取决于骨干网络大小、输入分辨率、TensorRT 优化情况、硬件算力等。一个用 ResNet-101 做骨干的 SSD 可能比用 MobileNet 做骨干的 Faster R-CNN 慢不少。速度对比必须限定“同等骨干、同等分辨率”才有意义。

为何常见:把“流程步骤少”和“端到端耗时短”划等号,忽略了神经网络推理耗时主要花在卷积计算上,而不是流程分支上。

面试题

Q1. 单阶段检测与两阶段检测最根本的区别是什么?

单选题 · easy

  • A.前者先提取候选区域后者直接回归
  • B.后者先提取候选区域前者直接回归← 正确答案
  • C.两者在训练数据标注方式上有差异
  • D.两者在网络层数和参数量上差异大

答案:B。两阶段检测(如 Faster R-CNN)先通过 RPN 提取候选区域,再对候选区分类和回归;单阶段检测(YOLO/SSD)直接在整图上一步回归出边界框和类别。这就像法餐先点菜再烹饪,快餐一眼看到直接出餐。

Q2. YOLOv1将输入图像划分为几个网格?

单选题 · easy

  • A.划分为1个网格整体预测
  • B.固定划分为7乘7的网格← 正确答案
  • C.划分为14乘14的网格
  • D.随输入图像尺寸动态变化

答案:B。YOLOv1 将输入图像固定划分为 7×7 的网格,每个网格负责预测中心点落在其中的目标。网格数越多,能检测的目标越密集,但 YOLOv1 受限于 7×7 的粒度,对小目标并不友好。

Q3. SSD相比YOLOv1的核心创新在哪?

单选题 · mid

  • A.使用了更深层残差网络骨干
  • B.引入多尺度特征图各自预测← 正确答案
  • C.在网络中增加注意力机制
  • D.将锚框数量扩大了三倍多

答案:B。SSD 的核心创新是在多个不同尺度的特征图上分别做预测,浅层特征图负责小目标、深层负责大目标。这好比自助餐厅设多个餐台,每层摆放不同分量的菜品,而不是像 YOLOv1 只在最后一层特征图上“一个窗口出餐”。

Q4. 关于锚框,以下说法正确的有哪些?

多选题 · mid

  • A.YOLOv2用聚类统计定制锚框← 正确答案
  • B.SSD在多层特征图上铺锚框← 正确答案
  • C.锚框数量增加效果必然提升
  • D.锚框尺寸只能通过手动指定

答案:AB。YOLOv2 用 K-means 聚类统计训练数据中的宽高比来定制锚框(A 对);SSD 在多层特征图上按尺度线性递增铺设锚框(B 对)。锚框过多会导致正负样本失衡、训练变慢(C 错);锚框尺寸也可以用聚类等数据驱动方式自动学习(D 错)。

Q5. 预测框与真实框的重叠程度用什么衡量?

单选题 · mid

  • A.交并比IoU指标来衡量← 正确答案
  • B.平均精度mAP来衡量
  • C.每秒帧数FPS来衡量
  • D.损失函数LOSS来衡量

答案:A。IoU(交并比)计算两个框交集面积与并集面积的比值,直接衡量重叠程度,取值范围 0 到 1。mAP 衡量模型整体的精度表现,FPS 衡量速度,损失函数是训练时的优化目标,三者都不是直接衡量单对框重叠的指标。

Q6. YOLO系列从哪个版本起引入锚框?

单选题 · mid

  • A.从YOLOv1起就引入
  • B.从YOLOv2起引入← 正确答案
  • C.从YOLOv3起引入
  • D.从YOLOv4起引入

答案:B。YOLOv1 直接回归边界框坐标,没有锚框。YOLOv2 引入锚框机制,并用 K-means 聚类从训练数据中学习锚框的尺寸和宽高比,提升了定位精度和训练稳定性。

Q7. 单阶段检测的固有优势包括哪些?

多选题 · hard

  • A.端到端训练推理流程更简洁← 正确答案
  • B.同等算力下推理速度更快← 正确答案
  • C.更契合视频实时检测场景← 正确答案
  • D.小目标检测能力必然更强

答案:ABC。单阶段检测没有独立的候选区域提取模块,训练和推理流程都是端到端一步完成(A 对),省去中间步骤使同等算力下速度更快(B 对),高帧率天然适合视频实时场景(C 对)。但“必然更强”过于绝对,小目标检测取决于多尺度设计等具体方案,YOLOv1 的小目标能力就明显弱于 SSD(D 错)。

Q8. 计算mAP时,AP对应什么曲线下的面积?

单选题 · hard

  • A.精确率关于召回率的曲线← 正确答案
  • B.召回率关于精确率的曲线
  • C.精确率关于置信度的曲线
  • D.损失值关于迭代次数的曲线

答案:A。AP 是 Precision-Recall 曲线下的面积,横轴是召回率(查全率)、纵轴是精确率(查准率)。曲线越靠近右上角,面积越大,说明模型的“又准又全”能力越强。B 选项是横纵轴互换,含义不同。

Q9. 实时视频检测最优先关注哪项指标?

单选题 · easy

  • A.每秒处理帧数FPS指标← 正确答案
  • B.交并比IoU的平均值
  • C.锚框默认数量的多少
  • D.模型参数量的规模

答案:A。实时视频检测要求系统每秒钟能处理的图像帧数足够高(通常 ≥30 FPS),否则画面会卡顿、决策会延迟。IoU 衡量单框精度、锚框数量是设计细节、参数量影响模型大小,都不是实时性的直接指标。

Q10. YOLO与SSD的共同点包含哪些?

多选题 · hard

  • A.都属于单阶段检测范式← 正确答案
  • B.都从整图直接回归检测结果← 正确答案
  • C.后处理都需要非极大值抑制← 正确答案
  • D.检测精度一定高于Faster R-CNN

答案:ABC。YOLO 和 SSD 都是单阶段检测器(A 对),都从整张图像直接输出边界框和类别(B 对),推理后都需要用 NMS 去除重叠的冗余框(C 对)。D 项“一定高于”过于绝对——两阶段检测在精度上有其优势,且具体胜负取决于骨干网络和训练策略。