
最近这两年陆陆续续帮组里的应届生和转方向的朋友做模拟面试聊下来有个很明显的感受目标检测这块的问题来来回回就是那么几类但真正能答到点上的人并不多。很多人简历上写着做过YOLO项目一问mAP是怎么算出来的、Anchor为什么这么设计、NMS在什么情况下会把正确框删掉回答就开始打太极了。这篇就把我自己面试别人和被人面试时遇到的目标检测问题做一次比较完整的整理重点不是罗列答案而是讲清楚每类问题背后面试官到底想确认什么以及常见的错误答法卡在哪里。适合准备CV算法岗的同学也适合工作几年想换个方向、需要把知识体系重新捋一遍的人。内容会从最基础的指标一路聊到工程落地和手撕代码中间穿插一些我自己的答题思路和踩过的坑你可以当成一份复习清单来看。1. 面试官在目标检测这块到底考什么1.1 从岗位需求倒推考察维度先想明白一件事面试官问目标检测不是想听你把某一篇论文复述一遍而是在有限的时间里确认你具不具备干活的能力。大部分CV算法岗的实际工作内容无非是拿一个骨干网络加上检测头在业务数据上把指标调上去然后想办法把模型塞进端侧或者服务端跑起来。所以考察的维度其实很集中大致能分成四块第一是概念是否扎实比如mAP、IoU、正负样本这些术语你能不能讲清楚第二是结构是否理解问你FPN为什么有用、YOLO的检测头怎么设计的第三是训练是否踩过坑比如损失不下降、指标卡在某处怎么排查第四是工程是否落地过模型多大、推理耗时多少、量化之后掉点多少。这四块里前两块靠背也能蒙过去后两块才是真正拉开差距的地方。我带过一个候选人简历上写了三个检测项目问第一个项目的mAP多少答0.85再问这个0.85是在哪个数据集上、用了什么评价标准就说不清了。这种细节一露馅前面讲得再顺也会被扣分。反过来有些人项目做得不复杂但能把数据量、训练轮次、涨点手段、失败尝试都讲得清楚反而显得可信。所以准备的优先级我建议是先把基础概念彻底弄明白再对着自己简历上的项目做刨根问底式的自问自答最后才去补那些前沿方向的名词。1.2 高频问题的分层结构把常见问题按难度分个层复习的时候心里会有数。最底层是名词解释型比如什么是IoU、什么是Anchor、mAP和AP的区别这类问题答不上来基本就结束了属于必须拿下的送分题。往上一层是对比分析型比如两阶段和单阶段有什么区别、YOLOv3和YOLOv5改了什么、SSD和Faster R-CNN的差异在哪这类问题考察你有没有横向的知识面光背单个模型不够。再往上是原理推导型比如为什么用Focal Loss、正负样本怎么划分、NMS的阈值怎么选这类问题面试官往往会在你答完之后继续追问看你理解到什么深度。最高层是开放设计型比如给你一个检测小目标的任务你会怎么做、模型要部署到移动端你选什么方案这类问题没有标准答案看的是你的思路和工程判断。我自己的习惯是复习的时候把每个模型都问自己一遍它解决前人的什么问题、核心改动是什么、有什么明显短板。这三问能答顺基本的问题就稳了。下面几节我会按这个顺序把每一层的典型问题挑出来细讲。2. 基础概念类问题怎么答才不踩雷2.1 mAP的计算流程要能一步步说清楚这是被问得最多、也最容易答得含混的问题。很多人一张口就是mAP是各类别AP的平均值然后就没有了。面试官想听的是完整链条先按置信度对某个类别的所有预测框排序然后从高到低逐个判断每个预测框和该类别所有真实框算IoUIoU超过阈值通常0.5且该真实框还没被匹配过就算真正例否则算假正例被漏掉的真实框算假负例。沿着排序往下走每加入一个预测框就更新一次精度和召回率这样就能画出一条P-R曲线曲线下的面积就是这个类别的AP。把所有类别的AP取平均就是mAP。这里有几个容易翻车的追问。第一个是IoU阈值VOC用的是0.5COCO用的是一组从0.5到0.95、步长0.05的阈值再平均叫mAP[.5:.95]所以同样是0.85在不同标准下含金量完全不一样回答时必须说清楚用的是哪套。第二个是同一个真实框被多个预测框匹配怎么办标准做法是只保留IoU最高的那个算正例其余的算假正例这一步就是所谓的匹配唯一性。第三个是类别不平衡时mAP会不会失真会因为每个类别权重一样样本少的类别AP波动很大这也是COCO后来又引入APs、APm、APl这些按目标尺寸分组的指标的原因。你如果能在回答时主动提一句COCO那套多阈值和小中大目标分组面试官基本就知道你确实用过而不是背的。提示回答mAP时一定要先问清楚或者主动说明评价标准是VOC还是COCO、IoU取多少这个小动作会显得你很专业。2.2 IoU和它的几个变种IoU本身很简单两个框的交集面积除以并集面积取值0到1。但面试里往往会顺着问下去。比如IoU有什么局限常见答法是它只反映重叠程度不反映距离两个完全不相交的框IoU都是0但在损失函数里没法区分谁离得更近这就引出了GIoU、DIoU、CIoU这些改进。GIoU在IoU基础上加了一个惩罚项用最小闭包区域减去并集再除以最小闭包区域这样不相交时也能提供梯度。DIoU进一步考虑了中心点距离。CIoU再加上长宽比的一致性。这三个的演进逻辑你要能讲出来面试官大概率还会问哪个效果最好一般工程上CIoU用得多因为它把重叠、距离、长宽比都考虑进去了。还有一个常被忽略的点是IoU的用途不只是评价在NMS里也用它来判定两个框是否重复在正负样本分配里也用它来判断Anchor和真实框的匹配度。同一个概念出现在三个地方你如果能主动把它们串起来讲会加分不少。2.3 Anchor到底解决了什么问题Anchor是目标检测里绕不开的概念。早期的方法要么直接回归坐标比如YOLOv1要么用滑动窗口配合分类器前者收敛难后者计算量大。Anchor的思路是在特征图的每个位置预设若干个不同尺度和长宽比的参考框网络只需要预测相对于这些参考框的偏移量和是不是有目标这样回归目标就被归一化到一个比较小的范围训练更稳定。你可以把它理解成一个先验我知道目标大概长什么样、有多大让网络去微调而不是从零开始猜。顺着Anchor会追问几个问题。为什么Faster R-CNN用9个Anchor一般是3种尺度乘以3种长宽比。为什么后来有人提Anchor-Free因为Anchor带来了超参数敏感、正负样本极度不平衡、不同数据集要重新聚类Anchor尺寸这些问题所以像FCOS、CenterNet这类方法干脆不用Anchor改成预测目标中心点和尺寸或者预测到四条边的距离。但Anchor-Free也不是万能的小目标场景下它未必比调好的Anchor方案强。这里答的时候千万不要一边倒地说Anchor-Free更好或者Anchor过时了工程上选哪个取决于数据分布和部署约束这种平衡的表达才是面试官想听的。3. 经典网络结构问题的拆解思路3.1 从R-CNN到Faster R-CNN的问题链条这条演进线是面试的常客但很多人只会背版本讲不出每个版本解决了上一个版本的什么痛点。你可以这样组织R-CNN用选择性搜索生成约两千个候选区域每个区域单独送进CNN提特征再分类问题是重复计算太多、训练分好几段、速度慢到没法用。Fast R-CNN把整张图过一次CNN然后在特征图上用RoI Pooling把候选区域对应的特征裁出来统一尺寸分类和回归放在一个网络里一起训速度大幅提升但候选区域还是靠选择性搜索生成这一步成了瓶颈。Faster R-CNN的贡献就是用RPN网络替代选择性搜索RPN在特征图上直接预测候选框和检测头共享卷积特征实现了端到端训练。面试官的高频追问是RPN怎么训练的答案在于它给每个Anchor分配正负样本标签和某个真实框IoU最高的Anchor是正样本IoU超过0.7的也是正样本低于0.3的是负样本中间的不参与训练。还有RoI Pooling和RoI Align的区别前者有两次量化取整导致特征和原图位置对不齐后者用双线性插值避免量化对分割和定位精度更友好这个问题在做过Mask R-CNN的人身上几乎必问。我把这条线总结成一个记忆口诀选择性搜索太慢、特征重复算太多、两段训练太麻烦、候选框生成还是瓶颈每解决一个就前进一代。按这个逻辑讲比干巴巴背时间线强得多。3.2 YOLO系列一路改了什么YOLO是简历上出现频率最高的模型问得也最细。我建议按每个版本的核心改动来准备。YOLOv1把检测当成回归问题一张图一次前向出所有框快但定位精度差尤其小目标和密集目标不行。YOLOv2引入Anchor、批量归一化、多尺度训练把精度拉上来。YOLOv3是很多人的入门款用Darknet-53做骨干引入FPN式的多尺度预测在三个不同尺度的特征图上各出一个检测头小目标检测明显改善分类损失换成二元交叉熵来支持多标签。YOLOv4和YOLOv5更多是工程优化的集大成者Mosaic数据增强、CSP结构、PANet、各种训练技巧堆上来涨点是实打实的但理论创新有限。再往后一些版本开始引入Anchor-Free的解耦头、标签分配策略比如Task Alignment Learning、以及更强的数据增强。面试里如果你只答版本号会显得很虚如果能说出v3的多尺度是针对小目标的、v4/v5的CSP是为了减少计算同时保留梯度流、后面的解耦头是把分类和回归分开避免任务冲突效果完全不同。还有一个几乎必问的点是YOLO的损失由哪几部分组成一般包括框回归损失、置信度损失、分类损失框回归早期用MSE后来普遍换成了CIoU这类带几何约束的损失。3.3 FPN和多尺度特征融合为什么重要目标检测的核心难点之一是尺度变化同一张图里可能同时有大车和小远方的行人。深层特征图语义强但分辨率低小目标在上面几乎消失浅层特征图分辨率高但语义弱容易被背景干扰。FPN的思路是自顶向下把深层特征上采样后和浅层特征相加让每一层既有语义又有细节然后在多个尺度上分别预测。这一招对mAP的提升非常明显尤其是对小目标。后面还有PANet在FPN基础上加了一条自底向上的路径BiFPN做加权融合思路都是在多尺度上做文章。面试里常见追问是FPN的上采样用什么方式一般用最近邻插值因为计算简单且不引入额外参数相加和拼接有什么区别相加要求通道数一致、计算量小拼接保留更多信息但通道翻倍。还有一点可以主动提FPN不只是检测在用分割、关键点检测里也很常见属于通用结构。答这种问题时如果能跨任务举一反三会让人觉得你不是死记硬背。4. 损失函数与训练细节的高频追问4.1 分类损失和回归损失怎么搭配检测的损失一般是多任务损失分类负责是什么回归负责在哪里。分类常用的有交叉熵和Focal Loss回归常用的从早期的Smooth L1到现在的IoU系列损失。Smooth L1的好处是在误差小的时候是平方项、误差大的时候是线性项对离群点不那么敏感训练更稳。但它的缺点是把四个坐标当成独立变量回归忽略了框作为一个整体的几何关系所以后来IoU Loss、GIoU、DIoU、CIoU逐步取代它直接用IoU相关的量做损失和评价指标也更一致。面试官经常会问多任务损失怎么平衡分类和回归的权重是不是固定的。标准答法是加一个权重系数但更深入的说法是不同任务的梯度量级不一样回归损失的数值波动大如果不做归一化可能会压过分类损失。工程上常见的做法是把回归损失除以正样本数量做归一化或者用不确定性加权把权重也当成可学习参数。这一点能答出来会明显拉开层次。4.2 Focal Loss解决的到底是什么问题单阶段检测器精度长期不如两阶段的一个核心原因是正负样本极度不平衡一张图里可能有上万个候选框真正包含目标的只有几个。普通的交叉熵对每个样本一视同仁大量容易分类的背景样本累积起来会主导梯度让模型学不到有用的东西。Focal Loss的做法是给每个样本乘一个调制因子容易分类的样本权重被压得很低难样本权重相对保留这样训练就聚焦在hard example上。公式里有个gamma参数控制压制强度通常取2alpha用来平衡正负样本比例。常见追问是Focal Loss和OHEM在线难例挖掘有什么区别Focal Loss是软加权所有样本都参与但权重不同OHEM是硬筛选只挑损失最大的那部分样本参与训练。前者实现简单、没有额外计算后者需要排序和筛选开销更大但更直接。还有一个坑是Focal Loss在两阶段里未必有用因为两阶段经过RPN已经过滤了大部分背景样本不平衡没那么严重。回答这种什么时候用、什么时候不用的问题比背公式有价值得多。4.3 NMS和后处理的细节NMS是检测的最后一步负责把同一个目标上的多个重复框去掉。流程是按置信度排序取最高的框然后把它和剩下的框算IoU超过阈值的删掉循环直到处理完。听起来简单但面试官会追问它的问题。第一个是密集场景下两个真实目标靠得很近IoU很高NMS会把其中一个正确框误删这就是漏检的来源。针对这个问题有Soft-NMS不直接删而是降低分数还有把IoU换成考虑中心点距离的DIoU-NMS。第二个是NMS的阈值选取阈值高保留框多、召回高但误检多阈值低则相反通常要在验证集上扫一遍选最优。第三个是NMS的速度它是串行的框多的时候会成为推理瓶颈工程上会用一些并行化的实现或者先在候选框上做筛选。还有一个常被问到的细节是置信度阈值和NMS阈值是两个不同的东西前者过滤低质量预测后者去重很多人会混为一谈。实际调参时两个都要动而且它们的组合会影响最终的精度召回平衡回答时把这两个分开说清楚会显得细节扎实。4.4 训练不收敛和指标卡住怎么排查这类问题最能看出实战经验。我一般的排查顺序是先看数据和标签检测的标注很容易出问题比如类别名对不上、坐标越界、框太小人眼都看不清这些会让模型学不到东西再看学习率和批大小学习率太大会震荡、太小会卡在局部用热身加余弦退火是比较稳的组合然后看损失曲线如果分类损失降但回归损失不降可能是Anchor尺寸和你的数据不匹配需要重新聚类如果两者都不降可能是骨干网络初始化有问题或者冻结策略不对。指标卡在某一个值上不去常见原因是正负样本分配策略和数据分布不匹配比如你的目标普遍很小但Anchor都是大框模型就学不好小目标。这时候可以调小Anchor尺寸、增大输入分辨率、或者在损失里给小目标加权。还有一种情况是过拟合训练集指标很高验证集不动那就回到数据增强和正则化上想办法。这部分我没有标准答案给你背因为每个项目的情况都不一样但只要你讲出先数据后模型再参数的排查顺序并给出具体判断依据面试官就能确认你真的跑过完整的实验。5. 工程落地与进阶方向5.1 小目标检测为什么难、怎么攻小目标在图像里占的像素很少经过多层下采样之后在特征图上可能只剩一两个像素信息几乎丢失这是它难的根源。解决思路一般从几个方向入手。数据层面提高输入分辨率能让小目标占据更多像素或者用小目标过采样、切图训练的办法增加小目标的样本量。结构层面用FPN这类多尺度融合让浅层的高分辨率特征参与预测或者加一些更精细的特征金字塔变体。训练层面在损失里对小目标的贡献加权或者调整正样本分配让更多Anchor匹配上小目标。这里有个很实际的经验小目标检测的提升往往不是靠换个网络就能解决的很多时候是标注质量和数据分布的问题。如果标注时小目标框得不准或者训练集里小目标本来就少再好的结构也救不回来。面试里能把先确认数据、再谈结构这个顺序讲出来比上来就推荐某个模型强。5.2 轻量化和部署相关的问题模型要上线绕不开速度和体积。面试里常见的问法是你做过哪些轻量化工作、模型部署到端侧要注意什么。轻量化主要分三条路换轻量骨干网络比如用MobileNet、ShuffleNet这类做剪枝和量化把不重要的通道去掉或者把浮点权重压成八位整数用知识蒸馏拿大模型教小模型。量化是最常用的但要注意掉点尤其检测头的回归分支对量化比较敏感所以有时候只量化骨干、检测头保持浮点。部署侧的问题就更工程了比如你的模型输入多大、在目标硬件上跑到多少帧、内存占用多少、是不是支持动态输入。这些问题没有统一答案但你必须对自己项目里用过的模型心里有数。有个加分点是主动谈精度和速度的取舍比如业务上要求实时那就牺牲一点mAP换速度如果要求高精度就上大模型或者多尺度测试。能讲清楚这个取舍逻辑的候选人通常被认为更懂落地。5.3 开放词汇检测这类新方向这几年开放词汇检测、开集检测是热点面试里出现的频率也在上升。传统的检测器只能检测训练时见过的固定类别开放词汇检测想让模型能识别没见过的类别一般靠视觉语言模型把文本和图像特征对齐用文本描述来指导检测。你可以不了解具体实现细节但至少要知道它解决什么问题、大概思路是什么。同理还有三维目标检测、多模态检测这些方向如果岗位相关提前看一两篇综述把名词和思路混个脸熟就够了不用陷进去毕竟面试不是论文答辩。我的建议是准备一个一页纸的新方向速览每个方向记三句话解决什么问题、核心思路、典型代表。被问到的时候能接上话又不会因为不懂装懂而露怯。6. 手撕代码与项目经历的表达6.1 常考的代码题和写法检测岗的代码题集中在几个经典操作上IoU计算、NMS、以及一些张量操作。IoU的关键是搞清楚交集的坐标怎么算左上角取两组坐标里较大的右下角取较小的如果右下小于左上说明不相交要截断到0。NMS是排序加循环筛选。这两段代码建议手写熟练不要依赖库函数因为面试官就是想看你懂不懂原理。下面给一份可以默写的Python版本。import numpy as np def iou(box, boxes): # box: [x1, y1, x2, y2] xx1 np.maximum(box[0], boxes[:, 0]) yy1 np.maximum(box[1], boxes[:, 1]) xx2 np.minimum(box[2], boxes[:, 2]) yy2 np.minimum(box[3], boxes[:, 3]) w np.maximum(0.0, xx2 - xx1) h np.maximum(0.0, yy2 - yy1) inter w * h area1 (box[2] - box[0]) * (box[3] - box[1]) area2 (boxes[:, 2] - boxes[:, 0]) * (boxes[:, 3] - boxes[:, 1]) return inter / (area1 area2 - inter 1e-6) def nms(boxes, scores, thr0.5): order scores.argsort()[::-1] keep [] while order.size 0: i order[0] keep.append(i) ious iou(boxes[i], boxes[order[1:]]) idx np.where(ious thr)[0] order order[idx 1] return keep写的时候注意几个细节除零保护要加否则会出nan坐标顺序要统一别一会儿xyxy一会儿xywhNMS里更新order的时候要跳过第一个已经保留的框容易差一位。另一个常考的是手写卷积或者下采样的感受野计算这类题考察的是你对神经网络基本运算的理解提前推几遍就能记住规律。6.2 项目经历怎么讲才站得住面试官看简历里的检测项目最想确认的是这个项目真的是你做的而且你理解了里面的取舍。我的建议是每个项目准备四段话。第一段讲背景和难点数据多少、目标是什么、卡在哪越具体越好。第二段讲你试过哪些方案包括失败的尝试比如先用了某个模型效果不好分析原因后换成了什么。第三段讲关键改动和涨点比如换骨干涨了几个点、加了某个数据增强涨了几个点、调了正负样本分配又涨了多少。第四段讲部署和反思模型多大、推理多快、还有哪些没解决的问题。这里面第二段最重要因为失败的尝试最能体现你是真的动手做过。很多候选人只讲成功路径一听就像照着教程走了一遍。你如果能把我一开始用大Anchor发现小目标学不好重新聚类之后好转这种细节讲出来可信度立刻不一样。还有个小技巧是准备一两个具体的数字比如某次调参后mAP从多少涨到多少数字比形容词有说服力。6.3 答题节奏和常见的坑最后说几个答题上的坑。第一个是遇到不会的问题不要硬编可以坦诚说不熟悉然后讲你知道的相关部分比如开放词汇检测我没实际做过但我知道它大概是用文本特征来指导检测类似CLIP那种对齐思路这样比瞎编强。第二个是不要只答结论不给过程面试官问原理就是想听过程你直接甩个名词他会继续追不如一次讲透。第三个是主动暴露边界比如这个方法在XXX场景下效果好但在XXX情况下会退化能说出局限的人往往被认为理解更深。还有一个心态上的事情目标检测的知识点确实多不可能每个都答满分面试官也知道。与其追求面面俱到不如把自己做过的部分讲深、讲透。我见过不少候选人项目不算亮眼但因为讲得清楚、细节真实最后拿到了不错的评价。反过来简历堆了一堆热门模型名字一深入就空的反而容易翻车。我个人在准备和辅导别人面试的过程中最大的体会是目标检测这块真正拉开差距的从来不是你知道多少个模型而是你能不能把一个问题从是什么讲到为什么这么做再讲到换我怎么做。模型会过时YOLO的版本号每年都在变但正负样本怎么划分、损失怎么设计、多尺度怎么融合、指标怎么评估这些底层逻辑是相对稳定的把这几块吃透新模型出来你花半天看论文就能跟上。最后分享一个我自己的习惯每学一个新检测器就逼自己用三句话给别人讲明白它改了什么、为什么改、代价是什么讲不出来的地方就是你的知识盲区回去补上就行。