资讯动态

好未来视觉算法笔试复盘:从基础理论到教育场景应用

发布时间:2026/9/1 3:25:21 来源:尧图企业网站定制
2023年好未来秋招视觉算法岗第一批笔试我刚好赶上了。考完出来最大的感受是这家公司的笔试风格跟互联网大厂那种LeetCode定生死的套路不太一样它对视觉基础理论的考察占比相当高而且会结合教育场景出题。如果你准备投好未来或者其他教育科技公司的视觉算法岗这篇复盘值得认真看一下。我说一下整体情况。笔试安排在牛客网进行时间120分钟题型分三块单选题40道、编程题2道、简答/设计题1道。总分100分单选题和编程题各占40分简答题占20分。单看题目难度不算特别刁钻但有一个明显的特征广度优先、深度次之基础概念密度极高。单选题里会冷不丁冒出一道图像处理的老知识点或者一道机器学习里的冷门推导如果复习的时候只顾着刷检测分割的SOTA论文很容易在选择题上翻车。这篇文章我不打算只回忆题目而是从考了什么、为什么这么考、下次怎么准备三个维度来拆解。好未来笔试的题目设置其实能折射出教育场景下视觉算法工程师的真实工作内容OCR、题目识别、手势/表情分析、学习状态监测这些都得懂。明白了这一点备考方向和刷题优先级自然就清楚了。1. 整场笔试的时间轴与考察范围全貌1.1 笔试流程和题型分布回顾先说流程。牛客网双机位监考手机架在侧后方电脑屏幕共享全程不能切出页面。一旦切出超过3次系统会直接弹窗警告再犯就强制交卷。这个环节其实是心理战因为120分钟要完成43道题时间并不宽裕如果还因为切页面被警告导致心态波动后面很容易崩。我的建议是考试前把一切需要查的资料全部放弃进入考试页面后不要有任何侥幸心理。题型分布如下单选题40道每题1分覆盖视觉基础、机器学习基础、深度学习基础、经典网络结构、目标检测/分割/OCR常识。编程题2道每题20分一道二维动态规划一道贪心加排序。简答题1道20分给出一个教育场景下的视觉任务要求写出技术方案和数据迭代思路。从卷面结构能看出这家公司筛选候选人的核心逻辑既要理论基础扎实又要代码基本功过关还得把算法能力和业务结合起来。三道题各自代表一个维度单选考察知识面编程考察逻辑和工程实现简答考察方案设计能力。三者缺一不可。1.2 考察范围的底层逻辑教育场景需要什么样的视觉算法工程师好未来的主营业务是K12教育旗下有学而思网校、题拍拍、学而思培优等产品线。这些业务天然依赖视觉技术拍照搜题需要题目OCR识别、图形结构解析作业批改需要手写体识别和公式识别AI课堂需要手势识别、表情识别、专注度分析图书内容数字化需要版面分析、图像矫正、去摩尔纹。这些需求决定了笔试的考察偏好。我考完把40道单选题按知识点重新归类了一遍大致比例是这样的知识点模块题量占比典型考察方式图像处理基础约20%滤波、边缘检测、直方图、图像金字塔、几何变换深度学习基础约30%卷积计算量、感受野、BN、反向传播、激活函数机器学习基础约15%分类指标、正则化、模型评估检测与分割约15%IoU、NMS、mAP计算、FPN结构理解OCR与文档分析约10%文本检测算法、矫正方法网络结构约10%ResNet、MobileNet、Transformer变体这个比例说明复习时不能只看深度学习传统图像处理也得捡起来甚至有些同学忽略的机器学习基础同样会考。视觉算法岗不是只跟CNN打交道很多业务场景里会用到传统的图像预处理和分类器搭配方案。2. 单选题里的高频知识点哪些冷饭被翻来覆去地炒2.1 图像处理模块的经典考点及记忆要点图像处理部分出现了几类非常考古的题目就是那种你平时做深度学习根本不碰但一到笔试就冒出来的知识。印象最深的一道是给出一幅低对比度图像问用哪种方法能有效改善其视觉效果。选项里有直方图均衡化、高斯滤波、中值滤波、Canny边缘检测。答案是直方图均衡化原理是把灰度直方图的分布拉伸到整个灰度范围让原本集中在狭窄区间的像素值分散开视觉效果自然就变清晰了。另外一道是问Sobel算子用于做什么选项边缘检测、角点检测、直线检测、区域分割。答案是边缘检测。Sobel本质是一个离散微分算子通过计算图像灰度在水平和垂直方向的一阶导数的近似值来寻找梯度变化剧烈的点而梯度大的地方通常就是边缘。还有一道比较有意思的题问以下哪种操作属于形态学处理高斯模糊、直方图匹配、膨胀、仿射变换。答案是膨胀。形态学处理基于集合论膨胀操作会扩大图像中的亮区域腐蚀则缩小亮区域这在文档图像去除噪声、断笔修复中很常用。如果你做过OCR预处理应该对这两个操作不陌生。我自己复习的时候归纳过一个规律图像处理模块的高频考点集中在灰度变换、空间滤波、频率域滤波、边缘检测、图像分割、形态学处理这六个方向。建议把这些内容系统过一遍不要凭感觉猜。2.2 深度学习基础计算量推导和原理细节是重灾区深度学习基础部分好未来有一道计算卷积输出尺寸的题输入特征图是32x32x3卷积核是5x5padding为2stride为1问输出特征图的尺寸。套公式 (32 2*2 - 5)/1 1 32所以输出是32x32。这种送分题不能丢。但后面出现了几道容易被忽视的细节题一道问BN层在训练和推理阶段的行为差异。答案是训练时使用当前batch的均值和方差进行归一化同时维护全局均值和方差的滑动平均推理阶段使用训练时积累的全局统计量而不是当前batch的统计量。很多人做项目时直接调nn.BatchNorm2d没想过这两个阶段的差异结果笔试就被打回原形。另一道问感受野的计算一个输出特征图上的像素对应输入图像上的区域大小。连续经过两个3x3卷积stride均为1感受野是5x5再经过一个3x3卷积感受野变成7x7。这个用公式 RF_new RF_old (kernel_size - 1) * stride相乘实际推算时从后往前累加。 两个3x3卷积和一个5x5卷积的感受野相同但参数量更少这正是VGG网络的核心思想。还有一道关于激活函数的题目ReLU为什么能缓解梯度消失答案是ReLU在正区间梯度恒为1不会像sigmoid那样在饱和区梯度趋近于0因此反向传播时梯度不易衰减。但要注意ReLU也有缺陷神经元输出恒为负时梯度恒为0导致权重不再更新这就是神经元死亡问题LeakyReLU等变体就是为了解决这个。2.3 检测分割与OCR业务关联度最高的考点检测部分的题比较常规但很考验记忆准确性。比如计算IoU两个框交集面积为20并集面积为50问IoU是多少答案0.4。另一道问NMS非极大值抑制的作用去除重叠度较高的冗余检测框保留每个目标的置信度最高的框。原理很直观就是对同一类别的检测框按得分排序依次删除与当前最高分框IoU超过阈值的框。OCR相关的题让我眼前一亮有一道问文档图像中的摩尔纹常见于哪种场景以及用什么方法抑制。答案拍摄屏幕或打印文档时容易出现高频干涉条纹可通过频域滤波或低通滤波抑制也可以在采集端通过调整拍摄角度规避。这道题说明好未来的笔试出题人真的懂业务——拍照搜题必然要处理各种复杂光线和拍摄条件下的文档图像。顺便说在代码框里简单验证了一下常用的摩尔纹验证逻辑大致是这样的import cv2 import numpy as np def remove_moire(image, d15, sigma_color35, sigma_space35): # 双边滤波能在去噪的同时保留边缘适合摩尔纹的初步抑制 result cv2.bilateralFilter(image, d, sigma_color, sigma_space) return result实际笔试不需要写代码但理解摩尔纹产生原因和应对手段对后续面试环节非常有帮助。3. 两道编程题复盘两道各具代表性的典型题3.1 第一道二维矩阵最大全1正方形面积动态规划编程题第一道是给定一个m行n列的二维矩阵矩阵元素只有0和1要求找出只包含1的最大正方形并返回其面积。这道题是LeetCode 221的变体属于动态规划的经典题。递推关系非常直接定义dp[i][j]表示以坐标(i, j)为右下角的最大全1正方形边长。当前位置如果为1则dp[i][j]受限于左边、上边和左上角三个位置的dp值取最小值加1dp[i][j] min(dp[i-1][j], dp[i][j-1], dp[i-1][j-1]) 1每个格子的状态只依赖上一行和当前行前一列所以空间可以从二维压到一维。def maximal_square(matrix): if not matrix: return 0 m, n len(matrix), len(matrix[0]) dp [[0] * n for _ in range(m)] max_side 0 for i in range(m): for j in range(n): if matrix[i][j] 1: if i 0 or j 0: dp[i][j] 1 else: dp[i][j] min(dp[i-1][j], dp[i][j-1], dp[i-1][j-1]) 1 max_side max(max_side, dp[i][j]) return max_side * max_side空间优化版def maximal_square_optimized(matrix): if not matrix: return 0 m, n len(matrix), len(matrix[0]) dp [0] * (n 1) max_side 0 for i in range(m): prev 0 for j in range(n): temp dp[j1] if matrix[i][j] 1: dp[j1] min(dp[j1], dp[j], prev) 1 max_side max(max_side, dp[j1]) else: dp[j1] 0 prev temp return max_side * max_side我当时的做法是直接上了一维优化版。笔试时间紧张能写对一版就行不必追求最优解证明。但参考答案不能错——dp数组的含义、状态转移方程、边界条件这三个要素写清楚面试官能看到你的思路就足够了。3.2 第二道会议室最多安排场次贪心加排序第二道题是给定若干活动的开始时间和结束时间问一天最多能安排多少场活动要求时间不能重叠。这道题看起来像区间调度问题核心是贪心策略每次都选结束时间最早的且与已选区间不冲突的活动。证明思路是贪心选择性质结束时间越早剩余可用时间越长因此不会比最优解差。先按结束时间升序排序再依次遍历维护上一次选中活动的结束时间若当前活动开始时间不小于它则选中并更新结束时间。def max_activities(intervals): if not intervals: return 0 intervals.sort(keylambda x: x[1]) count 1 last_end intervals[0][1] for start, end in intervals[1:]: if start last_end: count 1 last_end end return count这道题其实不复杂但需要注意排序键是结束时间而不是开始时间。如果按开始时间排序贪心就失效了。笔试现场我见过有人直接按开始时间排序然后从头选这种思路在某些情况下得到的结果比最优解小属于典型的看着对但不对。另外题目里可能有多个活动结束时间相同的情况排序时如果结束时间相同开始时间早晚无所谓不影响结果。这点不需要额外处理。3.3 编程题的实战教训时间分配和边界条件编程题我建议先做第二道再做第一道因为贪心排序代码量小思路清晰10分钟内能搞定动态规划虽然也不难但状态转移方程要想清楚容易在小细节上卡住。笔试时间是120分钟前50分钟搞定40道选择题已经很紧张了编程题必须留至少40-50分钟否则容易出现低级错误。边界条件最常见的问题是空数组和单元素数组这两道题的空数组情况一定要单独处理。还有输入可能是字符串数组而不是整数数组LeetCode常见坑输入读取格式最好先在本地验证一遍。我那年实际做题时第一道题虽然写得快但提交后一直超时后来发现问题出在Python的输入输出上——用sys.stdin.readline而不是input()在大矩阵输入下时间差距非常明显。笔试环境一般不会给示例输入之外的测试点所以读入优化很重要import sys def main(): lines sys.stdin.read().strip().splitlines() if not lines: return m, n map(int, lines[0].split()) matrix [list(line.strip()) for line in lines[1:1m]] print(maximal_square(matrix)) if __name__ __main__: main()4. 简答题的考察重点教育场景下的方案设计4.1 我拿到的题目拍照搜题场景的文本识别难题简答题给了一个业务场景用户在任意角度、任意光照、任意背景下用手机拍摄一道数学题系统需要准确识别题目中的文字、公式和几何图形然后返回这道题的解析答案。假设你负责优化这个识别链路请给出完整的技术方案包括预处理、检测、识别、后处理以及数据迭代策略。这道题一看就是平时业务里真实遇到的问题。它不是考你背诵某个模型而是考察你在真实场景里怎么把一堆算法组件拼起来并且能够针对坏case持续迭代。这类题在好未来的笔试里出现概率极高因为这就是他们工程师每天在做的事。我的回答框架大致是这样的预处理环节先做透视矫正。学生拍作业本很少是正对着拍的多半有倾斜和透视变形。方案是用传统CV的方法检测作业纸的四条边边缘检测加直线拟合再通过透视变换把纸面拉正。如果检测不到纸张区域可以用深度学习版面分析方法兜底比如用DBNet做文本区域检测然后基于文本区域的整体布局估算矫正参数。光照不均的问题用自适应直方图均衡化CLAHE做局部对比度增强。摩尔纹用频域滤波或专门的小模型检测后处理。文本检测与识别环节文本检测用DBNet或PSENet这类兼顾速度和精度的模型因为移动端部署要考虑推理延迟。文字识别用CRNN加CTC或者采用最新基于Transformer的识别模型比如SVTR中文长文本识别场景下SVTR的效果更好。数学公式部分通用OCR很难直接识别需要用公式识别模型输出LaTeX序列比如基于Encoder-Decoder结构的模型这一步是整个链路里最难的。几何图形解析环节数学题里的几何图形不能简单当成图片识别需要语义理解。例如识别出一个三角形和一个圆形并且判断它们之间的位置关系、标注的数值等。这个环节没有特别成熟的端到端方案一般是目标检测加图形属性分类的组合。数据迭代策略用户上传的图片是天然的标注数据源可以建立识别失败—人工标注—加入训练集—模型更新的闭环。同时为了让模型对手机拍摄的形变更具鲁棒性可以在训练阶段做随机透视变换、随机亮度扰动、随机摩尔纹模拟等数据增强。用OCR的置信度分数做样本筛选优先标注置信度低且用户主动纠错的样本。4.2 这类简答题的答题套路不只是讲模型还要讲闭环从阅卷者视角看简答题想看到的核心点是能不能先把问题拆解成若干子任务明确每个子任务的输入输出知不知道每个子任务有哪些主流算法可选并且知道各自优劣有没有工程落地的意识比如推理速度、模型大小、失败兜底有没有数据迭代的全局观知道这是一个持续优化的过程不是一次训练就完事。很多同学答这类题容易犯一个错误光讲我用DBNet检测、用CRNN识别就结束了缺少预处理和数据闭环的部分。我复盘时觉得好未来的判分标准非常务实他们希望候选人像一个真正的业务算法工程师一样思考问题而不只是一个会调包调参的炼丹师。4.3 教育场景还有哪些可能的简答题方向基于对好未来业务的了解我整理了其他可能出现的方向你们准备时可以一并覆盖手写体作业批改识别手写数字、字母、汉字并进行对错判断。难点是手写体形变大、潦草且不同学生书写风格差异极大。AI课堂专注度分析通过摄像头检测学生的头部姿态、视线方向、眨眼频率来判断是否走神。涉及人脸关键点、视线估计、时序建模。口算题拍照批改针对低年级口算题识别数字和运算符号判断结果对错。看起来简单但处理手写和印刷混排场景时会有很多坑。教材版面结构化把整页教材解析成标题、正文、图片、表格、习题等不同区块方便后续检索和推荐。公式检索用户拍照输入一个公式从题库中检索相似公式然后返回解析。这个任务涉及公式识别、公式匹配和语义相似度。把每个方向的技术链路过一遍面试时如果被问到相关场景都能做到有话说。5. 笔试结束后复盘哪些准备有效哪些是无效努力5.1 时间分配策略我实际花费的时间和该有的节奏下面是我直观感受到的时间分配情况给大家一个参考环节预期时间实际耗时复盘结论单选题40道40-50分钟55分钟超出预期遇到概率统计类计算题耗费较多编程题2道40分钟35分钟有一道边界条件险些看漏提前结束较亏简答题1道20-30分钟25分钟框架明确但细节可以再展开检查时间剩余10分钟5分钟只检查了编程题的极端输入选择题没有复查程序员有个通病写选择题时觉得这个我会草草就过结果到编程题手忙脚乱。我的建议是40道单选控制在45分钟以内压缩下来的时间用来详细写简答题和检查编程题的边界条件。因为单选是知识面问题会就是会不会想再久也没用简答题则不同写得多写得细确实能多拿分。5.2 哪些准备最有效基础题超过六成SOTA论文性价比极低我刷过不少CV方向的顶会论文但笔试现场能直接用来答题的几乎为零。选择题考的是DBNet、CRNN、ResNet、FPN这类经典结构很少考最新的YOLOv8改了什么更不考2023年才出的新SOTA。简答题更是如此考的是方案设计能力和业务思考不是让你默写DETR的Transformer结构。这个现象其实非常正常。好未来的笔试是海选性质难度太深通过率会很低反而失去选拔意义。笔试阶段的核心目标是筛掉基础不牢的人面试阶段才是真正拉开差距的地方。所以备考时要分清主次优先级一经典网络结构和原理比如ResNet为什么能有效、BN到底做了什么、感受野怎么算。优先级二图像处理经典算法和OpenCV常用操作包括灰度变换、直方图、滤波、边缘检测、形态学。优先级三目标检测与分割的基本指标包括IoU、mAP、NMS的原理和计算。优先级四数据结构和算法刷题覆盖动态规划、贪心、二分、DFS/BFS、字符串处理。优先级五公司业务方向对应的视觉技术OCR、手写识别、公式识别、版面分析。5.3 一个容易被忽视的备考项概率统计和线代基础单选题里还出现了一些概率统计和线性代数的题比如行列式的计算、方阵的特征值、条件概率和贝叶斯公式、期望与方差的性质。有一道题印象很深两个随机变量的方差分别为4和9相关系数为0.5问两者之和的方差。答案是4 9 20.5sqrt(4*9) 4 9 6 19。这类题在机器学习里会频繁用到基础不牢很容易被绕进去。备考时除了看计算机视觉的教材至少要把《机器学习》周志华前几章讲过的特征值、矩阵分解、概率公式、协方差和相关系数这些内容过一遍。搞视觉的普遍对线性代数不陌生毕竟天天跟矩阵打交道但概率论里偏统计推断的部分容易遗忘建议专门补一补。6. 从这场笔试反推的秋招备考节奏与后续调整6.1 笔试前一个月怎么安排复习最稳妥如果把好未来笔试看作秋招视觉算法岗的标准样本我的备考节奏可以这样规划第一周系统过基础理论。用李航的《统计学习方法》加周志华的《机器学习》把监督学习的核心模型LR、SVM、决策树、集成学习和评估指标过一遍。深度学习的部分重点看CNN的基础组成、训练技巧、经典网络结构。第二周图像处理和OCR专项。用《数字图像处理》冈萨雷斯配合OpenCV文档把直方图、滤波、形态学、边缘检测等基础操作全部过一遍代码。OCR方向深入了解文本检测和文本识别的经典方案有条件的话跑一个简单的OCR Demo。第三周项目复盘加模拟笔试。把自己做过的视觉项目按问题定义、方案设计、模型选型、评估指标、迭代过程、最终效果的框架整理成篇。找两套往年的视觉算法岗笔试真题严格按120分钟模拟做一遍重点感受时间分配。第四周编程题冲刺加业务调研。每天3-5道LeetCode中等难度的题重点覆盖动态规划、贪心、二分、双指针。同时把目标公司最近一年的技术公众号文章、公开演讲、招聘JD全部看一遍提炼他们业务中可能涉及的技术方向。6.2 代码能力之外的软实力讲清楚比做出来更重要这场笔试让我意识到视觉算法岗的考察越来越不局限于会跑模型而是考察会思考模型。简答题对方案设计的重视程度反映出教育科技公司对算法工程师的预期你不仅要能训练出一个高精度的模型还要能解释清楚每条技术路线的取舍能说清数据从哪来、bad case怎么处理、模型上线后怎么监控。我认识一个进了好未来面试的同学他说面试环节基本是在简历项目和笔试简答题的基础上延伸比如会追问你的OCR模型在模糊图片上效果差你打算在数据层面还是模型层面改善具体怎么做这类问题。所以笔试不是为了考倒你而是为了面试环节埋下伏笔。6.3 笔试当天的细节设备调试、草稿纸、代码编辑器最后分享几个笔试当天的实操建议设备提前一天测试摄像头、麦克风、浏览器兼容性。牛客网笔试建议用Chrome关闭所有无关标签页和通讯软件。双机位需要一部手机要提前准备好一个稳固的手机支架。草稿纸准备至少3张A4空白纸。单选里那些概率统计的计算题、编程题的边界条件推导都需要纸笔。我考的时候旁边放了一摞草稿纸手感踏实很多。编程环境牛客的在线编辑器支持多种语言但默认的代码补全很弱。提前规划好自己用哪种语言作为主力Python的话把常用的输入输出模板提前背熟比如列表转数组、字符串切分、二维矩阵读入。心态单选题如果卡了超过1分钟果断猜一个跳过。笔试是海选目标是过线而不是满分一道选择题的死磕很可能导致后面简答题没时间写完整得不偿失。根据我个人经验好未来笔试的难度在秋招视觉岗里属于中等偏上但它的风格很典型——既考察作为算法工程师的基本素养又兼顾了具体业务场景里的技术应用。如果你把基础概念、经典算法、项目复盘、业务理解这四块都准备扎实了通过笔试并没有想象中那么难。希望这篇复盘能给你带来一些实际的参考价值。

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价