最近面试了几家公司的计算机视觉算法岗,被问到了很多有深度的问题,从传统CV到深度学习,从目标检测到图像分割,从模型原理到工程落地。本文整理了我被问到的那些计算机视觉面试题,附上我的回答思路,希望对正在准备CV面试的朋友有所帮助。
一、面试背景
先说说我的情况。我做计算机视觉算法开发三年了,主要做目标检测和图像分割方向,用过TensorFlow和PyTorch,有实际项目落地经验。最近想换个环境,面试了几家公司,有大厂也有创业公司,岗位都是CV算法工程师。
面试下来最大的感受是:现在的CV面试越来越注重基础和深度,不是只会调参、跑模型就能过的。面试官会从一个问题深入追问,直到你答不上来为止,考察你对原理的理解深度。而且工程落地能力越来越受重视,只会写论文、做实验不够,还要懂模型部署、性能优化、业务落地。
下面把我被问到的问题按类别整理出来,分享我的回答思路。
二、深度学习基础题
问题1:卷积神经网络为什么适合图像处理?相比全连接网络有什么优势?
回答思路:
- 局部感受野:卷积核只关注局部区域,符合图像的局部相关性(相邻像素关系密切,远处像素关系弱)
- 权值共享:同一个卷积核在整张图上滑动,参数大大减少,降低过拟合风险
- 平移不变性:同一个特征不管出现在图像哪个位置,都能被同一个卷积核检测到
- 层级化特征提取:浅层提取边缘、纹理等低级特征,深层提取物体部件、整体等高级特征
- 相比全连接网络,参数量少得多,训练更快,泛化能力更强
问题2:BatchNorm的原理是什么?为什么能加速训练?
回答思路:
- 原理:对每个mini-batch的数据,在每个通道上做归一化,减去均值除以标准差,然后做缩放和平移(两个可学习参数gamma和beta)
- 加速训练的原因:
1. 解决了内部协变量偏移(ICS)问题,每层输入分布稳定,学习率可以设大一些 2. 缓解了梯度消失和梯度爆炸,梯度更稳定 3. 对初始化不那么敏感,降低了调参难度 4. 有一定的正则化效果(因为均值和方差是在mini-batch上计算的,引入了噪声)
- 注意:训练时用batch的均值方差,推理时用全局的滑动平均均值方差
- 局限性:batch size太小时效果不好,所以有了LayerNorm、GroupNorm等替代方案
问题3:ResNet的残差连接为什么能解决梯度消失?
回答思路:
- 残差连接:H(x) = F(x) + x,网络学习的是残差F(x) = H(x) - x,而不是直接学习H(x)
- 反向传播时,梯度可以通过残差连接直接回传,梯度 = ∂F/∂x + 1,即使∂F/∂x很小,梯度也不会消失(因为有+1)
- 残差连接让信息可以直接跨层流动,深层网络也能有效训练
- 残差学习比直接学习恒等映射更容易,因为残差通常接近于零,优化空间更小
- ResNet的核心贡献就是让训练上百层甚至上千层的网络成为可能
问题4:过拟合怎么解决?
回答思路:
- 数据层面:数据增强(翻转、裁剪、颜色抖动、Mixup、CutMix等)、收集更多数据、迁移学习
- 模型层面:降低模型复杂度、正则化(L1/L2)、Dropout、DropConnect、早停(Early Stopping)
- 训练层面:交叉验证、权重衰减、学习率调度
- 其他:BatchNorm有一定正则化效果、标签平滑(Label Smoothing)、模型集成
- 关键是要分析过拟合的原因:是数据太少还是模型太复杂,针对性解决
三、目标检测题
问题5:两阶段检测(Faster R-CNN)和一阶段检测(YOLO、SSD)的区别和优缺点?
回答思路:
- 两阶段:先生成候选框(RPN),再对候选框分类和回归。代表:Faster R-CNN、Mask R-CNN
- 优点:精度高,尤其是小目标和密集目标;候选框质量高 - 缺点:速度慢,因为有两个阶段,不适合实时场景
- 一阶段:直接在特征图上回归框和分类,没有候选框阶段。代表:YOLO、SSD、RetinaNet
- 优点:速度快,适合实时检测;结构简单,容易部署 - 缺点:精度略低于两阶段,尤其是小目标;正负样本不平衡问题严重
- 趋势:现在一阶段检测的精度已经追上来了(如YOLOv4/v5、RetinaNet用Focal Loss解决样本不平衡),实际应用中一阶段用得更多,因为速度优势明显
- 选择:对精度要求高、不要求实时,选两阶段;要求实时、精度可接受,选一阶段
问题6:Focal Loss的原理是什么?解决了什么问题?
回答思路:
- 解决的问题:一阶段检测中正负样本极度不平衡(负样本可能有上万个,正样本只有几十个),大量简单负样本的损失淹没了正样本和难样本的梯度,导致模型学不好
- 原理:在交叉熵损失基础上加了一个调制因子(1 - p_t)^gamma,降低易分类样本的权重,让模型更关注难分类的样本
- 公式:FL(pt) = -alphat (1 - pt)^gamma log(pt)
- gamma调节聚焦程度,gamma=0时就是普通交叉熵,gamma越大越关注难样本,一般取2
- alpha_t用来平衡正负样本,一般正样本取0.25,负样本取0.75
- 效果:RetinaNet用了Focal Loss之后,精度超过了两阶段的Faster R-CNN,证明一阶段也能达到高精度
问题7:NMS(非极大值抑制)的原理是什么?有什么改进?
回答思路:
- 原理:检测算法会对同一个目标产生多个重叠的检测框,NMS用来去除重复框。步骤:按置信度排序,选最高分的框,删除和它IoU大于阈值的其他框,重复直到没有框
- 传统NMS的问题:
1. 阈值是固定的,不同场景需要不同阈值 2. 密集目标时,两个不同目标的框IoU高,会被误删 3. 直接把低分框删掉,可能会丢失一些检测
- 改进方法:
1. Soft-NMS:不直接删除,而是降低重叠框的分数,更适合密集场景 2. DIoU-NMS:用DIoU代替IoU,考虑了中心点距离,更准确 3. 自适应NMS:根据场景动态调整阈值 4. 可学习NMS:用网络学习NMS策略,如Relation Network
问题8:小目标检测有哪些方法?
回答思路:
- 特征层面:
1. 特征金字塔(FPN):融合浅层高分辨率特征和深层语义特征,提升小目标检测 2. 高分辨率输入:增大输入图像尺寸,小目标更清晰 3. 空洞卷积:扩大感受野同时保持分辨率
- 数据层面:
1. 数据增强:针对小目标的增强,如复制粘贴小目标、过采样含小目标的图像 2. 超分辨率:对小目标区域做超分,提升分辨率
- 模型层面:
1. 锚框设计:针对小目标设计更小的锚框,更密集的锚点 2. 专门的小目标检测头:增加浅层特征的检测分支 3. 上下文信息:利用小目标周围的上下文辅助检测
- 训练层面:
1. 损失函数:对小目标的损失加权 2. 多尺度训练:训练时用不同尺寸,增强对小目标的鲁棒性
四、图像分割题
问题9:语义分割和实例分割的区别?
回答思路:
- 语义分割:对图像中每个像素分类,区分不同类别,但不区分同一类别的不同个体。比如把所有"人"的像素都标成人,不区分是哪个人
- 实例分割:在语义分割基础上,还要区分同一类别的不同个体。比如图像中有三个人,要分别标出来,知道哪个像素属于哪个人
- 难度:实例分割比语义分割更难,因为既要分割又要检测和区分个体
- 代表方法:语义分割有FCN、U-Net、DeepLab系列;实例分割有Mask R-CNN、YOLACT、SOLO等
- 应用:语义分割适合自动驾驶的道路场景理解、医学图像分割;实例分割适合需要精确到个体的场景,如人数统计、机器人抓取
问题10:U-Net为什么在医学图像分割中效果好?
回答思路:
- U型结构:编码器(下采样)提取特征,解码器(上采样)恢复分辨率,中间有跳跃连接把浅层特征和深层特征融合
- 跳跃连接:把编码器的特征直接拼接到解码器对应层,保留了浅层的高分辨率细节信息,对分割边界很重要
- 适合小数据集:医学图像数据通常很少,U-Net结构相对简单,参数不多,不容易过拟合,在小数据集上也能训练好
- 多尺度特征融合:跳跃连接让模型同时利用深层语义信息和浅层细节信息,分割更精确
- 端到端训练:不需要候选框或后处理,直接输出分割图,简洁高效
- 这些特点让U-Net成为医学图像分割的标准架构,后来的很多方法都是在U-Net基础上改进的
问题11:DeepLabv3+的ASPP模块是什么?有什么用?
回答思路:
- ASPP(Atrous Spatial Pyramid Pooling):空洞空间金字塔池化
- 原理:用不同膨胀率的空洞卷积并行提取特征,捕捉多尺度上下文信息。不同膨胀率对应不同的感受野,能捕捉不同大小的目标
- 作用:
1. 多尺度信息融合,对不同大小的目标都有好的分割效果 2. 空洞卷积在不增加参数量的情况下扩大感受野,保持分辨率 3. 比普通金字塔池化更高效,不需要多次下采样上采样
- DeepLabv3+在ASPP基础上加了编码器-解码器结构,进一步提升分割边界的精度
五、模型部署和工程题
问题12:模型部署到端侧有哪些优化方法?
回答思路:
- 模型压缩:
1. 剪枝:去掉不重要的权重或通道,减少参数量和计算量 2. 量化:把FP32权重变成INT8甚至INT4,减少存储和计算,推理速度提升 3. 知识蒸馏:用大模型(教师)指导小模型(学生)训练,小模型能达到接近大模型的精度 4. 网络结构搜索(NAS):自动搜索适合端侧的高效网络结构
- 推理优化:
1. 用推理框架:TensorRT、ONNX Runtime、NCNN、MNN等,针对硬件做了优化 2. 算子融合:把多个小算子合并成一个大算子,减少内存访问和kernel启动开销 3. 内存优化:复用中间张量的内存,减少内存占用
- 工程优化:
1. 多线程/多进程并行 2. 流水线处理,预处理、推理、后处理并行 3. 批处理,提高GPU利用率
- 关键是根据具体硬件(CPU/GPU/NPU/手机芯片)选择合适的优化方法和推理框架,不能一概而论
问题13:模型推理时速度慢,怎么排查和优化?
回答思路:
- 先定位瓶颈:
1. 用profiler工具分析每个算子的耗时,找到最慢的算子 2. 看是计算密集型还是内存访问密集型 3. 看GPU利用率是高还是低,低的话可能是数据加载或CPU瓶颈
- 常见优化方向:
1. 输入尺寸太大?适当减小输入分辨率 2. 模型太大?用轻量模型或模型压缩 3. 后处理慢?优化后处理代码,用C++重写,或移到GPU 4. 数据加载慢?用多线程预加载,优化数据预处理 5. 没用推理优化框架?换成TensorRT等优化框架
- 注意:优化要针对性,不要盲目优化,先profile找到瓶颈再动手
六、开放性问题
问题14:你怎么看计算机视觉的发展趋势?
回答思路:
- Transformer在CV中的应用:ViT、DETR等,Transformer正在从NLP渗透到CV,在检测、分割、分类等任务上都取得了好效果,可能是未来的方向
- 自监督学习:不需要大量标注数据,用对比学习等方法预训练,降低对标注的依赖,这对CV很重要因为标注成本高
- 多模态融合:视觉和语言、语音等模态结合,如CLIP、VQA,让模型理解更丰富的语义
- 端侧AI:模型越来越小、越来越高效,能在手机、IoT设备上运行,应用场景更广泛
- 3D视觉:随着3D传感器普及,3D检测、3D重建、NeRF等方向发展很快
- 我的看法:CV不会被某一种架构完全统治,CNN和Transformer会长期共存;落地能力比论文指标更重要,能解决实际问题的技术才有价值
问题15:做CV项目时,数据质量差怎么办?
回答思路:
- 先分析数据问题:是标注错误?数据不平衡?数据量少?还是数据分布和测试集不一致?
- 针对性解决:
1. 标注错误:清洗数据,人工复核,用主动学习找难样本重新标注 2. 数据不平衡:过采样少数类、欠采样多数类、损失加权、数据增强 3. 数据量少:迁移学习、数据增强、半监督学习、自监督预训练、合成数据 4. 域偏移:域适应、风格迁移、用目标域数据微调
- 数据是CV项目的基础,数据质量决定了模型的上限。很多时候提升数据质量比换模型更有效
- 建立数据闭环:上线后收集bad case,补充标注,重新训练,持续迭代
七、面试经验总结
这次面试下来,总结了几点经验:
- 基础要扎实:CNN、ResNet、BN这些基础概念,一定要理解原理,不能只知道怎么用。面试官很喜欢从基础深入追问。
- 要有项目深度:简历上写的项目,一定要能讲清楚细节:为什么选这个方案?遇到了什么问题?怎么解决的?效果怎么样?面试官会追着问。
- 关注最新进展:CV发展很快,面试会问到最新的论文和方法,平时要多关注arXiv和技术博客,至少知道主流方法的思路。
- 工程能力很重要:现在公司招CV算法,不只是要会训模型,还要会部署、会优化、能落地。有端侧部署、性能优化经验的很加分。
- 表达要清晰:回答问题要有条理,先给结论再展开,不要东拉西扯。遇到不会的问题,诚实说不会,可以说说自己的思路,不要瞎编。
八、写在最后
计算机视觉是一个发展很快、竞争也很激烈的方向。面试只是一个开始,真正的能力还是在日常工作中积累的。
希望这篇面试题整理能帮到正在准备CV面试的朋友。如果你也有面试经历或者更好的回答思路,欢迎在评论区交流讨论。
最后祝大家都能拿到心仪的offer!
评论(0)
暂无评论,快来抢沙发~
评论功能仅对会员开放,请先登录
登录