☰
出行平台CV算法实习生面试全流程复盘:从笔试到手撕NMS
2026/10/17 1:11:35 网站建设 项目流程

前几天刚面完某头部出行平台的CV算法工程师实习生岗位,从投简历到收到口头offer,前后差不多三周。整个流程包括一次在线笔试、三轮技术面和一轮HR面,节奏不算拖沓,但每一轮都有实打实的筛选。面完最大的感受是:出行场景下的计算机视觉,和实验室里跑模型完全是两码事,他们更在意的是你到了真实业务里能不能干活、遇到资源受限和样本不干净的时候,你怎么办。

这篇文章把我这次CV算法工程师实习生面试的全过程、高频题目、答题思路和踩过的坑一次性整理出来。正在准备视觉算法实习的同学可以直接拿来对标,尤其是简历里写了目标检测、语义分割、模型优化这类项目的人,这篇内容会非常对胃口。

1. 这场面试到底在面什么

1.1 出行平台的CV算法实习生平时做什么

先理解岗位背景,你才知道该往哪个方向准备。出行平台的视觉算法方向,大致可以分成两大类。第一类是车端感知,也就是车载摄像头拍到的画面要实时理解。典型任务包括:前车检测、行人检测、车道线分割、路面障碍物识别、驾驶员疲劳与分心检测。这类任务的核心约束是“实时”和“端侧部署”,算力有限、内存有限,不能把几百兆的大模型直接塞进去。第二类是云端图像处理,比如车辆图片审核、车牌识别、车型分类、路面缺陷识别、图像质量评估。这类任务对精度要求更高,算力相对宽裕,但需要处理海量数据,工程链路更复杂。

作为实习生,进去之后大概率会跟某个具体方向,不会让你一上来就负责完整系统。但面试时,面试官默认你对整个链路有基本认知。我的建议是,不管简历上写的是什么项目,都要能说清楚它在整个系统里处于哪个环节,输入是什么、输出给谁用、延迟和精度的平衡怎么取舍。这种“链路意识”是出行平台CV岗和实验室项目最大的区别。

1.2 岗位画像与候选人基本盘

从这轮面试的体验来看,CV算法实习生的候选人画像比较清晰。学历方面,硕士为主,但本科也有机会,关键看项目匹配度。论文不是硬性要求,很多候选人没有发论文,靠扎实的项目经历也能进到面试后段。反而是那些简历上堆了一堆“熟悉XX框架”“了解XX模型”的候选人,被问到具体原理时容易露馅。

核心要求可以拆成四块。

  • 编程能力:Python是必须的,C++是加分项。至少能熟练写清楚代码逻辑,能处理简单的数据脚本。
  • 深度学习基础:CNN结构、反向传播、BatchNorm、损失函数、优化器、过拟合与正则化,这些都是高频题。
  • CV项目经历:最好是和“检测”“分割”“分类”沾边的项目。项目不求多,但你必须把里面的每个技术选型都讲清楚。
  • 表达能力:面试官问一个问题,你能不能有逻辑地把思路讲出来。很多人不是不会,而是讲得乱七八糟,最后面试官无从判断。

我还注意到一个细节:面试官很看重“你是不是真的做过”。比如你写了用过Focal Loss,他会追问“你的正负样本比例到底是多少?”“你试过OHEM吗?为什么选Focal Loss?”这些问题如果简历是你自己包装的,很容易当场穿帮。

1.3 简历项目怎么准备才扛得住深挖

这部分是我这次面试最深的体会。简历上的项目描述决定了面试官问你的方向,而你的回答质量直接决定offer。不要写“我基于YOLOv5训练了一个目标检测模型”,这种描述等于把提问权完全交给面试官,而且没有任何信息量。正确的写法是:说清楚你要解决的问题、你的方案、你的量化结果。

