☰
2023版CV面试题库:图像基础、深度学习与工程部署高频题
2026/9/30 12:10:08 网站建设 项目流程

做CV方向的同学大概都有过这种体验:简历上写着熟悉OpenCV、做过检测和分割项目,面试官开口第一个问题却是"你说说BGR和RGB为什么要转,不转会怎样"。这类问题不难,但答不利索就直接暴露了基本功。这几年我把面过的、被面过的、帮别人复盘过的题目攒在一起,慢慢整理成了一份自己的CV面试题库,2023年这一版又补了不少新东西。它主要面向三类人:准备校招/社招的CV算法和工程岗候选人、从其他方向转CV的开发者、以及需要给团队做技术摸底的技术负责人。内容覆盖图像基础、传统图像处理、深度学习模型、工程部署四大块,既有原理问答也有一些纯实操的坑。我尽量不写成教科书,而是按"面试官想听什么、你为什么这么答、答错了会踩什么坑"这个思路来组织,能直接拿去对着练。

1. 为什么要自己动手整理一份CV面试题

1.1 从"背题"到"建知识地图"的差别

市面上现成的题库不少,但直接背的效率和理解着整理完全不是一个量级。我试过纯背,结果就是面试官随口换个问法立刻卡壳——比如题库里问"BN的作用是什么",你背了"加速收敛、防止过拟合",面试官接着问"那推理阶段BN还做归一化吗,均值方差从哪来",背答案的人当场就哑了。整理题库的真正价值,是逼着你把零散的知识点连成一张地图:图像从采集到送入模型的每一步做了什么变换,模型内部的每一层承担什么职责,推理部署时哪些算子会被合并、哪些会拖慢速度。有了这张地图,面试官问哪一块,你都能顺着地图往上下游延伸两句,这才是能让对方觉得"这人真做过"的地方。

我自己的整理方式是给每一道题打三个标签:知识点归属(属于哪一块地图)、考察意图(面试官其实想判断什么能力)、延伸方向(答完能主动往哪带)。举个例子,"图像为什么常用归一化到[0,1]或标准化到均值0方差1"这道题,知识点归属是数据预处理,考察意图是看你懂不懂数值稳定性与收敛的关系,延伸方向可以带到"不同backbone对输入范围的偏好不同,比如某些预训练模型要求特定mean/std"。这样一道题就串起了三四个考点,比孤立记忆牢固得多。

1.2 2023年CV岗位能力画像的变化

前几年CV面试的重心还是"你会不会训模型",2023年明显感觉重心往两头挪了:往上游挪到数据处理和标注质量,往下游挪到部署和成本。我统计过自己近两年记录的面试题,纯模型结构原理类大概占四成,工程与部署类占了三成多,剩下的才是传统图像处理和数据相关。这个比例变化背后是行业的真实需求——模型架构已经高度开源化,能训出模型的人多了,但能把它稳定、低成本地跑在真实业务上的人依然稀缺。

所以我在整理2023版题库时,刻意加重了三类内容:推理优化(量化、蒸馏、算子融合、TensorRT/ONNX相关知识)、数据闭环(标注规范、难例挖掘、数据清洗)、传统方法(因为很多岗位的预处理和后处理仍然是OpenCV手写的,这块答不出来会显得只会调库)。传统方法这块特别有意思,很多人觉得"都深度学习时代了还考Canny?",但恰恰是这类题最能筛人,因为它考的是你有没有真正理解图像本身。

1.3 我的分类框架与使用建议

整份题库我分成四大模块,每个模块下面再按"基础—进阶—工程"三层排列。基础层是必须张口就来的,比如色彩空间、卷积计算、常见损失函数;进阶层是能讲清楚为什么的,比如各种归一化层的区别、注意力机制的设计动机;工程层是能讲出踩坑经验的,比如显存不够怎么调、推理延迟怎么定位。使用方法上我的建议是先做减法再做加法:先确定目标岗位的画像(是偏研究还是偏工程),只保留相关模块精刷,别一上来就全铺开,容易挫败。等你把核心模块刷透了,再往回补边角知识,这时候效率反而更高。

提示:整理题库时一定要记录"我是怎么答错的",而不是只记标准答案。错题本的价值远大于题库本身。

2. 图像基础与OpenCV实操:送分题与送命题并存

2.1 像素、通道、色彩空间这些"简单"问题

