
好未来2023秋招视觉算法岗第一批笔试我是在九月初投的简历一周后就收到了笔试链接。说实话教育科技公司的视觉算法岗和互联网大厂的通用视觉岗考察侧重点差别还是蛮大的。好未来更关注图像理解、OCR、检测分割这些能直接落地到教学场景里的能力笔试题目也明显在往这个方向靠。这篇文章我会按我的回忆和复盘把笔试的整体结构、考点拆解、编程题思路、备考建议全部梳理一遍供后续准备视觉算法岗校招的同学参考。1. 笔试整体印象与岗位画像1.1 好未来视觉算法岗到底在做什么好未来的业务核心是教育视觉算法很多都围绕“拍照学习”这个场景展开。你打开App拍一道数学题系统要自动识别题目区域、切出题干、识别文字和公式再匹配题库拍一张口算作业要判断对错、标出错题位置在直播课里还要分析学生的专注度、是否存在异常行为。这些任务落到算法头上就是图像分类、目标检测、文字检测识别、公式识别、图像质量增强、行为分析这些方向的组合。所以我拿到笔试题目后最大的感受是它不是普普通通考你背过多少个模型而是考你遇到真实业务场景时能不能把任务抽象成视觉问题再用合理的模型和方案去解决。我的建议是准备这类笔试之前一定先去App里把核心功能实际操作一遍看看产品界面哪些地方会被拍、拍出来的图长什么样、算法要输出什么。你会在题目里发现很多影子。1.2 第一批笔试的题型结构2023秋招第一批笔试一共120分钟我印象里分了三个部分选择题、编程题、算法设计题。选择题大概20道覆盖机器学习基础、深度学习基础、图像处理基础偶尔穿插几道概率题和数据结构题。编程题有两道需要在线写代码给的是核心函数不用处理输入输出实现指定功能即可。算法设计题是一道场景题给你一个业务需求让你写出技术方案要包括数据准备、模型设计、训练策略、评估指标。从时间分配上看120分钟其实很紧张。我当时的策略是先快速扫一遍所有题目选择题控制在40分钟内编程题每道20分钟留40分钟给算法设计题。结果实际操作中编程题第二道比我预想的难卡了快半小时最后算法设计题时间被压缩到20分钟。这个教训后面我细说。2. 核心知识点拆解从考题反推重点2.1 深度学习基础高频中的高频选择题里深度学习基础占了大头。卷积神经网络的结构、感受野计算、参数量估算、BN层的作用、激活函数的对比、常见损失函数的适用场景这些都是送分题但如果你基础不牢送分题也会变成送命题。我印象很深的一道题给一个输入特征图尺寸经过三层卷积和池化问输出尺寸和感受野。这题考的就是最基础的计算。公式是output_size (input_size - kernel_size 2*padding) / stride 1感受野则是从最后一层往前逐层叠加。这类题没有技巧必须熟练到闭着眼能算。我当时因为对转置卷积的输出尺寸公式记混了差点选错后来复盘时专门把常用公式整理了一遍。另一个常见考点是Softmax和交叉熵。它不会直接问你公式而是给你一个多分类任务的logits和标签让你算loss。这里要注意数值稳定性实际工程里用的是LogSoftmax NLLLoss而不是先算Softmax再取对数原因就是Softmax计算时指数容易溢出。笔试题目虽然只是选择题但它会考察你是否理解这个坑。如果只是死记公式很容易漏掉对数值稳定性的判断。2.2 目标检测与分割最直接的业务技术栈好未来的题目区域定位、错题定位、课堂人数统计全都离不开目标检测和分割。笔试里不会让你手写完整Faster R-CNN代码但会考察关键概念。比如选择题会问在Faster R-CNN中RPN的anchor设置、正负样本如何定义、ROI Pooling的作用。还会让你对比YOLO系列和两阶段检测器的优缺点。我遇到的一道题是如何缓解检测中的类别不平衡问题。选项里有Focal Loss、OHEM、随机采样、过采样考察点在于你是否理解Focal Loss的提出动机和数学形式。再比如分割相关的题FCN中的转置卷积、U-Net的跳跃连接、语义分割的常见损失函数Cross Entropy、Dice Loss。重点是Dice Loss在类别不平衡场景下的表现以及为什么医疗图像里很常用。教育场景的题目区域分割同样存在前景占比小的问题这种对比思维在笔试里很加分。准备这部分我建议把目标检测的经典模型按时间线梳理一遍R-CNN → Fast R-CNN → Faster R-CNN → YOLO系列 → SSD → RetinaNet → DETR。不需要背所有细节但要能说清每个模型解决了什么问题代价是什么。笔试选择题经常考察“哪个模型引入了什么模块”和“三个模型之间的差异”。2.3 图像分类与特征提取模型的底子图像分类是视觉算法的基础笔试中通常考经典网络的结构特点和设计动机。ResNet的残差结构为什么能解决退化问题MobileNet的深度可分离卷积相比普通卷积参数量减少多少ViT和CNN在归纳偏置上的区别是什么这里有一个经常会考的计算题深度可分离卷积的参数量和计算量对比。普通卷积的参数量是kernel_size * kernel_size * in_channels * out_channels深度可分离卷积分成depthwise和pointwise两步参数量是kernel_size * kernel_size * in_channels in_channels * out_channels。把两者相除会发现大约是1/out_channels 1/(kernel_size^2)所以MobileNet能在精度损失有限的情况下大幅降低算力需求。笔试中不要求推导到这一层但你要有量级概念。还有一道印象比较深的题是判断题在ImageNet上预训练的模型迁移到目标任务时是否需要冻结前几层正确答案是“不一定”要看数据量和任务相似度。数据少则倾向冻结浅层数据多可以整体微调。这类题考的不是单一知识点而是你对迁移学习的理解深度。建议大家把“预训练-微调”这件事的原理、适用条件、常见trick都过一遍题目怎么变形都能应对。2.4 OCR与图像处理教育场景的护城河好未来的视觉算法岗笔试一定绕不开OCR相关的考题。因为拍照搜题、作业批改、公式识别这些产品功能都依赖文字检测、方向分类、文字识别这条pipeline。我的印象里选择题考了图像二值化的常见算法大津法OTSU、透视变换的应用场景、形态学操作的作用膨胀、腐蚀、开运算、闭运算。有一道题是给一张倾斜拍摄的文本图像问如何校正。正确答案是先做边缘检测找到文本区域的四个顶点然后用透视变换把区域映射到正矩形。这道题看着简单但如果你没实际处理过类似任务可能想不到用cv2.getPerspectiveTransform加cv2.warpPerspective的完整链路。另外算法设计题也极容易往OCR场景靠。比如让你设计一个“作业批改”系统输入是手机拍摄的纸质作业图像输出是每道题的正确/错误标记。你需要把整条pipeline写出来图像去畸变、透视校正、背景去除、题目区域检测、手写笔迹识别、与标准答案比对。这里不止考模型还考工程经验。我后面会专门讲算法设计题的答题框架。如果你要系统准备这一块建议把传统图像处理的经典操作过一遍灰度化、高斯滤波、Canny边缘检测、Hough变换、轮廓查找、形态学处理、连通域分析。虽然现在很多任务都被深度学习取代了但笔试题还是喜欢考这些基础因为它们是理解更复杂方案的前提。3. 编程题与算法设计题实战思路3.1 两道编程题的复盘好未来的笔试编程题不是纯LeetCode风格会更贴近图像处理或业务逻辑。这里我凭记忆还原两道包含核心考点的题目供大家参考。第一道题大意是给一个二维矩阵每个位置代表一个像素灰度值要求计算某个矩形区域内所有像素的平均值并且需要支持多次查询。这就是典型的二维前缀和。你先把前缀和矩阵pre[i][j]算出来定义为从(0,0)到(i,j)的子矩阵和查询时用四个矩形的加减即可单次查询时间复杂度O(1)。这类题在图像处理里很常见比如均值滤波的快速实现、特征图池化前的区域统计。代码很短vectorvectorlong long pre(n1, vectorlong long(m1, 0)); for (int i 1; i n; i) { for (int j 1; j m; j) { pre[i][j] pre[i-1][j] pre[i][j-1] - pre[i-1][j-1] matrix[i-1][j-1]; } } // 查询区域 (r1,c1) 到 (r2,c2) long long sum pre[r21][c21] - pre[r1][c21] - pre[r21][c1] pre[r1][c1];这里要注意long long防止溢出笔试环境里如果没注意类型会直接导致答案错误。我当时因为初始化边界多写了一层花了几分钟排查所以提醒大家先确认边界条件再动手。第二道题比较有意思跟业务相关给一个由若干小写字母组成的字符串代表一个学生的答案再给一个标准答案字符串要求判断这两个字符串是否有“最长公共子序列”并输出最长公共子序列的长度。其实就是一个LCS问题动态规划经典题。但题目里有个变体它要求考虑两个答案中可能包含多余的空格和标点需要先做清洗再比较。这种业务化包装在校招笔试里很常见本质上还是算法题只是多了数据预处理。如果你们遇到类似题别慌先把无关字符过滤掉再做DP。状态转移方程是dp[i][j] dp[i-1][j-1] 1 if s1[i-1] s2[j-1] else max(dp[i-1][j], dp[i][j-1])最后输出dp[n][m]即可。需要说明的是这类题目不会涉及严格的对错判断因为实际场景里学生答案存在多种等价表达笔试只是为了考察你是否掌握了基础的动态规划方法。3.2 算法设计题的答题框架第三部分是算法设计题我记得题目描述了一类需求对着纸质练习册拍一张照片算法需要自动识别当前页的题目区域并输出每道题的位置框。这道题没有标准答案但你的回答会让面试官看出你有没有做过真实项目。我的建议是回答这种题时一定要有结构感。第一步明确输入输出。输入是手机拍摄的原始RGB图像可能包含倾斜、阴影、手指遮挡输出是若干矩形框每个框表示一道题的坐标位置最好给出置信度。第二步拆解pipeline。通常可以做两阶段方案先做版面分析再做题目切分。版面分析可以用基于深度学习的检测模型比如YOLO或DBNet先检测出图像中的大块文本区域再根据文本框之间的位置关系、行间距、题号特征用启发式规则或聚类切分出独立题目。如果采集数据量足够也可以直接训练一个题目检测模型端到端输出题目框。第三步数据准备。需要题目区域标注工具标注维度包括题号、题干区域、选项区域、作答区域。考虑到不同版式差异很大建议采集多个年级、多个学科的练习册数据覆盖不同字体、拍摄角度、光照条件。第四步模型选型和训练细节。检测模型可以考虑使用DBNet或YOLOv5/YOLOv8backbone用MobileNet或ResNet。训练时要注意尺度问题因为手机拍摄的图像分辨率很高直接resize到640*640会丢失很多小字信息。我的经验是可以先用原图尺度做一次粗检测再用OCR识别结果辅助校正。第五步评估指标。除了检测常用的mAP还要关注题目框是否与真实题目区域吻合。比较实用的指标是IoU、框中心点误差和边界误切率同时要针对真实业务场景进行卡阈值。这个框架不一定是最优解但在笔试中这样组织能让面试官看到你有工程思维而不是只会套模型。核心逻辑是先定义问题再拆方案再讲数据最后讲评估。如果只写“用YOLO检测一下”分数大概率不会高。4. 备考策略与时间线4.1 基础复习别让送分题变成丢分题准备视觉算法岗笔试最怕的就是基础不牢。选择题里那些模型结构、公式计算、损失函数如果你考前一周才开始翻书大概率记混。我建议至少提前一个月开始复习把按考点分类的笔记整理成一份速查手册每天过一遍。复习清单可以参考深度学习基础反向传播、梯度消失、权重初始化、BatchNorm、正则化、图像处理基础滤波、边缘检测、形态学、直方图、卷积网络架构LeNet、AlexNet、VGG、ResNet、DenseNet、MobileNet、EfficientNet、ViT、检测分割Faster R-CNN、YOLO、Mask R-CNN、DETR、OCRCRNN、CTC、Attention OCR、DBNet、模型加速剪枝、量化、蒸馏。这里特别提醒一点笔试选择题偶尔会考得非常细比如问某个模型的某一层输出通道数或者某个模块在哪个阶段引入。备考时可以通过画结构图的方式加深记忆把每个模型的主干、分支、损失函数串成一条线比单独背结论要牢固得多。4.2 刷题与项目实战让知识“用得上”笔试编程题虽然不像LeetCode那样难到离谱但如果你平时不刷题现场想状态转移方程会很紧张。我给自己的要求是笔试前每天至少写三道代码题重点覆盖动态规划、前缀和、双指针、二叉树、字符串处理。另外视觉算法岗笔试越来越喜欢考察“业务化包装”的题目比如把图像区域统计包装成RLE压缩把OCR文本对齐包装成编辑距离。刷题时不要只满足于AC多想一想这道题在图像处理里能有什么应用这样面试时你能讲出更深的理解。我自己还会在本地跑一些小项目比如用OpenCV实现文档矫正、用PaddleOCR识别拍照图片里的文字、用YOLOv5训练一个自定义的题目检测器。项目不一定要非常完整但实践一遍之后很多概念会变得很具体。比如透视变换的原理我最初只在文档里见过真正写代码处理倾斜图像时才理解了为什么需要四个对应点来求单应性矩阵。4.3 临场策略时间安排和心态控制笔试是线上进行环境相对复杂。我建议提前测试摄像头、网络、编译器环境避免开考后折腾设备。120分钟的笔试如果你的编程能力中等建议把时间切成这样选择题不超过40分钟编程题两道控制在50分钟算法设计题30分钟最后留一点时间检查。但实际会有很多意外情况。比如某道选择题花了5分钟还是不确定选一个最有把握的标记后继续往后走不要在单选上纠缠太久。我做题的时候有一道复杂的计算题硬算了8分钟最后发现是思路错了浪费了时间。如果在真实笔试中题目不能回到上一题那你只能凭第一感觉选。编程题如果完全没思路先把暴力解法写上去至少能过部分测试用例。很多笔试平台是按测试点给分的不要一上来就追求最优解先保证能做出来再考虑优化。我见过很多同学栽在不写代码只写思路上了平台直接判零分非常可惜。算法设计题则需要预留足够篇幅不要只写三行话。即使你时间不够也要把pipeline拆成几个阶段用关键词把每个阶段的核心方法写出来。阅卷人是在找你有没有项目思维不是等一篇论文。5. 复盘我踩过的坑和给你的一些提醒5.1 时间分配真的是第一道大题我这次笔试最大的失误就是编程题第二道用了太久。主要原因是我把LCS问题想复杂了看到“学生答案”和“标准答案”就开始考虑编辑距离、字符权重加权结果绕了一个大弯。实际上题目只要LCS长度根本不用考虑权重。复盘时我才发现如果先读题三遍再动手10分钟就能写完。所以笔试时拿到编程题先口头翻译一下题目的真实要求。把“学生答案”和“标准答案”替换成“字符串A”和“字符串B”问题立刻变成经典的序列比对题。这种抽象能力需要平时多练习看到任何带业务场景的题目先剥掉包装识别出实际算法模型。5.2 写代码时容易忽略边界和溢出编程题第一道二维前缀和我的第一版代码在计算查询区域时没有加偏移量导致索引错位。痛定思痛以后凡是遇到矩阵相关题目我先画一个小矩阵把前缀和数组多开一圈然后手动走一遍查询逻辑。虽然会多花一分钟但能避免大概率翻车。还有一个细节是数据类型的溢出。计算大矩阵区域和时结果可能超过int范围一定要用long long或Python的int。这类错误在本地测试往往发现不了因为自测数据太小但提交后大测试用例就会暴露。建议笔试环境里先看一眼数组范围再决定用哪种类型。5.3 基础概念只看不用笔试照样懵这次笔试题里有几道概念题我印象很深。比如问“深度可分离卷积的参数量比标准卷积少多少”这题我本来觉得很简单但真正做的时候才发现我虽然知道MobileNet用了深度可分离卷积却没有亲自算过参数量。结果只能在几个答案里猜。复盘之后我专门找了一张纸把标准卷积、depthwise卷积、pointwise卷积的参数量推导了一遍再对比一下后面再遇到这类题就不会慌了。所以我的建议是复习概念时别只背结论尽量动手推导一遍哪怕是菜市场数学也行。笔试真正考察的是你对知识的理解程度不只是一句“MobileNet使用了深度可分离卷积”。5.4 常见问题速查表问题我的处理办法选择题遇到计算量很大的题先跳过做完其他题再回来避免卡壳编程题题意不清晰多读几遍将业务语言翻译成算法语言最后再动手编程题最优解想不出来先写暴力解保证有分再优化算法设计题不知道写多少至少写完整pipeline每个环节带一句核心方法时间不够优先保证编程题能运行通过算法设计题用点列式回答线上环境出问题提前测试保留备用浏览器和网络5.5 关于“第一批笔试”的额外观察“第一批”通常意味着这是整个秋招最早期的一次笔试可能存在题型不稳定的情况。根据我的观察好未来的视觉算法岗笔试会分为多个批次批次越早越侧重基础批次越晚越可能结合最新的业务方向比如大模型相关的多模态理解。第一批笔试反而适合用来探路如果你投的岗位没有笔试限制甚至可以尝试投递后先做一次模拟感受节奏。后续批次可能还会出现多模态大模型的相关概念题比如CLIP、BLIP、图文检索、零样本分类这些方向。建议准备2024年以后校招的同学刷题之外还要关注视觉语言模型的基础知识即使笔试没考面试也会大概率追问。还有一点笔试只是第一步通过之后通常会有1-2轮技术面试面试官会拿着你在算法设计题里写的方案追问细节。所以千万不要笔试结束后就把题目扔到一边考完当天趁记忆还在立刻复盘自己的答案尤其是算法设计题想一想如果被追问“你的检测模型在小目标上效果不好怎么优化”你该怎么回答。这个复盘过程比多刷三套题更有价值。我个人在实际操作中的体会是视觉算法岗笔试不追求你写过多少篇论文而是看你有没有把基础打牢能不能把业务问题拆成技术问题。如果你能把一份往年笔试复盘到这种颗粒度那通过概率会高很多。希望这篇复盘能帮到正在准备好未来或类似教育科技公司视觉算法岗的你。