简介:这份PDF面向准备计算机视觉算法岗位面试的求职者与在校学生,系统梳理了面试中高频出现的知识点,帮助读者在碎片时间快速回顾与查漏补缺。内容覆盖数据结构与算法基础,如稳定与不稳定排序、回溯法与分支定界法、常见搜索算法及哈希表冲突处理;同时深入深度学习方向,包括加速收敛策略、BN原理、CNN感受野与feature map计算、Xavier与He参数初始化、CNN在图像中的应用与不适用场景,以及神经网络效果不佳时的排查思路,并附带Linux、进程线程与网络基础知识。资源为单个PDF文件,压缩包约294KB,轻量便携,适合随时翻阅。目前已有705人学习下载,可作为面试前的速查清单,帮助读者串联零散知识点、明确复习重点,提升面试应答的条理性与覆盖面。
1. 计算机视觉算法面试准备:从一份 PDF 到一套能扛住追问的知识体系
计算机视觉算法面试准备这件事,很多人第一反应是刷题、背八股、把一份计算机视觉.pdf 从头翻到尾。但真正面过几轮的人都知道,面试官不会问你「BN 的公式是什么」,他会问「你项目里 BN 的 momentum 设了多少,为什么」。这份计算机视觉.pdf 如果只是知识点罗列,那它顶多算个索引;真正能让你在面试里不翻车的,是把每个知识点还原成「我遇到过什么问题、怎么选的、参数怎么定的、哪里踩过坑」。
这篇笔记面向的是准备 CV 算法岗的从业者和应届生,尤其是那种「知识点都见过,但一被追问就露馅」的状态。我会把一份典型的计算机视觉.pdf 拆成可复现的准备路径:先建立知识骨架,再针对高频追问做深挖,最后落到能讲清楚的项目表达。不聊虚的,直接讲怎么把 PDF 里的条目变成面试时能脱口而出的东西。
2. 把计算机视觉.pdf 拆成三层知识骨架:检测、分割、骨干网络
一份合格的计算机视觉.pdf 通常覆盖检测、分割、分类三大块,但面试真正考的是这三块背后的共享底座——骨干网络、特征金字塔、损失函数设计。如果按 PDF 的章节顺序平铺直叙地背,面试时很容易被一个跨模块的问题打穿。我一般会把 PDF 内容重组成三层:底层是骨干和算子,中层是任务头,顶层是训练策略和部署约束。
2.1 骨干网络:从 ResNet 到 Transformer 的选型逻辑
面试里问骨干网络,不会只问结构,而是问「你这个场景为什么用 ResNet 不用 ViT」。这背后是数据量、感受野、计算成本的权衡。ResNet 的残差连接解决的是深层网络退化问题,而 ViT 的 self-attention 在数据量不足时容易过拟合,因为它的归纳偏置比卷积弱得多。
准备时我建议把 PDF 里所有骨干网络整理成一张对比表,重点记三个维度:参数量、FLOPs、在中小数据集上的表现。下面是一个整理模板,用 Python 字典存下来方便随时查:
# 骨干网络对比速查表,面试前过一遍 backbones = { "ResNet-50": { "params_M": 25.6, # 参数量,百万 "flops_G": 4.1, # 224x224 输入下的计算量 "inductive_bias": "强", # 卷积自带局部性和平移不变性 "best_for": "中小数据集、边缘部署", "interview_trap": "残差连接为什么能缓解梯度消失" }, "ViT-B/16": { "params_M": 86, "flops_G": 17.6, "inductive_bias": "弱", # 需要大量数据学出空间关系 "best_for": "大数据集、预训练充分", "interview_trap": "位置编码怎么加的,为什么用可学习编码" }, "Swin-T": { "params_M": 28, "flops_G": 4.5, "inductive_bias": "中", # 窗口注意力引入局部性 "best_for": "需要多尺度但算力有限", "interview_trap": "shifted window 到底解决了什么问题" } }这段代码的价值不在运行,而在帮你把「选型理由」和「面试陷阱」绑在一起记。参数说明:params_M 和 flops_G 是面试官常问的量化指标,inductive_bias 决定了模型对数据量的敏感度,interview_trap 是你必须提前准备好答案的追问点。我一般会把这个表打印出来,面试前半小时扫一遍,比翻 PDF 快得多。
2.2 检测头与分割头:Anchor-based 和 Anchor-free 的边界
检测这块,PDF 里通常会并列讲 Faster R-CNN、YOLO 系列、FCOS。面试官最爱问的是「Anchor-based 和 Anchor-free 的本质区别是什么」。很多人答「一个用 anchor 一个不用」,这等于没答。本质区别在于正负样本分配策略:Anchor-based 靠 IoU 阈值匹配,Anchor-free 靠中心点或关键点回归。
准备时要把每个检测器的正负样本分配逻辑写清楚。以 FCOS 为例,它把特征图上的每个点直接回归到边界框,用 center-ness 分支抑制低质量预测。面试追问会落在「center-ness 怎么算、为什么能提升精度」:
import torch def center_ness(bbox_targets): """ FCOS 的 center-ness 计算,面试常问 bbox_targets: [N, 4],格式为 (l, t, r, b) 相对当前点的距离 返回: [N, 1],值域 0~1,越靠近目标中心越接近 1 """ l, t, r, b = bbox_targets.unbind(-1) # 左右最小距离除以左右最大距离,上下同理 left_right = torch.stack([l, r], dim=-1) top_bottom = torch.stack([t, b], dim=-1) # 取最小比最大,得到中心度 center = torch.sqrt( (left_right.min(-1)[0] / left_right.max(-1)[0]) * (top_bottom.min(-1)[0] / top_bottom.max(-1)[0]) ) return center.unsqueeze(-1)逻辑说明:center-ness 的作用是让远离目标中心的预测点权重降低,因为那些点虽然能回归出框,但质量差。参数上,sqrt 是为了让数值分布更平滑,面试时如果被问到「不用 sqrt 行不行」,答案是行但收敛慢。这个细节在 PDF 里往往只有一句话,但面试官就爱抠这种地方。
分割任务同理,PDF 里会讲 FCN、U-Net、DeepLab。面试高频追问是「上采样为什么用转置卷积而不是双线性插值」。转置卷积有可学习参数,能恢复更多细节,但容易产生棋盘伪影;双线性插值无参数、更稳定,但表达能力弱。我一般会答「看任务,如果边缘精度要求高且数据够,用转置卷积;否则双线性插值加卷积更稳」。
2.3 损失函数:分类、回归、分割的损失怎么选
损失函数是面试里最容易暴露理解深度的地方。PDF 里会列 CrossEntropy、Focal Loss、Smooth L1、Dice Loss,但面试官会问「你那个任务为什么用 Focal Loss 不用 CE」。Focal Loss 解决的是正负样本极度不平衡,通过调制因子降低易分样本的权重。
准备时要把每个损失的适用场景和超参写清楚。比如 Focal Loss 的 gamma 和 alpha,gamma 控制难易样本的聚焦程度,alpha 控制正负样本的权重。下面是一个对比表,面试前过一遍:
| 损失函数 | 适用任务 | 关键超参 | 面试追问点 |
|---|---|---|---|
| CrossEntropy | 分类均衡 | 无 | 为什么配合 softmax |
| Focal Loss | 检测、类别不平衡 | gamma=2, alpha=0.25 | gamma 调大调小的效果 |
| Smooth L1 | 框回归 | beta=1.0 | 为什么比 L2 稳 |
| Dice Loss | 分割、小目标 | 无 | 和 CE 怎么组合 |
这张表不是让你背,而是让你在面试时能快速定位「他问的是哪个维度」。我见过太多人把 Focal Loss 的公式背得滚瓜烂熟,但被问「gamma 设 5 会怎样」就卡住了。答案是:gamma 越大,易分样本权重被压得越狠,训练更聚焦难样本,但太大容易导致训练不稳定,因为难样本可能是标注噪声。
3. 高频追问的深挖路径:从 BN 到 NMS 的参数级准备
面试里真正拉开差距的,不是你知道多少模型,而是你对每个模块的参数和边界条件有多清楚。这一章我把 PDF 里最容易出追问的四个点拆开:BN、NMS、学习率策略、数据增强。每个点都落到「参数怎么设、为什么、失败时看什么」。
3.1 BN 的 momentum 和 eps:面试官最爱抠的两个参数
BN 是 CV 面试的必考题,但大多数人只答「归一化、加速收敛」。面试官会追问「momentum 默认多少、设大了会怎样」。PyTorch 里 BN 的 momentum 默认 0.1,注意它和优化器的 momentum 不是一回事。BN 的 momentum 是滑动平均的系数,公式是 running_mean = (1 - momentum) * running_mean + momentum * batch_mean。
momentum 设大了,running_mean 更新快,但波动大;设小了,更新慢,训练初期统计量不准。我一般会答「默认 0.1 在大多数任务够用,如果 batch size 很小比如 2,可以调到 0.01 让统计更稳」。eps 默认 1e-5,作用是防止除零,如果输入方差极小,eps 太大会导致归一化失效。
import torch.nn as nn # BN 的参数设置,面试时能说清每个参数的含义 bn = nn.BatchNorm2d( num_features=64, # 通道数,必须和输入通道一致 eps=1e-5, # 防止除零,输入方差极小时保护 momentum=0.1, # 滑动平均系数,小 batch 时调小 affine=True, # 是否学习 gamma 和 beta,默认 True track_running_stats=True # 推理时用 running stats ) # 面试追问:训练和推理时 BN 行为有什么区别? # 训练时用当前 batch 的均值和方差,推理时用 running_mean 和 running_var逻辑说明:affine=True 让 BN 有可学习的缩放和平移,如果设 False,归一化后直接输出,表达能力下降。track_running_stats 在推理时必须为 True,否则推理时还在用 batch 统计,结果会随 batch 变化。这些细节 PDF 里可能只有一行,但面试官就靠这个判断你有没有真正训过模型。
3.2 NMS 的 IoU 阈值和变体:从 Soft-NMS 到 DIoU-NMS
NMS 是检测后处理的核心,面试必问。标准 NMS 的 IoU 阈值通常设 0.5,但面试官会问「阈值设 0.3 和 0.7 分别什么效果」。阈值低,抑制狠,容易漏检重叠目标;阈值高,保留多,容易误检。我一般会答「密集场景调高到 0.6~0.7,稀疏场景 0.3~0.5」。
Soft-NMS 不直接删除高 IoU 框,而是降低其置信度,适合重叠目标多的场景。DIoU-NMS 在 IoU 基础上加入中心点距离,能更好区分相邻目标。准备时要把这些变体的核心公式和适用场景记清楚:
import numpy as np def nms(dets, iou_thresh=0.5): """ 标准 NMS,dets: [N, 5],格式 (x1, y1, x2, y2, score) 面试时手写版,重点展示排序和 IoU 计算 """ x1, y1, x2, y2, scores = dets[:, 0], dets[:, 1], dets[:, 2], dets[:, 3], dets[:, 4] areas = (x2 - x1 + 1) * (y2 - y1 + 1) order = scores.argsort()[::-1] # 按置信度降序 keep = [] while order.size > 0: i = order[0] keep.append(i) # 计算当前框和剩余框的 IoU xx1 = np.maximum(x1[i], x1[order[1:]]) yy1 = np.maximum(y1[i], y1[order[1:]]) xx2 = np.minimum(x2[i], x2[order[1:]]) yy2 = np.minimum(y2[i], y2[order[1:]]) w = np.maximum(0.0, xx2 - xx1 + 1) h = np.maximum(0.0, yy2 - yy1 + 1) inter = w * h iou = inter / (areas[i] + areas[order[1:]] - inter) # 保留 IoU 小于阈值的框 inds = np.where(iou <= iou_thresh)[0] order = order[inds + 1] return keep逻辑说明:这段代码面试手写频率极高,重点在 argsort 降序、IoU 计算、阈值过滤三步。参数 iou_thresh 是唯一超参,面试追问会落在「为什么用 0.5 不用 0.7」。注意代码里 +1 是为了避免边界框面积为 0,这是工程细节,面试官看到会加分。
3.3 学习率策略:warmup、cosine、step 的适用场景
学习率策略是训练策略里的高频追问。PDF 里会列 StepLR、CosineAnnealing、Warmup,但面试官会问「你那个任务为什么用 cosine 不用 step」。Cosine 衰减平滑,适合长训练;Step 在里程碑处突降,适合短训练且对收敛点有预期。Warmup 解决的是训练初期梯度不稳定,尤其是大 batch 或 Transformer 结构。
准备时要把每种策略的参数和适用场景写清楚。比如 CosineAnnealing 的 T_max 通常设为总 epoch 数,eta_min 设为初始学习率的 1/100 或 0。Warmup 的 warmup_epochs 一般设 3~5,warmup_lr 从 1e-6 线性升到初始学习率。
from torch.optim.lr_scheduler import CosineAnnealingLR, StepLR, LambdaLR # 余弦退火,适合长训练,T_max 设为总 epoch cosine = CosineAnnealingLR(optimizer, T_max=100, eta_min=1e-6) # 阶梯衰减,适合短训练,milestones 是降 lr 的 epoch step = StepLR(optimizer, step_size=30, gamma=0.1) # warmup + cosine,Transformer 常用 def warmup_cosine(epoch): if epoch < 5: return (epoch + 1) / 5 # 线性 warmup return 0.5 * (1 + np.cos(np.pi * (epoch - 5) / 95)) warmup_scheduler = LambdaLR(optimizer, lr_lambda=warmup_cosine)逻辑说明:T_max 和 step_size 是最容易设错的参数。T_max 设小了,学习率过早降到 eta_min,模型欠拟合;设大了,后期学习率还很高,loss 震荡。我一般会答「T_max 等于总 epoch,eta_min 设初始 lr 的 1/100,warmup 5 个 epoch」。这些数字不是死的,但面试时给出具体值比含糊其辞强得多。
3.4 数据增强:从 Flip 到 MixUp 的收益边界
数据增强是面试里容易被低估的点。PDF 里会列 Flip、Crop、ColorJitter、MixUp、CutMix,但面试官会问「你那个任务为什么用 MixUp 不用 CutMix」。MixUp 是两张图线性叠加,标签也线性叠加,适合分类;CutMix 是裁剪粘贴,保留局部特征,适合检测和分割。
准备时要把每种增强的适用任务和超参写清楚。MixUp 的 alpha 通常设 0.2,CutMix 的 alpha 设 1.0。注意增强不是越多越好,分类任务里 Flip 和 Crop 几乎无损,但 ColorJitter 对颜色敏感的任务可能有害。
import torchvision.transforms as T # 分类任务常用增强组合 train_transform = T.Compose([ T.RandomResizedCrop(224, scale=(0.8, 1.0)), # 随机裁剪,scale 控制裁剪比例 T.RandomHorizontalFlip(p=0.5), # 水平翻转,p 是概率 T.ColorJitter(brightness=0.2, contrast=0.2), # 颜色抖动,幅度别太大 T.ToTensor(), T.Normalize(mean=[0.485, 0.456, 0.406], # ImageNet 统计量 std=[0.229, 0.224, 0.225]) ]) # MixUp 和 CutMix 在训练循环里实现,不在 transform 里 # 面试追问:为什么 Normalize 的 mean 和 std 用 ImageNet 的? # 答:预训练模型在 ImageNet 上训的,推理时分布要一致逻辑说明:scale=(0.8, 1.0) 控制裁剪面积比例,太小会丢失目标,太大会引入过多背景。ColorJitter 的 brightness 和 contrast 设 0.2 是经验值,设 0.5 可能让颜色失真。Normalize 的 mean 和 std 必须和预训练模型一致,否则特征分布偏移,fine-tune 效果差。这些细节 PDF 里往往一笔带过,但面试官就靠这个判断你有没有真正调过参。
4. 避坑与常见问题:面试准备里最容易翻车的五个点
准备 CV 面试的过程中,我见过太多人把时间花在错的地方。这一章列五个高频翻车点,每条按「现象 → 原因 → 解决」写,都是血泪经验。
4.1 只背公式不理解参数,一追问就露馅
现象:面试官问「BN 的 momentum 默认多少」,答「0.1」,再问「设 0.01 会怎样」,卡住。
原因:PDF 里只写了公式,没写参数含义和调参经验。背公式是输入,理解参数是输出,中间缺了「我调过」这一环。
解决:每个模块准备时,强制自己回答三个问题——默认值多少、调大调小分别什么效果、什么场景要改。比如 BN 的 momentum,默认 0.1,调小让统计更稳但收敛慢,小 batch 时调小。把这三个问题写成注释贴在代码里,面试前过一遍。
4.2 项目描述太笼统,没有具体数字
现象:简历写「使用 YOLO 完成目标检测,mAP 达到 0.85」,面试官问「baseline 多少、提升来自哪个改动」,答不上来。
原因:项目是跟着教程做的,没做过消融实验,不知道每个改动的贡献。
解决:哪怕项目是复现,也要自己跑一组消融。比如 baseline mAP 0.80,加了 Focal Loss 到 0.83,加了 MixUp 到 0.85。面试时能说清「Focal Loss 贡献 3 个点,MixUp 贡献 2 个点」,比只报最终数字可信得多。数字不用大,但要有来源。
4.3 忽略推理部署,被问延迟和显存就懵
现象:面试官问「你这个模型推理延迟多少、显存占用多少」,答「没测过」。
原因:只关注训练精度,没关注部署约束。工业界面试尤其看重这个。
解决:准备时用 torch.cuda.Event 测一下推理时间,用 torch.cuda.max_memory_allocated 测显存。下面是一个测量模板:
import torch def measure_inference(model, input_tensor, warmup=10, runs=50): """ 测量推理延迟和显存,面试时能报出具体数字 warmup: 预热次数,避免首次编译影响 runs: 正式测量次数,取平均 """ model.eval() # 预热 for _ in range(warmup): _ = model(input_tensor) torch.cuda.synchronize() # 测延迟 start = torch.cuda.Event(enable_timing=True) end = torch.cuda.Event(enable_timing=True) start.record() for _ in range(runs): _ = model(input_tensor) end.record() torch.cuda.synchronize() latency = start.elapsed_time(end) / runs # 平均毫秒 # 测显存 mem = torch.cuda.max_memory_allocated() / 1024**2 # MB return latency, mem逻辑说明:warmup 必须做,首次推理有编译和缓存开销,不预热数据会偏大。torch.cuda.synchronize 保证计时准确,不然测的是异步下发时间。面试时能报出「延迟 15ms,显存 1.2G」,比「很快、不大」强太多。
4.4 数据增强过度,训练精度反降
现象:加了 MixUp、CutMix、ColorJitter 一堆增强,训练集精度上不去,验证集也差。
原因:增强太强,模型学不到真实分布。尤其是小数据集,强增强等于加噪声。
解决:增强要按任务选。分类任务 Flip + Crop 几乎无损,ColorJitter 幅度别超 0.3。MixUp 的 alpha 设 0.2,CutMix 设 1.0,别同时用。小数据集先不加 MixUp,等 baseline 稳了再试。我一般会先跑一版无增强的 baseline,再逐个加,看验证集涨不涨,不涨就撤。
4.5 损失函数和评价指标不匹配
现象:训练 loss 降得很好,但 mAP 或 IoU 不涨。
原因:损失函数优化的是代理目标,和最终指标有 gap。比如检测里分类 loss 和回归 loss 的权重没调好,分类准了但框不准。
解决:准备时把损失权重当超参调。检测任务里分类 loss 和回归 loss 通常 1:1,但小目标多时回归 loss 权重要加大。分割任务里 CE 和 Dice 通常 1:1,小目标多时 Dice 权重加大。面试时能说清「我试过 1:2 和 2:1,最后 1:1 最好」,比只报最终结果有说服力。
5. 把 PDF 变成面试表达:一个可复用的准备流程
准备到后期,核心不是学新东西,而是把已经会的东西组织成面试官能听懂的表达。这一章给一个可复用的流程,把计算机视觉.pdf 里的条目变成你自己的话。
5.1 用「问题-方案-参数-结果」四段式整理每个知识点
每个知识点都按这四段写一遍,写不出来说明没真懂。比如 BN:
- 问题:深层网络训练时内部协变量偏移,收敛慢
- 方案:对每个 batch 做归一化,加可学习的缩放平移
- 参数:momentum 0.1,eps 1e-5,affine True
- 结果:收敛加速,允许更大学习率,但 batch 太小时统计不准
这四段写下来,面试时不管从哪个角度问,你都能接住。我一般会用一个 Markdown 文件整理,每个知识点一节,面试前过一遍。
5.2 准备三个深度项目,每个能讲 15 分钟
面试官通常会让挑一个项目细讲。准备三个:一个检测、一个分割、一个分类或部署。每个项目按「背景-难点-方案-实验-反思」讲。难点要具体,比如「小目标漏检严重」,方案要对应,「加了 FPN 和 Focal Loss」,实验要有数字,「mAP 从 0.72 到 0.78」,反思要真实,「FPN 的额外计算让延迟涨了 3ms,后来换了轻量版」。
5.3 模拟追问:每个知识点准备三层深度
第一层是「是什么」,第二层是「为什么」,第三层是「怎么调」。比如 NMS:
- 是什么:后处理去重,按置信度排序,抑制高 IoU 框
- 为什么:模型会输出多个重叠框,需要去重
- 怎么调:IoU 阈值 0.5 默认,密集场景 0.6~0.7,稀疏 0.3~0.5
三层都准备好,面试官问到哪层都不慌。我一般会找朋友互相问,或者自己对着镜子讲,讲不顺的地方就是没懂的地方。
5.4 面试前 24 小时的复习清单
最后一天不学新东西,只过清单:
| 复习项 | 具体内容 | 时间 |
|---|---|---|
| 骨干网络 | ResNet/ViT/Swin 参数量和选型理由 | 30 分钟 |
| 检测 | Anchor-based vs Anchor-free,NMS 变体 | 30 分钟 |
| 分割 | FCN/U-Net/DeepLab 区别,上采样方式 | 20 分钟 |
| 损失 | Focal/Smooth L1/Dice 适用场景 | 20 分钟 |
| 训练策略 | BN 参数、学习率策略、数据增强 | 30 分钟 |
| 项目 | 三个项目的四段式表达 | 60 分钟 |
这张表不是让你全背,而是让你知道「哪些是必须能脱口而出的」。我一般会把这张表贴在显示器边上,面试前扫一遍,心里有底。
说到底,计算机视觉算法面试准备不是把 PDF 背下来,而是把 PDF 里的每个条目变成「我遇到过、我调过、我踩过坑」的故事。面试官想找的不是百科全书,是能一起干活的人。我自己的习惯是每准备一个知识点,就问自己一句「如果面试官追问参数,我能答上来吗」,答不上来就回去补。希望帮到你。
本文还有配套的精品资源,点击获取