举例说明。我有个朋友在简历上写过一个行人检测项目,面试官问他:“你为小尺度行人做了什么?”他一开始只回答“加了数据增强”,面试官明显不满意。后来他改成这样描述:针对小尺度行人漏检问题,在网络中增加了一个高分辨率检测头,同时用Focal Loss缓解正负样本不均衡,并用多尺度训练增强,最终小目标AP从0.32提升到0.41,推理帧率保持在40FPS以上。面试官听完后就开始和他讨论检测头的拼接位置了。

我建议每个项目都用“背景-难点-方案-结果”四段式写,每一段控制在两三句话。难点要具体,结果要量化。然后把每个技术选择背后的“为什么”写下来,比如为什么选这个模型、为什么不选另一个、数据是怎么处理的、指标是怎么算的。这些内容不一定要全写进简历,但要整理成面试前必看的文档。

2. 面试流程全记录

2.1 笔试:筛选门槛没有想象中高

笔试是在投递之后几天收到的,在线完成,总时长约一个小时。题型是选择题加两道编程题。选择题覆盖的面比较广:Python语法、Numpy操作、概率论基础、CNN感受野计算、BatchNorm的作用等,有一部分是深度学习常识题,还有一部分是“给你一段代码问输出是什么”的题目。整体难度一般,不涉及复杂的数学推导,但知识点比较杂。

编程题不是ACM赛题风格,更偏工程向。我记得一道题是“合并两个有序数组,并要求原地合并”,另一道是“字符串中找最长无重复子串”。难度都不算高,但要注意边界条件。如果你平时有刷题习惯,这种笔试通过不难。没刷过题的话,建议至少把二分、双指针、动态规划、字符串处理这些常见题型过一遍。笔试题不是拉分项,但挂了会非常可惜。

2.2 一面:项目深挖与基础问答

一面是技术面,时长约50分钟,以项目深挖为主,中间穿插基础问答。面试官会从简历第一段开始逐行问,提问链路非常清晰:项目背景是什么,你负责哪部分,数据从哪来,有多少样本,怎么清洗和标注,为什么选这个模型,损失函数用的什么,评价指标怎么算,遇到什么问题,怎么排查的。问完之后会针对某个技术点往里钻,比如你提到了Anchor,他会问你Anchor是怎么生成的、大小怎么设置、正负样本怎么定义。

这一面还考察了基础能力。我被问到的是:BatchNorm在训练和推理时的行为有什么区别,为什么CNN具有平移不变性,过拟合怎么判断以及怎么解决。这些问题都不难,只要系统学过深度学习基础都能答上来。但如果你想靠背答案蒙混过关,大概率会被追问到细节。

一面最后有一道手写代码题,让我实现NMS。这个我在后面专门展开讲。

2.3 二面:场景题与工程思维

二面通常由更资深的工程师或小组负责人来面,风格明显不一样。项目聊得少了,更多的是开放性的场景题,考察你把技术套到真实业务里的能力。我被问到的问题包括:如何判断司机是否在玩手机、如何估计前车距离、如果要在低算力设备上部署一个检测模型你会怎么做。

这类问题没有标准答案,面试官想听的是你的思考框架。我的回答套路是:先明确任务定义和评价指标,再说数据怎么来、怎么标注,然后讲模型选型和训练策略,最后谈部署约束和效果评估。比如判断司机玩手机这个问题,我会说:先定义“玩手机”的行为边界,是手持手机还是视线停留在屏幕上,然后根据车内摄像头的安装位置确定能看到什么画面,再考虑用人脸关键点加手部检测联合判断,同时用时序信息做平滑,防止单帧误判。模型方面会用轻量化的检测模型加分类头,部署在车机端,延迟控制在几十毫秒以内。

面试官听完会追问一两个转折问题,比如“如果夜间红外图像效果很差怎么办”“如果这个人手放方向盘下方看不到怎么办”。遇到这种追问不要慌,面试官不是要你解决所有问题,而是看你会不会先拆解条件再给方案。

2.4 HR面:软素质与实习安排

HR面放在最后,主要聊实习时间和软素质。问题包括:能实习多久、每周到岗几天、学校和导师是否同意、目前有没有其他offer、如果遇到项目压力和任务冲突会怎么处理。这一轮不太会刷技术候选人,但实习时间不匹配是真会挂的。

