十年匠心定制 · 商业建站与技术教学双线并行 咨询热线:400-886-1026 service@lmnt.cn
ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

计算机视觉算法岗笔试全解析:从数学基础到CV考点与备考策略

计算机视觉算法岗笔试全解析:从数学基础到CV考点与备考策略 2018年参加网易校招时计算机视觉算法工程师的笔试卷拿到手第一感觉是范围真的广但笔试的割裂感也很明显。后面带过几届新人、自己也参与过出题才逐渐看明白这类校招笔试卷并不追求你“背住了多少模型”而是要确认你有没有扎实的数学底子、能不能把算法落到代码、拿到一个图像场景问题是否知道如何拆解。这篇内容我会把当年这张卷子代表的考点框架、出题逻辑、容易失分的细节以及我后来复习和带人准备时反复强调的备考策略完整拆一遍。想冲刺大厂CV算法岗、或者正在刷算法岗笔试的朋友这篇文章可以直接作为一份复习地图来用。需要说明的是文中不会复刻原卷原题而是基于这类岗位笔试的常见考察方向做系统整理但覆盖的知识点和题型结构和真实笔试基本是同一套逻辑。1. 从一份笔试卷倒推CV算法岗笔试到底在筛什么人1.1 试卷模块构成与时间分配网易这类互联网公司的校招算法笔试通常安排在90到120分钟线上作答。计算机视觉算法工程师的卷子虽然年年有调整但模块基本能分成四大块选择题/填空题、简答题、编程题、综合题。我的直观经验是选择题覆盖数学基础、机器学习基础、深度学习基础一般占30到40分简答题会围绕某个模型原理或某个CV场景展开占20分左右。编程题占30分左右最常出的是动态规划、字符串匹配、排序、图论、数据结构操作基本不直接考图像而是考通用的算法功底。最后还有一道综合设计题通常是给一个偏工业或偏业务的实际场景让你设计解决方案占10到20分。这个分布放在今天依然有代表性很多公司校招笔试沿用类似结构。1.2 笔试真正想考察的三件事我经历过笔试、面试、也参与过出题之后才理解一次笔试不是要筛选“背过标准答案的人”而是要在最短时间内完成三层筛选。第一层是数学功底。概率统计、线性代数、矩阵运算到没到“能实际使用”的程度。图像处理和机器学习本质上都是数学问题一个不会推贝叶斯公式、不理解矩阵特征值的人后面做模型优化和论文复现会很吃力。第二层是算法功底。能不能把思路变成可运行的代码边界条件是否考虑完整复杂度分析是否准确。编程题就是用来刷掉那些只会调库、不会写底层逻辑的人。第三层是工程直觉。综合题考察的是拿到模糊业务需求时能不能快速拆成“预处理、特征提取、模型设计、评估迭代”的流水线。所以复习笔试的时候只刷代码题是不够的只背模型面试题也不够。笔试筛的是一个完整的能力闭环。1.3 为什么2018年的框架到现在还有参考价值很多人会问深度学习变化这么快2018年的卷子岂不是早就过时了我的回答是工具和模型名会过时但考点框架不会。CNN的卷积计算、反向传播、图像预处理算子、经典机器学习模型、基础数据结构算法这些在今天依然是一切视觉模型的地基。即便现在Transformer、自监督学习、对比学习成了主流面试官依然会先确认你是否理解卷积的局部连接和权值共享是否知道Sobel算子的两个方向卷积核。新模型只是新技术栈笔试永远考的是底层原理。看旧试卷的重点不是背当年的题目而是抓住它搭建的考察骨架再往里补充新东西。2. 数学与机器学习基础题这些“保分题”怎么做到不丢分2.1 概率统计与线性代数的高频出题点这类笔试的选择题里数学部分出镜率最高的几个知识点我按出现频率排序说一下。第一个是贝叶斯公式。考察方式通常不是直接写出公式而是给一个医学检测、垃圾邮件识别或者分类器混淆矩阵场景让你求后验概率。我见过最经典的变形是某分类器在正样本上的召回率是0.9误报率是0.05正样本先验概率是0.01问一个样本被预测为正类时它真的是正类的概率。这种题容易栽在“误报率”和“假正率”的概念混淆上计算本身只需要套公式P(A|B) P(B|A) * P(A) / P(B)第二个是期望与方差的运算性质。尤其是E(aXbY)和Var(aXbY)的计算很多CV算法题最后都归结为对随机变量的统计。第三个是矩阵的特征值与特征向量。主成分分析、协方差矩阵、图像压缩、谱聚类都建立在特征分解上笔试题会直接要求计算简单矩阵的特征值或者问“PCA为什么要对协方差矩阵做特征分解”。线性代数这部分我建议至少要把高斯消元、矩阵乘法、特征值定义、正定矩阵的意义过一遍不需要会证明但要会算、知道几何意义。2.2 经典机器学习算法考点速查机器学习算法部分笔试很少考得很深但覆盖面极广。逻辑回归、支持向量机、决策树、KNN、K-means、朴素贝叶斯、XGBoost这些最常见。我整理了一个自己复习时用的考点对照表基本可以覆盖这类笔试的选择题和简答题。算法高频考点常见失分点逻辑回归损失函数形式、为什么用交叉熵、决策边界把sigmoid输出直接当概率SVM支持向量、间隔最大化、核函数作用搞混软间隔和硬间隔决策树信息增益、基尼系数、剪枝算不出具体信息增益值KNN距离度量、K值影响、维数灾难忽略特征归一化K-means算法步骤、K值选择、收敛条件对离群点敏感结果不稳定XGBoost正则项、GBDT区别、特征重要性说不清泰勒展开的作用复习策略上不要只是背概念要能做“一句话解释”逻辑回归是在线性加权后套sigmoid再做极大似然估计SVM是找一个最大间隔超平面核函数把低维线性不可分映射到高维线性可分K-means是迭代“分配-更新”两个步骤直到中心不再变化。笔试选择题的干扰项经常就藏在细节里比如“K-means一定能收敛到全局最优”就是典型错误选项。2.3 KL散度与生成模型概念的查漏补缺KL散度在2018年的卷子里已经偶有出现这几年越来越常见因为它牵扯到VAE、扩散模型这些热门方向。笔试通常不会让你推导完整ELBO但会考察基本定义D_KL(P||Q) Σ P(i) * log(P(i)/Q(i))这个值用来衡量两个分布的差异数值越小表示两个分布越接近。注意它不是对称的也就是说D_KL(P||Q)不等于D_KL(Q||P)这是选择题最爱挖的坑。ELBO这个概念如果卷子里考到核心要知道变分推断的目标是最小化KL散度而ELBO是证据下界最大化ELBO等价于让近似后验接近真实后验。我建议这一块不要深陷公式推导理解到“KL散度衡量分布差异、ELBO是最大化下界”就足够应对笔试真正深挖留给面试环节。3. 深度学习与计算机视觉核心考点从卷积手算到检测算法演进3.1 CNN基础与一次完整的手算卷积深度学习基础题里卷积的计算是最稳的拿分点也是最容易丢分的地方。丢分不是因为不会而是因为边界条件算错。出一道经典手算题输入是4x4的矩阵1 2 0 1 0 1 2 0 1 0 1 2 2 1 0 1卷积核是3x31 0 1 0 1 0 1 0 1stride1padding0求输出的feature map。计算思路是输出尺寸公式为 (H - K 2P) / stride 1这里H4K3P0stride1所以输出是2x2。第一个输出值取输入左上角3x3区域与卷积核逐元素相乘后求和左上角3x3区域 1 2 0 0 1 2 1 0 1与卷积核逐元素相乘 11 20 01 00 11 20 11 00 1*1 100010101 4第二个输出值窗口右移1位区域变成 2 0 1 1 2 0 0 1 2计算得21 00 11 10 21 00 01 10 2*1 201020002 7这类题做完一定要检查padding和stride是否代入正确很多试卷会在题目里写“same padding”或“valid padding”两者输出的feature map尺寸完全不同。另外我习惯最后再做一次“尺寸反推”如果输出的空间尺寸算出来不对说明公式代入有误回头重找。3.2 图像处理算子Sobel、拉普拉斯与边缘检测CV岗笔试卷里图像处理算子出现频率非常高因为这是区分“只会深度学习”和“真懂视觉基础”的分水岭。Sobel算子和拉普拉斯算子是我认为最值得吃透的两个。Sobel算子分横向Gx和纵向Gy两组卷积核Gx [-1 0 1] [-2 0 2] [-1 0 1] Gy [-1 -2 -1] [ 0 0 0] [ 1 2 1]Gx对垂直方向的边缘响应更强因为它检测的是水平方向从左到右的亮度变化Gy对水平方向边缘响应更强。梯度幅值G sqrt(Gx² Gy²)梯度方向θ atan2(Gy, Gx)。笔试简答题经常问“Sobel算子和拉普拉斯算子的区别”得分点就是Sobel是一阶微分、对噪声有一定平滑作用、能给出边缘方向拉普拉斯是二阶微分、对噪声敏感、只能给出边缘位置不能给出方向。拉普拉斯算子常用卷积核[ 0 1 0] [ 1 -4 1] [ 0 1 0]锐化的做法是g f - c * ∇²f。如果题目问“为什么拉普拉斯算子能锐化图像”我的理解角度是二阶微分在边缘处会产生零交叉把原始图像减去拉普拉斯结果相当于在灰度变化剧烈的地方增大对比度视觉上看边缘更清晰。这类推导题只要能把公式写出来并对每个符号给出解释基本能拿大部分分。3.3 图像分类与目标检测的演进脉络分类和检测是CV笔试的“大拿题”考法通常是选择题列举模型让你选哪个属于哪一类或者简答题让比较两个检测框架的异同。分类方向至少要把AlexNet、VGG、ResNet的动机和贡献说清楚。ResNet的残差连接解决的是什么问题是退化问题就是网络加深到一定程度后训练集上的准确率反而下降而不是过拟合。残差块学习的是F(x) H(x) - x让网络在恒等映射附近做微调梯度能更顺畅地回传。如果卷子里出现EVA-02这种较新的分类模型通常是在问Transformer结构在视觉领域的适配核心概念是patch embedding、全局自注意力、CLS token把它理解为“图像版BERT做分类”就能对上大部分考点。检测方向Faster R-CNN的两个阶段结构是重点RPN生成候选框Fast R-CNN做分类和回归。YOLO系列代表的是单阶段思路把检测当作回归问题直接预测边界框和类别概率速度更快。简答题如果问“两阶段和单阶段检测器各有什么优缺点”得分点要落在精度与速度的权衡上两阶段精度更高、但速度慢单阶段速度快、但小目标和重叠目标容易出现漏检。工业异常检测这类具体应用校招笔试卷直接考的少但综合题可能给一个“凸点检测”“表面缺陷分类”场景。遇到这种题脑子里要有一条主线先做图像预处理灰度化、去噪、增强再做特征提取Sobel边缘、纹理特征、局部二值模式最后设计分类器或检测模型。这条流水线思维笔试面试都是高分框架。4. 编程与数据结构题KMP、排序和最短路背后考查的思维4.1 模式串pabacaba的next数组究竟有多少种答案KMP算法是校招笔试的常客因为它在O(nm)时间内解决字符串匹配问题考察点非常集中next数组的计算。热搜词里正好提到“模式串pabacabanext[i]定义为”我就用这个例子把两种最常见的定义一次讲透这是很多人在这一步失分的原因。先说明不同教材对next数组的定义有区别。第一种定义next[i]表示“前i-1个字符构成的前缀中最长相同真前后缀的长度”同时约定next[0] -1。这是国内数据结构教材的常见版本。按这个定义p abacaba的next数组为next[0] -1 next[1] 0 next[2] 0 next[3] 0 next[4] 1 next[5] 0 next[6] 1 next[7] 2拆开来看next[4]取的是前3个字符aba最长相同真前后缀是a长度1next[7]取的是前6个字符abacab最长相同真前后缀是ab长度2。注意是“真前后缀”也就是不能取整个字符串本身。第二种定义next[i]表示下标i处失配时模式串指针应该跳转到的位置。这个版本实现KMP时更常用。两种定义下的数组值可能不同所以刷题或笔试时先看清题目给的next定义再开始计算否则答案必然对不上。我自己的经验是做题时用一个小技巧快速验证把算出来的next数组代入“失配-跳转”过程看能否正确匹配目标串能跑通就说明算对了。KMP的匹配代码模板我复习时用的是这一版vectorint buildNext(const string p) { int n p.size(); vectorint next(n 1); next[0] -1; int j -1; for (int i 0; i n; ) { if (j -1 || p[i] p[j]) { i; j; next[i] j; } else { j next[j]; } } return next; } int kmpSearch(const string s, const string p) { int i 0, j 0; int slen s.size(), plen p.size(); vectorint next buildNext(p); while (i slen j plen) { if (j -1 || s[i] p[j]) { i; j; } else { j next[j]; } } return j plen ? i - j : -1; }笔试如果现场要求手写KMP我会建议先写匹配主流程再补buildNext函数因为buildNext的递归跳转逻辑更容易写错放在后面有时间仔细检查。4.2 排序算法笔试为什么反复在这个“老话题”上做文章很多备考的人觉得排序题太基础不值得花时间实际情况恰恰相反。排序算法是数据结构笔试的“必考题”因为它最适合考察三件基本功代码实现的边界控制、时间空间复杂度分析、算法稳定性的概念。我把最常考的几种排序整理成表格复习时对照记忆算法平均时间复杂度最坏时间复杂度空间复杂度稳定性冒泡排序O(n²)O(n²)O(1)稳定快速排序O(n log n)O(n²)O(log n)不稳定归并排序O(n log n)O(n log n)O(n)稳定堆排序O(n log n)O(n log n)O(1)不稳定插入排序O(n²)O(n²)O(1)稳定希尔排序取决于增量O(n²)O(1)不稳定笔试选择题常考两个点。第一点是“快排最坏情况什么时候出现”答案是每次划分都选到最小或最大元素作为基准时比如对已有序数组做快排且固定选第一个元素作为基准。解决办法是随机选基准或三数取中。第二点是“归并排序为什么稳定而快排不稳定”因为归并在合并两个有序子序列时遇到相等元素时优先取左边序列的元素稳定性可以保持快排的分区过程中等于基准的元素可能被交换到不同的位置稳定性被破坏。手写快速排序时我反复踩过的坑是递归边界写错。一个正确而简洁的写法def quick_sort(arr, left, right): if left right: return pivot arr[left] i, j left, right while i j: while i j and arr[j] pivot: j - 1 arr[i] arr[j] while i j and arr[i] pivot: i 1 arr[j] arr[i] arr[i] pivot quick_sort(arr, left, i - 1) quick_sort(arr, i 1, right)这段代码的关键是先从右往左找比pivot小的元素再从左往右找比pivot大的元素。如果顺序反过来最后pivot归位的逻辑就会出问题。4.3 图论与经典思维题Dijkstra、贪心、快速幂、二分图编程题里的图论题目Dijkstra算法绝对是最常出现的。考察模式通常是给一个带权无向图求单源最短路径。笔试需要熟练写堆优化版本不然数据范围一大就会超时。堆优化Dijkstra的核心思路是维护一个优先队列每次取出当前距离最小的节点然后松弛它的邻边。复杂度从O(V²)优化到O((VE) log V)。一个容易丢分的点不能处理负权边。如果题目出现负权边要想到用Bellman-Ford或SPFA并说明原因——Dijkstra的贪心策略基于“已确定最短路的节点不会再变短”负权边会破坏这个前提。贪心算法在笔试中出现的频率也很高常见场景有任务调度、区间覆盖、跳跃游戏。最关键的考点不是“会写贪心”而是“能证明为什么贪心是对的”或者“能判断这道题不能用贪心”。我见过很多考生在“跳跃游戏II”里贪心写得很好但遇到“零钱兑换”时也直接贪心结果没考虑面额不整除的情况导致结果错误。所以笔试时看到贪心题先多想一步局部最优的叠加一定能得到全局最优吗快速幂是另一个高频基础考点既有纯数学题也会藏在组合数学题里。核心是二分幂把指数b按二进制拆解long long fastPow(long long a, long long b, long long mod) { long long res 1; while (b 0) { if (b 1) res res * a % mod; a a * a % mod; b 1; } return res; }如果笔试卷子难度偏高还会出现二分图最大匹配用匈牙利算法或HK算法。这块通常出现在筛选难度更高的笔试里但不至于到竞赛难度。核心要理解“交替路”和“增广路”的概念从一个未匹配点出发交替经过非匹配边和匹配边如果能走到另一个未匹配点就说明找到了一条增广路取反后匹配数加一这就是匈牙利算法的全部逻辑。5. 一道综合题的全流程拆解从建模到编码的拿分细节5.1 综合题长什么样一道带有工业味道的题目综合题是整套试卷里最能体现岗位差异的部分。计算机视觉岗位的综合题通常不会直接问“请设计一个目标检测模型”而是给你一个略显模糊的业务场景要求你给出完整方案。我基于这类笔试的常见考法模拟一道典型题目某工业质检场景需要在传送带上检测金属零件表面的划痕和凹坑图像由工业相机拍摄分辨率为1024x1024背景单一、光照相对稳定但零件可能旋转。要求设计一条完整的视觉检测流水线并写出核心步骤的关键实现思路。这道题最大的考点不是模型选得多新而是你能否在有限篇幅里展示完整思考链条图像采集、预处理、目标定位、缺陷检测、分类与决策、工程优化。5.2 我推荐的答题框架与评分点拆解遇到这种综合题我的答题顺序是固定的哪怕时间紧张也要按这个框架写因为阅卷基本按步骤给分。第一步明确目标把“检测划痕和凹坑”转化为一个分类/分割问题。我写的时候会直接定义输入为灰度图I(x,y)输出为缺陷类别和位置同时标注“零件可能存在旋转因此需要先定位零件区域再做后续处理”。第二步图像预处理先灰度化用高斯滤波或中值滤波去除传感器噪声。此时要写清楚为什么划痕是细小结构选择中值滤波比高斯滤波更能保留边缘细节这一步是区分“背过答案”和“有真实处理经验”的关键。第三步零件定位由于背景单一可以用阈值分割或边缘检测找零件轮廓再用最小外接矩形获取感兴趣区域。这一步的目的是消除传送带背景和光照不均匀的影响同时把后续处理范围缩小降低计算量。第四步缺陷检测这里的得分点是分情况讨论。划痕是线性结构可以用Sobel算子或Canny边缘检测提取边缘再用霍夫变换或者形态学闭运算连接断裂的边缘凹坑是区域性结构可以用拉普拉斯算子或局部均值差分来定位灰度突变区域。我在写的时候会刻意强调先分析缺陷的形状特征再选择算子不能直接套深度学习。第五步如果允许用深度模型再补充一个方案在标注数据充足时可以用分割网络做像素级缺陷分割或者用分类网络对候选区域做二次确认。笔试能写出“传统图像处理保底 深度学习提精度”的两层方案基本就是高分答案。综合题最大的坑是只给方案不给理由。阅卷人想看的是“为什么选这个算子”“为什么不选另一种方法”而不是概念堆砌。5.3 综合题里容易被忽略的工程细节除了算法设计综合题还很喜欢在工程细节上设置得分点。第一个细节是边界处理。用Sobel或拉普拉斯算子卷积时图像边缘像素无法完整覆盖卷积核常见做法有补零、镜像填充、截断。我在答题时会明确写“卷积前对图像边缘做镜像填充避免边界处的梯度响应异常”。第二个细节是实时性。工业检测通常对帧率有要求。如果题目里出现“在线”“实时”等字眼需要提到可以用ROI裁剪、图像金字塔、算子加速即使是分析题把加速思路写出来也是加分项。这个细节很多人漏掉但恰恰是工业场景和学术场景最大的区别。第三个细节是缺陷标注和评估指标。题目如果问“如何评估方案效果”不能只答准确率。工业检测类任务普遍存在正负样本不均衡准确率没有参考价值应该用精确率、召回率、F1-score同时结合业务端关注漏检率还是误检率。如果允许进一步扩展就强调“先保证召回率再逐步提升精确率”因为工业缺陷漏检的代价远高于误检。6. 60天备考路线真题之外需要补齐的多块能力6.1 编程刷题的优先级怎么排如果你还有两个月左右准备时间编程刷题不能贪多求全要按笔试概率从高到低排优先级。我建议的顺序是字符串类KMP、回文串、滑动窗口、数组类双指针、前缀和、排序与二分、链表类反转、合并、二叉树遍历、层次、公共祖先、动态规划背包、子序列、区间DP、图论Dijkstra、并查集、拓扑排序、计算几何入门。整体可以做3遍。第一遍按专题过LeetCode高频题目标是把每类题型的模板代码写熟。第二遍做牛客网的历年笔试真题重点是训练限时状态下的做题速度。第三遍集中做错题和难题同时开始配合机器学习、深度学习基础题一起刷。我自己带人的经验是每天保持2到3道代码题数量不是关键关键在于每道题做完后能写清楚“这题考的是什么数据结构、什么算法思想、时间复杂度是多少”。6.2 深度学习部分建议动笔推导不要只看博客笔试中的深度学习题目很多是纸面推导题不是选择题。我的建议是准备一个笔记本手写推导几个核心公式卷积的前向传播和反向传播、全连接层的梯度推导、softmax交叉熵的梯度、BN层的训练和推理区别、SGD和Adam的更新公式。不要小看这些推导很多人在笔试时“觉得见过”但写不完整。我印象很深的是曾经在准备阶段忽略了softmax的雅可比矩阵推导结果笔试遇到“推导softmax交叉熵对logits的梯度”当场只能写出结论写不出过程丢了好几分。实际上过程很短求导时注意Softmax的分子分母都包含第i项分类讨论i和j是否相等即可结论就是“预测值减真实one-hot”。这个推导熟练了相关的变体题都能很快做出来。6.3 准备一个“面试式”项目复盘笔试面试无缝衔接笔试通过后马上就是面试这段时间不要割裂开。我建议在备考笔试时同步整理一个深度学习或计算机视觉方向的完整项目把技术栈、数据集、模型结构、评估指标、踩过的坑一条条写清楚。项目不在多一个足够关键是能经得起追问。标准的复盘思路是项目要解决什么问题、为什么选这个方案而不选其他方案、数据处理怎么做、模型怎么训练、效果如何评估、哪里还能优化。很多笔试综合题最后会延伸成面试题如果你提前把一个项目想透了遇到“遇到数据不平衡怎么办”“模型过拟合怎么处理”这类问题基本可以从项目中找到具体案例来回答而不是背空话。6.4 备考时间安排的节奏参考按60天规划我一般建议分成四个阶段前两周补数学和机器学习基础中两周集中刷数据结构和算法题后四周主攻深度学习和CV考点同时每周末做一次完整模拟卷。模拟卷很重要因为笔试不止考你会不会还考你在90分钟内能不能做完。我第一套模拟就暴露了时间分配问题在选择题上抠太久导致后面的编程题和综合题没时间写。后来养成的习惯是选择题每道不超过2分钟判断题不确定就靠第一直觉编程题留足40分钟综合题留20分钟。这个时间分配不一定适合所有人但至少说明一次完整模拟能帮你在真实考试前就找到自己的节奏。备考资料方面数据结构刷LeetCode机器学习理论可以参考经典教材的必读章节深度学习看框架文档结合源码CV算子类考点多跑几个图像处理的库函数亲手调参看效果比干记公式有用。我在准备阶段经常用一张噪声测试图轮流跑高斯滤波、中值滤波、Sobel、拉普拉斯观察不同参数下输出效果用到应试时反而更容易理解题目意图。最后再说一个我自己的体会。刷笔试卷最忌讳的是把注意力放在“压中原题”上真正有效的备考是建立体系每周固定时间过一遍本周学过的公式推导错题本上记录的是错误原因而不是题目本身编程题做完后不看题解、先自己讲一遍思路。计算机视觉算法岗位的笔试说到底考的是你在有限时间内把数学、算法、模型、工程串起来的能力。把框架搭好细节才会慢慢填满。
返回列表