计算机视觉面试高频核心问答


引言

计算机视觉是AI落地最广的分支之一,面试既考理论,更重工程结合能力。本指南筛选了30个以内最核心的高频问题,精简冗余,帮你高效备战。


一、图像处理高频基础

Q1:RGB vs HSV 怎么选?

A:

  • RGB:显示器通用加色模型,缺点是亮度与色彩强耦合——光照一变,三个通道全乱,不适合颜色分割。
  • HSV:分离了色调(H,颜色本质)、饱和度(S,鲜艳度)、亮度(V),H锁定后,V/S的变化干扰极小
  • 切换场景:绿幕抠图、红绿灯/红苹果识别等纯颜色相关任务

Q2:高斯/中值/双边滤波怎么挑?

A: 这些滤波工具的适用场景,可以记下这张速查表:

滤波类型适用噪声核心特点
高斯滤波高斯噪声(均匀模糊)邻域加权平均,模糊所有内容包括边缘
中值滤波椒盐噪声(黑白点)取邻域中位数,去噪同时保边缘
双边滤波普通噪声+要保细节加了“像素值差权重”——差太大不平滑,既能磨皮又能留眉毛(经典场景:美颜)

Q3:Canny边缘检测的核心?

A: 5步但面试只抓高频简化版

  1. 高斯滤波去噪
  2. Sobel算子算梯度强度+方向
  3. 非极大值抑制(NMS)“瘦身”边缘到1像素宽
  4. 双阈值+滞后跟踪:只留“高阈值边缘”或“和高阈值边缘相连的中间值边缘”。

二、深度学习网络高频基础

Q4:CNN为啥比MLP适合图像?

A: 3个降低参数量+贴合图像特性的核心:

  1. 局部感知:卷积核只扫邻域(图像是局部相关的,比如眼睛周围的像素才构成眼睛)
  2. 参数共享:同一个卷积核扫整张图(比如找“眼睛边缘”的规则,图的各个角落都通用)
  3. 平移不变性:加MaxPooling后,物体稍微移动位置,输出特征不变。

下面是一段直观的参数量对比代码,感受一下差距有多大:

import torch
import torch.nn as nn

def cnn_mlp_params():
    # 输入224x224x3,输出224x224x64
    # CNN参数量
    cnn = nn.Conv2d(3, 64, 3, padding=1)
    print(f"CNN参数量: {sum(p.numel() for p in cnn.parameters()) // 1000}K")  # ~1.7K
    # 对比MLP(仅理论简化,实际不可能做全连接)
    print(f"MLP理论参数量: {3*224*224 * 64*224*224 // 1e12}T")  # 超天文数字!

cnn_mlp_params()

Q5:1×1卷积的核心作用?

A: 别只说“降维”!面试要提全3个高频:

  1. 跨通道信息融合:比如把RGB三个通道的信息线性揉在一起
  2. 升/降维控计算:ResNet的Bottleneck就是靠2次1×1降升维,把参数量砍到原来的1/4
  3. 加非线性:1×1后面接ReLU,不改变分辨率就能增强表达能力。

Q6:BN的核心原理和作用?

A:

  • 原理:每个Batch内把特征拉成“均值0、方差1”,再学γ(缩放)β(平移)还原表达能力
  • 作用:(按面试优先级)
    1. 防止梯度爆炸/消失
    2. 大幅加速收敛(可以用更大的学习率)
    3. 微弱的正则化(靠Batch的随机性)

三、经典架构高频面试点

Q7:ResNet解决了啥问题?残差怎么理解?

A:

  • 核心痛点深层网络退化——网络叠到50层以上,训练集误差反而比20层高(不是过拟合,是学不动恒等映射)
  • 残差结构:加跳跃连接,让网络学 H(x) = F(x) + x(F(x)是残差)
    • 如果残差F(x)→0,模型至少能做到“浅层网络的恒等复制”,保证性能不会下降
    • 如果F(x)有用,还能学到更深层的特征。

下面是一个极简的残差块实现,帮你理解跳跃连接的处理细节:

