大疆笔试-计算机视觉算法B卷,这几个字在我收到笔试邮件之前就已经在各大校招群里刷屏了一周。真等到自己坐在摄像头前、打开答题页的那一刻,反而比预想中平静许多。整场笔试考下来我的感受是:这份卷子没有刻意刁难人,但也绝不让你轻松过关,它明显带着“做视觉系统的人”的出题思路,跟单纯刷LeetCode的互联网大厂笔试是两个路子。
这篇文章我打算完整复盘一下这场笔试,覆盖题型构成、核心考点、编程题解题思路,以及从笔试到面试衔接阶段的一些体会。如果你正准备投大疆的计算机视觉算法岗,不管你是应届生还是想跳槽的工程师,这篇内容应该都能帮你少踩几个坑、少走点弯路。
1. 大疆计算机视觉算法岗笔试全景速览
1.1 笔试平台与题型分布
先说考试形式。我这次参加的是计算机视觉算法B卷,整场考试在线上完成,用的是赛码网这个平台,全程摄像头监控加屏幕录制,浏览器会锁定在答题界面,一旦切出去超过三次就直接交卷。所以考试环境一定要提前弄好,找个安静房间,把手机放远一点,什么IM消息弹窗、浏览器插件通知全部关掉,别因为这些无关因素白费一次机会。
从题型分布来看,B卷和市面上能搜到的A卷回忆版大同小异,整体分为三个部分:
| 题型 | 题量 | 建议用时 | 考察重点 |
|---|---|---|---|
| 单选题 | 10道 | 25分钟 | 机器学习、图像处理、多视角几何基础 |
| 不定项选择题 | 5道 | 15分钟 | 深度学习细节、算法复杂度、C++特性 |
| 编程题 | 3道 | 60分钟 | 数据结构与算法、边界处理、代码风格 |
| 简答题 | 2道 | 20分钟 | 视觉系统设计、工程方案选型 |
大疆的笔试时间通常是2小时左右,题量不算大,但考察面很宽。我拿到的B卷在简答题部分明显侧重“视觉感知在机器人上的落地”,这和A卷的回帖里提到的“更偏图像处理理论”有一些差异。所以如果你投的是不同的事业部,笔试侧重点会有区别,这个后面细说。
1.2 考察知识点地图
我复盘完试卷之后,整理了一份高频考点地图,基本覆盖了大疆近两年计算机视觉算法岗的考察范围:
- 图像处理基础:Sobel算子、高斯滤波、形态学操作、直方图均衡化、图像金字塔。
- 多视角几何与相机模型:针孔模型、内外参数标定、透视几何、单应矩阵、对极约束、双目立体匹配。
- 深度学习:卷积网络基础、目标检测框架、IoU计算、BatchNorm作用、损失函数设计。
- 数据结构与算法:排序和查找、二分变形、贪心、动态规划、并查集、图论基础。
- 数学基础:线性代数(特征值、SVD)、概率论(极大似然、贝叶斯)、最优化方法。
- C++与工程:STL使用、智能指针、内存管理、多线程、代码复杂度。
注意,大疆的视觉算法笔试和其他公司最大的区别是:它非常愿意在选择题里考“工程直觉”。比如问你在嵌入式平台上部署一个检测模型,哪种结构更合适,这类题目不是单纯背概念就能答对的,需要你对模型计算量、参数量、延迟这些维度有真实的感知。
我这次就栽了一道关于双目立体匹配的不定项选择,选项里BM、SGBM、GC等几种算法的对比,考察它们的精度和速度排序。这题如果只看过论文标题没有实际跑过OpenCV接口,很容易混淆。所以如果有时间,建议备考阶段把OpenCV里经典的stereo算法模块亲自跑一遍,看效果、看耗时,比纯背书强太多。
2. 核心考点拆解:视觉基础与图像处理
2.1 传统图像处理算法考点
大疆笔试选择题很喜欢考传统图像处理的基础,这跟很多纯互联网公司一上来就是深度学习八股有挺大区别。我印象最深的一道题是给出一个Sobel算子的卷积核,问它是用来检测水平边缘还是垂直边缘,还追问了它的输出值范围和梯度方向。
Sobel算子本质上是一个离散微分算子,通过计算图像灰度在水平和垂直方向的近似梯度来做边缘检测。水平方向的Sobel核是这样:
-1 0 1 -2 0 2 -1 0 1这个核的特点是中间行权重为2,目的是在抑制噪声的同时加强中心像素的贡献。如果拿这个核去卷积图像,它响应的是x方向(水平方向)的灰度变化,也就是说它检测的是垂直边缘。同理,转置之后的核检测水平边缘。这个点看起来基础,但很多人真到了考场上反而会绕晕。
关于Sobel,我还想多提一句:它计算出来的梯度幅值通常是先求两个方向梯度的平方和再开根号。笔试中常见的一个坑是,如果题目只让你求近似幅值,可以直接用两个方向梯度绝对值之和来近似,这也是实际工程中为了降低计算量常做的优化。大疆喜欢考这种“理论正确但实际会优化”的知识点,因为做嵌入式视觉算法确实要考虑算力开销。
另外,双边滤波、中值滤波、高斯滤波的区别也是高频考点,尤其是它们对噪声的适用场景:高斯滤波适合处理高斯噪声但会模糊边缘,双边滤波在保边去噪上有优势,中值滤波则对椒盐噪声效果极好。我记得有一道选择题就是给定一幅含椒盐噪声的图像,问哪种滤波效果最好,答案显然是中值滤波。
2.2 透视几何与多视角几何
多视角几何这块是大疆笔试相对其他公司来讲出得比较深的模块,毕竟无人机的视觉定位、避障、建图全靠这些基础理论。B卷里有一道简答题直接让我描述从双目图像计算深度图的主要流程,这明显是冲着大疆的感知业务去的。
双目立体匹配的核心流程大概是四步:第一步是极线校正,通过立体校正把左右图像的行对齐,让对应点在水平方向搜索即可;第二步是代价计算,常用的有基于像素灰度差的绝对差和、基于梯度的代价,以及互信息这类更鲁棒的度量;第三步是代价聚合,这一步是SGBM和BM拉开差距的地方,SGBM会沿着多个路径做动态规划,把孤立像素的匹配代价在邻域内平滑,抑制匹配噪声;第四步是视差优化,通过左右一致性检查剔除遮挡区域的错误匹配,再用亚像素插值提高精度。
最后用三角形相似原理,根据视差d、基线距离B和焦距f算深度Z,公式是Z = f * B / d。这个公式在大疆的笔试里出现频率极高,不管是选择题还是简答题都喜欢往里嵌。我记得当年学这个公式的时候总觉得太简单,后来在真实项目中标定相机、调立体匹配参数才发现,从公式到稳定的深度图输出,中间隔了无数工程细节。
透视几何相关的还有单应矩阵和基础矩阵的区别。单应矩阵描述的是同一个三维平面在两个相机视角之间的映射关系,适用于地面平面、墙面这类平面场景,无人机落地、俯视跟踪地面目标经常会用;基础矩阵则描述的是两个相机在不同位置观察同一个三维点时,两幅图像对应点之间的对极约束关系,适用于一般的非平面场景。笔试如果出这类题,通常会给你一个应用场景问你该用哪个模型,比如“无人机拍摄地面已知高度的跑道标识,想要估计无人机相对跑道的姿态,用什么模型”,这种题的正确答案一般是单应矩阵,因为跑道可以近似看作一个平面。
2.3 数据结构与算法基础
说实话,我一开始以为视觉算法岗笔试的编程题会考图像处理相关的内容,结果拿到卷子发现,编程题三题全是纯算法题,跟视觉关系不大,这其实和大疆出题的策略有关:编程题考的是你解决问题的底子,视觉知识放在选择题和简答题里考。所以备考的时候千万别只刷视觉题,LeetCode该刷还是要刷。
大疆笔试的算法题难度大概在LeetCode中等偏上,不怎么会出特别偏的hard题,但是会在经典题型的变形上做文章。下面这些是我在B卷和往年题里见到过的类型,大家复习的时候可以重点留意:
- 二分的各种变形:旋转排序数组里找目标值、找峰值、二分答案求极值。
- 贪心算法:跳跃游戏、区间调度、分饼干。
- 动态规划:最长公共子序列、0-1背包变体、背包方案数。
- 图论:拓扑排序、最短路径、最小生成树、并查集判断连通性。
- 字符串:KMP匹配、回文子串、滑动窗口。
- 基础排序:快排、归并排序的手写,堆排序的调整过程。
我特别想提醒一点:大疆的编程题经常有“大数据量”这个隐藏条件,比如序列长度在10^5到10^6级别,这就意味着O(n^2)的解法大概率只能过部分用例,必须在设计算法时就把复杂度卡在O(n log n)以内。笔试时如果你先想到了暴力解法,用到一半发现复杂度不对,千万别抱着侥幸心理继续写,果断停手重新想才是明智的选择。
3. 编程题实战:从算法模板到现场发挥
3.1 高频算法题类型分析
编程题第一题往往是比较友好的签到题,但千万不要因为简单就大意,边界条件处理不好照样会卡壳。我记得B卷的第一道编程题是一道查目标值的题,本质是二分查找的变体,数列是一个有序数组在某个位置旋转之后得到的。题目要求找目标值在数组中的下标,如果不存在返回-1。
这道题的核心思路是:虽然数组整体不是完全有序的,但每次二分之后,左半部分或者右半部分一定有一边是有序的,利用这个性质可以把搜索范围缩小。具体来说,先比较中间元素和左边界元素的大小关系,判断左半区是否有序,如果左半区有序且目标值落在左半区范围内,就收缩右边界;否则向左边界方向收缩。还有一种情况是存在重复元素时,nums[mid]等于nums[left]会导致无法判断有序区间,这时候只能把左边界右移一位,复杂度退化到O(n)。大疆的题目一般不会用重复元素来卡你,但考场上要能想到这个退化情况。
编程题第二题考的是贪心算法,基本就是LeetCode上的跳跃游戏II原题变形,给你一个非负整数数组,每个元素表示你在该位置最多能跳多远,问到达最后一个位置需要的最少跳跃次数。乍一看这题可以用动态规划,但n能到10^6,O(n^2)的DP直接超时,正确做法是BFS式的贪心。
贪心的思路是维护当前一步能到达的最远距离curEnd和下一步能到达的最远距离nextEnd,遍历数组时不断更新nextEnd,当遍历到curEnd时说明必须再跳一步,跳跃次数加一,并把curEnd更新为nextEnd。这里有一个细节是:遍历不需要到最后一个元素,因为最后一个元素不需要跳出去,如果遍历到最后一个元素再触发跳跃判断,结果会多算一步。这类细节就是笔试刷人最狠的地方,思路对了但差一个边界条件,用例过不了一半。
第二题我在笔记本上重新写了一遍标准解法,代码如下,供大家参考:
int jump(vector<int>& nums) { int n = nums.size(); if (n <= 1) return 0; int jumps = 0; int curEnd = 0; int nextEnd = 0; for (int i = 0; i < n - 1; ++i) { nextEnd = max(nextEnd, i + nums[i]); if (i == curEnd) { jumps++; curEnd = nextEnd; if (curEnd >= n - 1) break; } } return jumps; }第三道编程题我记得是一道DFS和状态的题目,有点类似岛屿问题,但加了一个方向限制。这类题在大疆笔试里出现的原因是视觉算法工程师日常避不开地图遍历、连通域分析、区域分割,DFS/BFS的功底直接决定你能不能高效地处理这些逻辑。
3.2 复杂度优化与边界处理技巧
关于复杂度的把控,我给一个简单可操作的参考线:如果数据量是10^5级别,O(n^2)的算法在满数据下大概要执行10^10次基本操作,按每次操作1纳秒算也要10秒,这在笔试的时限下基本不可能通过。所以看到这个量级的第一时间就应该往O(n log n)或O(n)的方向想。如果数据量只有1000级别,O(n^2)甚至是O(n^3)都还有机会,这时候可以更大胆地使用暴力方法或者动态规划。
边界条件这块,我总结了一些我在笔试和各种代码评审中经常使用的检查清单,分享给大家:
- 数组长度是0或者1的情况,尤其涉及循环、递归、跳转的时候最容易出错。
- 数值越界:涉及加法、乘法的时候思考是否需要long long,尤其是求中间值写mid=(left+right)/2可能越界,最好写成left+(right-left)/2。
- 二分查找不要死循环:判断更新边界时,确保left和right的变化可以收敛,且mid更新不会导致无限循环。
- 排序完的数组注意重复元素的处理,尤其是去重逻辑里最容易写错下标。
- 字符串问题注意空串和单个字符的情况,以及子串切割时索引越界。
- 图论问题注意孤立节点和重边,这在笔试用例里很常见。
还有一点是代码风格。大疆的笔试平台支持C++、Java、Python,我建议如果编程水平允许,优先选C++,因为大疆内部视觉算法岗以C++为主,笔试考场上用C++写代码给面试官的第一印象会更好。当然如果你Python特别熟,快速写原型也是可以的,但注意Python在同样数据量下可能超时,尤其是多层循环和DFS递归的时候。
3.3 手撕代码的现场策略
笔试现场的时间很紧张,编程题一共60分钟三道题,平均每道只有20分钟。我的建议是不要一上来就闷头写代码,先用3到5分钟在草稿纸上理思路,把暴力解法、复杂度、优化方向都列出来,确定一条可行路径再动手。
这里我特别推荐一个“三段式”写法:先写函数的整体框架和关键数据结构,再填充核心逻辑,最后补上边界条件判断。这样做的好处是即使时间不够没写完,阅卷系统也能看到你整体的解题思路,部分用例可能会给分。切不要纠结于把每一行代码都写得完美,笔试考察的第一优先级是AC,其次是代码的可读性,你这个代码总不能写完自己都看不懂。
动手之后写代码要一边写一边在心里跑用例,尤其是边界情况,比如空输入、单个元素、全重复元素、最大值溢出。很多题目的隐藏用例就是卡这些地方,提前自测一遍能避免比较大的失分。
还有一个小技巧是为笔试准备一套自己的常用模板,比如二分查找模板、BFS模板、并查集模板、滑动窗口模板,考场上直接默写基础结构,再变形适配题目。这个习惯能显著提升手写代码的速度,也能减少低级错误。我在备考阶段专门整理过一个模板文档,参加笔试前快速过一遍,心里会比较有底。
4. 实战题目复盘:难度分层与答题节奏
4.1 中等难度题目实例拆解
这里我拿一道在笔试群和论坛里讨论度很高的题目来做复盘,题目大意是:给定一个无向图,节点的编号从1到n,边列表给出所有连接关系,判断这个图是否是一棵树。
图是否是一棵树要满足两个条件:第一,节点数为n时边数必须等于n-1;第二,图必须是连通的,即从任意一个节点出发可以遍历到所有节点。如果只满足第一个条件还不够,比如两个环用一条边连起来,边数也可能是n-1,但整体不是树。
解法可以用并查集来判环加统计连通分量:遍历所有边,如果两个端点已经属于同一个集合,说明出现环,直接返回不是树;否则合并两个集合。遍历结束之后检查连通分量是否为1,如果是1且没有环,就是树。这道题考的是非常经典的思路,但它实际考察的并不只是背模板的能力,而是面对一个图论问题,你能否想到用并查集来同时完成判环和统计连通性这个设计能力。
关于这种题目还有一个快速判定方法:用DFS或BFS遍历一遍图,如果每个节点都访问到了,并且遍历过程中没有发现“访问到已在当前递归栈中的节点”(也就是不存在环),就能判定是树。DFS判环需要注意区分“访问过的节点”和“当前路径上的节点”,这跟有向图和无向图的处理方式还不一样,细节很值得留意。
4.2 综合性题目解题思路
大疆笔试的简答题不像算法题那样有标准答案,它更看重你的设计思路和工程判断。B卷里有一道题是“设计一个无人机视觉避障系统,在计算资源有限的前提下,如何选择传感器和算法方案”,这道题考察的是系统级思维,而不是某个模型的精度。
我当时的回答分了三个层次。第一层次是传感器方案:提出使用双目相机加超声波/ToF传感器融合,双目负责中近距离的障碍物检测和深度估计,超声波负责近距离的盲区补充,这样在成本和功耗上达到平衡。第二层次是算法选型:说明采用基于立体匹配SGBM或基于深度学习的分割网络,但考虑到嵌入式平台算力,需要对比两者的精度与帧率,如果设备侧芯片无法跑大模型,可以选择轻量级分割模型加传统立体匹配的组合,同时用CPU或者NPU做异构计算。第三层次是系统容错:讨论单目失效、光照变化、低纹理场景的兜底策略,比如单目相机在弱纹理环境下无法可靠估计深度,这时要优先信任ToF传感器,并降级到安全悬停。
这种题目其实没有标准答案,面试官想看到的是你有没有全局观。答题时最好先给一个总体架构,再分别讲感知、决策、执行三个模块怎么分工。每条都讲到“为什么选这个方案”、有什么代价,比列一堆名词要强得多。
4.3 答题时间分配与心理调整
我个人的时间分配方案是:前40分钟做选择判断,留80分钟给编程和简答。选择题里如果遇到拿不准的,先凭经验和直觉标记一个答案,不要停留超过2分钟,赶紧跳到下一题。很多人在选择题上死磕一道几何题,结果编程题时间不够,这才是笔试最大的坑。
编程题建议从第二题开始做,如果第二题一眼没有思路再回头做第一题。第一题虽然最基础但也不一定最容易写对,反而第二题有时候能用模板秒解。先做能拿分的题,剩下时间再去啃硬骨头。简答题放到编程题之后做,因为简答题是主观题,写满了基本都有过程分,而编程题答不上来就是零分,分值权重明显不一样。
心态方面也要注意,笔试环境有摄像头监控,旁边安静的氛围有时候反而会放大焦虑。我习惯在开考前做两次深呼吸,然后告诉自己:“这套卷子就是一次算法交流,我只要把会做的全做对,就有机会进面试。”抱着这种心态去答题,比一直想着“我一定要过”要稳定得多。
5. 备考建议与常见问题排查
5.1 三个月冲刺路线
如果你还有两三个月的时间准备大疆的视觉算法笔试,我建议分三个阶段来复习。
第一个阶段是用三到四周把基础补牢。视觉部分至少要把《计算机视觉:算法与应用》第二版的经典章节过一遍,尤其是图像处理、特征提取、多视角几何这几块,不需要背公式,但要理解每个算法的输入输出和适用场景。算法部分把LeetCode热门100题刷两遍,重点看数组、链表、二叉树、动态规划这四类。
第二个阶段是专题突破,大概用两到三周。针对大疆常考的方向,比如双目立体匹配、目标检测、图像分割、SLAM基础,每个专题找几篇综述和经典论文阅读,不需要理解所有公式,但要能讲清楚核心思想和优缺点。顺便整理一份自己的算法模板库,把常用的二分、BFS、DFS、并查集、前缀和、滑动窗口模板都写一遍,强化肌肉记忆。
第三个阶段是模拟实战,考前两周每周做两套完整笔试。可以用牛客网和赛码网的往年真题来模拟,严格按照2小时的时间限制,开着摄像头答题,尽量模拟真实环境。做完之后逐题复盘,把错题和模糊的知识点整理成错题本,考前最后两天只看错题本和模板库。
5.2 笔试踩坑实录与避坑清单
下面这些坑,都是我亲身踩过或者从朋友那边听到的真实案例,列出来给大家避雷。
多选不定项漏选错选严重扣分。大疆的不定项选择是少选和错选都不得分或只给部分分,所以不确定的选项不要选,选上的选项必须有理有据。
编译环境不熟悉。有的同学平时用VS Code配插件写代码很流畅,上了笔试平台用的是老旧的编辑器和GCC版本,连头文件少写include都能让他卡半天。建议在赛码网上提前做一套模拟题,熟悉平台的操作方式。
切屏被警告。考试期间系统检测到切屏会弹提示,超过三次直接强制交卷。有些同学习惯性地切到编译器本地调试,这在线上笔试是大忌。如果一定要本地调试,建议用双屏且确保不切换浏览器窗口,不过最安全的还是直接在答题页面的编辑框里写完自测。
死磕一道编程题。三道编程题如果一道题卡了40分钟,就算写对也严重压缩了后面的时间,大概率总分不高。遇到没思路的题跳过去,先把能拿的分拿稳。
简答题写得太泛。我见过有同学在简答题里写“用深度学习方法解决避障”,没有提到具体模型、训练数据、部署细节、模型量化和加速手段,这种答案在阅卷人眼里等于没写。每一段都要有信息量,至少要让面试官觉得你真的动手做过类似的系统。
5.3 大疆笔试的独特之处与后续面试衔接
大疆的笔试风格跟其他公司最不一样的地方在于:它比较看重传统视觉功底和系统设计能力,而不只是深度学习模型。你可能会在选择题里遇到光流法、特征匹配、RANSAC这些偏传统的概念,这类知识在现在的校招复习资料里反而容易被忽略,需要你自己额外补。
如果笔试通过,后面通常会有一到两轮技术面试,面试官会拿着你的简历和笔试成绩深挖项目。我特意总结了一下笔试和面试之间的联系:笔试简答题如果写了“用双目立体匹配加深度学习分割做避障”,面试官大概率会顺着这个话题让你详述方案,问你怎么做极线校正、代价聚合、深度图滤波,以及遇到弱纹理区域怎么办。所以笔试简答题千万别编自己没有做过的方案,写上去的内容要经得起追问。
还有一点,大疆非常看重候选人对产品的理解。面试中可能会问“你觉得无人机在复杂森林环境里避障最大的难点是什么”这类开放问题,回答时能结合视觉算法的实际约束,比如光照剧烈变化、运动模糊、低纹理区域、计算资源限制,会比泛泛谈“用深度学习”更有说服力。
写在最后的一点体会
把这场笔试完整复盘下来,我自己最大的感受是:大疆考的很多知识点并不冷门,但它的出题方式要求你真正动手做过东西,而不是停留在看过论文和博客的层面。Sobel算子背一百遍不如自己在OpenCV里跑一遍,SGBM的四个步骤背得再滚瓜烂熟,不如亲手调一次参数、看看弱纹理区域视差图上的黑洞。
如果只让我给一条考前建议,我会说:把从图像输入到深度输出这条链路亲手实现一遍,把每种经典算法的适用场景和优缺点用表格整理清楚,再配合LeetCode刷题把代码功底练扎实,大疆这套笔试就没有想象中那么可怕。祝大家都能顺利通过笔试,拿到心仪的面试机会。