这块是面试开场的高频区,因为面试官想快速判断你的基本功和真实动手经验。最经典的几道:图像在内存里是怎么存的、BGR和RGB有什么区别、灰度化怎么算、HSV为什么更适合做颜色分割。先说存储,一张H×W的三通道彩色图在内存里通常是连续的H×W×3字节数组,但也可能是按通道分开存储的平面格式(planar),OpenCV默认是交错格式(interleaved),而很多推理框架或GPU算子更偏好平面格式。这个差异直接导致一个非常常见的坑:用OpenCV读图后直接喂给某些推理引擎,颜色会反,因为一个是BGR一个是RGB。

灰度化的公式很多人只记得加权平均,但面试官会追问权重为什么是0.299、0.587、0.114。这三个数来自人眼对不同波长光的敏感度——人眼对绿光最敏感,对蓝光最不敏感,所以绿色通道权重最高。如果你能顺带提一句"这个系数对应的是Rec.601标准,Rec.709的系数略有不同",基本就是加分项了。至于HSV,它的价值在于把"颜色是什么"(H)和"颜色多亮"(V)解耦了,做颜色阈值分割时用HSV比用RGB稳得多,因为光照变化主要影响V而不是H。

  • 面试常问:为什么HSV更适合颜色分割?答:色相与亮度解耦,对光照变化更鲁棒。
  • 延伸准备:LAB色彩空间的L通道也常用于亮度相关的处理,a、b通道接近人眼感知的色差。
  • 动手验证:自己写个脚本,把同一张图在RGB和HSV下各做一次红色提取,对比阈值范围,感受差别。

2.2 卷积、滤波与边缘:从均值到双边

滤波这块的核心是理解"卷积核决定了对什么样的信号敏感"。均值滤波就是全1归一化核,简单但在边缘处会把边缘也糊掉;高斯滤波按距离加权,中心权重大,平滑更自然,而且它是可分离的,二维高斯可以拆成两个一维卷积,计算量从O(n²)降到O(n),这个"可分离"是高频考点。中值滤波是非线性的,对椒盐噪声特别有效,因为它取的是排序后的中位数,孤立的极端值会被直接干掉。

双边滤波是个分水岭式的题。它同时考虑空间距离和像素值差异,所以能在平滑的同时保住边缘。面试官常问"双边滤波为什么慢",因为它不是简单的卷积,每个像素的权重都依赖邻域像素的值,无法用可分离卷积加速,常规实现是O(n²)每像素。如果能顺带提到"引导滤波是双边的一种快速近似",说明你确实翻过论文。

滤波方法线性/非线性主要用途边缘保持典型复杂度
均值滤波线性快速去噪差O(n²),可分离
高斯滤波线性通用平滑一般O(n),可分离
中值滤波非线性椒盐噪声较好取决于排序
双边滤波非线性保边平滑好O(n²),难加速

2.3 cv::exception 这类报错怎么系统排查

热词里出现了terminate called after throwing an instance of 'cv::exception' what(): openc...,这个报错我见得太多了,几乎是OpenCV新手的必修课。它的完整信息通常包含文件、行号和具体原因,比如Assertion failed后面跟着条件。排查有个固定套路,我整理成了一条路径:先读完整报错,找到断言条件;再看涉及哪些尺寸、类型、通道数;最后回头检查你的输入是不是符合这个函数的隐式要求。

举几个我真实踩过的例子。第一种是尺寸不匹配,比如cv::add或矩阵运算要求两个Mat尺寸和类型一致,你的mask是单通道而图像是三通道,就会抛断言。第二种是类型不对,OpenCV的Mat有CV_8U、CV_32F等类型,很多函数只接受特定类型,比如某些滤波要求输入是单通道浮点或8位。第三种最常见也最隐蔽:中文路径或路径不存在,cv::imread不会报错,它只是默默返回一个空的Mat,然后你后面任何操作都会在空Mat上抛异常。所以我养成了一个习惯,读图之后立刻加一句检查:

import cv2 img = cv2.imread(path, cv2.IMREAD_COLOR) if img is None: raise ValueError(f"读图失败,检查路径是否存在或是否包含非ASCII字符: {path}") print(img.shape, img.dtype)

这几行看着简单,但能省掉大量调试时间。更进一步,我建议在关键节点都打印shape和dtype,因为绝大多数cv::exception本质都是"你以为的形状"和"实际的形状"不一致。

注意:cv::imread读图失败返回空Mat而不抛异常,这是OpenCV设计上的一个"坑",务必手动判空。

3. 传统图像处理与特征工程的高频考点

3.1 边缘检测与霍夫变换