class ResidualBlock(nn.Module):
    """极简ResNet BasicBlock(不含Bottleneck)"""
    def __init__(self, in_c, out_c, stride=1):
        super().__init__()
        self.conv1 = nn.Conv2d(in_c, out_c, 3, stride, padding=1, bias=False)
        self.bn1 = nn.BatchNorm2d(out_c)
        self.conv2 = nn.Conv2d(out_c, out_c, 3, padding=1, bias=False)
        self.bn2 = nn.BatchNorm2d(out_c)
        # 当通道/分辨率变了,跳跃连接也要变
        self.shortcut = nn.Sequential()
        if stride != 1 or in_c != out_c:
            self.shortcut = nn.Sequential(
                nn.Conv2d(in_c, out_c, 1, stride, bias=False),
                nn.BatchNorm2d(out_c)
            )
    
    def forward(self, x):
        out = torch.relu(self.bn1(self.conv1(x)))
        out = self.bn2(self.conv2(out))
        out += self.shortcut(x)
        return torch.relu(out)

Q8:MobileNet的核心设计?

A: 深度可分离卷积——把标准卷积拆成两步,计算量约降为原来的1/9

  1. Depthwise(深度卷积):一个3×3卷积核只扫一个输入通道,不融合通道
  2. Pointwise(点卷积):1×1卷积扫所有通道,专门融合信息。

四、目标检测/图像分割高频

Q9:One-stage vs Two-stage检测器怎么选?

A: 一句话总结:追求极致精度选Two-stage,追求实时速度选One-stage。

类型代表模型核心流程优缺点适用场景
Two-stageFaster R-CNN先找候选框→再分类/修正框精度高,但慢(10FPS以内)离线标注辅助、医疗影像分析等对速度要求低的
One-stageYOLO、SSD直接在特征图上回归框+分类速度极快(YOLOv8n能跑300+FPS),精度略逊于最新Two-stage自动驾驶、安防监控、实时直播特效等对速度要求高的

Q10:NMS和Soft-NMS的区别?

A:

  • NMS流程:按置信度排序→取最高分框→删所有和它IoU>阈值的框→循环
  • Soft-NMS改进:不直接删,而是按重叠程度降低冗余框的置信度(比如IoU=0.8,得分×0.2),解决密集场景下“小物体被误删”的问题。

Q11:语义/实例/全景分割的区别?

A: 按面试优先级理解:

  1. 语义分割:只分“类别”,不管“个体”——比如把图里所有的“人”涂成红色,所有的“车”涂成蓝色
  2. 实例分割:既要分“类别”,也要分“个体”——比如把图里的“人甲”涂成红1,“人乙”涂成红2
  3. 全景分割:语义+实例,还要管“可数/不可数”——比如“人”是可数(分个体),“天空”是不可数(只分颜色)。

Q12:U-Net的核心思想?

A: Encoder-Decoder + 全尺寸跳跃连接

  • Encoder:卷积+池化,提取深层语义特征(比如“这个区域有癌细胞”),但分辨率会降
  • Decoder:转置卷积+卷积,把分辨率升回去,但细节会丢
  • 全尺寸跳跃连接:把Encoder每一层的高分辨率细节直接拼接到Decoder对应层,完美弥补细节丢失(经典场景:医学影像分割,因为小病灶不能丢)。

五、损失函数/训练优化高频

Q13:交叉熵/Focal Loss/Dice Loss怎么选?

A: 一张表帮你快速决策:

损失函数适用场景核心原理
交叉熵通用分类/分割,样本平衡当预测概率偏离真实标签时,损失快速增长
Focal Loss目标检测/分割(类别严重不平衡,比如背景占99%)给“易分类样本”(比如确定是背景的)加权重衰减,让模型集中学“难分类样本”(比如边界的小物体)
Dice Loss医学影像分割(目标极小,比如1mm的结节)直接优化IoU,只关心“预测区域和真实区域的重合度”,不关心像素总量。

Q14:如何处理样本不平衡?

A:工程优先级排序:

  1. 算法层面(最快实现):
    • 损失加权:给少数类加更大的Loss权重
    • 换Focal Loss
  2. 数据层面
    • 数据增强:针对少数类做更多的几何/颜色变换(比如旋转、翻转、亮度抖动)
    • 过采样(少量数据)/欠采样(大量冗余数据)

