滴滴CV岗笔试复盘:题型考点与图像处理编程题实战解析 📅 发布时间:2026/8/30 5:13:13 👁 浏览次数: 滴滴出行2018校园招聘网申笔试的计算机视觉研发工程师岗位我第一次打开试卷系统时其实有点意外。原以为会大面积堆深度学习模型推导结果整张卷子更像是一次“视觉问题解决能力”的侧写数学、图像处理、机器学习和一两道需要手写的编程题时间紧到不给你临时翻资料的余地。这篇文章不是官方答案而是我作为应试者视角的完整复盘覆盖题型结构、高频考点、一道典型图像处理编程题的实操解法以及针对这类岗位笔试的备战路径。无论你现在准备校招、找实习还是想跳槽到视觉算法岗这套拆解思路应该都接得上。1. 为什么 2018 年滴滴的计算机视觉岗笔试值得单独拿出来复盘1.1 出行场景背后的视觉岗位画像2018年前后的滴滴正在从网约车平台往“技术和安全”方向补课。司机证件审核、车内安全监控、地图数据采集、自动驾驶感知每一个方向都需要计算机视觉的人。这个岗位在校招里通常归在“研发工程师”序列但笔试考察的画像很明确不只要懂算法还要能把算法接到真实场景里。什么叫“真实场景”拿司机疲劳驾驶检测举例你在课堂上学过做人脸检测、关键点定位、分类但落到车上你还要处理红外摄像头下的低照度噪声、夜间反光、司机戴眼镜或者口罩、头部大幅度转动以及边缘设备的算力约束。笔试未必直接考这么细但它会在选择题和简答题里埋入类似的取舍逻辑比如“在低算力设备上做实时目标检测你选哪个模型”“如何用传统图像处理方法快速找到车道线”。所以这场笔试不是单纯考察知识面更像是在看候选人有没有“业务感”。同样的知识点网上的教程会讲“HOG特征配上SVM可以做人脸检测”而业务导向的题目会问“在复杂背景下HOG对光照变化敏感你会怎么做预处理”。这两种答题深度在阅卷人眼里完全不同。1.2 笔试在整个校招流程中的定位滴滴的校招流程通常是网申、在线笔试、一轮技术面、二轮技术面、HR面。笔试是简历筛选之后的第一道硬门槛也是唯一一个完全靠当场输出、不看你实习经历和学校背景的环节。对非头部学校但实际能力不错的同学来说这其实是很好的扳回一城的机会反过来简历很漂亮但基础不扎实的人很可能在这一轮被筛掉。计算机视觉研发工程师的第二批笔试整体难度和第一批相比没有本质差异但因为参与人数更多竞争往往更激烈。我在复盘时发现绝大多数人不是被难题卡死的而是在简单题上浪费了太多时间最后编程题没时间写完整。笔试的目标本来就不是满分而是稳定拿住该拿的分刷掉错误选项用剩余时间保住大题。这一点想明白后面所有策略才有意义。2. 卷面结构还原从选择题到编程题时间是怎么被吃掉的2.1 题型分布与参考占比不同批次的在线笔试题型会有微调但从“计算机视觉研发工程师”这个岗位的普遍出题逻辑来看卷面大体由三块构成客观题、简答题、编程题。以下是我根据记忆和同类岗位笔试整理的参考结构不是官方数据但可以作为备考框架题型数量范围考察内容建议用时单选/多选题15-25道高数、线代、概率、数据结构、机器学习、图像处理35-40分钟简答题2-4道传统视觉算法、深度学习方案设计、业务场景分析20-30分钟编程题1-2道数组、矩阵、搜索、动态规划可能结合图像处理背景45-50分钟选择题里高数和线代不是死记硬背而是考应用。比如给你一个 3×3 的卷积核问它对图像做了什么操作给你一个协方差矩阵问它的主成分方向给一组样本问贝叶斯公式的后验概率。这些题目本身不难但如果你已经脱离数学一年多很容易在考场上卡壳。数据结构和算法题也会出现比如二叉树遍历、链表操作、动态规划这部分和通用后端笔试高度重合。图像处理和机器学习相关的选择题则更贴近视觉岗位自身的知识结构比如“下列哪种滤波方式能够保留边缘信息”“Sobel算子的卷积核尺寸通常是多少”“TensorFlow和PyTorch中哪个操作用于计算梯度”等。2.2 简答题的考察逻辑方案设计比背概念更重要简答题是很多人的得分洼地因为平时刷题很少练这种开放式回答。它通常不会要你写出完整的代码而是给出一个具体问题让候选人给出解决思路。比如设计一个检测司机打哈欠的算法流程对车载摄像头拍摄的道路图像做车道线检测你会怎么处理如何用有限样本训练一个准确率较高的车型识别模型解释目标检测中 IoU 和 NMS 的作用并说明它们的缺陷。这类题目的高分答案往往具备三个特征结构化、有取舍、有量化指标。不要只写“用CNN提取特征然后分类”而是把流程拆成预处理、特征提取、模型选择、后处理、性能评估五步每一步给出具体工具或算法名顺带提一句计算瓶颈在哪里。阅卷人会根据你写出的步骤完整度和工程判断来给分而不是看你堆了多少名词。2.3 最容易吃时间的两个坑第一个坑是在多选题上过度纠结。多选少选不得分或者扣分所以很多人会反复推敲某一题的某个选项五分钟就没了。我的建议是每一道客观题限制在一分半以内实在拿不准的就按第一直觉选完标记等编程题写完再回头检查。第二个坑是低估在线笔试系统的环境差异。很多笔试系统不提供本地 IDE只有网页编辑器还可能有自动补全缺失、缩进混乱的问题。如果你平时用惯了 PyCharm 或 VS Code突然切到简洁网页连函数签名都可能打错。所以备考阶段至少要有三次用网页代码编辑器做题的经历提前适应手感。3. 核心考点拆解图像特征、目标检测与深度学习的常见出题姿势3.1 图像处理基本功滤波、边缘检测、特征描述子图像处理题在笔试里占比不低而且出题很细。最常考的几个方向我帮你梳理一下。滤波本质上是图像与卷积核的运算。高斯滤波是线性滤波适合去高斯噪声但会模糊边缘中值滤波是非线性滤波对椒盐噪声特别有效而且能在一定程度上保留边缘。这是一个非常高频的对比题常见考法就是给你一幅带有某种噪声的图片问用什么滤波效果最好。答案如果区分不了高斯噪声和椒盐噪声就容易出错。边缘检测方面Sobel 算子基于一阶导数计算梯度幅值和方向简单快速Canny 算子包含高斯平滑、梯度计算、非极大值抑制、双阈值滞后处理对噪声更鲁棒边缘也更细。面试和笔试都爱问“Canny 和 Sobel 的区别”其实答案就落在“是否做了非极大值抑制”和“是否使用双阈值”上。特征描述子里SIFT 具备尺度和旋转不变性但计算量大SURF 是 SIFT 的加速版本ORB 比两者更快更适合实时系统HOG 统计梯度方向直方图常与 SVM 配合做人检测。笔试中的考法很直接比如“对光照变化最鲁棒的特征是什么”“在嵌入式设备上做实时特征匹配选什么”你需要把每种方法的“不变性”和“实时性”对应起来。3.2 目标检测模型对比两阶段与单阶段目标检测是计算机视觉岗位最重要的方向之一笔试中几乎必有一题。两阶段模型以 R-CNN 系列为代表先生成候选区域再对每个区域进行分类和回归准确率高但速度慢。单阶段模型以 YOLO 和 SSD 为代表直接在图像上预测边界框和类别速度快但早期版本对小目标不友好。模型核心思想优点劣势适用场景R-CNN候选区域 卷积网络分类准确率高速度慢流程复杂离线分析Fast R-CNNRoI Pooling 共享卷积计算比 R-CNN 快候选区域生成仍是瓶颈实验室研究Faster R-CNNRPN 网络生成候选框端到端、精度高速度仍受限精度优先任务YOLO网格回归边界框实时性好小目标检测弱视频流、车载感知SSD多尺度特征图预测速度精度平衡需要调参通用检测任务笔试问“为什么 YOLO 速度比 Faster R-CNN 快”本质是在考两者流程差异。YOLO 将目标检测建模为一次回归问题把整张图分成网格每个网格预测边界框和类别概率Faster R-CNN 先由 RPN 生成候选框再对候选框分类和回归。没有候选区域生成这一步自然节省大量时间。同时要掌握评估指标。IoU 计算预测框和真实框的交并比NMS 用于抑制同类别重复框mAP 是每个类别 AP 的平均值。选择题里容易出现“NMS 的输入是什么、输出是什么”“mAP 计算中 AP 曲线下面积怎么理解”这类概念题。3.3 卷积操作与感受野一道题就能看出基本功有一类题目几乎是视觉岗笔试的“保留曲目”给定输入尺寸、卷积核尺寸、padding 和 stride求输出尺寸。公式很简单输出尺寸 floor((W - K 2P) / S) 1。如果输入是 224×224卷积核是 5×5padding 是 2stride 是 1输出尺寸就是 224因为 padding 把边界补了回来。感受野也很常考。给你一串卷积层配置求最后特征图上某一点对应原图的区域大小。计算公式是叠加逐层累加每层感受野 上一层感受野 (kernel_size - 1) × stride_累积。比如第一层 3×3 卷积 stride 为 1感受野是 3第二层 3×3 卷积 stride 为 2累积感受野不是 5而是 3 (3-1) × 2 7。很多人在这里算错是因为忽略了 stride 的累积。这类题没有捷径就是多刷几道计算例子。我会建议把所有常见的 CNN 配置组合都手推一遍搞懂“为什么小卷积核堆叠能替代大卷积核”比如两个 3×3 卷积堆叠感受野等于一个 5×5 卷积但参数更少、非线性更强。这部分既考数学也考对网络设计的理解。3.4 场景化简答题的答题模板面对“设计一个XX检测系统”这类问题我会用四段式结构去回答。第一段讲清楚任务定义和输入输出输入是视频流还是单帧图像输出是报警信号还是结构化信息。第二段讲数据训练数据从哪来如何标注正负样本比例失衡怎么处理。第三段讲算法前处理、主干网络、后处理具体到模型名称和损失函数。第四段讲工程约束帧率要求、算力资源、模型大小以及如何在精度和速度之间取舍。举例来说如果题目是“设计司机疲劳检测系统”我的答案会这样组织输入为驾驶室摄像头实时视频流输出为疲劳等级或报警信号数据方面采集不同光照、不同遮挡、不同人种样本标注眼睛闭合状态、打哈欠频率、头部姿态算法上先做人脸检测与关键点定位再计算 PERCLOS 眼睛闭合率结合嘴部纵横比判断哈欠叠加头部姿态变化输入轻量级时序模型工程上控制在 15-30 FPS用 INT8 量化部署到嵌入式设备。这种答题方式不一定有标准答案但它展示了你在真实项目中会怎么思考比写一堆“用深度学习方法”要实在得多也更容易拿高分。4. 一道图像处理编程题的完整复盘从审题到代码实现4.1 题目场景还原与输入输出约定编程题里面有一类非常典型的题目是“计算最大连通域面积”。它表面是图像处理题实际考的是搜索算法、边界条件处理和二维矩阵遍历。为了帮你完整复盘我把它还原成一道可以在笔试系统里直接运行的题目。题目描述给定一个 m × n 的二维矩阵矩阵元素为 0 或 1其中 1 表示前景像素0 表示背景。如果两个 1 像素在上下左右四个方向上相邻则它们属于同一个连通区域。请输出最大连通区域的像素个数。输入格式第一行为两个整数 m 和 n表示矩阵行数和列数接下来 m 行每行 n 个整数每个整数为 0 或 1用空格分隔。输出格式一个整数表示最大连通区域的像素个数。示例输入4 5 1 1 0 0 1 1 0 0 1 1 0 0 1 0 0 1 0 1 1 0对于这个示例手动点一下会发现左上角那块由 (0,0)、(0,1)、(1,0) 构成面积是 3中间偏右的一块由 (0,4)、(1,3)、(1,4) 构成面积是 3最下方中间区域由 (2,2)、(3,2)、(3,3) 构成面积也是 3。所以答案是 3。看似都是 3但考场上如果矩阵再大一点肉眼就数不过来了必须用算法。4.2 解题思路BFS 是最稳妥的选择这道题的解法有很多种DFS、BFS、并查集都能做但在在线笔试环境里我会优先推荐 BFS。原因是DFS如果用递归实现遇到很大的连通区域时系统递归深度过大容易爆栈Python 环境下尤其明显。BFS 用队列迭代实现没有递归深度问题代码结构也清晰。核心思路是这样的遍历整个矩阵的每一个像素当遇到一个值为 1 且没有访问过的像素就以它为起点开始广度优先搜索。搜索过程中把当前像素的上下左右四个邻居放进队列同时标记为已访问每弹出一个像素就把面积计数器加 1。当队列为空时说明这个连通区域已经全部遍历完用当前面积和全局最大值进行比较。这样遍历完全部像素后得到的就是最大连通域面积。需要注意的一点是“访问标记的时机”。很多新手会先把像素加入队列等出队时才标记已访问这样会导致同一个像素被重复加入队列多次轻则浪费时间和内存重则死循环。正确的做法是在入队时就标记为已访问这样即使遇到多个邻居指向同一个像素也不会重复入队。4.3 参考代码与输入解析细节下面是一份可以直接运行的 Python 代码。输入解析用sys.stdin.read()一次性读取所有字符再 split这样可以避免input()在输入量较大时的性能问题也不用来回处理换行符。import sys from collections import deque def max_connected_area(grid, m, n): if m 0 or n 0: return 0 visited [[False] * n for _ in range(m)] directions [(1, 0), (-1, 0), (0, 1), (0, -1)] max_area 0 for i in range(m): for j in range(n): if grid[i][j] 1 and not visited[i][j]: queue deque() queue.append((i, j)) visited[i][j] True area 0 while queue: x, y queue.popleft() area 1 for dx, dy in directions: nx, ny x dx, y dy if 0 nx m and 0 ny n: if grid[nx][ny] 1 and not visited[nx][ny]: visited[nx][ny] True queue.append((nx, ny)) if area max_area: max_area area return max_area def main(): data sys.stdin.read().strip().split() if not data: return it iter(data) m int(next(it)) n int(next(it)) grid [] for _ in range(m): row [] for _ in range(n): row.append(int(next(it))) grid.append(row) print(max_connected_area(grid, m, n)) if __name__ __main__: main()代码不复杂但有几个细节值得注意。visited是独立的一个二维数组没有直接去修改grid这是一种更安全的做法因为笔试系统可能会在同一个输入上多次调用你的函数如果你把grid中的 1 改成 0 来标记已访问第二次调用结果就不对了。directions中四个方向用一个数组统一管理代码会更整洁。边界判断0 nx m and 0 ny n放在数组访问之前可以避免索引越界异常。4.4 现场踩坑记录与调试过程我第一次在笔试环境写这道题时犯了两个典型的错误今天写出来供你参考。第一个错误是用了递归 DFS。当时觉得 DFS 代码更短三行就能写完结果遇到一个 200×200 的全 1 矩阵递归深度直接超过 Python 默认限制报RecursionError。在线笔试系统一般不会允许你去修改递归深度所以我后来彻底改用 BFS再也没出过这个问题。第二个错误是输入解析。我一开始用input()一行一行读取但如果某一行末尾多了空格split()之后依然正常真正的问题在于如果题目给的是多行数据而某些行被系统用空行分隔input()就会读到空字符串导致int()转换报错。改用sys.stdin.read().strip().split()之后空格和空行都会被统一处理所有数据进入一个列表再按顺序读取就非常稳。还有一个小技巧笔试时如果时间紧张可以先写暴力解法拿到部分分再逐步优化。比如这道题你先用 DFS 实现如果系统小数据集能通过大数据集超时至少能拿到一部分测试用例的分数。在总分制的笔试里每一分都很重要。4.5 边界条件与扩展方向这道题还有几个边界条件需要额外注意m 或 n 为 0 时直接返回 0矩阵中没有 1 时最大连通域面积按理说应该是 0单个 1 像素也算面积 1。这些情况不值钱但漏掉任何一个都可能导致测试用例 fail。如果题目把连通规则从四连通改成八连通也就是上下左右再加四个对角方向只需要在directions里增加(1,1)、(1,-1)、(-1,1)、(-1,-1)四个方向即可。某些场景下八连通更符合真实图像的像素邻接关系比如在分析语义分割掩膜时通常用八连通来合并小区域。更进阶的延伸是把这道题连接到真实图像处理中的连通域标记算法比如 two-pass 算法它可以在一次遍历中给每个连通域打上不同的标签。如果你在项目里用过 OpenCV 的connectedComponentsWithStats应该知道它返回每个区域的面积、外接矩形和质心这些信息可用于筛选小噪点区域、提取大目标等操作。笔试往往不会考到这么深但有这个知识储备面试时可以很自然地展示工程能力。5. 备战这一类岗位笔试的路径与现场应试节奏5.1 四周复习计划怎么排如果你现在距离笔试还有一个月我建议把时间切成四个阶段。第一周主攻数学和图像处理基础。高数里的偏导、极值线代里的矩阵运算、特征值分解概率里的条件概率、贝叶斯公式、常见分布这些是选择题的高频区域。图像处理至少要看完滤波、边缘检测、直方图均衡化、形态学操作、HOG 和 SIFT 的原理。不要只背结论尽量自己用 NumPy 写一遍 Sobel 边缘检测哪怕只有 30 行代码也会让理解深刻很多。第二周主攻机器学习与深度学习。机器学习重点看逻辑回归、SVM、决策树/随机森林/GBDT、混淆矩阵、精确率/召回率、ROC/AUC。深度学习重点看 CNN 基本结构、反向传播过程、感受野计算、dropout 和 batch normalization 的作用以及目标检测模型的演进脉络。第三周进入刷题模式。LeetCode 上优先刷数组、矩阵、BFS/DFS、动态规划这几类高频题比如岛屿数量、图像渲染、旋转矩阵、最大正方形。同时专门找三到五道带图像背景的编程题练习培养“看到二维矩阵就想到搜索”的条件反射。第四周做限时模拟。找一套往年的校招笔试题设置 120 分钟闹钟用网页代码编辑器完成整套题。模拟时不要中断让自己适应系统界面、倒计时压力和多题切换的状态。模拟完后的错题整理比你再多刷 50 道题都有价值。5.2 现场做题的高效顺序开考后的前五分钟先不要急着做题。快速浏览整个卷面判断各题难度和分值占比脑子里形成一个大致的时间分配方案。我的习惯是先做编程题里最有把握的一道因为那时候头脑最清醒做完之后心里有底再去处理选择题压力会小很多。如果你发现某道选择题完全不会先选一个最可能的答案并标记千万不要停在上面耗时间。简答题不要空着哪怕只写出流程框架和关键词也有可能拿到部分分数。编程题如果写不出最优解就写暴力解先保证运行结果正确再去想优化。最后留出五到十分钟检查。重点检查编程题的输入输出格式、边界条件、变量名拼写以及是否有地方把visited和grid搞混。很多时候笔试分数差就在这些细节上。5.3 我的个人心得笔试并不是终点坦白讲计算机视觉岗笔试的难度往往比面试低一些但它的筛选效率极高。笔试通过的人不一定知识面最广但一定是基础扎实、能在限时环境下稳定输出的人。这种能力在后续实习和工作中非常关键因为真实项目里的问题往往也是在时间压力下要求你快速拆解、快速验证。经历过这次笔试复盘我最大的体会是不要用“刷题数量”来代替“知识体系”。你要是只刷了 200 道 LeetCode却不理解 HOG 为什么对光照敏感不理解 NMS 到底在解决什么问题遇到业务向的简答题依然会露怯。反过来把基础原理吃透再把常见的搜索、DP、矩阵题练熟应对这类笔试会从容很多。最后再分享一个我后来一直沿用的习惯每次笔试结束后不管考得好不好都趁记忆新鲜把题目和答案复盘一遍。不需要写得特别工整关键是记录下“当时为什么卡住”和“正确解法是什么”。这些记录回头翻看时特别有用因为校招笔试的考点高度重叠一次复盘往往能给下一场笔试省出不少时间。