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

资讯详情

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

顺丰科技视觉算法笔试客观题:核心考点与复习策略

顺丰科技视觉算法笔试客观题:核心考点与复习策略 每年秋招一到九、十月份各种技术社群里就会有人问顺丰科技的视觉算法岗笔试到底考什么。2019年那批“顺丰科技秋招视觉算法工程师笔试客观题合集”的流传版本我也看过基本是各路人马凭记忆拼出来的选择、判断和填空从图像处理、机器学习到深度学习、概率统计全都有。作为当年亲自参加过这类笔试、后来又在算法岗位带过校招生的从业者我想借这个合集聊点更实在的它到底在考察什么、背后的出题逻辑是什么、以及那道最容易被忽略的“藏分题”到底长什么样。先说清楚这篇文章不是原题答案的搬运。一方面零散回忆出来的题本身不一定准确另一方面公司的笔试题库每年都在变与其背几道“可能考过”的题不如把这类笔试当成一面镜子用它照出来的知识体系来规划自己的复习。如果你是正在准备视觉算法校招、或者想了解物流科技公司算法岗笔试风格的同学这篇内容应该能帮你在复习路上少走很多弯路。1. 顺丰科技招视觉算法工程师到底在找什么样的人1.1 物流科技场景下的视觉算法岗位画像顺丰科技和纯互联网公司的算法团队有个很明显的气质差异他们的算法要直接长在业务线上不是在论文数据集里刷分就完事了。物流场景里视觉算法最常见的几个落地点基本决定了笔试和面试的考察偏向。运单OCR识别是最典型的。面单上的三段码、电话号码、地址信息要在各种光照、褶皱、倾斜、遮挡条件下稳定识别出来。包裹体积测量也很常见要基于深度相机或者双目视觉估算包裹的长宽高直接关系到运费计算和车辆装载率。分拣线上的异常检测比如暴力分拣、抛件识别则要用视频动作识别或者姿态估计的思路来做。还有仓储场景里的货物计数、车辆识别、园区安防每一个都能单独拉出来做一个项目。这些任务有几个共同点数据量大但质量参差场景相对固定但光照和遮挡变化多端对实时性和成本敏感。所以物流科技公司要的视觉算法工程师不只是会训练模型还得理解数据、理解场景、理解模型落在端侧还是云端、理解算力成本怎么控制。这种岗位画像投射到笔试里就变成了“基础扎实、概念清晰”优先于“追新算法、会讲论文”。2019年秋招正好赶上物流科技公司加大智能化投入的阶段。那一年视觉算法的主流技术栈还是以CNN为主目标检测领域的YOLOv3、Faster R-CNN、SSD基本是标配知识点Transformer在视觉里还没形成后来那种铺天盖地的势头。所以笔试客观题覆盖的知识点反而比现在更集中、更基础也更适合用来梳理底层知识框架。1.2 客观题在笔试流程里的定位第一道筛子校招的投递量非常大技术面不可能每份简历都约面试聊一遍。客观题笔试承担的第一职责就是自动化筛选机器阅卷、快速出分把基础不过关的简历挡在面试之外。这意味着客观题不会出太偏、太钻牛角尖的题目它的考察目标很朴素——判断你有没有系统地学过视觉算法需要的核心知识。客观题的另一个特点是“广度优先、深度有限”。你不太可能在选择题里看到一道让你手写完整反向传播推导的大题更多是考“梯度消失的常见原因”“Batch Normalization在训练和测试时有什么区别”“SVM里支持向量是什么意思”这类一个概念对应一个判断的知识点。但它们覆盖面广从数据结构、编程基础到数字图像处理、机器学习、深度学习、数学基础一个方向一道题就能拼出一张完整的知识画像。以我当时观察到的行业通用考察方向为例大致可以这样分块考察方向典型知识点出题风格判断数据结构与算法数组、链表、栈队列、排序、复杂度偏送分考基础数字图像处理滤波、边缘检测、形态学、颜色空间偏原理考理解机器学习模型评估、过拟合、逻辑回归、SVM、K-Means偏辨析考概念深度学习卷积、池化、BN、Dropout、激活函数、目标检测偏重点考得最多数学基础概率、贝叶斯、线代、最优化偏计算考细心编程语言Python/C基础、OpenCV常见用法偏输出考代码阅读顺丰科技这类物流科技公司会在图像处理和工程落地相关的部分多放几道题这符合它的业务特点但整体结构还是和行业通用的笔试题型一脉相承。换句话说你按这套地图去准备不光能应对这一家公司的笔试其他互联网大厂的视觉算法岗笔试也大概率能覆盖到八成以上。2. 客观题考察地图六大方向里哪些才是真正的大头2.1 图像处理基础题出题最稳定、也最容易被轻视很多准备算法岗的同学会把大把时间花在深度学习模型上图像处理基础反而被晾在一边。但实际笔试里图像处理这块的题目非常稳定几乎是每次必考而且出题风格极其直接会就是会不会就是不会没有太多蒙的余地。常考的知识点就那几个中值滤波和高斯滤波的区别与适用场景Sobel算子和Canny边缘检测的流程差异腐蚀、膨胀、开运算、闭运算分别解决什么问题RGB、HSV、YUV颜色空间的转换逻辑直方图均衡化为什么能增强对比度双线性插值和最近邻插值的区别。这些都是图像处理的“基本盘”每一道题背后都对应一个非常明确的应用场景。举个例子中值滤波为什么适合去除椒盐噪声因为椒盐噪声在图像上表现为孤立的亮点或暗点中值滤波取邻域内像素排序后的中位数孤立噪声点排序后会被周围正常像素“挤”掉所以去噪效果很好。而高斯滤波是线性滤波对高斯噪声效果更好但对椒盐噪声会把噪声“涂抹”到周围像素上反而让噪声区域变大。这些逻辑不是靠背而是靠理解图像在滤波前后的变化过程。我的复习建议是花一个下午把OpenCV里这些基础函数全部跑一遍cv2.GaussianBlur、cv2.medianBlur、cv2.Canny、cv2.erode、cv2.dilate、cv2.equalizeHist对着一张真实图片挨个看效果。用肉眼看一遍效果比背十遍概念都管用。视觉算法的特点和纯后端开发不一样很多东西是“看得见、摸得着”的这种直观感受会在你做选择题时形成一种条件反射。2.2 机器学习基础选择题几乎必见的模型与评估机器学习基础是客观题里的另一个稳定出题区而且集中考两类内容一类是经典模型的原理和适用场景另一类是模型评估指标的计算和辨析。模型方面逻辑回归、SVM、决策树、随机森林、K-Means的出现频率最高。常考的点包括逻辑回归的损失函数是什么SVM的核函数解决什么问题决策树的划分依据有哪些随机森林为什么比单棵决策树稳定K-Means对初始中心选择为什么敏感。这类题的共同特征是“概念辨析”出题人喜欢把相似概念放在同一个选项里做干扰。评估指标方面精确率、召回率、F1、ROC、AUC是绝对高频。特别是精确率和召回率的关系很多人容易搞混。精确率是“你认为是正例的样本里有多少真的是正例”召回率是“所有真正的正例里你找回了多少”在不同业务场景下两者的重要性完全不同。比如垃圾邮件检测更看重精确率因为误杀正常邮件代价太高而癌症筛查更看重召回率因为漏诊的后果更严重。这种业务直觉在物流场景里同样适用比如包裹安检里漏掉一个违禁品的代价远大于多查几个正常包裹。另外注意一点通常会有“判别式模型和生成式模型”的区别题。判别式模型直接学习决策边界典型代表是逻辑回归、SVM生成式模型学习的是联合概率分布典型代表是朴素贝叶斯、隐马尔可夫模型。做这种题的时候要小心选项里经常会放一个看似合理但张冠李戴的组合。2.3 深度学习基础客观题里的绝对重头戏如果说图像处理和机器学习是餐前小菜那深度学习基础就是主菜题量占比通常最高。考察方式也从单纯的概念记忆升级到了组件理解、网络演进逻辑、训练策略辨析。必考的组件包括卷积层的计算过程、池化层的作用、Batch Normalization在训练和测试时的差异、Dropout的工作原理、各种激活函数的优缺点、交叉熵损失和MSE损失的区别、SGD和Adam等优化器的特点。这些组件的考察方式不一定是直接问“它是什么”而更多是给一个具体场景问你应该选哪个组件、或者某个组件在这种场景下会有什么行为。经典网络结构也是常客。AlexNet、VGG、ResNet基本是必知必会。一条主线是看网络如何变深AlexNet引入了ReLU和DropoutVGG用连续小卷积核替代大卷积核ResNet通过残差结构解决了深层网络退化问题。理解了这条主线就不需要死记每个网络的具体结构而是能从“解决什么问题”的角度去推演答案。目标检测相关的基础概念在2019年和现在都是重点。两阶段和一阶段检测器的代表算法要清楚R-CNN系列和YOLO、SSD的基本思路要能说清楚差异。还有一些更细节的概念比如Anchor是什么非极大值抑制NMS是干什么的mAP怎么算。这些都是从选择题一路考到面试的常客基础不牢的话客观题会直接翻车。复习策略上我建议做一次“前向传播手推”随便选一个小一点的输入尺寸比如32x32的单通道图像从头到尾过一遍卷积、池化、全连接、Softmax每一步都把尺寸、参数量、计算量写下来。推完这一次卷积输出尺寸怎么算、参数个数怎么算、全连接层输入维度怎么对齐这些高频考点基本就拿下了。2.4 数学基础与编程常识拉开差距的地方数学基础是很多视觉算法候选人的薄弱区也是客观题里最容易拉分的部分。概率论里贝叶斯公式是重中之重几乎每年都会出现比如给一个先验概率和似然求后验概率。常见分布也需要掌握高斯分布、伯努利分布、泊松分布各自对应什么场景期望和方差怎么算最大似然估计的基本思路是什么。线性代数里矩阵乘法是最基本的特征值和特征向量主成分分析PCA的思想奇异值分解SVD在图像压缩里的应用都是高频考点。高数考得相对少一些但导数、偏导数、梯度下降方向这些和深度学习绑定的概念不要丢分。编程常识这块别忽视。客观题里通常会有几道不是直接考算法、而是考语言基础和代码阅读的题。Python里可变与不可变对象的区别列表和字典的查找时间复杂度深拷贝和浅拷贝的差异C里指针和引用的区别智能指针的基本用途这类题看似简单但要是平时只写Python不写C遇到C题还是容易一愣。另外常见的排序算法时间复杂度和稳定性表建议考前过一遍属于送分但不能丢的题。3. 高频考点的原理拆解公式要懂更要会推3.1 卷积输出尺寸、参数个数和感受野一套逻辑吃下三类计算题客观题里计算题部分最集中的考点就是卷积相关计算。先说输出尺寸这是最基础的H_out floor((H_in - k 2p) / s) 1W_out 同理。其中 H_in 是输入尺寸k 是卷积核大小p 是paddings 是步长。很多人会问是向上取整还是向下取整如果除不尽PyTorch 的默认行为是向下取整floor这个细节在代码输出题里也可能考到。举个例子输入224x224的图像经过一个7x7、stride2、padding3的卷积输出尺寸是floor((224 - 7 2*3) / 2) 1 floor(223 / 2) 1 111 1 112所以输出是112x112尺寸正好减半。这个计算在视觉里非常常见比如ResNet的第一层就是这个配置。参数个数计算也很高频参数量 C_out x (C_in x k x k 1)最后的1是偏置项。比如输入是3通道卷积核是64个3x3那参数量就是64 x (3 x 3 x 3 1) 64 x 28 1792。这里要注意的是分组卷积、深度可分离卷积都有对应的变体公式比如深度可分离卷积把空间卷积和通道融合拆开参数量大幅下降MobileNet就是靠这个思想在移动端跑起来的。感受野是概念加计算的综合题。感受野可以理解成输出特征图上一个像素点对应输入图像上的多大区域。计算公式递推式为RF_l RF_{l-1} (k_l - 1) x stride_prod其中 stride_prod 是从当前层往前所有层的 stride 乘积。这里最容易算错的地方是当前层一个3x3卷积对上一层感受野的影响是 (k-1) 乘以之前所有层的stride乘积而不是乘以当前层的stride。我见过很多人在这里栽跟头考场上时间一紧张公式记错了一步错步步错。空洞卷积在这类题里也出现过等效卷积核尺寸是k_equiv k (d - 1) x (k - 1)其中 d 是膨胀率。比如3x3卷积、膨胀率2等效卷积核就是5x5感受野变大但参数量不变。复习的时候把这些公式放在一张纸上考前手推一遍最小例子比如从1x1输入开始推一遍过完考场上一分钟就能算完一道题。3.2 IoU与NMS目标检测客观题的必考送分题目标检测方向的客观题里IoU的计算和NMS的逻辑基本是必出的。IoU全称是Intersection over Union也就是两个框的交集面积除以并集面积用来衡量预测框和真实框的重合程度。举个具体例子。假设真实框是 [x110, y110, x250, y250]预测框是 [x120, y120, x260, y260]。交集的坐标是 [max(10,20)20, max(10,20)20, min(50,60)50, min(50,60)50]交集宽高为30x30面积900。真实框面积为40x401600预测框面积为40x401600并集面积是1600 1600 - 900 2300。IoU 900 / 2300 约等于 0.3913。这就是一道典型的选择题计算过程。这类题几乎不会给你出特别复杂的数值但会变着法考你对IoU阈值概念的理解。IoU阈值设得太高比如0.9会导致只有高度重合的框才被保留容易漏检设得太低比如0.3会导致保留了很多重叠度不高的框容易误检。目标检测中通常取0.5作为基础阈值更严格的评测可以用0.7或者更高这个常识在题目里也出现过。NMS的完整流程可以这样理解在一张图上一个目标往往会生成很多个候选框我们要从中挑出最靠谱的一个。步骤是先把所有候选框按置信度从高到低排序把置信度最高的框作为一个保留框然后遍历剩余候选框凡是和这个保留框的IoU大于阈值的都认为它们是同一个目标产生的重复框直接删掉。接着在剩下的框里再取置信度最高的重复上述过程直到没有候选框剩下。这个逻辑用伪代码写出来就是def nms(boxes, scores, iou_threshold): idx sorted(range(len(scores)), keylambda i: scores[i], reverseTrue) keep [] while idx: i idx[0] keep.append(i) idx [j for j in idx[1:] if iou(boxes[i], boxes[j]) iou_threshold] return keep与NMS相关的变体也是区分度很高的题。Soft-NMS的核心改进是不直接删除高IoU的框而是按IoU大小降低其置信度避免密集场景下两个真实目标靠得很近时误删。DIoU和CIoU则在IoU基础上额外考虑了框中心距离和宽高比更精细地刻画了两个框的差异。这些内容属于“见过就知道、没见过就懵”的区分题时间充裕的话翻一翻性价比很高。3.3 损失函数与优化器从背公式到会辨析损失函数和优化器在客观题里经常以“辨析题”的形式出现单纯背公式远远不够得理解每个方案解决什么痛点。分类问题为什么用交叉熵而不是均方误差MSE这是高频题。逻辑上Softmax输出加MSE损失会导致梯度表达式中含有sigmoid的导数项而sigmoid在饱和区的导数趋近于0梯度消失严重训练极慢。交叉熵损失配合Softmax在数学上可以消掉sigmoid导数项梯度只和预测偏差相关偏差越大梯度越大训练效率高得多。另外一个角度是概率解释交叉熵本身就是衡量两个概率分布差异的度量用它做分类损失比MSE更自然。Focal Loss是目标检测里应对正负样本不平衡的经典设计在交叉熵基础上乘了一个调制因子 (1 - p_t)^γ。p_t是模型对该样本预测正确的概率。如果某个样本已经被很好分类p_t接近1调制因子接近0该样本的损失被压低如果某个样本很难分类p_t较小调制因子相对大损失就保留得更多。这样训练重心自然偏向难样本。γ是一个超参一般取2在RetinaNet论文里是这么用的。优化器的区别也是一个高频辨析点。SGD是最朴素的梯度下降按批数据计算梯度更新参数容易陷入局部最优也容易震荡。Momentum在SGD基础上引入动量项相当于给更新过程加了“惯性”能抑制震荡、加速收敛。AdaGrad对每个参数自适应学习率适合稀疏数据但学习率会单调衰减到很小。RMSProp改进了AdaGrad的学习率衰减问题用滑动平均来调节。Adam则是Momentum和RMSProp的结合既有动量又有自适应学习率是工程上最常用的默认选择。选择题如果问“哪个优化器适合稀疏梯度”答案通常指向AdaGrad或Adam如果问“哪个最稳定可解释”答案通常是SGD。每种优化器的代价和适用场景复习时要能一句话说清楚。3.4 训练策略与基础结构BN、Dropout和ResNet为什么有效Batch Normalization是客观题里的常青树而且出题人特别喜欢考训练和测试阶段的差异。训练时BN用当前batch内的均值和方差做归一化测试时没有batch的概念用的是训练阶段滑动平均统计下来的全局均值和方差。这个差异如果记混了很多题都会做错。另外一个高频细节是BN为什么有效。通常说法是“减少内部协变量偏移”这个说法算对但现在的理解更倾向于BN让优化 landscape 更平滑使得梯度下降更容易收敛。选择题里如果问BN的作用选项里出现“防止过拟合”“加速收敛”“允许使用更大的学习率”“缓解梯度消失”这几个一般来说“减少内部协变量偏移”和“允许更大学习率、加速收敛”都是可以选的但要注意“防止过拟合”并不是BN的直接作用。Dropout才是更常用来防过拟合的手段而且它也有训练和测试差异训练时随机丢弃神经元测试时保留全部神经元但要把输出乘以保留概率或者反过来在训练时除以保留概率。这个细节同样高频。ResNet为什么能训练得更深也是必考。深层网络面临的问题是梯度消失和退化问题。ResNet通过恒等映射也就是残差连接让梯度可以“抄近路”直接回传到浅层这就是所谓的“梯度高速公路”。更深层的理解是残差结构让网络至少能学到恒等映射也就是说即使新增的层学不到有效特征也不会比浅层网络更差。这从原理上解释了为什么ResNet可以堆到上百层而VGG训练到几十层就很吃力。做题时不要只答“解决梯度消失”要把恒等映射这条逻辑也带上才答得完整。4. 出题人常用的“坑位”设计这些选择题错得最冤4.1 概念张冠李戴把相似概念放进同一道题客观题最常见的坑是把两个相似概念放到同一个选项里让你在“看起来都对”里纠结。比如把“高斯滤波适合去除高斯噪声”和“中值滤波适合去除椒盐噪声”的正确说法和“高斯滤波适合去除椒盐噪声”的错误说法放在一起对滤镜原理不熟的人很容易看走眼。还有一个典型场景是Dropout和BN的混淆。我在一套题里见过这样的选项“Dropout在测试时也需要随机丢弃神经元”和“BN在测试时仍然使用当前batch的均值方差”这两个都是错误说法但放一起就很有迷惑性。正确的记忆方式是训练和测试阶段行为有差异的组件就那么几个BN、Dropout一定要单独拎出来对比记忆。我自己的做法是建一个“易混淆对照表”左边写概念A右边写概念B中间一列写它们的核心区别。比如“L1正则化和L2正则化”“精确率和召回率”“SGD和Adam”“过拟合和欠拟合”。考前不刷题只刷这张表效果比盲目刷一百道题都好。4.2 特殊值与边界条件计算题里的隐藏雷区计算题翻车往往不是不会算而是忽略了边界条件。最常见的边界坑包括卷积输出尺寸除不尽时怎么取整padding到底是什么含义空洞卷积的等效核怎么算方差分母是n还是n-1。比如方差问题总体方差分母是n样本方差分母是n-1因为样本方差要用样本均值替代总体均值消耗了一个自由度无偏估计要除以n-1。选择题如果给一组数让算方差先看清楚问的是总体方差还是样本方差这个区分就能过滤掉一批不细心的人。卷积输出尺寸的边界条件也很容易踩。如果用TensorFlow的SAME padding输出尺寸是向上取整用PyTorch默认的向下取整有时会差一个像素。题目如果没明确指示一般按公式取floor来算但如果选项里两个都有就要结合题目上下文判断。再看一个更隐蔽的坑感受野计算里stride的乘积。很多人算感受野时把当前层的stride也乘进去其实当前层stride影响的是下一层感受野的放大倍数而不是当前层自身的感受野。边界条件就藏在这种细节里。4.3 业务场景干扰项看不懂选项不代表题目超纲物流科技公司的笔试里有些选择题会套一个业务场景的壳比如“某面单OCR模型在晴天剪裁下识别率很高但到了雨天识别率明显下降请问这反映了什么问题”本质还是在考泛化性和数据分布漂移。或者“分拣线上的目标检测模型频繁把远处的传送带零件误检为包裹请问最可能的原因是什么”本质上考的还是误检和正负样本不平衡。遇到这类题先把题面里的业务词翻译成技术词。面单识别变成OCR包裹检测变成目标检测晴天雨天变成训练数据和测试数据分布不一致传送带零件变成背景干扰。翻译完之后你发现考点还是那些基础概念。不要被陌生业务词吓住。客观题不会拿真正的业务细节来卡人那属于面试环节的事。笔试阶段它要确认的是你能不能把业务问题抽象成技术问题这是算法工程师的基本功。5. 笔试实战策略从刷题到落笔的完整打法5.1 做题顺序与时间分配客观题笔试的时间通常不会特别宽裕。我的建议是拿到卷子先做一次快速浏览不用逐字读花一两分钟扫一遍了解题型分布和题量做到心里有底。然后按“会做的先做、不会的先跳、计算题稍后、读题超过两遍还不懂的直接标记跳过”的原则来安排。一道客观题没必要恋战平均一分钟左右一道。如果一道题思考超过两分钟还没头绪这题大概率是卡在某个边界条件或者概念盲区上继续耗下去只会挤压后面送分题的时间。碰到很长的题干先看选项再回读题干往往更高效。四个选项的差异点通常就在某个核心概念上带着差异去读题干能快速定位到它到底在问什么。5.2 错题复盘把一套题变成一类题考完笔试之后的复盘比考前的刷题更重要。我见过太多人刷题只对答案看完正确答案就划过去下次遇到同知识点的题照样错。正确的复盘方式是不记“这题选C”而是记“这题考的是BN训练和测试阶段的区别正确答案是因为测试时用全局统计量我错选成了当前batch统计量”。这样一条一条记下来错题本就从“答案本”变成了“知识漏洞清单”。我自己的复盘习惯是建一个两栏表格左栏写错题描述和选项右栏写“本质考点正确思路易错点”。考前不看题只看右栏。如果右栏的内容你已经能不看左栏就完整叙述出来说明这个知识点真的掌握了。这种方法比重复刷题效率高很多。5.3 针对物流科技公司的额外准备轻量化与落地思维如果你投的是顺丰科技这类物流科技公司笔试或面试的隐藏加分项是对算法落地有概念。物流场景对成本和实时性非常敏感模型往往要部署在边缘设备或者ARM嵌入式设备上跑在GPU服务器上根本不行。所以轻量化网络MobileNet、ShuffleNet的基本思想剪枝、量化的基本概念TensorRT、OpenVINO这些推理加速工具的名字和适用场景至少要有基本了解。我当时复习时养成了一个习惯不管你学什么模型都多问自己一句“这模型如果部署到一台摄像头后面的计算盒子上它还跑得动吗”。这个视角可能不会直接帮你解决某道选择题但它能帮你理解为什么物流科技公司笔试里会出现“模型压缩”“量化”“端侧部署”相关选项。针对物流场景可以提前准备几个典型项目思路面单OCR的难点在哪里、包裹体积测量用哪些传感器方案、抛件检测用什么网络结构。这些不一定是笔试题目但笔试积累的知识面试时完全衔接得上。另外如果时间允许多关注一下顺丰科技这类公司公开的物流科技报道、技术分享和专利了解他们正在做的事情。笔试里如果出现“边缘计算”“端到端部署”相关选项你就不至于一点概念没有。最后再分享一点个人体会。我见过不少基础不错的同学把大量时间花在刷高难算法题上结果笔试栽在图像处理和机器学习的概率、线性代数这些“看起来简单”的题上非常可惜。校招笔试考的不是你有多聪明而是你的知识体系有没有建立起来。一套客观题短期看是过不过的差别长期看是你对自己知识盲区的一次全面体检。如果你能借这套题把“图像处理、机器学习、深度学习、数学、编程”这条线串成一张网那这次笔试的价值就远超一次通过本身了。
返回列表