如果你是准备实习面试,投递前一定要先确认自己的空余时间。我当时明确表示可以实习6个月,每周到岗5天,导师同意,HR面就非常顺利。如果你只能来两三个月,建议提前想好怎么说明情况,同时表达出“虽然时间短但上手快”的态度。薪资方面,出行平台实习生薪资是有固定范围的,HR问期望时不要报太低也不要报太高,给一个具体范围,然后说明更看重学到的东西。

3. 高频考题和解题思路

3.1 手撕代码:常见的三类题

CV算法岗的手撕代码题,和纯后端开发不太一样,通常有三类。第一类是通用算法题,二分查找、链表反转、二叉树遍历、动态规划、双指针这类,难度在中等偏下。第二类是CV基础算子实现,比如计算IOU、手写NMS、用Numpy实现图像缩放或归一化。第三类是简单的数据处理题,比如按类别统计目标数量、过滤掉面积过小的检测框。

其中最常考的就是NMS。这也是我这次面试被要求手写的题目。下面是我最后写出来的版本:

import numpy as np def nms(boxes, scores, iou_threshold=0.5): x1 = boxes[:, 0] y1 = boxes[:, 1] x2 = boxes[:, 2] y2 = boxes[:, 3] areas = (x2 - x1) * (y2 - y1) order = scores.argsort()[::-1] keep = [] while order.size > 0: i = order[0] keep.append(i) xx1 = np.maximum(x1[i], x1[order[1:]]) yy1 = np.maximum(y1[i], y1[order[1:]]) xx2 = np.minimum(x2[i], x2[order[1:]]) yy2 = np.minimum(y2[i], y2[order[1:]]) w = np.maximum(0.0, xx2 - xx1) h = np.maximum(0.0, yy2 - yy1) inter = w * h iou = inter / (areas[i] + areas[order[1:]] - inter) indices = np.where(iou <= iou_threshold)[0] order = order[indices + 1] return keep

这道题写起来不难,但有几个容易出错的地方。第一,areas必须用浮点数,否则整数坐标下宽高相减可能变成0。第二,排序要用降序,从最高分开始。第三,iou计算时,交集面积不能为负数,所以要用np.maximum(0.0, ...)。第四,当order只剩一个元素时,order[1:]是空数组,np.maximum和np.minimum也能正确处理。我当时犯了第二个错误,排序反了,面试官提示了一下才改过来。所以我要特别强调:先讲清楚思路再动手,边说边写,面试官会更愿意给你提示。

3.2 深度学习与CV基础高频问题清单

技术面里,深度学习基础是必考项。我把这次面试前后遇到的、以及周围同学整理过的问题列出来,按照考察频率排个序:

问题考察方向
过拟合有哪些表现,怎么解决基础概念
BatchNorm在训练和推理的区别模型原理
什么是感受野,怎么计算网络结构
ResNet为什么有效网络设计
目标检测中正负样本不平衡怎么解决工程能力
Anchor是什么,大小怎么设计检测基础
小目标检测难在哪,怎么优化场景理解
训练时Loss不下降怎么办排错能力
模型量化是什么,有什么影响部署基础
Focal Loss和OHEM的区别损失函数

挑几个重点展开。BatchNorm在训练时用当前batch的均值和方差,推理时用的是训练阶段累计的全局统计量。由于训练时数据分布会变化,BN还需要维护两个可学习参数做缩放和平移,这也是很多面试官喜欢深挖的点。感受野计算则经常以“给你一个VGG16,问最后一层感受野多大”这类题出现,你需要掌握逐层递推的算法,而不是死记数字。

关于小目标检测,面试官更想听到能落地的方案。高分辨率输入、FPN多尺度融合、在更多小目标区域做数据增强、专门设计针对小目标的检测头、用滑窗切图推理,这些都是常用手段。你能说出一两条并解释原理,就能超过大多数候选人。

3.3 出行场景业务题拆解