Canny几乎是必问的,但面试官想听的不是"它用了双阈值",而是完整的流程和每一步的意图。标准流程是高斯滤波去噪、计算梯度幅值和方向、非极大值抑制、双阈值检测加滞后连接。其中非极大值抑制是重点:沿着梯度方向比较相邻像素,只保留局部最大,这样边缘会被细化到一个像素宽。双阈值的作用是用高阈值确定"确定是边缘"的种子,再用低阈值沿着这些种子做连通扩展,只保留与强边缘相连的弱边缘,从而抑制造点又不断开真实边缘。如果你能说出"高低阈值的比值经验上取2:1到3:1",就是明显的动手痕迹。

霍夫变换的考点是"它为什么能检测直线"和"它的参数怎么调"。原理是把图像空间的点映射到参数空间,一条直线上的所有点会在参数空间交于一点,于是直线检测变成了找峰值。面试常问的是它的计算代价和如何改进,可以提到概率霍夫变换,它随机采样边缘点来投票,比标准霍夫快很多,同时还能输出线段端点。

3.2 特征点与描述子:SIFT、SURF、ORB

这组题的核心是理解"特征点要满足什么性质":可重复性、可区分性、尺度不变、旋转不变、对光照和噪声鲁棒。SIFT之所以经典,是因为它用高斯差分金字塔找尺度空间极值,再用梯度方向直方图定主方向实现旋转不变,描述子用128维梯度统计实现光照鲁棒。面试官爱问的和计算有关:SIFT为什么慢,因为它的金字塔层级多、描述子维度高,且当时受专利保护,工业上常用ORB替代。

ORB是个性价比之王,它融合了FAST角点检测和BRIEF描述子,速度极快,而且加了方向信息让BRIEF具备旋转不变性。高频问题包括"ORB和SIFT在什么场景下选哪个"——实时性要求高、光照变化不剧烈的场景选ORB,比如SLAM的前端;精度要求高、场景变化大的选SIFT。这种"根据场景选方法"的问题最能体现工程判断力。

  • FAST角点:只比较像素与圆周上若干点的亮度,极快,但没有方向和尺度。
  • BRIEF描述子:二进制串,用汉明距离匹配,快但旋转不变性差。
  • ORB:FAST加方向,BRIEF加旋转,兼顾速度和鲁棒。

3.3 几何变换与插值:细节里的水平

缩放、旋转、仿射、透视变换这些操作,面试官往往用一个具体问题切入:"图像放大两倍时你用的是哪种插值,为什么?"最近邻插值最快但会产生锯齿和块状效应,双线性插值用周围四个点加权,平滑但边缘会略糊,双三次用十六个点,质量更好但更慢。放大场景一般用双线性或双三次,缩小时则要注意先做低通滤波再采样,否则会引入混叠,这就是所谓的抗混叠处理。

透视变换的考点是"需要几个点",答案是四个点对,因为它有八个自由度。做题时常见的问题是"四点顺序和对应关系搞反了导致结果翻转"——我踩过这个坑,透视变换的源点和目标点顺序必须严格一一对应,否则出来的图会扭曲得离谱。实操上我习惯先用鼠标取点标出来看一眼,确认对应关系没问题再做变换。

4. 深度学习时代的CV核心考点

4.1 卷积网络的必答题

卷积这块最经典的计算题是"给定输入尺寸、卷积核大小、步长、填充,求输出特征图尺寸"。公式是 floor((H + 2P - K) / S) + 1,面试时最好能口算。更深一层的问题是感受野,感受野是指输出特征图上某个点对应原图多大区域,它随层数累积增长,这也是为什么深层网络能"看到"全局信息。常见追问是"两个3×3卷积和一个5×5卷积感受野一样吗",答案是一样,但两个3×3的参数更少、非线性更多,所以VGG里全用3×3。

然后是各种归一化层。BN在训练时用当前batch的均值和方差,推理时用滑动平均的全局统计量;这个训练/推理的不一致是高频考点。LN不依赖batch维度,适合序列或小batch场景。GN把通道分组做归一化,在小batch下比BN稳。这里有个很容易被追问的点:为什么BN对batch大小敏感——因为batch小的时候统计量噪声大,导致训练不稳定。

4.2 目标检测:从两阶段到单阶段

检测题几乎跑不掉IoU、NMS、mAP这三板斧。IoU是交并比,计算两个框的重叠程度,我在面试时经常被要求现场手写。NMS是非极大值抑制,先按置信度排序,取最高分框,然后抑制与它IoU超过阈值的其他框,循环直到处理完。面试官爱追问"NMS有什么缺点"——它会误删密集场景中真实相邻的目标,于是诞生了Soft-NMS(用分数衰减代替直接删除)和各类改进方法。手写NMS是个很能体现水平的题,因为它既考逻辑又考边界处理。

