尧图建网站 尧图建网站 YAOTU WEB BUILD 免费咨询
ARTICLE DETAIL

资讯详情

深耕网站建设与建站编程的一线实战洞察。

3D视觉算法实习生笔试核心考点与备考策略

3D视觉算法实习生笔试核心考点与备考策略 2018年春天我投了网易计算机视觉算法实习生岗位方向是3D视觉。笔试是在线上做的时间大概两个小时左右题目不算偏但覆盖范围很广计算机视觉、3D视觉、机器学习、数据结构算法都有。当时做完最大的感受是光刷LeetCode不够还得懂相机标定、对极几何这些视觉基础。现在回头看这场笔试的考点和出题思路对准备视觉算法岗的同学依然有参考价值。这篇文章我就按自己的回忆和后来梳理的知识点把这类笔试常考的模块拆开讲讲。1. 笔试题型全景与考察思路1.1 整体结构与时间安排线上笔试的时间一般会在邮件里写得比较清楚我当时是120分钟包含选择题、填空题、简答题和编程题。实际做下来选择题占比不低大概15到20道涉及数学、机器学习、视觉基础和少量逻辑题。编程题一般有两道难度呈梯度第一道偏基础第二道需要一点算法设计能力。3D视觉方向还会额外混入一两道专业题比如相机模型、立体匹配、点云配准不会很难但没接触过的人会无从下手。很多人容易把这类笔试当成普通开发岗笔试来准备觉得把LeetCode刷熟就够了。实际不是这样。网易的算法实习生笔试尤其是视觉方向更看重“基础理论工程直觉”选择题里会直接出现SVM核函数、K-means初始化、CNN感受野这些概念编程题则经常和图像处理、几何计算沾点边。所以如果你只准备数据结构和算法可能连第一轮筛选都过不了。1.2 出题人的考察逻辑从出题人的角度看实习生进来是要干活儿的不是来学习的。3D视觉方向日常要做相机标定、特征匹配、点云处理、三维重建或者给深度学习模型准备数据这些工作对数学和代码都有硬性要求。笔试里反复出现的坐标系变换、矩阵运算、目标函数优化本质上都是工程现场的缩影。另外笔试也会考察“知识广度”。视觉领域很杂不同方向的知识存在交集比如光流法既可以用在视频处理也可以用在视觉SLAMICP既可以用在点云配准也可以用在机器人定位。出题人会把这类交叉知识点混在一起考看你有没有真正理解原理而不是背几个公式。我在后面会按模块展开把自己印象比较深的考点和复习思路整理出来。2. 3D视觉核心基础坐标系、相机模型与几何约束2.1 相机模型、内参外参和畸变3D视觉第一课就是针孔相机模型。笔试里最常见的考法是已知相机内参矩阵K、外参旋转R和平移t给定一个世界坐标系下的3D点求它在图像上的像素坐标。公式很简单x K[R|t]X但很多人在考场上一紧张就会把外参作用顺序搞反。先要把世界点变换到相机坐标系也就是P_c R * P_w t然后再投影到归一化平面最后再用内参变换到像素坐标。内参矩阵里的fx、fy、cx、cy要清楚含义cx、cy是光心在像素坐标系中的坐标fx、fy是焦距换算到像素单位的倍数。这个考点经常延伸成两个方向一个是反过来给像素坐标求归一化坐标也就是做逆变换另一个是加畸变模型包括径向畸变和切向畸变。笔试一般不会让你算复杂的畸变矫正但会问你畸变矫正的作用或者给你一组畸变系数让你判断图像边缘是“桶形”还是“枕形”。我当时复习时是这么记的径向畸变发生在镜头边缘直线会变弯切向畸变是镜头和成像平面不平行造成的。如果给的是鱼眼镜头畸变会更严重。实际工程中OpenCV的calibrateCamera函数直接能在标定板上算出来但笔试不会让你调库所以手推一遍小孔成像的完整流程很重要至少要在纸上能写出K、R、t、畸变系数的关系。2.2 对极几何、基础矩阵和本质矩阵对极几何是双目和运动恢复结构的基础也是网易这类公司很爱考的3D视觉知识点。对极约束的公式是 x2^T F x1 0其中F是基础矩阵x1和x2是两个视角下匹配点的齐次坐标。如果已知相机内参K则本质矩阵E K2^T F K1E只包含旋转和平移信息更便于分解出位姿。笔试常见考点包括F和E的秩是多少、最少需要几个点可以求解、八点法怎么构造线性方程。我当时就吃过亏光记住了“八个点”没理解为什么。后来自己推了一遍才发现F矩阵有9个元素但去掉尺度自由度和秩为2的约束实际自由度是7所以理论上7个点就能解但八点法因为把对极约束看成线性方程组实现简单所以更常用。这类细节很容易出现在选择题或简答题里你如果能写出八点法的具体步骤哪怕是伪代码也会比只写“RANSAC八点法”的答案拿分多。还常考单应矩阵H它描述的是同一平面在两张图像之间的映射关系适用场景是特征点共面比如拍摄一个标定板或一面墙。双目立体匹配时如果左右相机观察的是同一个平面单应矩阵就能直接把左图映射到右图。笔试里有时会问“什么时候用F/E什么时候用H”我建议记一句口诀空间点一般情况用对极几何平面场景或无人机俯拍地面用单应矩阵。这个区分在实际落地时也很有用。2.3 PnP、ICP与点云配准3D视觉方向还会考到位姿估计相关的内容。PnPPerspective-n-Point解决的是已知3D点和对应2D像素坐标求相机位姿的问题常见于视觉SLAM和AR场景。ICPIterative Closest Point解决的是两组3D点云的配准通过迭代寻找最近点并最小化误差常见于三维重建和机器人定位。笔试如果出场景题一般会这样问给你一组已知坐标的3D路标点和它们在图像中的投影位置用什么方法求相机位姿答案就是PnP再加RANSAC去掉误匹配。反过来给你两个不同视角采集的点云但不知道点之间的对应关系用什么方法配准答案是ICP。有个容易混淆的点是如果已知点对对应关系ICP可以通过SVD求出闭式解如果不知道对应关系就需要迭代搜索最近邻。这个区分一定要记清楚面试时也很常问。实际工程里RANSAC和ICP经常串联使用先用特征匹配加RANSAC求初始位姿再用ICP精配准。我在笔试时遇到过一个简答为什么ICP容易陷入局部最优原因是它只搜索最近邻初始位姿差太远就会收敛到错误结果。所以考场上回答这类问题要答出“需要好的初始值”这一层才说明你真的做过相关项目。3. 算法与数据结构代码题不只是“刷题”3.1 KMP算法和next数组画图不如手推网易笔试的编程题和选择题里字符串算法出现频率很高KMP是绕不开的。有一个热门的题目形式是给定模式串pabacaba让算next数组。不同教材对next数组下标和含义的定义不太一样这里我按最常见的定义来算next[i]表示模式串前i个字符的最长相等前后缀长度且不包括自身next[0]-1。p abacaba # next[i] 表示 p[0..i-1] 的最长相等前后缀长度 # 计算结果[-1, 0, 0, 1, 0, 1, 2, 3]为什么是这个结果一个个看next[0] 固定为 -1next[1] 对应前缀a没有真前后缀长度0next[2] 对应ab前缀后缀不相等长度0next[3] 对应aba最长的相等前后缀是a长度1next[4] 对应abac找不到相等前后缀长度0next[5] 对应abaca最长相等前后缀是a长度1next[6] 对应abacab最长相等前后缀是ab长度2next[7] 对应abacaba最长相等前后缀是aba长度3。我在考场上踩过的坑是这个next数组和部分匹配表PMT很容易搞混有的教材把PMT定义为包含当前字符的前后缀最大长度再加一个首位的-1结果就会整体错位。所以考试前一定要确认你自己用的定义并且用一个小例子验证。实际写代码时可以直接跑下面这段def get_next(p): m len(p) nxt [-1] * (m 1) i, j 0, -1 while i m: if j -1 or p[i] p[j]: i 1 j 1 nxt[i] j else: j nxt[j] return nxt print(get_next(abacaba)) # [-1, 0, 0, 1, 0, 1, 2, 3]KMP考的不只是查表更重要的是失配时为什么跳转。比如p[6]失配后j要跳到next[6]2因为p[0..1]ab已经和p[4..5]ab匹配过不需要重新比较。这个思想能讲清楚选择题基本就稳了。3.2 排序、动态规划和贪心熟记复杂度表网易的笔试算法题不会太偏但会考复杂度分析和稳定性。比如快速排序在平均情况下是O(n log n)最坏情况下是O(n^2)堆排序无论情况都是O(n log n)但不是稳定排序归并排序是稳定排序但需要O(n)额外空间。这些内容经常以选择题形式出现让你判断“哪个说法正确”或者“哪个排序算法最适用于某场景”。动态规划和贪心也会出现常见的有最长上升子序列、0-1背包、区间调度等。笔试编程题第一道如果比较简单往往会出这类经典模型。这里有个技巧看到题目先判断状态定义比如最长上升子序列的状态 dp[i] 表示以第i个元素结尾的最长长度转移方程就是 dp[i]max(dp[j]1)其中 ji 且 nums[j]nums[i]。笔试时如果能先写一个O(n^2)的暴力版本再考虑优化至少能拿一部分分。贪心算法考得比较隐蔽经常包装成“选择最少会场数量”或“最多能参加几个活动”。思路就是区间按结束时间排序再依次选择不冲突的区间。考场上不用纠结证明能说出贪心策略并写出代码就行。我当时把这部分的模板题都刷了一遍考场上基本是秒杀节省了很多时间留给后面的专业题。3.3 优化算法和“冷门”考点知道思想就行除了经典数据结构笔试偶尔会穿插一些算法概念的选择题比如粒子群算法、模拟退火、快速幂、二分图匹配之类。热词里也有“粒子群算法原理”和“kl elbo算法原理详解”这说明很多人在查这类考点。3D视觉方向考粒子群通常不是让你手写完整代码而是让你选出正确的速度和位置更新公式或者判断它属于启发式优化算法。我复习这类知识点时用的是“一句话记忆法”粒子群算法是模拟鸟群觅食每个粒子根据个体最优和群体最优更新速度模拟退火是模拟金属降温过程用概率接受劣质解来跳出局部最优快速幂是把指数拆成二进制来加速计算。面试官如果问得更深可能会让你比较粒子群和遗传算法的区别这时候答出“粒子群没有交叉变异只靠速度和位置更新”就够了。至于KL散度、ELBO这些概念更多出现在机器学习面试里但笔试选择题偶尔也会出现能简单说明ELBO是证据下界就行。4. 机器学习与深度学习基础视觉算法岗的隐形门槛4.1 经典机器学习考点SVM、聚类、KNN3D视觉算法实习生虽然偏视觉方向但机器学习基础一定躲不过。笔试喜欢考SVM的核函数、支持向量概念、K-means的初始化问题和KNN的分类原理。我有一个经验凡是问“如何处理线性不可分数据”你都要想到核函数凡是问“K-means的缺点”都要回答“对初始中心敏感、需要预先指定K、容易陷入局部最优”。KNN在视觉里有个典型应用图像分类。一道经典选择题会问“KNN的K值取大取小有什么影响”答案一般是K太小容易过拟合K太大分类边界过于平滑。3D视觉方向还会延伸一问点云分类能不能用KNN可以但要注意点云的密度不均匀常见的做法是先找近邻再做特征编码。这类题考察的不是你会不会调库而是你有没有思考过算法在具体数据上的局限。传统机器学习在三维视觉中也有应用比如用随机森林做语义分割、用SVM分类物体。笔试如果给一个“从点云中识别小目标”的场景你可以从特征提取、分类器和后处理三方面作答。即使不写代码也要把流程说清楚展现出工程思维。4.2 深度学习基础CNN、损失函数、优化器网易作为互联网公司对深度学习基础的考察非常实在。选择题会出现卷积层的输出尺寸怎么算、池化的作用、ReLU为什么能缓解梯度消失、SGD和Adam的区别。这些内容不超纲但需要真正理解不能只背结论。我建议把“CNN前向计算”的尺寸公式默写一遍输出尺寸 (输入尺寸 - 卷积核大小 2*padding) / stride 1。如果考到感受野就一层一层往回推。笔试里还有道题让我印象很深给出一个输入是224x224x3经过一个卷积核3x3、padding1、stride1的卷积层输出尺寸是多少答案是224x224因为padding1让尺寸保持不变。这种题很基础但特别容易因为算错加减而出错考试时一定要列式子。损失函数方面除了分类用的交叉熵3D视觉还会接触到回归损失比如L1、L2、Smooth L1。笔试可能会问为什么目标检测中常用Smooth L1而不是L2因为L2对大误差的惩罚过重训练初期容易梯度爆炸Smooth L1在误差较小时使用平方、较大时使用线性兼顾稳定性和收敛速度。另外Triplet Loss在度量学习和人脸识别里常用也适合做点云检索这算是一个加分项能答出来会显得你知识面比较广。4.3 3D视觉中的深度学习方法3D视觉方向的笔试不会停留在传统几何还会问一些和深度学习结合的趋势题。比如单目深度估计、双目立体匹配、点云分类和分割、三维重建等。2018年的时候NeRF还没完全流行但现在复习的话至少要了解深度学习如何替代部分传统pipeline。我说一个最常见的考察方向双目立体匹配。笔试可能让你列出完整的流程包括极线校正、代价计算、代价聚合、视差优化和视差细化。用深度学习方法做一般就是输入左右图像对经过一个Siamese网络提取特征然后构建代价体再用3D卷积正则化最后回归视差。网易当时有一道简答题类似“如何用深度学习方法做双目深度估计”我当时答了传统方法也提了端到端学习虽然不完美但让面试官看到我是有思考的。还有一类题是点云处理。给你一万个无序点云点让你分类你会怎么做传统方法可以提取特征、降维、接分类器深度学习方法可以直接用PointNet核心思想是共享MLP和最大池化来保证置换不变性。笔试如果出选择题大概率会问PointNet为什么能处理无序点云答案就是最大池化聚合了所有点的特征输出与点顺序无关。这个知识点在3D视觉岗位笔试中出现频率很高建议重点掌握。5. 备考实操从刷题到真题模拟5.1 复习资料和刷题路线如果你现在时间比较充裕我建议按“视觉基础机器学习编程题”三条线并行复习。视觉基础首选《多视图几何》和《视觉SLAM十四讲》前者偏理论后者更贴近工程尤其是相机模型、对极几何、PnP、ICP这些章节几乎和笔试考点一一对应。机器学习可以看李航的《统计学习方法》重点放在SVM、聚类、KNN和集成学习。深度学习部分多看经典论文和博客至少把CNN、损失函数、优化器的细节过一遍。编程刷题不要一上来就闷头刷500题。3D视觉岗位的笔试算法通常不要求复杂高级数据结构LeetCode前100题加上剑指Offer就够用。刷的时候按题型来数组、字符串、链表、二叉树、动态规划、贪心每种题型固定刷十几道然后总结模板。KMP这类算法单独整理代码模板考前再默写一遍能大幅降低考场上的紧张感。5.2 时间分配与答题策略线上笔试最怕“时间分配失衡”我见过不少同学在一道编程题上死磕导致后面简单题没时间做。我的策略是拿到卷子先花两分钟扫一遍所有题目标记出哪些是熟悉的哪些是没把握的。选择题控制在40分钟左右遇到卡壳的题先凭第一感觉选一个并标记留着最后回来检查。编程题如果有两道先做有思路的不要按顺序死磕第一道。答题时有一个细节简答题即使不会也尽量写出和问题相关的公式、流程或关键词。比如问如何做相机标定你哪怕只写出“用标定板拍多张图提取角点通过单应矩阵求解内参外参”也能拿到部分分。阅卷不是完全看标准答案而是看你是不是具备基本的专业素养。工程类题目答出“流程关键公式可能遇到的问题”就是一条完整思路。5.3 笔试后的复盘与面试衔接笔试结束不等于万事大吉。网易这类公司往往会根据笔试结果安排面试面试官手里可能真的有你的笔试卷子会问“你笔试里KMP为什么这么写”或者“你对极几何那题是怎么想的”。所以笔试结束后最好趁记忆还热着把每道题重新复盘一遍尤其是做错的和犹豫过的题。我的习惯是建一个自己的错题本分三列题目、正确解法、错误原因。比如KMP next数组我当时定义搞混了就专门记了一行“不同教材定义不同先写清楚自己的定义再计算”。面试前翻一翻错题本比临时抱佛脚看教程有用得多。如果笔试里暴露了某些知识点薄弱比如对极几何不熟那在面试前就再补一遍因为面试官很可能针对薄弱点深挖。6. 常见问题与避坑指南6.1 复习中最容易踩的坑我见过很多同学复习3D视觉岗位时把大量时间花在“看起来高级”的算法上比如花好几个晚上研究粒子群模拟退火却连相机内参矩阵都写不对。结果笔试一考粒子群只考了一道选择题相机模型倒是考了好几道大题。复习一定要抓主流考点冷门概念只要了解原理和关键词即可不必深挖。这里说的主流考点就是坐标系变换、对极几何、特征匹配、点云配准、CNN基础、经典机器学习、常见数据结构和算法。另一个坑是只看不练尤其是不动手推公式。比如对极约束很多人能背出 x2^T F x1 0但真让你用八点法构造方程组就懵了。笔试不是考背诵而是考应用建议看完一个知识点立刻在纸上推一遍公式再用小例子模拟一遍。比如给定一个简单的平移矩阵手算一次基础矩阵计算过程会帮你记住很多细节。6.2 考场实战经验线上笔试的软环境也要提前准备。找一个网络稳定的地方提前测试浏览器、摄像头、编译器环境。有些线上笔试平台有代码自动补全但不支持本地IDE所以平时练习时尽量适应在线编辑器。还有一点很重要看清输入输出格式。比如链表、二叉树的输入常常会给你数组需要自己构建树结构很多算法能写出来却挂在输入处理上非常可惜。我最后还想提醒一句选择题里遇到不确定的不要空着。和简答题一样能排除两个选项再蒙一个正确率总会高一些。编程题如果实在没有思路先写一个暴力解法再写一句注释说明“这里可以用二分/DP优化”也能增加印象分。笔试考察的不是完美答案而是在有限时间里尽量展示自己的思维过程。我个人在实际操作中的体会是网易3D视觉算法实习生的笔试更像一块试金石它不会要求你已经做出过什么厉害的科研项目但会检验你有没有把视觉基础吃透。后来我带实习生时也会出类似的题我发现能走得更远的同学往往不是刷题最多的人而是能把相机模型、矩阵变换、特征匹配这些基础讲得特别清楚的人。如果你现在还在准备阶段不妨把多视图几何里的核心章节认认真真过一遍再配合编程题训练笔试通过率一定不会差。最后再分享一个小技巧考前一天把常用公式、KMP模板、CNN尺寸公式写在一张A4纸上考试时即使不能带进系统默写一遍也能帮你定心。
返回列表