出行平台CV面试的特色是业务题。这类题看起来开放,其实有固定的答题框架。先拆任务、定指标,再谈数据和模型,最后说部署和迭代。我在这里用一道完整的题演示。

题目:如何检测前方路面的轮胎碎片或掉落物。

我的回答思路是:先定义任务,掉落物尺寸小、形状不固定,属于小目标检测,而且车辆在运动,漏检比误检更危险,所以评价指标优先看召回率。数据方面,搜集真实道路掉落物图片会很困难,可以先从公开数据集里筛,再结合人工合成和仿真场景生成,标注时用小目标密集型标注。模型方面,选择轻量化检测模型,比如YOLO系列或者更小的结构,但需要修改网络增加小目标分支,可以借鉴FPN思想,把浅层高分辨率特征和深层语义特征融合。训练时用小目标专门的损失函数,比如把分类损失换成Focal Loss,同时做多尺度训练。部署方面,要考虑端侧算力,可能需要量化、剪枝,推理延迟控制在几十到一百毫秒内。最后要建立闭环,把漏检case定期收集回来做难例挖掘,不断迭代。

说完这一套,面试官基本能看出你有工程思维。不要害怕给出的方案不完美,关键是逻辑闭环。题目里给你一个模糊的问题,你要先把它变成可执行的问题,这是CV算法岗的核心能力。

4. 实操复盘与常见坑

4.1 项目经不起深挖怎么办

我自己的第一轮面试就差点栽在项目上。简历里我写了一个“车辆检测与跟踪”项目,面试官问我:“你预处理的时候,图像resize到多少?长宽比失真怎么处理?”我当时根本没思考过这个问题,愣了几秒,只好说“使用了letterbox方式”。其实我的代码里并没有实现letterbox,面试官接着问细节,我就卡住了。

后来我把这个项目从头到尾重新过了一遍,把每一个参数、每一个预处理步骤都整理进一个文档。比如输入尺寸、是否保持长宽比、标签是否归一化、类别数量、训练集数量、验证集划分方式、最优模型选择的指标、推理时后处理的阈值,全部写清楚。这个文档我建议每个准备面试的人都做一份,不需要给面试官看,但一定要让自己烂熟于心。面试官问到你项目里的任何一个细节,你都能对答如流的时候,这个项目才算真正属于你。

4.2 手撕代码翻车与临场调整

前面提到我在写NMS时把降序排序写成了升序,这是我笔试后的第一次手撕代码,一紧张就犯了这个低级错误。这里分享一个可复用的临场应对方法:不要急着写代码,先用一两句话告诉面试官你的整体思路,比如“我会先按分数从高到低排序,然后依次选置信度最高的框,去掉与它IOU过高的框”。说完思路之后,面试官知道你心里有数,即便代码有小问题,他也会更愿意往“提示”的方向走,而不是直接判负。

写代码的过程中,加注释也很重要。不仅帮你自己理思路,也让面试官看到你的代码习惯。我那次重写NMS时,每一行都念出来自己在干什么,比如“这是取最大坐标,用来算交集区域”。念出来之后,我发现排序错了,就主动说“这里应该用降序”,然后改过来。面试官反而会觉得你有自我纠错能力。

4.3 反问环节:问什么才加分

每次技术面最后,面试官都会问“你有什么想问我的”。很多人要么说不问,要么问加班和薪资,其实浪费了一次加分机会。我的经验是,把反问当成一次展示思考深度的机会。

你可以问:“目前团队在端侧模型部署上,瓶颈主要是在模型结构还是量化流程?”这个问题一出来,面试官会把你当做一个有部署意识的人,而不是只会训练模型的选手。也可以问:“实习生进来主要是承担某一个模块的优化,还是完整跟一个项目?”这种问题让他看到你关注实际产出。还有一个比较稳妥的问题:“团队目前对实习生有什么样的培养路径?”既体现你的稳定性,也让面试官觉得你来实习是真想学东西,而不是混简历。