import numpy as np def nms(boxes, scores, iou_thresh=0.5): # boxes: [N, 4] 格式为 x1,y1,x2,y2 order = scores.argsort()[::-1] keep = [] while order.size > 0: i = order[0] keep.append(i) if order.size == 1: break xx1 = np.maximum(boxes[i, 0], boxes[order[1:], 0]) yy1 = np.maximum(boxes[i, 1], boxes[order[1:], 1]) xx2 = np.minimum(boxes[i, 2], boxes[order[1:], 2]) yy2 = np.minimum(boxes[i, 3], boxes[order[1:], 3]) w = np.maximum(0.0, xx2 - xx1) h = np.maximum(0.0, yy2 - yy1) inter = w * h area_i = (boxes[i, 2] - boxes[i, 0]) * (boxes[i, 3] - boxes[i, 1]) area_o = (boxes[order[1:], 2] - boxes[order[1:], 0]) * (boxes[order[1:], 3] - boxes[order[1:], 1]) iou = inter / (area_i + area_o - inter + 1e-6) order = order[1:][iou <= iou_thresh] return keep

mAP的考点是"它怎么算"。以单类为例,把预测按置信度排序,逐个累加计算精确率和召回率,画出PR曲线,曲线下面积就是AP,多类取平均就是mAP。面试常问"mAP@0.5和mAP@0.5:0.95有什么区别",后者在多个IoU阈值下取平均,对定位精度要求更高,也更严格。

4.3 语义分割、实例分割与关键技术

分割的核心区分题是:语义分割不区分同类实例,实例分割要区分,全景分割两者兼有。语义分割里最经典的问题围绕上采样和感受野展开,比如"为什么需要跳跃连接"。以U-Net为例,编码器不断下采样提取语义,解码器上采样恢复分辨率,而跳跃连接把编码器的高分辨率细节直接送到解码器,解决了下采样过程中细节丢失的问题。

转置卷积和插值是另一个高频区。转置卷积不是"卷积的逆运算",它更像是把输入按比例放大后再做卷积,会产生棋盘格伪影,所以很多网络改用"最近邻上采样加卷积"的组合来避免。这里有个实操经验:如果你在做分割时发现输出有规律的网格状纹理,八成是转置卷积的步长和核大小不匹配导致的,改小核或换插值上采样通常能解决。

4.4 注意力机制在CV里的落地

从ViT火了之后,注意力成了必问项。核心是自注意力的计算:Q乘K算出相似度,归一化后加权V。面试官会问"自注意力的复杂度",答案是O(n²d),n是序列长度,这也是为什么高分辨率图像上直接用ViT很吃力。于是有了各种改进:窗口注意力把全局注意力限制在局部窗口内降低复杂度,再用移位窗口实现跨窗口信息交互;还有用卷积做局部建模、注意力做全局建模的混合结构。

一个容易被追问的点是"位置编码为什么必要"。因为自注意力本身对输入顺序是置换不变的,不做位置编码的话,模型分不清图像块的空间位置,等于把图像当成了一袋词。这在分类任务上可能还能勉强工作,但在检测、分割这种强空间依赖的任务上会直接崩掉。

5. 工程落地与部署优化:拉开差距的地方

5.1 模型压缩与推理加速

这块题目的特点是"没有标准答案,全看经验"。量化是最常问的,核心是把浮点权重和激活用低比特整数表示来减少计算和内存。面试官会追问"量化的主要难点",答案是激活值的动态范围难以预先确定,所以有训练后量化(简单但精度损失大)和量化感知训练(精度好但要改训练流程)。另一个高频点是算子融合,把卷积、BN、激活合并成一个算子,减少内存读写,推理框架基本都会自动做这个。

蒸馏和剪枝也常出现。蒸馏是让小模型学大模型的软标签,剪枝是去掉不重要的权重或通道。我个人的经验是,面试时能说出"剪枝后通常需要微调恢复精度"这种落地细节,比只讲概念更有说服力。

优化手段主要收益典型代价落地难度
量化提速、省显存精度损失中
剪枝减小模型需微调中高
蒸馏小模型提精度需教师模型中
算子融合减少访存依赖框架低

5.2 数据处理与训练工程

数据这块的题往往是"开放式的",比如"让你做一个缺陷检测项目,数据只有几百张你会怎么做"。这题考的是工程思维,可以答:先用数据增强扩充,包括几何变换和颜色扰动;再用迁移学习,从预训练模型微调;如果缺陷样本极少,可以考虑异常检测思路,只学好样本的分布再找异常。面试官想看到的是你有没有真的处理过小样本问题,而不是背了一堆增强方法的名字。