Q15:SGD vs Adam怎么选?

A: 核心是权衡速度和泛化

  • Adam:收敛极快,对初始学习率不敏感→初期快速验证想法、调通流程
  • 带动量的SGD:收敛慢,调参难,但泛化能力通常更好→追求极致精度(比如比赛、高精度落地)

Q16:如何解决过拟合?

A:工程落地优先级排序:

  1. 数据端(最有效):
    • 加数据
    • 强数据增强(Mixup、Cutout、CutMix)
  2. 训练端(快速实现):
    • 早停(Early Stopping):验证集Loss连续N轮不下降就停
    • L2正则化(权重衰减)
    • 标签平滑(防止模型太自信)
  3. 模型端
    • 降低模型复杂度(比如从ResNet101换成ResNet50)
    • 加Dropout(注意Dropout和BN不要一起用在训练后推理阶段)。

六、工程部署与实战高频(超级重要!!)

Q17:模型压缩的三个核心方法?

A:落地易用性+效果排序:

  1. 量化:把FP32→INT8/FP16,体积减4倍,推理速度提2-4倍,精度损失极小
  2. 剪枝:移除权重小/对结果贡献弱的通道,直接减计算量
  3. 知识蒸馏:大模型(教师)教小模型(学生)学输出概率分布(Soft Label),小模型能接近大模型的精度。

Q18:ONNX/TensorRT/NCNN分别干啥?

A:部署链路理解:

  1. ONNX:跨框架“翻译官”——把PyTorch/TensorFlow模型转成通用格式,方便迁移
  2. TensorRT:NVIDIA GPU推理“加速器”——算子融合、显存优化,速度能提2-5倍
  3. NCNN/MNN:手机/ARM嵌入式推理框架——包体小、不依赖第三方库,适合移动端落地。

Q19:预处理/后处理的核心坑?

A: 避坑第一条:预处理必须和训练时100%一致!

  • 比如训练时用的是(mean=[0.485,0.456,0.406], std=[0.229,0.224,0.225])的ImageNet归一化,推理时必须一模一样
  • 比如训练时缩放到640×640用的是“保持宽高比+填充黑边”,推理时不能直接拉伸(会导致物体变形,精度暴跌)

后处理避坑

  • 大模型输出的后处理(比如NMS)经常比推理还慢→尽量用GPU加速(比如TensorRT Plugin、CUDA实现的NMS)。

Q20:如何定位模型速度慢的问题?

A: 核心是分段测速!

  • 测量全链路:数据加载→预处理→推理→后处理→结果传输
  • 找瓶颈:
    • GPU利用率低(<50%)→瓶颈在CPU/IO(数据读不过来、预处理太慢)
    • GPU利用率高→模型计算量太大→换小Backbone、量化、剪枝
    • 传输时间长→不要返回原始图像,只返回坐标/掩码的压缩结果。

七、项目深度访谈(体现个人能力的核心!)

千万不要只说“我用了YOLOv8做了目标检测”!**必须加“量化指标、解决的具体痛点、工程细节”**。

参考问题1:你项目的难点是什么?

参考回答(结合工程)

“难点在于在边缘设备(比如20TOPS算力的 Jetson Nano)上把目标检测的端到端延迟控制在100ms以内,同时mAP不能降超过2%。 我先做了FP16量化,速度提了2倍但延迟还是150ms;然后把Backbone从ResNet50换成MobileNetV2,精度降了3%;最后又加了TensorRT的算子融合和动态Batch,延迟降到85ms,精度恢复到只降1.8%。”

参考问题2:为什么选这个模型?

参考回答(体现Trade-off)

“我选了YOLOv8s,因为它在精度、速度、部署难度之间达到了最优平衡点。 相比Two-stage的Faster R-CNN,它快10倍,适合实时场景;相比纯Transformer的DETR,它在小数据集(我只有2万张标注图)上收敛更快,且不需要太多调参;相比更轻的YOLOv8n,它的mAP高了5%,满足业务要求。”


相关教程

准备面试时,一定要把**自己做过的1-2个核心项目**烂熟于心,每个环节的量化指标、解决的痛点、工程细节都要能说出来。