我二面时问了一个关于“数据闭环”的问题,面试官明显来了兴致,给我讲了不少他们如何把存量司机违规图片收集起来重新标注、重新训练的经验。这种交流是面试里很珍贵的信号,说明他已经把你放在“同事”的位置上了。

5. 给准备者的避坑清单

5.1 常见问题速查表

这一部分,我把面试里最容易遇到的问题和答题思路整理成了一张表。建议面试前一天看一遍,不需要逐字背,但心里要有数。

高频问题考察点参考答题思路
介绍一下你做过的项目表达与真实性按STAR法则,说清背景、任务、行动、结果,结果要量化
手写NMS/IOUCV基础代码先讲思路再写代码,注意边界条件
检测小目标有什么方法业务理解多尺度、高分辨率、数据增强、损失函数调整
正负样本不平衡怎么办实战经验Focal Loss、OHEM、难例挖掘、调整采样策略
怎么判断过拟合基础概念训练loss降、验证loss升,引入正则、早停、数据增强
实习能多久稳定性给出明确时长,尽量讲3到6个月
你最大的缺点是什么自我认知说真实但不致命的缺点,重点讲改进措施
为什么选择我们公司动机匹配结合业务场景、技术方向、个人成长目标回答

答题时注意一个原则:先给结论,再给理由。不要先说一堆铺垫,最后才蹦结论。面试官一天要面很多人,时间有限,你先把结论放在最前面,他能快速判断你的思路,然后才有兴趣听细节。

5.2 两周冲刺时间表

如果你离面试还有两周左右,可以参考这个时间安排。这不是考试攻略,而是我复盘后觉得最有效的准备路径。

前两天把简历上每个项目重新梳理,整理出项目文档,包括模型结构图、训练参数、数据预处理具体代码、结果指标。第三四天集中过深度学习基础,建议找一份高频率面试题清单,逐条口头回答,而不是光看。第五六天刷通用算法题,重点复习二分、双指针、链表和动态规划。七八天练习手写CV算子,NMS、IOU、卷积的朴素实现都要能一口气写出来。九十天做模拟面试,可以找同学或自己给自己提问,把项目介绍用口头讲一遍并录音。十一二天复盘所有卡壳的地方,重点补充说不清楚的知识点。最后两天调整状态,不要再疯狂刷题,回归项目文档和常见题,保证睡眠。

时间表看起来很常规,但大多数人输在“项目没梳理”而不是“题没刷够”。项目是你的锚点,面试官所有的追问都会从锚点出发,把它整理透,你就成功了一半。

5.3 心态与临场技巧

最后聊心态。我面第一轮技术面的时候特别紧张,自我介绍说得磕磕绊绊,项目介绍也像是在背稿子。后来我调整了一个策略:把面试当成一次技术交流,而不是考试。面试官也是工程师,他问的问题你自己平时也会思考,你们是平等的。

遇到不会的问题,千万不要沉默,也不要硬编。可以说“这个方向我之前了解不深,但我认为它可能跟XX有关,我的理解是……”这样即便不准确,面试官也能看到你的推理过程。很多面试官会顺着你的思路给你提示,这时候你再接住,反而比假装会答效果好得多。

还有一个细节:回答完一个问题后,可以加一句“以上是我对这个问题的理解”,给面试官一个明确的信号,说明你已经回答完毕,可以进入下一题了。这个小动作会显得你非常从容。

我个人在实际操作中的体会是,CV算法实习生面试到最后,其实在考察两件事:一是基本功是否扎实,二是面对陌生问题时能不能有条理地拆解。基本功靠平时积累,拆解问题的能力可以靠模拟场景题快速提升。我这次面完最大的收获不是offer本身,而是意识到自己之前准备项目只准备了“我做了什么”,没有准备“我为什么这么选”,更没有准备“为什么不选另一个方案”。后来我把每个项目都补上了这种对比逻辑,再去面其他公司的时候明显稳了很多。如果你也在准备这类面试,建议现在就拿起笔,把你简历里的项目全部重新写一遍,试着用一句话讲清楚背景,再讲清楚为什么选这个方案,你会发现很多面试问题提前就被堵死了。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询