标注质量也是个隐蔽考点。很多人忽略的是标注一致性,同一张图不同标注员画框的松紧不同,会让模型学到噪声。工程上会用交叉校验、标注规范文档、以及让模型参与预标注来提高一致性。这些细节平时看着琐碎,但面试时说出来会让人觉得你干过真项目。

5.3 部署链路上的常见面试题

部署题的经典开场是"一个模型训练时精度很好,上线后效果变差,你怎么排查"。这是一道典型的系统性排查题,可以按链路往下走:先确认前后处理是否一致(训练和推理的归一化参数、通道顺序是否一致),再确认输入尺寸和插值方式是否一致,然后是模型是否被正确转换(比如转ONNX时某些算子行为变了),最后考虑线上数据分布是否和训练数据偏移。这个问题的价值在于它逼你把整条链路完整地说一遍。

另一个高频题是"推理延迟高怎么优化"。我的排查顺序是:先看是不是预处理成了瓶颈(读图、解码、resize很吃CPU),再看模型本身(能不能量化、能不能换更小的backbone),最后看批次和并发策略。很多人一上来就想换模型,其实很多时候瓶颈在数据前处理。

提示:部署相关的题,回答时一定要带"先定位再优化"的思路,直接给方案会被追问"你怎么知道是这里慢"。

6. 常见问题与排查技巧实录

6.1 面试高频翻车点速查表

整理题库的过程中我发现,很多人不是不会,而是答得没有结构。下面这张表是我总结的"典型问题—翻车原因—正确姿势",可以直接对着自查。

问题类型常见翻车点正确做法
概念题只给结论不给动因先说是什么,再说为什么这么设计
计算题公式记混、不写推导写清每一步,边界情况单独说明
场景题直接给方案先问清约束,再分情况讨论
代码题忽略边界和空输入先处理空、单元素、越界
部署题一上来就换模型先定位瓶颈再优化

拿计算题举例,有人被问卷积输出尺寸,直接背公式往里套,结果遇到步长不能整除的情况就懵了。正确的做法是理解公式里每一项的含义,知道向下取整是因为超出边界的部分不计算。理解了这层,无论怎么改参数你都能推。

6.2 复习节奏与刷题顺序建议

我建议大家别按"从第一章背到最后一章"的方式复习,而是用倒推法:先找三到五个目标岗位的真实JD,把里面出现的技术关键词列出来,然后按出现频率排优先级。这样你会发现,高频的其实就那么几十个点,集中精力攻下它们,收益远大于平均用力。

时间安排上,我一般建议留两到三周:第一周过基础概念,重点是能讲清楚为什么;第二周补工程和部署,结合自己项目里真实的坑;第三周做模拟问答,最好是找个人互相面,或者自己对着问题限时口述并录音。录音回放是提升表达最有效的方法,你会发现很多口头禅和逻辑断层,自己听一遍就全暴露出来了。

6.3 几个我自己踩过的坑

第一个坑是"为了显得专业而堆术语"。我早期面试特别喜欢说"我们用了各种先进的特征融合和注意力机制",结果面试官一句"具体融合在哪一层、为什么是那一层"就把我问住了。后来我学乖了,宁可讲一个简单但讲透的点,也不堆一堆讲不清的名词。面试官判断你真懂还是装懂,往往就看你能不能在细节上被追问三层还不崩。

第二个坑是"只准备成功案例"。有一次面试官问"你做过失败的项目吗",我愣住了,因为题库里没有这类题。后来我专门准备了一个效果不达预期的项目复盘,讲清楚问题出在哪、怎么定位的、最后学到什么,反而成了加分项。真实项目很少有完美收尾的,能坦诚复盘反而更可信。

第三个坑是忽略了动手验证。很多概念我以为自己懂了,直到真写代码才发现漏洞。比如NMS我背得滚瓜烂熟,第一次手写时忘了处理空输入和"只剩一个框"的边界,跑起来就报错。所以我现在的习惯是,凡是面试可能要求手写的算法,我一定至少完整实现一遍并通过几个边界用例。

这份题库我还在持续往里加,尤其是部署和数据处理这两块,因为行业需求变得快。我个人的体会是,面试题的答案会过时,但"把每个问题问到三层为什么"的习惯不会过时。你整理的过程本身,比整理出来那份文档值钱得多。

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

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

立即咨询