CV算法岗面试高频考点与自测清单

CV算法岗面试高频考点与自测清单 简介面向CV算法岗求职者的知识点与面试问答汇总内容覆盖计算机视觉、机器学习、图像处理、编程语言与数据结构五大方向聚焦校招与社招中的高频考点。资源共288个文件以195个文本笔记文件md为主体系统梳理图像分割、特征提取、尺度不变特征变换SIFT、残差网络ResNet与视觉几何组网络VGG的对比、过拟合与偏差方差等面试常考问题并给出问答形式的应答思路另有58张示意图与21张实景图png及jpg辅助展示网络结构和实验效果辅以少量PDF文档和可运行脚本方便补充理论细节与代码实践。整个压缩包仅13.44MB轻量便携目前已有810人学习浏览。既适合即将参加算法岗面试的应届生快速回顾和建立知识框架也适合在职开发者利用碎片时间查漏补缺各章节均配有常见提问与参考回答便于自测与复习笔记凝练了关键结论和答题要点能有效节省自行搜集资料的时间。1. 从简历到面试CV算法岗到底在考什么那次我面一位简历上写着“精通目标检测”的候选人问到他 NMS 里 IoU 阈值怎么影响结果他卡壳了再问非极大值抑制的替代方案他直接说没想过。这不是个例。CV 算法岗面试表面考模型实际考的是“像素到语义”这一整条链路里的每一环是否真的打通。简历上堆 ResNet、YOLO被追问到图像处理基础、数据结构复杂度甚至 Python 可变参数时就露馅。下面这份梳理把高频考点拆成计算机视觉、机器学习、图像处理、编程语言与数据结构五个维度给出直接可用的回答思路、代码片段和参数细节。适合准备校招或社招的算法工程师也适合团队设计考核题。与其背十份面经不如按这套框架把原理和实践对齐。2. 计算机视觉核心从图像基础到模型设计2.1 图像基础与透视几何送分题里的坑面试开场通常问“什么是图像”。别只答“像素矩阵”要说出分辨率、位深、色彩空间的作用。比如 RGB 图像每个像素 3 通道灰度图 1 通道色彩空间除了 RGB 还有 HSV、LabHSV 在图像分割里常用因为色调对光照变化比 RGB 稳定。面试官在简历里看到“图像处理”项目常常会追问透视几何相机的内参外参、畸变模型、单应性矩阵。一个常见问题是“两张不同视角的图片如何对齐”回答核心是求单应矩阵 H3x3 矩阵8 个自由度用至少 4 对匹配点通过 DLT 算法求解。这里有个容易忽略的点单应矩阵要求特征点在同一平面或者相机纯旋转。用 RANSAC 过滤误匹配是必须的否则 DLT 会被野点带偏。面试时能说出“单应矩阵不等于本质矩阵本质矩阵还需要相机内参才能分解出旋转和平移”就是加分项。2.2 特征提取与描述SIFT 为什么依然值得讲角点检测、SIFT、ORB 都是高频考点。SIFT 的四个步骤——尺度空间极值检测、关键点定位、方向分配、描述子生成——每一步都有数学细节。面试官问“尺度空间是什么”不要只答“高斯金字塔”要说“用不同 σ 的高斯核卷积得到多尺度表示σ 对应尺度目的是模拟人眼近看远看的效果”。SIFT 描述子是 128 维基于梯度方向直方图对旋转和光照有一定不变性。现在很多项目直接用深度学习特征但传统特征在图像配准、三维重建里依然是打底方案。2.3 从 ResNet 到 VGG用代码讲清设计差异图像分类算法里ResNet 和 VGG 的区别是经典题。VGG 用堆叠小卷积核3x3模拟大感受野结构规整但层数深了会梯度消失ResNet 引入残差连接让拟合目标从“F(x)H(x)”变成“F(x)H(x)-x”梯度可以跨层回传。回答时最好画一下残差块的结构再补一句“VGG 参数量大ResNet50 参数量反而小但计算量不低”。手写一个残差块有助于现场答import torch import torch.nn as nn class BasicBlock(nn.Module): def __init__(self, in_ch, out_ch, stride1): super().__init__() self.conv1 nn.Conv2d(in_ch, out_ch, 3, stride, 1, biasFalse) self.bn1 nn.BatchNorm2d(out_ch) self.conv2 nn.Conv2d(out_ch, out_ch, 3, 1, 1, biasFalse) self.bn2 nn.BatchNorm2d(out_ch) self.shortcut nn.Sequential() if stride ! 1 or in_ch ! out_ch: self.shortcut nn.Sequential( nn.Conv2d(in_ch, out_ch, 1, stride, biasFalse), nn.BatchNorm2d(out_ch) ) def forward(self, x): out torch.relu(self.bn1(self.conv1(x))) out self.bn2(self.conv2(out)) out self.shortcut(x) return torch.relu(out)这段代码的关键点shortcut 分支分两种情况——输入输出通道和尺寸一致时直接恒等不一致时用 1x1 卷积并设置 stride 对齐尺寸。为什么用 biasFalse因为后面有 BatchNorm卷积层的偏置会被 BN 归一化掉多余还有可能引起均值偏移。回答“为什么残差有效”时除了梯度路径还要提“模型集成”视角残差网络可以看成多个深度不同的子网络集成。对比项VGG16ResNet50基本模块3x3 卷积堆叠瓶颈残差块参数量约 1.38 亿约 2550 万需要显存高全连接层大中关键设计小卷积核大深度残差连接BN梯度传播容易消失可跨层传递表中数据是常规公开数据面试中说个大概即可。2.4 图像分割从 FCN 到 Mask R-CNN 的演进路线图像分割面试频率高常问“分割和检测的区别”“FCN 为什么能端到端”。FCN 把全连接层换成卷积层再通过转置卷积上采样到原图尺寸实现像素级分类。后面 DeepLab 系列使用空洞卷积扩大感受野保持分辨率。实例分割 Mask R-CNN 在 Faster R-CNN 基础上增加 mask 分支同时完成检测和分割。再往后还有 Cascade R-CNN 这种用级联 IoU 阈值提升检测精度的思路面试时提一句“不同阈值对应不同质量的候选框级联结构让每个阶段的阈值匹配其输入分布”会显得有深度。一个高频问法是“转置卷积和反卷积一样吗”答案是不一样——转置卷积只是恢复了形状不是数学上的逆运算。实践上分割任务的损失函数常用交叉熵和 Dice Loss 组合。类别不均衡严重时用 Dice Loss 更稳但 Dice 梯度不平滑可以和交叉熵按 7:3 加权。面试现场能写出“softmax 之后接交叉熵”的计算式就够了。3. 机器学习与模型训练过拟合、偏差方差与选型实战3.1 机器学习分类与损失函数选择机器学习面试必问“什么是监督学习、无监督学习、半监督学习、强化学习”。关键在例子监督学习给“输入-标签”对图像分类就是无监督学习只给数据聚类、降维半监督学习用少量标注加大量无标注数据伪标签是常见做法强化学习靠奖励信号。面试官会对“如何在 CV 任务里用半监督”感兴趣可以答用教师模型对无标注数据生成伪标签设置置信度阈值过滤再用学生模型学习。损失函数选择也是高频题。分类问题常用交叉熵回归问题用 MSE 或 MAE目标检测的定位损失从 Smooth L1 到 CIoU。为什么回归不用交叉熵——因为交叉熵基于概率分布回归目标是无界实数分布假设不成立。L1 损失对离群点鲁棒但零点不可导L2 损失可导但会放大离群点误差Smooth L1 在误差小于 1 时用二次项大于等于 1 时用一次项结合两者优势。3.2 偏差方差分解与过拟合的四个解决手段“偏差和方差是什么”是经典题。偏差衡量模型预测期望与真实值的差距方差衡量模型在不同训练集上的稳定性。高偏差意味着欠拟合——模型容量不够高方差意味着过拟合——模型记住了噪声。一个模型总误差约等于偏差平方加方差加噪声。面试中最好画一个靶心图来描述低偏差高方差是“每次打得分散但平均在靶心”对应过拟合。抑制过拟合的四个手段正则化、数据增强、早停、Dropout。这里给一个 PyTorch 早停的实现片段class EarlyStopping: def __init__(self, patience5, min_improve1e-4): self.patience patience self.min_improve min_improve self.best_loss float(inf) self.counter 0 def step(self, val_loss): if val_loss self.best_loss - self.min_improve: self.best_loss val_loss self.counter 0 return False # 不停止 self.counter 1 return self.counter self.patience逻辑说明patience是容忍验证损失连续多少次不下降才停止min_improve是要求的最小提升量损失必须比历史最优少至少这个值才算进步防止微小波动触发重置。使用时在验证集上每个 epoch 调用step(val_loss)返回 True 就停止训练并恢复最优模型。这个写法能容忍短暂的平台期比“连续 n 次 epoch 没下降就停”更实用。3.3 解决一个分类问题从线性回归到 SVM 的选型路线面试官常给一个场景“一万样本图像分类类不平衡怎么选模型”。合理的回答顺序是先基线模型比如逻辑回归或浅层 MLP判断线性是否可分如果线性可分SVM 也够用如果数据复杂用 CNN 加迁移学习。这里用下表说明适用场景算法数据量特征维度适用场景线性回归小低数值预测线性关系逻辑回归中小中二分类基线决策树/随机森林中中高表格数据、特征离散SVMRBF 核中小中小样本高维边界明确CNN大高图像图像、视频选型的核心是“先验证线性再引入非线性”。面试官问 SVM 核函数时要说出 RBF 核表达式K(x,z)exp(-gamma * ||x-z||^2)gamma 越大核函数越“尖锐”越容易过拟合。C 控制误分类惩罚C 越大越不容错。同时别忘 SVM 只输出决策值不直接输出概率需要 Platt 缩放。3.4 训练中遇到损失不下降、类别不均衡怎么办损失不下降先排查学习率设置过高导致震荡过低导致缓慢数据集标签是否正确模型是否有数值不稳定如 NaN。一个操作经验是先用少量样本比如 64 个过拟合如果 loss 能降到接近 0说明模型和管线没问题再逐步加数据如果小样本也降不下去基本是 bug 在数据 loader 或代码逻辑。类别不均衡常用 Focal Loss、过采样/欠采样。Focal Loss 的公式FL(p_t)-(1-p_t)^gamma * log(p_t)gamma 通常取 2能降低易分样本的权重让模型关注难样本。面试时还能补充一句“alpha 参数用于调整正负样本的权重常和 gamma 一起用”。4. 图像处理与编程语言数据结构的面试硬功夫4.1 图像处理操作滤波、边缘检测与形态学的现场推导图像处理是 CV 基础面试常让口头描述或手写伪代码。高斯滤波是怎么做的用高斯核做卷积核大小和 sigma 关系sigma 越大图像越平滑细节丢失越多。3x3 高斯核常见值是1 2 1 2 4 2 1 2 1需要归一化实际就是各元素除以 16。然后 Canny 边缘检测五个步骤高斯模糊、计算梯度幅值和方向Sobel 算子、非极大值抑制、双阈值检测、滞后连接。问“为什么 Canny 要做非极大值抑制”回答是梯度方向上的相邻像素可能都给出高响应但只有局部极大值才是边缘否则边缘粗了。直接用 OpenCV 来实现一次import cv2 img cv2.imread(cell.jpg, cv2.IMREAD_GRAYSCALE) blur cv2.GaussianBlur(img, (5, 5), 1.2) # 核5x5sigma1.2 edges cv2.Canny(blur, threshold150, threshold2150) # 双阈值参数说明(5, 5)是高斯核尺寸必须是正奇数1.2是高斯核在 x 和 y 方向的标准差决定平滑程度。Canny 的threshold1是低阈值threshold2是高阈值响应高于高阈值判定为强边缘低于低阈值直接丢弃中间的要和强边缘连接起才算。现场答“低阈值高阈值一般按 1:2 到 1:3 设置比如 50/150”能体现工程经验。另外处理前如果图像噪声大可以先用中值滤波去掉椒盐噪声但中值滤波对高斯噪声效果不如高斯滤波。形态学操作膨胀、腐蚀、开运算、闭运算。膨胀取邻域最大值腐蚀取最小值开运算是先腐蚀后膨胀用来消除小白点闭运算是先膨胀后腐蚀用来填充小洞。提问“边缘检测前为什么要先降噪”答案直接梯度算子对噪声敏感噪声产生虚假边缘。4.2 编程语言Python 与 C 的机制考点Python 面试高频问题是“可变对象和不可变对象”“默认参数陷阱”“GIL 影响”。可变对象有 list/dict/set不可变对象有 int/str/tuple。函数默认参数如果是可变对象多次调用会累积状态正确做法是默认用 None 再判断赋值。GIL 使多线程无法并行执行 CPU 密集任务多线程适合 I/O 密集多进程适合计算密集。C 问题常考“智能指针”“深拷贝浅拷贝”“虚函数”。shared_ptr 循环引用会导致内存泄漏因此需要 weak_ptr。CV 算法岗的 C 题常是“写一个带引用计数的智能指针”或者解释“为什么移动语义能提升性能”。如果面试用 Python也会考察生成器的 yield、装饰器如何在不改原函数的情况下计时。回答时最好结合一个例子用functools.wraps保证被装饰函数的__name__不被覆盖这种细节会给人留下“真的写过”的印象。4.3 数据结构链表反转和二叉树遍历的边界条件算法手撕环节链表题是标配。链表反转要小心空链表和单节点迭代实现如下def reverse_list(head): prev None cur head while cur is not None: nxt cur.next # 先保存后继否则断链 cur.next prev # 反向 prev cur # 移动prev cur nxt # 移动cur return prev # prev最终指向原链表尾逻辑说明每一步把当前节点指向它前面的节点需要三个指针prev、cur、nxt。第 3 行先保存cur.next因为在改cur.next之后原 next 就丢失了。最后返回 prev 而不是 cur因为 while 结束时 cur 为 Noneprev 是新链表头。面试官再问“如何看出空间复杂度 O(1)”因为只用了有限几个指针。二叉树遍历中递归写法简单但迭代写法才考基本功。前序遍历迭代需要栈后序稍微复杂一点可以用“前序遍历反转左右顺序”再整体反转来取巧但要主动说出这个 trick。还有一个高频题是“二叉树最近公共祖先”解法是递归分治注意其中一个节点就是根节点的情况。数据结构的选择题也常出哈希表查找 O(1) 是平均复杂度最坏可能 O(n)红黑树是近似平衡二叉搜索树插入删除旋转次数有限Java 的 TreeMap 用它。准备这些时要把每个结论的“前提条件”和“最坏情况”挂上号面试官就爱挑这两种场景深挖。5. 一套可复现的 CV 面试自测清单从理论到白板代码5.1 用半小时检验知识闭环准备一个自己的“简历项目深挖表”对每个项目按五层输出数据从哪来、标注怎么做、模型怎么选、loss 怎么调、上线遇到什么问题。每个层再往深问两个“为什么”。例如提到用 ResNet50 做分类要能回答“为什么不用 ResNet18”和“显存不够怎么办用 ResNet18 或减小 batch”。5.2 白板代码按三类准备第一类数据结构手写——链表反转、两数之和、二叉树层序遍历、快速排序。第二类模型调用——用 PyTorch 写一个最小训练循环下面这段值得背import torch import torch.nn as nn model nn.Linear(10, 2) optimizer torch.optim.SGD(model.parameters(), lr0.01) loss_fn nn.CrossEntropyLoss() for x, y in dataloader: optimizer.zero_grad() pred model(x) loss loss_fn(pred, y) loss.backward() optimizer.step()这段代码里optimizer.zero_grad()必须在 backward 之前否则梯度会累加lr0.01对 SGD 要按任务调太大不收敛太小进度慢。能答出“为什么每次迭代要清零梯度”是因为 PyTorch 默认梯度累加不清零会导致 batch 间梯度混合。第三类图像处理——用 OpenCV 写出灰度化、高斯滤波、Sobel 边缘检测的调用链。把这三类各练两遍大部分白板环节可以通过。5.3 高频 MVP 题自测清单NMS 的 Python 实现输入 boxes、scores、IoU 阈值输出过滤后的索引。手写交叉熵-sum(y_true * log(y_pred 1e-8))加极小值防止 log0。说出 ResNet50 从输入到输出的 shape 变化输入 3x224x224经过 conv1 得到 64x112x112layer1 之后 256x56x56最终全局平均池化后 2048 维全连接层输出 1000 类。拓扑排序的应用场景依赖关系的解析比如深度学习网络层的执行顺序。最后一个建议面试时如果被问住主动说“这个方向我正好补过我的理解是……”展示思路比沉默重要。把这套自测跑完一次记得把每道题的边界条件、参数设置和当初的卡壳点记进自己的错题本面试前翻一遍比新刷十道题管用。本文还有配套的精品资源点击获取