
每年秋招的笔试环节都是筛人最狠的一道关。尤其是计算机视觉算法岗投递人数多、岗位要求杂笔试题目往往横跨数学、图像处理、深度学习、数据结构与算法多个领域跟面试完全是两种考察逻辑。我参加了网易2020校招计算机视觉算法工程师正式批的笔试考完之后花了整整一个周末复盘把能回忆起来的题目方向、踩坑点和备考思路做了系统整理。这篇内容不涉及具体题目的所谓“标准答案”而是把这场笔试真正在考什么、哪些知识是核心得分点、哪些地方容易白丢分完完整整梳理出来给后续准备大厂CV算法岗校招的同学做一个参考。整体来说网易这套笔试题的核心是扎实的计算机视觉基础加够用的算法思维不需要你掌握多前沿的模型但基础概念必须吃透代码题得能在有限时间内写出能跑通的解法。下面我按考卷的实际结构展开讲。1. 笔试全景一张卷子背后的岗位能力要求1.1 题量与时间一道需要节奏感的“综合卷”网易2020校招正式批的笔试是在牛客网系统上完成的我记得整场考试时长大约120分钟题量大致是单选多选题、问答题和两道左右编程题的结构。不同批次的题目组合略有差异但总体考察面非常固定计算机视觉基础、机器学习与深度学习理论、常用算法与数据结构、简单编程实现。这套题最需要注意的不是题难而是知识点跨度大。如果你平时只刷目标检测和图像分类的论文不复习传统的图像处理内容和机器学习基础很容易在前面选择填空环节反复犹豫把编程题的时间挤掉。相反如果只看西瓜书和PRML对图像算法不熟视觉题又会变成盲区。平衡是关键。1.2 考点覆盖范围从像素操作到模型评估根据我的回忆和与同期同学的交流笔试考点大致可以分成四块考察方向具体知识点题目形式图像处理基础图像锐化、Sobel算子、拉普拉斯算子、直方图均衡化单选题、多选题特征与几何SIFT原理、边缘检测、相机标定、对极几何单选、简答题机器学习与深度学习损失函数、反向传播、BatchNorm、经典网络结构、KNN、聚类单选、多选、简答算法与编程KMP、快速幂、排序、动态规划、DFS/BFS、数组操作编程题这其实已经点出了大厂CV岗位笔试的核心逻辑算法岗不等于“只会调包调参”笔试阶段就是要验证你有没有完整的计算机视觉知识体系以及能不能用代码解决实际问题。提示如果你投递的是算法工程师里的CV方向不要只复习深度学习传统图像处理在笔试中的占比稳定在30%左右这部分反而是比较容易拿分的题。1.3 为什么笔试和面试考察侧重点完全不同很多同学反馈笔试考得“偏”或“老”我觉得这是预期偏差。面试会深挖你做过的项目、讲模型改进的动机考察解决开放问题的能力而笔试的本质是“宽口径筛选”它需要在不面对面交流的情况下判断你是否有基本的知识储备。因此经典的、有定论的知识点如SIFT的步骤、Sobel算子的计算、KMP的next数组就成了最有效的标准化考题。备考笔试时不需要追逐最新论文把基础补扎实才是最优解。2. 计算机视觉基础题传统图像处理依然是拿分主力2.1 图像锐化的拉普拉斯算子一个高频考点图像锐化是图像增强的经典内容网易这套题里拉普拉斯算子相关概念的出镜率很高。简单来说拉普拉斯算子是二阶微分算子对图像中的灰度突变区域响应强烈在平坦区域响应趋近于零。将拉普拉斯响应叠加到原图上就能增强边缘对比度让图像看起来更“清晰”。常见的四邻域拉普拉斯卷积核是这样0 1 0 1 -4 1 0 1 0八邻域的版本会加上对角线1 1 1 1 -8 1 1 1 1笔试中经常考察的点是使用该卷积核对图像卷积后得到的是二阶导响应不是锐化后的最终图最终输出要按以下方式计算g(x, y) f(x, y) - c * ∇²f(x, y)其中系数c的正负取决于拉普拉斯核中心是正还是负。很多人在这里记反符号导致选错答案。我当时在复盘时特意记住一条规律核中心为负时是相减核中心为正时是相加本质上是让边缘处灰度变化的方向被放大。2.2 Sobel算子与图像梯度方向Sobel算子也是图像处理高频题它结合了高斯平滑和微分属于一阶微分算子。水平方向和垂直方向两个卷积核如下Gx: -1 0 1 -2 0 2 -1 0 1 Gy: -1 -2 -1 0 0 0 1 2 1笔试题目经常给出一小块灰度矩阵让你手动计算某个像素的Gx和Gy然后求梯度幅值或梯度方向。这里最容易踩的坑是忘记乘以系数1/8有些实现不归一化或者在计算梯度的绝对值时只取一个方向的值。实际上梯度幅值通常是两个方向的近似G |Gx| |Gy|或者精确求欧几里得范数G sqrt(Gx^2 Gy^2)计算量不大但很考验细心程度。复习时一定要把卷积操作的计算过程亲手推几遍避免在考场上临时算错。2.3 直方图均衡化与图像增强直方图均衡化是让图像灰度分布更均匀、从而提升对比度的方法。它的核心是累积分布函数CDF的重映射。笔试中常给出一个小灰度图的直方图要求计算均衡化后的灰度映射表。步骤大致是统计灰度级概率分布p(r_k) n_k / N。计算累积分布函数CDF。用公式 s_k round((L-1) * CDF(r_k)) 得到新灰度值。这个计算不难但需要注意输出灰度的取整规则和L的取值范围8位图像L256。我在笔试模拟时很多次在这里丢分原因是对“累计概率乘以最大灰度级”这一步理解不透后来用一张8x8的小图手动跑通一遍就彻底记住了。2.4 特征点与SIFT简答题的常客SIFT尺度不变特征变换是计算机视觉笔试的“钉子户”。关键考点集中在四个方面尺度空间极值检测用不同尺度的高斯核做卷积构造高斯金字塔再在同一组内做差分得到DoG高斯差分金字塔在DoG空间寻找局部极值点。关键点定位对候选点的三维尺度空间进行二次泰勒展开精确定位坐标并去除低对比度和边缘响应点通过Hessian矩阵主曲率比值。方向分配在关键点邻域统计梯度方向直方图峰值方向作为主方向超过峰值80%的方向作为辅方向。描述子生成将坐标轴旋转到主方向在16x16窗口内计算4x4子区域的8方向梯度直方图形成128维向量最后做归一化和截断处理。笔试不会让你写完整的SIFT代码但很可能问“SIFT为什么具有尺度不变性”或“DoG金字塔与高斯金字塔的关系”。答案的关键在于DoG是相邻尺度高斯图像相减的结果它近似于尺度归一化的高斯拉普拉斯LoG而LoG的极值点在尺度维度上具有稳定的响应。我备考时用一句话概括SIFT的尺度不变性来自“在尺度空间找极值”旋转不变性来自“按主方向归一化”光照不变性来自“梯度归一化和向量截断”。这一句话足够对付大部分简答题。2.5 边缘检测与Canny算子之间的对比Canny边缘检测在笔试中也频繁出现。它比Sobel和拉普拉斯更复杂流程是高斯滤波去噪。用Sobel计算梯度幅值和方向。对梯度幅值做非极大值抑制。用双阈值检测强弱边缘。通过滞后连接抑制孤立弱边缘。笔试经常把Sobel、拉普拉斯、Canny放在一起考对比题。我的记忆方法是Sobel是一阶微分、有方向性拉普拉斯是二阶微分、无方向性、对噪声敏感Canny是“滤波梯度抑制双阈值”的完整流程效果最好但计算量最大。这种对比题属于背下来就能拿分的类型。2.6 相机模型与对极几何容易被忽略的分区相机模型相关的题目不一定每场都有但一旦出现就是拉开差距的点。常考概念包括内参矩阵K包含焦距f_x、f_y和主点坐标c_x、c_y。外参相机在世界坐标系中的旋转R和平移t。对极约束p2^T * F * p1 0其中F是基础矩阵。本质矩阵E与基础矩阵F的关系E K^T * F * K。单应矩阵H在平面场景下两视图间点的映射关系是p2 H * p1。我复习这部分时吃过亏因为平时做深度学习项目很少用到传统几何。后来发现一个比较管用的理解方式单应矩阵解决的是“平面到平面”的映射基础矩阵解决的是“非平面的一般场景”下匹配点之间的约束关系。笔试如果给两个相机位姿求F或E不需要真算出数值理解公式含义和矩阵性质就足够应对了。3. 机器学习与深度学习理论容易被忽视的隐形大头3.1 损失函数与优化算法不只是会选Adam笔试对机器学习的考察通常不深但有广度。常考损失函数包括平方损失L2对异常值敏感误差大时梯度大。绝对值损失L1对异常值更鲁棒但在零点的导数不可导。交叉熵损失分类问题标配配合Softmax使用。合页损失Hinge LossSVM使用的损失鼓励正确类别的分数超过错误类别至少一个间隔。优化算法方面SGD、Momentum、RMSProp、Adam的区别几乎是必考。我建议从“参数更新公式”的层面去记忆而不是只记名字。比如Momentum就是给梯度加了一个历史速度项Adam结合了一阶矩估计和二阶矩估计并做了偏差校正。笔试可能会给出一个简化的参数更新公式让判断是哪种方法或者比较不同方法的收敛特点。提示遇到优化器的比较题优先从“是否自适应学习率”“是否需要手动调学习率”“对稀疏特征的效果”几个角度分析。3.2 反向传播与计算图推导题的核心场景CV笔试中出现反向传播的概率很高。如果题目是纯数学推导通常会给一个简单的两到三层的计算图要求写出某个参数的梯度表达式。这类题只要掌握链式法则就不会丢分。我当时总结了标准做法先画计算图标出每个节点的数值。从损失函数出发沿反向路径逐层求偏导。中间结果先写成“局部梯度”的乘积形式再代入数值。例如一个简单的线性层加Sigmoid再加交叉熵损失的结构对权重W的梯度会等于“上游梯度”乘“输入x”乘“Sigmoid的导数”。只要不跳步基本不会出错。注意batch中多个样本的梯度是累加的平均值有的题会在这里设陷阱。3.3 经典网络结构与BatchNorm原理深度学习基础部分会考察经典网络的发展脉络和核心创新点。常考内容包括ResNet的残差连接缓解深层网络退化问题。BN层的作用对每个mini-batch在通道维度上做归一化减少Internal Covariate Shift。1x1卷积改变通道数实现跨通道信息融合。感受野计算从卷积核大小、步长、填充逐层向前推。特别是BatchNorm笔试容易考“训练和推理阶段有什么区别”。训练阶段使用当前batch的均值和方差并且学习可重构参数gamma和beta推理阶段则使用训练过程中累计的全局均值和方差。很多人会漏掉“推理阶段不更新统计量”这个细节我就在一套模拟题中栽过一次。3.4 传统机器学习KNN、聚类、SVM没有退出考纲即使岗位是CV方向传统机器学习算法仍是笔试的标准考察区。网易笔试常考的包括KNN的“三要素”K值选择、距离度量、分类决策规则。KNN是懒惰学习没有显式训练过程。K-Means聚类初始化簇中心、分配样本、更新中心点、迭代至收敛。考法通常是给几个点手动跑一轮迭代计算新的聚类中心。PCA降维求协方差矩阵的特征值特征向量按特征值大小排序取前k个方向。SVM与核函数线性可分SVM的间隔最大化、软间隔与惩罚参数C、RBF核的作用。有一道多选题我记得很清楚问到哪些机器学习算法对特征尺度敏感。答案包括KNN、K-Means、SVM使用RBF核和PCA而决策树和基于树模型的集成方法随机森林、GBDT对尺度不敏感。这类题考验的是对算法原理的深层理解而不是背公式。3.5 模型评估与过拟合问题模型评估部分的常考点包括Precision与Recall的区别以及F1-score的计算公式。ROC曲线与AUCAUC表示随机取正样本和负样本正样本得分高于负样本的概率。过拟合的判断与解决办法数据增强、正则化、Dropout、Early Stopping、降低模型复杂度。笔试中关于过拟合的题目经常结合CV场景比如“训练集loss下降但验证集loss上升应该怎么做”。这种题的套路答案最多选数据增强和Dropout而不是增大模型规模或增加训练轮数。要特别注意题目是单选还是多选多选时少选通常不给分所以不确定的选项不要选。4. 编程题实战数据结构与算法的手撕现场4.1 字符串类算法KMP不是只考“听说过”网易的编程题恰好有字符串处理相关的题目。热搜词里也出现了KMP算法、next数组的讨论说明这是很多同学复盘时的记忆点。KMP的核心思想是利用模式串的next数组避免主串指针的回退将匹配复杂度降到O(mn)。我当时被问到的next数组题是一个简化版本给定模式串p abacaba要求计算其next数组有的题目里next[i]定义为失配后跳转的位置。这里用最常见的一种定义方式演示一下计算思路next[0]固定为-1或0取决于定义。遍历模式串逐个比较前缀和后缀的最长公共长度。对于abacabap[0] a 前缀空 next[0] -1 p[1] ab 前缀后缀最长公共长度0 next[1] 0 p[2] aba 最长公共前后缀 a 长度1 next[2] 1 p[3] abac 最长公共前后缀长度0 next[3] 0 p[4] abaca 最长公共前后缀 a 长度1 next[4] 1 p[5] abacab 最长公共前后缀 ab 长度2 next[5] 2 p[6] abacaba 最长公共前后缀 aba 长度3 next[6] 3笔试时需要根据题目中next数组的不同定义是“最长公共前后缀长度”还是“失配跳转位置”来调整结果。建议在考前把这两种定义下的next数组写法都练一遍不然特别容易失分。4.2 快速幂与分治思想在数值计算题中的应用网易笔试的编程题出现过多次快速幂相关的计算场景。快速幂的核心是二分思想将计算a^b的时间从O(b)降到O(log b)。基础实现如下def fast_pow(a, b, mod): res 1 base a % mod while b 0: if b 1: res (res * base) % mod base (base * base) % mod b 1 return res笔试里快速幂往往不是单独考而是作为组合数计算、模运算题目的一部分。比如计算组合数C(n, k) mod p需要先计算阶乘和阶乘逆元其中求逆元就要用到费马小定理加快速幂。遇到这类题如果逆元不会求至少要把快速幂本身写对可以拿到部分分数。4.3 排序与查找手撕快排和归并是基本功排序算法在笔试中经常以“代码填空”或“求某次划分后的数组状态”的形式出现。快排的partition过程是重点。有一道经典题是给一个数组用快排的Lomuto分区进行一趟划分要求写出划分后数组的状态。这类题只要确定基准值通常是最后一个元素然后手动模拟替换过程即可。归并排序的重点是合并两个有序数组的写法比较容易和“求逆序对数量”结合。这道题的核心是在merge过程中如果右边数组的元素小于左边数组的元素那么左边剩余的元素都大于它逆序对数累加mid - i 1。笔试中遇到这类题暴力法能过小规模测试但想拿全分必须写归并排序的版本。4.4 动态规划与贪心经典题型不能丢动态规划在笔试编程题中属于必考内容。网易2020批次的笔试中出现了类似“最长上升子序列”的变形题以及背包问题的简化版本。最稳妥的备考方法是把经典DP模型练熟最长上升子序列LISO(n^2)的DP和O(n log n)的贪心二分两种解法都要会。最长公共子序列LCS二维DP表注意状态转移的边界。01背包一维数组优化的写法。打家劫舍类在数组或环形数组上做状态转移。贪心算法考察的往往不是复杂贪心而是“区间调度”和“跳跃游戏”这类经典题。笔试中看到贪心题先写一个朴素案例验证正确性再考虑是否要用排序加扫描的方式实现。4.5 图论与搜索DFS/BFS的实用模板图论题在CV算法岗笔试中出现的频率比想象中高但通常不会考太复杂的最短路或网络流而是用搜索解决的题型。比如岛屿数量二维矩阵中连通的1的个数、网格中的最短路径、拓扑排序。DFS/BFS的模板一定要滚瓜烂熟。我当时在笔试中就遇到一道二维矩阵搜索的题目核心就是BFS或DFS加visited数组。下面给一个BFS的通用框架from collections import deque def bfs(grid, start): m, n len(grid), len(grid[0]) visited [[False] * n for _ in range(m)] q deque([start]) visited[start[0]][start[1]] True directions [(1, 0), (-1, 0), (0, 1), (0, -1)] while q: x, y q.popleft() for dx, dy in directions: nx, ny x dx, y dy if 0 nx m and 0 ny n and not visited[nx][ny] and grid[nx][ny] 1: visited[nx][ny] True q.append((nx, ny))这个模板在笔试中的价值不只是解决一道题而是所有网格类搜索问题的通用底座。把方向数组、边界判断、visited去重这三件事写利索能节省很多调试时间。5. 考场复盘我从这套题里学到的备考方法论5.1 时间分配策略选择题速攻编程题保分整套卷子120分钟我的时间分配建议是单选和多选总计不超过40分钟问答题不超过30分钟剩下至少50分钟留给编程题。选择题遇到拿不准的不要反复纠结先标记出来做完编程题再回头想。我考试时因为在一道SIFT细节题上花了好几分钟导致编程题时间紧张最后一道题只写了暴力解这个教训值得吸取。5.2 高频失分点三类错误最可惜复盘之后我把这套试卷最容易丢分的地方归纳为三类概念混淆型拉普拉斯的符号方向、Sobel核的归一化、KNN和K-Means的区别、SVM的硬间隔与软间隔。这些属于记忆不牢考前三天要专门过一遍。计算粗心型直方图均衡化的累积概率计算、卷积输出尺寸的计算、动态规划的初始化条件。这类没有技巧只能在平时刷题时就把计算步骤写完整养成不跳步的习惯。代码细节型二分查找的边界条件left right还是left right、BFS的visited去重位置、快速幂的模运算时机。这些都是编程题里常见的扣分点跑测试用例时最好覆盖空数组、单元素数组和极端大数三种边界情况。5.3 结合热搜词再聊几句“粒子群算法”和“模拟退火”热搜词里有“粒子群算法原理”和“模拟退火算法”这两个是智能优化算法虽然不完全是CV笔试的主流考点但在部分批次的技术面或笔试附加题中出现过。粒子群算法的核心是每个粒子维护位置和速度根据个体最优pbest和群体最优gbest更新速度v w * v c1 * rand * (pbest - x) c2 * rand * (gbest - x) x x v模拟退火的核心是以一定概率接受较差的解这个概率由温度T控制公式是P exp(-delta_E / T)。如果笔试中遇到这类题大概率是选择题考察“是否容易陷入局部最优”“参数w或T的作用”等概念。我建议作为扩展知识了解不必花太多时间刷复杂的实现题。6. 下一轮备考给即将参加校招同学的具体建议6.1 知识体系查漏先过一遍“经典清单”基于这次笔试的经验我整理了一份备考清单覆盖面完全对标大厂CV算法笔试图像处理滤波、边缘检测、直方图均衡化、形态学操作、图像锐化算子。特征与几何SIFT、HOG、SURF、相机模型、对极几何、光流。机器学习SVM、决策树、随机森林、KNN、K-Means、PCA、逻辑回归、贝叶斯分类器。深度学习CNN原理、经典网络结构AlexNet、VGG、ResNet、Inception、BN层、激活函数、损失函数、优化器。数据结构与算法数组、链表、栈、队列、二叉树、图、哈希表、排序、二分、双指针、滑动窗口、DFS/BFS、DP、贪心、KMP、快速幂。每一条下面至少要能说出“是什么、为什么这样设计、典型应用场景”以及是不是多选题目中容易出混淆选项的点。可以按这个清单做自我提问答不上来的就回到教材或课程里补。6.2 编程手感保持每天两道题的“性价比”选择笔试编程题不追求偏题怪题重点是把高频题练熟。我的建议是每天保持两道题的节奏一道“数据结构题”优先二叉树遍历、链表反转、有效的括号、LRU缓存。一道“算法思想题”优先二维矩阵搜索、最长回文子串、零钱兑换、跳台阶。不要只刷简单题。笔试编程题的难度一般是LeetCode中等偏下但加上考试时间限制临场压力会放大难度。平时做题时要用计时器模拟45分钟两道题的节奏。牛客网的在线编程环境跟实际笔试系统非常接近建议至少提前两周在牛客网上适应一下输入输出格式。6.3 真题模拟建立“题型敏感度”比刷题数更重要刷真题的核心目的不是赌原题而是建立对题型分布的敏感度。我备考时做了三套大厂CV岗位真题模拟每一套都严格计时结束后不看答案先自己复盘把错题按知识点归类。反复出现的知识漏洞会非常明显比如我发现自己对SIFT的尺度空间部分总是记不住细节后来专门花了一天把DoG的构建过程画成流程图才彻底记住。模拟时还应该注意一个细节笔试系统的IDE没有智能补全提示代码照常能写但不要依赖编辑器的自动格式化平时在本地写代码时也尽量少用自动补全保持手写代码的熟练度。6.4 从笔试到面试这轮准备不会白费笔试准备的内容和面试并不脱节。SIFT、边缘检测、BN层、经典网络结构、SVM这些笔试考点在面试环节被追问的概率也很高。我后来在面试中被问过“ResNet为什么能解决退化问题”“BN在训练和测试阶段的区别”这些都是笔试复盘时已经整理过的内容。所以不用把笔试单纯看作“一次考试”把它当作一次系统性的知识梳理收益会延续到后续所有面试环节。我个人最有体感的经验是不要把大量时间花在追逐最新的模型结构上大厂笔试更像是一个基础能力扫描仪考的就是你能不能在一小时内把学过的知识准确调出来并用代码解决一个经过包装的经典问题。把这份清单上的内容稳住编程手感练起来通过笔试的把握会大很多。最后分享一个小技巧考试前一天不要再刷难题了把整理好的知识点清单浏览一遍特别是容易混淆的表格项拉普拉斯与Sobel的区别、BN训练与推理的区别、L1与L2的区别然后早点休息。笔试考的不仅是知识储备还考你在两小时内保持清醒头脑的能力。