秋招季的笔试题库一年比一年卷好未来视觉算法岗这批卷子我做完之后印象很深整体感受是知识广度覆盖到位深度考察集中在目标检测和分割这两个老牌方向手撕代码环节倒是意外地务实。如果你正在准备教育科技类公司的视觉算法岗或者想检验一下自己的基础是否扎实这篇复盘值得花十分钟看完。先说笔试的基本盘全程在线监控作答总时长120分钟题型分为单选20题、多选5题、简答3题、手撕代码2题。单选多选覆盖了机器学习、深度学习、图像处理、相机模型等基础板块简答聚焦在落地场景中的方案设计手撕代码则是LeetCode中等偏下难度配上视觉背景的包装。整体看下来好未来的题目风格偏向“用过就知道”很多细节是刷题刷不出来、必须真跑过实验才答得准的。1. 整体笔试体验与题型概览1.1 好未来视觉算法岗笔试的定位与目标好未来作为教育科技公司视觉算法团队主要做的方向包括拍照搜题、作业批改、课堂行为分析、教学内容结构化等所以笔试题目天然带有“真实场景驱动”的色彩。你会在题目里看到很多和教育场景强相关的图像理解任务比如题目文本识别、手写公式识别、学生动作检测这类背景。和纯互联网大厂相比好未来的笔试更关注你能否用视觉算法解决实际业务问题而不是单纯考察模型结构记得多熟。比如有一道简答题直接问在拍照搜题场景下如果用户上传的照片存在倾斜、模糊、光照不均你的预处理pipeline怎么设计每一步为什么这么做。这种题目没有标准答案但你的回答能直接反映你有没有处理过真实数据。另一个特点是多选题的干扰项设置得很狡猾。不是一眼能看出对错的选项而是那种“看起来对、实际上适用范围有限”的说法。比如问哪些数据增强方式适合目标检测任务有个选项是随机裁剪字面上没错但随机裁剪可能把目标物体裁掉一半导致标注失效实际中要用crop with constraint。这种坑如果你没实际训练过检测模型很容易踩进去。1.2 题型分布与分值结构从分值分配来看客观题单选多选占了大头差不多55分主观题简答手撕占45分。这意味着选择题是保底分必须拿稳而主观题是拉分项决定了你能否进到下一轮面试。具体分布如下表题型题量分值/题总分考察重点单选题202分40分基础概念、公式推导、模型细节多选题53分15分边界情况、适用条件、易混淆知识点简答题3约8分25分方案设计、问题分析、场景落地手撕代码210分20分数据结构、算法实现、代码基本功单选和多项的区分度很微妙。单选里有不少题看似在考记忆比如问ResNet的残差结构解决了什么问题、BatchNorm在训练和推理时的行为差异但选项里藏着细节陷阱。比如BatchNorm那题正确答案是“推理时使用滑动平均得到的全局均值和方差”有人会错选“推理时继续使用batch内的统计量”这就是典型的没有真正部署过模型才会犯的错误。手撕代码部分是两道题一道是纯算法题一道是带视觉背景的编程题。纯算法题考的是数组操作和滑动窗口难度不大但要求你写出高效解法带视觉背景的编程题是图像缩放要求实现双线性插值不能调用OpenCV。这两道题给我的感觉是基本功扎实的人十分钟能写完不扎实的人可能卡在边界条件上半小时出不来。2. 视觉算法基础知识考察重点2.1 深度学习与卷积网络核心概念选择题里深度学习基础部分占了相当大的比重基本覆盖了面试八股文的核心知识点。题干看似常规但选项设计得很细能筛掉“只背结论、不懂原理”的候选人。有一道题考的是感受野计算。给定一个VGG16风格的卷积栈包含若干3x3卷积和2x2最大池化要求计算最后一层特征图上的一个点对应输入图像的像素范围。这道题需要你熟练掌握感受野的递推公式感受野递推公式RF(l) RF(l-1) (kernel_size(l) - 1) × stride_multiplier(l)其中stride_multiplier是之前所有层stride的连乘。这种题没有捷径只能老老实实从第一层往后算。我建议平时就养成手推感受野的习惯不要依赖网络上的现成计算器笔试时你不可能有时间去查。还有一道题考的是深度可分离卷积的参数计算量对比。普通3x3卷积的参数量是3×3×C_in×C_out深度可分离卷积是3×3×C_in 1×1×C_in×C_out。题目给了一个具体输入输出通道数要求算出两者的参数量比值。这种题就是考查你对MobileNet系列结构的理解会算参数就能拿分。另外一道关于损失函数的题比较有意思。题目问在类别不平衡的二分类任务中使用BCE Loss训练时模型倾向于预测负样本以下哪种方法能有效缓解选项包括Focal Loss、OHEM、修改正样本权重、增大batch size。前三个都是对的增大batch size本质上不解决类别不平衡问题只是让梯度估计更稳定。如果你清楚Focal Loss的数学形式以及OHEM的全称是Online Hard Example Mining这道题并不难。2.2 经典CV任务分类、检测、分割分类、检测、分割三大任务是笔试的核心板块好未来的题目不是简单地考概念而是考你在实际应用中对算法选型的理解。图像分类部分有一道题考了ResNet和DenseNet的结构差异。题目问的是DenseNet相比ResNet最本质的区别是什么选项里有“梯度消失更严重”“特征重用”“参数更少”“层数更深”。正确答案是特征重用DenseNet通过密集连接让每一层都能直接访问前面所有层的特征图实现了特征的极致复用。但这里有个容易混淆的点DenseNet参数量确实更少但那是结果而非原因选“参数更少”就是掉坑了。目标检测部分是重头戏选择题和简答题都有涉及。有一道题考的是Faster R-CNN中RPN的角色问RPN输出的候选框接下来要经过什么操作才能进入RoI Pooling。答案是NMS去除冗余框后再按照得分排序选取前N个候选框这里考察的是你是否理解RPN输出的候选框数量远大于最终用于训练的框数量中间需要一个筛选过程。语义分割方面考了一道关于FCN上采样方式的题目。FCN使用转置卷积进行上采样但转置卷积容易产生棋盘效应。题目问的是以下哪种方法可以缓解这种效应正确答案是用双线性插值上采样再接卷积进行细化这也是DeepLab系列和U-Net的常见做法。这一点如果你只用过现成分割库、没有自己从头搭过分割网络可能答不上来。简答题里有一道比较有分量的题目在课堂场景下需要同时检测学生举手、低头、站立三种动作你会如何设计一个视觉方案这种题考察的不只是检测模型本身而是整个方案设计能力。我当时答了三个层次主干网络选型CSPDarknet或ResNet系列、检测头设计单阶段还是双阶段、工程优化TensorRT加速、模型剪枝。要注意这种题不能只答模型选型还应该包括数据采集、标注方案、评估指标这些工程细节。3. 从笔试看视觉算法工程师的核心能力模型3.1 做题之外的隐藏考察点我发现好未来的笔试有一个特点很多题表面考知识点实际考工程判断力。比如有一道选择题问在目标检测任务中当训练集很小只有几千张图时以下哪种做法最不可取选项里有数据增强、迁移学习、从零训练一个深层检测器、使用预训练权重微调。正确答案是从零训练深层检测器这几乎是工程上的共识但很多没有实际训练经验的人可能会觉得“从零训练更干净、更能适应自己的数据”。另一个隐藏考察点是权衡能力。有一道简答题问拍照搜题场景中对检测和识别的精度要求很高但用户手机性能参差不齐你怎么平衡精度和速度这道题考察的就是模型压缩和加速的工程经验。你至少需要提到蒸馏、量化、剪枝这几个方向并说明为什么在移动端部署时INT8量化比FP16更常用因为INT8在移动端GPU上有硬件加速单元且内存占用减半。还有一道多选题考察数据增强的细节以下哪些数据增强操作在目标检测中需要特别注意标注同步变换选项包括随机裁剪、色彩抖动、随机旋转、MixUp。正确答案是随机裁剪、随机旋转、MixUp因为这三个操作会改变目标的位置或形状需要同步调整标注框。色彩抖动不改变目标的空间位置所以不需要处理标注。这题考察的是你对数据增强底层机制的理解而不是会不会调用imgaug库。3.2 哪些能力是刷题刷不出来的笔试结束后我复盘了一下发现单纯靠刷题通过好未来笔试的难度很高因为很多题目的选项设置需要你具备真实项目经验才能准确判断。举一个具体例子。多选题里有一道关于模型剪枝的题目以下哪些属于结构化剪枝选项包括通道剪枝、权重剪枝、层剪枝、核剪枝。如果你只是看过剪枝的科普文章可能会把权重剪枝也算进去但实际上权重剪枝属于非结构化剪枝因为它稀疏化的是单个权重硬件加速效果很有限。结构化剪枝通道剪枝、层剪枝、核剪枝剪掉的是整块结构单元可以直接获得推理加速。这种题刷题软件帮不了你必须自己动手做过模型压缩实验才能分辨清楚。另外有一道手撕题目考的是图像缩放题干把双线性插值的公式写出来了要求你用Python实现。很多人觉得这题简单但实际写起来才发现边界条件处理很关键。双线性插值在计算源图像坐标时需要把目标图像的像素坐标映射回源图像坐标系如果直接套公式不做边界判断在图像边缘会出现索引越界。这题考察的就是代码实现中的工程细节意识跟你在学校做的实验作业完全是两码事。所以我认为好未来这套笔试对候选人的核心要求可以归纳为三层第一层是扎实的基础知识能拿选择题保底分第二层是真实项目中的工程判断力简答题拉开差距第三层是过硬的代码功底手撕题决定上限。这三个层次缺一不可临时抱佛脚很难同时补到位。4. 手撕代码与快速编程题详解4.1 手撕题目一滑动窗口中的最大最小值这道题是整套卷子里代码难度最小的一道但也是区分度很高的一道。原题大意是给定一个整数数组和一个窗口大小k输出每个滑动窗口中的最大值。解法就是经典的单调队列时间复杂度O(n)。核心思路是维护一个双端队列保证队列中的元素值单调递减队头元素就是当前窗口的最大值。每次移动窗口时先把新元素加入队列并弹出队尾所有比它小的元素再判断队头元素是否已经滑出窗口如果滑出则弹出。我当时用Python写的核心代码如下from collections import deque def max_sliding_window(nums, k): dq deque() res [] for i, v in enumerate(nums): # 弹出队尾所有比当前值小的元素保证队列单调递减 while dq and nums[dq[-1]] v: dq.pop() dq.append(i) # 移除已经滑出窗口的队头元素 if dq[0] i - k: dq.popleft() # 当窗口形成后每次移动都记录队头元素 if i k - 1: res.append(nums[dq[0]]) return res这道题的易错点在于队头元素移出的判断时机。如果你先判断队头是否越界再加入新元素或者先加入再判断都有可能漏掉或错删元素。我当时是先加入新元素再判断队头是否滑出窗口。还有一种写法是先删除越界元素再加入新元素看起来逻辑没问题但窗口刚开始滑动时队头索引大于i-k就会出错细节处理容易翻车。这道题出现在视觉算法岗的笔试里并不突兀因为滑窗思想在图像处理中太常见了比如最大值滤波、非极大值抑制的邻域搜索本质上都是滑动窗口在数据上的应用。你能写出O(n)的解法说明你是真的理解数据索引和边界条件的处理这比背一堆模型结构更有说服力。4.2 手撕题目二双线性插值实现图像缩放这道题是我觉得整套卷子里最有“视觉算法岗”特色的题目。题干描述很简单给定一个输入图像矩阵和一个目标尺寸用双线性插值实现缩放不能使用OpenCV。双线性插值的原理并不复杂目标图像上的像素坐标映射回源图像坐标系后会落在四个源像素点之间根据距离比例进行加权平均。公式如下假设目标像素映射回源图的坐标为(src_x, src_y)x0 floor(src_x)y0 floor(src_y)dx src_x - x0dy src_y - y0则插值结果为f(src_x, src_y) ≈ (1-dx)(1-dy)f(x0,y0) dx(1-dy)f(x01,y0) (1-dx)dyf(x0,y01) dx·dy·f(x01,y01)。坐标映射的计算是这道题的关键。最常用的方式是src_x (dst_x 0.5) * (src_width / dst_width) - 0.5 src_y (dst_y 0.5) * (src_height / dst_height) - 0.5使用0.5偏移是因为图像像素的中心在坐标0.5处这样坐标映射更准确。如果不加0.5直接按比例映射缩放后的图像会出现系统性偏移视觉效果上就是图像整体平移了一个像素。我当时写的核心代码如下def resize_bilinear(src, dst_h, dst_w): src_h, src_w src.shape[:2] dst np.zeros((dst_h, dst_w, src.shape[2]), dtypenp.float32) for dy in range(dst_h): for dx in range(dst_w): src_x (dx 0.5) * (src_w / dst_w) - 0.5 src_y (dy 0.5) * (src_h / dst_h) - 0.5 x0 int(np.floor(src_x)) y0 int(np.floor(src_y)) x1 min(x0 1, src_w - 1) y1 min(y0 1, src_h - 1) wx src_x - x0 wy src_y - y0 # 四邻域加权 for c in range(src.shape[2]): top (1 - wx) * src[y0, x0, c] wx * src[y0, x1, c] bottom (1 - wx) * src[y1, x0, c] wx * src[y1, x1, c] dst[dy, dx, c] (1 - wy) * top wy * bottom return dst这道题有几个细节很容易出错。第一是边界处理计算x1和y1时要和src_w-1、src_h-1取最小值防止索引越界。第二是数据类型如果源图像是uint8类型直接做浮点运算可能会溢出最好先转成float32算完再转回uint8。第三是速度问题三重循环在图像大时会非常慢但笔试场景下只需功能正确不会考察性能优化。有人可能会问为什么要手写双线性插值而不直接调OpenCV的cv2.resize因为这道题考察的是你对插值算子本身的数学理解。在后续的面试中面试官很可能追问双线性插值相比最近邻插值有什么优缺点为什么在图像分割任务中上采样很少用双线性插值而是用转置卷积如果你只是会调库这些问题就答不上来了。5. 常见问题与避坑经验实录5.1 多选题容易踩中的干扰项整套卷子做完我发现多选题的干扰项设计得比单选更细致专门针对复习不全面或者知识体系有盲区的候选人。整理一下我认为最有代表性的三个坑给后面参加笔试的同学提个醒。第一个坑是关于BatchNorm在训练和推理阶段的差异。选项里有一个说法是“推理时BatchNorm继续使用每个batch的均值和方差”这显然不对但如果你平时只在训练模式下跑模型没有做过推理部署可能真的不知道推理阶段用的是全局滑动平均统计量。这个知识点在一般的深度学习教程里不会特别强调但它直接影响模型部署后的性能。第二个坑是关于Focal Loss的超参数。题目问Focal Loss中的gamma值越大对困难样本的关注程度会怎样变化。很多人凭印象觉得gamma越大越关注困难样本但准确地说gamma越大易分类样本的loss贡献被抑制得越厉害相对而言困难样本的loss占比确实提高了。关键在于这里有个隐含前提Focal Loss的本质是降低易分类样本对梯度的主导作用并非直接提高困难样本的权重。如果你表述不严谨很容易被干扰项带偏。第三个坑是关于数据增强的几何变换。有一道多选题问哪些几何变换会导致目标检测标注框需要变化选项里有随机旋转、随机裁剪、随机翻转、随机缩放。大多数人能判断旋转和缩放需要变但会漏掉裁剪因为裁剪在图像分类里不需要改标注。但在检测任务中裁剪不仅改变了目标的位置还可能把部分目标裁掉标注框必须跟着调整。这就是典型的“分类任务知识迁移到检测任务时产生偏差”的坑。5.2 笔试临场的时间分配与心态调整好未来这批笔试的时长是120分钟题量不小我做完后还剩不到五分钟。时间分配上我的策略是先花35-40分钟把单选和多选做完并标记不确定的题再花40分钟做简答题每题写10-15分钟最后30分钟写手撕代码留5分钟检查。这个顺序是刻意设计的。客观题靠的是瞬时记忆和判断力越往后越容易忘所以趁头脑清醒时先做。简答题需要组织文字很耗时间但要控制节奏每题最多15分钟没思路就先把能想到的要点列出来写个纲领也不至于零分。手撕代码放最后是因为它最需要冷静的思路如果你先写代码写兴奋了再回去做选择题容易陷入刷题惯性反而对某些细节选项丧失判断力。我踩过的最大一个坑是简答题。有一道关于目标检测中正负样本不平衡的题我一开始写得太详细从Focal Loss的数学公式到OHEM的实现细节都写了一遍写完发现已经用了20分钟后面两道题只能压缩时间。这个教训很直接简答题是按点给分不是按字数给分把核心要点写清楚比长篇大论更重要。如果你在某个知识点上特别熟悉容易控制不住想炫耀的欲望但笔试不是展示学术深度的地方而是卡点得分的地方。关于代码题我还想提醒一句先写一个暴力解的框架再优化。笔试的代码测试用例通常只有少量数据暴力解法也能通过部分用例拿分但如果你一开始就追求最优解卡在某一步写不出来反而一分都拿不到。我第二道图像缩放题一开始直接上双线性插值的完整实现结果边界条件写错了调试了半天才通过。如果当时先写最近邻插值拿基础分再优化到双线性心态会稳很多。5.3 笔试后的复盘方法笔试结束后不要对完答案就翻篇建议花半小时做一个系统的复盘这对后续面试帮助很大。我复盘时通常会做三件事第一把做错的题整理成一份错题集标注错误原因。大部分错误可以归为三类概念混淆比如把DenseNet和ResNet的差异归为参数多少、场景迁移失误把分类任务的偏好带到检测任务、粗心大意漏看“不正确的一项”这种题干。把每一道错题归类你就能迅速找出自己的知识薄弱面。第二把简答题的答案重新组织一遍按照“背景-方案-权衡-效果验证”的结构重写。笔试时因为时间紧很多人的答案只有“方案”没有“权衡”但面试官会追问为什么选这个方案。提前准备好一个完整的回答框架面试时可以更加从容。第三把两道手撕代码题重写一遍这次要写出最简洁、最健壮的版本并且补充注释。我自己写代码有个习惯每次重写都尝试用更少的代码行或更高的可读性来完成同一功能这样不仅能巩固算法思路还能锻炼代码表达力。笔试代码面试官不一定能看到但面试时写白板代码的功底会直接影响评价。6. 常见问题速查笔试中的高频考点清单根据我对好未来这套笔试以及同级别公司视觉算法岗笔试的研究整理了一张通用性较强的高频考点清单覆盖了选择题和简答题中反复出现的主题分享给大家作为复习参考。考点主题常见出题角度容易踩的坑复习建议感受野计算给定网络结构求特征图感受野忘记计算stride累积效应手推3-5个经典网络的感受野BatchNorm机制训练与推理阶段的差异混淆全局统计量与batch统计量从源码或公式层面理解模型参数量与FLOPs深度可分离卷积对比普通卷积漏算bias或忽略乘法次数手算MobileNet各层参数量目标检测正负样本RPN中正负样本如何定义忽略anchor与GT的IoU阈值细节精读Faster R-CNN原始论文对应的采样部分类别不平衡Focal Loss、OHEM的适用场景混淆“降低易样本权重”与“提高难样本权重”推导Focal Loss梯度公式数据增强检测任务中标注同步处理把分类增强操作直接套用到检测明确几何变换与颜色变换的差异模型压缩结构化剪枝与非结构化剪枝无法区分两者对推理加速的影响动手跑一次剪枝实验插值算法最近邻/双线性/双三次插值忽略坐标偏移和边界条件手写实现三种插值并对比效果这套清单并不只在好未来笔试中适用我自己做完比较后发现字节、快手、美团这些公司的视觉算法岗笔试考点重合度基本在70%以上。区别只在于出题形式有的公司更偏好场景设计题有的更偏爱数学推导但底层知识要求是相通的。最后再说一个个人体会。好未来这套笔试让我最深刻的不是某道题多难而是它整体传递出的信号教育科技公司要的不是最懂模型的人而是最能解决实际问题的人。选择题考的全是基础概念简答题全是在具体教育场景中设计算法方案手撕代码考的也是最贴近图像处理的插值实现。这种命题思路和面试官聊的时候也得到了一些印证视觉算法岗进入公司后主要工作是把前沿模型落地到真实教学场景中而不是发论文。如果你正在准备类似的笔试我的建议是不要只看花哨的新模型新架构把经典模型吃透、把图像处理基本功练扎实、把代码能力提上来比跟风追新更重要。基础概念的精准理解、工程场景中的权衡判断、手写代码的边界处理这三样练到位不只是通过笔试后续面试和实际工作的底子也就打下来了。