
“CV面试题整理汇总2023持续更新中...”——这个标题是我自己笔记文件的命名习惯每年招聘季前后都会把面过的人、被问到的题、自己答得不顺的地方重新过一遍顺手补进这个文件。计算机视觉这个方向和纯后端不太一样它横跨图像处理、深度学习、模型部署三条线面试官随手一个“你这张图为什么要先转成Float再归一化”就能把只会调库的人筛出去。这篇东西面向准备找CV算法、CV工程、多模态相关岗位的人也适合已经工作两三年、想跳槽前把知识体系重新捋一遍的同行。我把题目按模块拆开每道题不只给结论更写清楚为什么会这么问、回答时该往哪个方向展开、哪些坑我亲眼见过有人踩。整理的标准只有一条面试官听完之后能不能判断你真的动手做过而不是背过。1. 这份CV面试题汇总到底解决什么问题很多人一搜“CV面试题”跳出来的都是零散的题目列表一道题配一句标准答案看着挺全真到面试里一句追问就露馅。我整理这份东西的出发点正好相反题目只是引子重点是把同一类问题背后的知识链条串起来让你在会议室里能顺着面试官的思路往下聊而不是等着他换下一题。1.1 面试官在CV岗上真正想考察什么先说清楚考察结构。CV岗位的面试通常分四块图像基础与工程能力、深度学习理论、任务相关的算法细节、部署与性能。四块的权重跟岗位强相关。偏研究的岗位会把理论问得很深比如让你推导卷积的参数量、解释BN在推理阶段的行为偏工程的岗位更喜欢问数据流水线、推理速度、内存占用、模型上线之后怎么监控。我面过的一个候选人YOLO系列讲得头头是道但被问到“你的预处理在CPU上做了多久”时愣住了最后给出的数字和实际差了十倍——这种回答直接暴露了他只跑过notebook没上过线。面试官问的每一个问题背后基本对应一个判断提问方向面试官想确认的事图像基础你是否理解数据的形状、类型、取值范围网络结构你是否理解计算量和感受野的取舍训练细节你是否真的调过参而不是复制脚本部署问题你是否关心过线上表现和资源成本项目追问你在项目里到底负责哪一部分所以准备的时候别把题目当成孤立的点。把“预处理”这条线从读图、解码、resize、归一化、打包batch一路串起来面试官从哪个点切入你都能接得住。1.2 从“背答案”到“讲清取舍”我最怕听到的回答是“因为大家都这么做”。比如问“为什么分类任务常用交叉熵而不是MSE”如果只回答“交叉熵效果好”基本就到此为止了。合格的回答应该包含MSE在配合Sigmoid时梯度会包含激活函数的导数项输出接近饱和区时梯度很小学习变慢交叉熵配合Softmax时梯度形式更干净误差大时梯度大收敛更快。你看同样是结论后者体现的是“我知道为什么”。再比如Batch Size的调整很多人张口就说“越大越好训练快”。实际要考虑学习率同步放大、显存上限、BN统计量的稳定性。我一般会这样组织回答先给结论再说适用条件最后补一句自己在什么场景下踩过坑。这套结构在面试里特别吃香因为它证明你不只是记了知识点还知道边界在哪。1.3 2023年CV面试的题目风向变化说几个我观察到的变化。第一纯传统图像处理的问题变少了但没消失OpenCV的工程问题反而更多尤其是环境和版本兼容导致的各种异常。第二Transformer相关的问题从“了解”变成“会用”ViT、Swin、DETR这类结构经常被追问位置编码和多尺度怎么处理。第三部署从加分项变成了必需项量化、算子融合、推理引擎的选择几乎每轮都会碰到。第四多模态和图文对齐开始出现在一些岗位的面试里虽然问得不深但至少要知道CLIP这类对比学习的基本思路。还有一个有意思的现象面试官越来越喜欢用“报错”作为切入点。比如直接甩一句terminate called after throwing an instance of cv::exception what(): OpenCV(...)问你怎么排查。这类问题没有标准答案考的就是你的定位思路。2. 图像基础与OpenCV工程能力最容易被忽视的基本功图像基础看起来简单实际是拉开差距的地方。我见过太多人能把网络结构画得清清楚楚却说不清一张图从文件变成张量中间经历了什么。面试官如果连续追问三步预处理很多人就开始含糊了。2.1 图像数据结构与颜色空间那点事第一类必问读进来的图是什么类型。用OpenCV的cv::imread或Python里的cv2.imread默认读出来是uint8形状是H x W x C通道顺序是BGR而不是RGB。这一点每年都能筛掉一批人因为拿BGR直接喂给只在RGB上训练过的模型颜色通道错位会带来明显的精度下降而且这种错误很隐蔽指标掉几个点你未必第一时间想到是通道问题。import cv2 img cv2.imread(sample.jpg) # 默认 BGR, uint8, HWC print(img.shape, img.dtype) # (H, W, 3) uint8 rgb cv2.cvtColor(img, cv2.COLOR_BGR2RGB) float_img rgb.astype(float32) / 255.0 # 归一化到 [0,1]为什么归一化用的是除以255而不是别的因为像素取值范围是0到255除以255把它线性映射到0到1方便后续减均值、除标准差。那为什么不直接减均值除方差因为不同数据集统计量不同先归一化再标准化是通用做法也便于把均值方差固化进模型的前处理配置里。灰度图的处理也常被问。cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)用的是加权平均权重来自人眼对亮度感知的非线性——大约0.299R、0.587G、0.114B。记住这个权重比记住API有用因为面试官可能追问“为什么不直接三个通道相加除以三”。2.2 几何变换、插值与重采样第二个高频区是几何变换。resize、旋转、仿射、透视配上插值方式的选择。插值这里有个判断逻辑缩小图像时更关注抗混叠一般用面积插值INTER_AREA效果稳放大图像时用双线性或双三次双三次更平滑但计算更贵。最近邻最快但边缘会有锯齿语义分割的标签图常用它因为要保持类别索引不被插值污染。我实际踩过一个坑把分割标签图和原图用同一套双线性插值结果标签里出现了2.5这种小数转头做one-hot就报错。后来标签统一用最近邻输入图用双线性问题就没了。这个小细节面试里说出来特别加分因为它证明你真的处理过带标签的数据。仿射变换的矩阵也要会看。旋转加平移可以写成一个2x3的矩阵cv2.warpAffine直接吃这个矩阵。透视变换用cv2.getPerspectiveTransform需要四个对应点。这里常被追问“点序该怎么给”答案是要和目标的宽高对应一致否则会出现图像翻转或者拉伸变形。2.3 传统特征与形态学为什么现在还问有人觉得SIFT、ORB、边缘检测这些过时了其实问它们有两个目的一是考察你对图像本质的理解二是很多工业视觉场景里传统方法比深度学习更稳、更快、更可解释。比如做定位和测量一幅图上一个圆形工件用霍夫圆检测可能几毫秒就搞定上深度学习反而重。形态学运算腐蚀、膨胀、开运算、闭运算要能说清区别开运算是先腐蚀后膨胀用来去小白点闭运算是先膨胀后腐蚀用来补小黑洞。Canny边缘检测的两个阈值怎么定也是一个常考点——高阈值筛强边缘低阈值连弱边缘两者比例经验上大概在2:1到3:1之间。提示被问传统方法时顺势聊一句“什么场景我不会用深度学习”往往能加分。面试官喜欢有判断边界的人。3. 深度学习与卷积网络把原理讲到面试官点头这一块是理论重灾区也是最能拉开差距的部分。题目本身不难难的是面试官会一层一层追问。下面按追问链来整理。3.1 卷积、感受野与参数量的手算“给我算一下这个卷积层的参数量。”这是标配问题。假设输入通道Cin、输出通道Cout、卷积核k×k那么参数量是Cin * Cout * k * k再乘以几就是几层叠加。加上偏置就是Cin * Cout * k * k Cout。输出特征图尺寸是(H - k 2p) / s 1向下取整。这些公式要能在白板上现推别背。感受野的递推也很关键。假设每一层都是3×3、步长1、无空洞那么第n层的感受野是2n 1。如果中间有步长2或者空洞卷积就要按递推公式一层层算。为什么问这个因为感受野决定了模型能“看到”多大范围的上下文直接影响检测大目标和分割边界的效果。深度可分离卷积也必须会算。标准卷积拆成逐通道卷积加逐点卷积之后参数量大约能降到原来的1/Cout 1/k^2。以3×3为例大概压到九分之一左右。这就是MobileNet系列能跑在移动端的核心原因答的时候把公式带上说服力完全不一样。3.2 归一化、激活与初始化BatchNorm的面试问题很稳定训练和推理有什么区别。训练时用当前batch的均值和方差同时用滑动平均更新全局统计量推理时用训练阶段积累的全局均值和方差不再依赖当前batch。这解释了为什么推理时batch size变化不会影响结果也解释了为什么小batch训练BN会不稳。追问常常是“BN和LN的区别”答案核心在于归一化的维度不同BN在batch维度上统计LN在特征维度上统计所以LN不依赖batch大小适合序列和Transformer。激活函数要能说清ReLU的优缺点。优点是计算简单、缓解梯度消失缺点是负半轴梯度为零可能造成神经元“死亡”。于是有了LeakyReLU、ELU这些变体。GELU因为平滑在Transformer里很常见。初始化问题问得也细。为什么不能全零初始化因为会让同一层的神经元输出完全相同反向传播时梯度也相同网络失去对称性破缺的能力等于退化成一个线性层。Xavier适合Sigmoid和TanhHe初始化适合ReLU系因为它们分别考虑了激活函数的方差特性。3.3 损失函数与样本不均衡分类用交叉熵回归常用L1、L2或者Smooth L1。这里常被追问“检测框回归为什么用Smooth L1”。因为L1在零点不可导L2对离群点太敏感Smooth L1在原点附近用平方、远离原点用线性兼顾稳定和鲁棒。样本不均衡是重头戏。Focal Loss的思路是给易分类样本降权把注意力集中到难样本上公式里那个调节因子(1-pt)^gamma就是干这个的。类别不均衡还可以用过采样、欠采样、类别权重、数据增强来缓解回答时最好按场景给建议极端长尾用重采样加Focal Loss组合轻度不均衡直接给类别权重就够了。分割任务里IoU和Dice要能区分。IoU衡量预测和真值的交集比并集Dice更关注重叠部分。两者单调相关但不完全等价Dice对小目标更敏感所以医学图像里Dice用得更多。4. 检测、分割与跟踪CV岗的重头戏如果岗位偏检测或者分割这一块会被问得最深。我的建议是把一条主线理清楚从数据到标签从模型到后处理从指标到调优。4.1 两阶段与单阶段检测的取舍两类方法的区别是必答题。两阶段如Faster R-CNN系列先出候选区域再分类回归精度往往更好但速度慢单阶段如YOLO、SSD、RetinaNet直接回归速度快但早期在小目标上吃亏。回答时要补一句“现在这个界限在模糊”比如YOLO系列经过多轮演进精度已经能追平甚至超过一些两阶段方法而DETR这类基于Transformer的方法又是另一条路线。Anchor-based和Anchor-free的对比也是常问。Anchor需要预设尺度比例超参敏感但召回稳定Anchor-free省掉了这些超参靠关键点或中心点回归结构更简洁但对重叠目标的处理需要额外设计。中心点方法用高斯核在热力图上打标签这个思路要能讲清楚因为它同时出现在检测、关键点和跟踪里。4.2 NMS、mAP这些指标要能自己算NMS的流程要背下来步骤并理解每一步按置信度降序排序取最高分框计算它与其余框的IoU超过阈值的抑制掉重复直到处理完。常见追问是“两个同类物体挨得很近怎么办”答案是NMS会误抑于是有了Soft-NMS不直接删而是降分和基于IoU感知的改进方案。mAP的计算流程要能讲先按类别分别算AP再对类别取平均。AP的计算涉及把预测按置信度排序逐条累计精度和召回画PR曲线求面积。不同数据集对IoU阈值的规定不一样VOC用0.5COCO在0.5到0.95之间取多档再平均所以同一个模型在VOC和COCO上报出来的mAP不能直接比。4.3 分割与关键点的常见追问语义分割、实例分割、全景分割的区别要清楚语义分割只关心类别不区分个体实例分割区分个体全景分割把“可数的东西”和“不可数的背景”统一起来。上采样方式里转置卷积、双线性插值、反池化各有取舍转置卷积可以学习但容易产生棋盘格伪影实践中常用插值加卷积的组合来规避。关键点检测会问热力图回归和坐标回归的区别。热力图对空间信息更友好网络输出分辨率不用太高也能定位但需要把峰值坐标映射回原图尺寸映射时的缩放系数一旦算错关键点整体偏移这种bug很常见。5. 训练调优与工程落地区分候选人的分水岭到这一层面试基本从“知不知道”转向“做没做过”。问题会变得很具体。5.1 数据增强、学习率与过拟合数据增强不是越多越好。翻转、裁剪、颜色抖动、Mixup、CutMix各有适用场景。医学图像里左右翻转要谨慎因为器官位置有方向性文字识别里随机裁剪可能把字切掉得控制裁剪区域。回答时能举出“什么增强在什么场景要慎用”比列举一堆增强手段有用得多。学习率策略要能解释为什么。余弦退火在训练后期平滑下降配合热重启可以跳出局部最优Warmup是因为训练初期权重随机梯度的方差大直接上大学习率容易震荡甚至发散所以先用小学习率预热几百步。过拟合的判断和解决是经典题。判断看训练和验证曲线的分叉解决手段包括增加数据、加正则、加Dropout、减模型容量、早停。这里常被追问Dropout在推理阶段的行为——训练时按概率随机置零并缩放推理时不用Dropout保持期望一致。5.2 模型部署ONNX到推理引擎部署这条链我建议这么讲训练框架导出ONNX再根据目标硬件选择推理引擎然后做图优化、量化、算子融合。ONNX的价值在于统一中间表示但导出时经常遇到算子不支持的问题尤其是自定义层和动态shape。解决办法是替换等效算子或者写自定义插件。量化部分要能分清训练后量化和量化感知训练。训练后量化简单但精度损失可能较大量化感知训练在训练时模拟量化误差精度更稳代价是流程更复杂。INT8相比FP32理论上能带来数倍的吞吐提升但实际收益取决于硬件是否有对应的加速指令。推理引擎的选择可以给个简单对照引擎适合场景需要留意的点ONNXRuntime跨平台快速验证部分算子优化有限TensorRT英伟达显卡推理版本兼容和算子支持OpenVINO英特尔平台模型转换步骤较多5.3 推理性能排查思路性能问题被问到的概率极高。我一般的排查顺序是先确认瓶颈在哪预处理、推理、后处理再确认是否被IO拖慢最后看是否batch和线程配置不合理。很多人测出来的“推理耗时”其实包含了读图和预处理把电费算到了模型头上。一个实用做法是把各阶段打点计时输出一张耗时分布表再针对性优化。预处理可以用多线程、GPU解码、以及把resize和归一化合并到推理引擎的前处理里。6. 高频问题与排查实录那些把人问住的细节这一节是我自己踩坑记录整理出来的和题库不同它更像“故障手册”。6.1 OpenCV常见报错与定位方法前面提到的terminate called after throwing an instance of cv::exception是典型例子。这类报错信息往往只给一个断言失败比如尺寸不匹配、通道数不对、类型不对。定位思路是三步第一看断言里的具体函数名通常能判断是哪个API第二把输入的形状、类型、通道数打印出来核对第三检查是否在空图上操作或者路径读图失败。import cv2 img cv2.imread(missing.jpg) if img is None: raise ValueError(读图失败检查路径和权限)读图失败返回None是最常见的坑之一尤其路径里有中文或者反斜杠时。另一个高频问题是版本差异某些API在新版本里改了参数顺序或者默认行为团队里不同机器装不同版本就会出现“你这边能跑我这边报错”。固定版本并在环境里锁定依赖是省事的做法。6.2 训练异常排查速查表现象可能原因排查动作loss不下降学习率过大/过小、标签错误用小样本过拟合验证loss变NaN梯度爆炸、除零、数据含异常值加梯度裁剪、检查输入范围训练好验证差过拟合、数据分布不一致检查数据划分和增强一致性指标突然掉预处理改动、通道顺序错比对前后处理配置显存溢出batch过大、中间张量未释放降batch、用梯度累积“用小样本过拟合”这一条我强烈建议所有人掌握。取十张图关掉增强训练到loss接近零如果连这都做不到说明代码本身有bug不用去怀疑超参。6.3 面试中的代码手撕环节手撕代码部分CV岗的题目集中在几类NMS、IoU、卷积实现、图像处理函数、以及张量操作。写NMS的时候注意维度顺序和边界情况IoU注意除零。写卷积的时候可以用滑窗或者矩阵展开面试官更在意你的思路是否清晰而不是能不能一行写完。注意手撕代码时先说思路再动手中间卡住也要出声说明你在做什么。面试官判断的是过程不是结果。7. 我自己的复习节奏与项目讲解方法最后聊点方法层面的东西这部分不写进题库但实际影响很大。7.1 三周复习节奏安排第一周过基础图像处理加网络原理边看边在纸上手推公式卷积参数量、感受野、BN这些必须能默写。第二周过任务算法检测、分割、关键点各挑一到两个代表结构搞清楚各自的创新点和取舍最好能画出结构简图。第三周过部署和项目把自己的项目从头到尾讲一遍准备好在任何一步被打断追问。每天的节奏我建议是上午理论、下午动手、晚上复盘。动手环节不要只看视频找一个开源实现跑通并且改一处结构看指标变化这种体验在面试里能讲出很多细节。7.2 简历项目怎么讲才有说服力项目讲述我总结成四句话结构背景和难点、你做了什么、结果如何、如果重做会改什么。第三句必须带数字比如“在某个数据集上mAP提升了若干点推理耗时下降多少毫秒”。第四句最容易被忽视但最能体现你的反思能力——面试官很吃这一套因为绝大多数候选人只会讲成功不会讲复盘。被追问“这个模块是你做的还是别人做的”时诚实回答讲清楚自己能独立完成的部分。夸大之后一旦深入追问破绽会非常明显。7.3 反问环节问什么反问不要浪费。可以问团队当前的技术栈、模型部署方式、数据规模、以及新人上手的第一个任务大概是什么。这些问题既能帮你判断岗位是否匹配也能让面试官觉得你是真的在考虑来不来而不是海投。我个人比较喜欢问“团队现在最难的技术问题是什么”答案往往能透露很多真实信息比如是数据质量、算力、还是工程效率。这份汇总我会继续往里补尤其是部署和排查这两块因为它们是实际工作中真正花时间的地方也是面试里最容易区分出“做过”和“没做过”的地方。如果你也在准备CV方向的面试建议别只收藏题库挑一个模块今晚就把它的追问链自己讲一遍卡壳的地方就是你要补的。