🖼️ 计算机视觉面试常见问题

📷 图像处理基础

Q1:RGB 和 HSV 颜色空间有什么区别?在什么场景下切换?

  • A: * RGB 是加色模型,对应显示器的红、绿、蓝灯珠。缺点是亮度与色彩高度耦合,改变光照时三个通道值都会变,不适合做颜色分割。
  • HSV 代表色调(Hue)、饱和度(Saturation)、亮度(Value)。
  • 切换场景:当需要根据颜色提取物体(如在绿幕抠图、识别红色交通标志)时,会切换到 HSV。我们只需锁定 H 通道的范围,就能排除光照强度(V)的干扰。

Q2:直方图均衡化(Histogram Equalization)的原理是什么?

  • A: * 原理:利用图像的累积分布函数(CDF)作为映射函数,将原始图像较窄的灰度范围拉伸到整个 $[0, 255]$ 空间。
  • 作用:自动增强图像的全局对比度。常用于处理曝光不足(太暗)或曝光过度(太亮)的图像,使细节更清晰。

Q3:高斯、中值、双边滤波三者如何选择?

  • A: * 高斯滤波:用于去除高斯噪声。原理是邻域加权平均,距离越近权重越大。代价是边缘会变模糊。
  • 中值滤波:取邻域中位数。杀手锏是去除椒盐噪声(黑白点),且比高斯滤波更能保护边缘。
  • 双边滤波:在空间距离权重基础上增加了像素值差异权重。如果两个像素值差太多,就不进行平滑。结果:既能降噪又能完美保留边缘(常用于美颜磨皮)。

Q4:请描述 Canny 边缘检测的具体步骤。

  • A: 1. 高斯滤波:平滑图像,降低噪声干扰。
  1. 计算梯度:利用 Sobel 等算子计算每个像素的梯度强度和方向。
  2. 非极大值抑制(NMS):在梯度方向上只保留局部最大值,“瘦身”边缘,使其宽度为一个像素。
  3. 双阈值检测:设置高、低两个阈值。高于高阈值的确定为边缘;低于低阈值的舍弃。
  4. 滞后跟踪:位于中间的像素,如果与“确定边缘”相连,则保留,否则舍弃。

🔍 传统特征提取

Q5:SIFT 和 ORB 的区别是什么?为什么工业界常用 ORB?

  • A: * SIFT:基于高斯差分金字塔,具有极强的尺度、旋转、亮度不变性。缺点:计算极其复杂,难以实时,且曾受专利保护。
  • ORB:结合了 FAST 关键点和 BRIEF 描述子。优点:速度比 SIFT 快 100 倍,且开源免费。虽然尺度不变性略弱,但在机器人视觉、SLAM 等实时场景中是首选。

Q6:简述特征匹配的完整流程(包含过滤和 RANSAC)。

  • A: 1. 匹配:利用暴力匹配(BF)或 FLANN 算法找到两张图中描述子距离最近的点对。
  1. 过滤:使用 Lowe's Ratio Test(最近邻距离/次近邻距离 < 0.8),剔除不稳定的匹配。
  2. RANSAC(随机采样一致性):从剩余点对中随机抽取 4 对,计算单应矩阵,统计支持该矩阵的内点数量。通过多次迭代,找到内点最多的矩阵,从而彻底剔除误匹配(离群点)

📐 相机与几何几何

Q7:相机的内参、外参、畸变系数分别代表什么?

  • A: * 内参 (Intrinsic):相机自身的属性。包括焦距 ($f_x, f_y$) 和主点坐标 ($c_x, c_y$)。它决定了从相机坐标系到像素坐标系的转换。
  • 外参 (Extrinsic):相机在世界坐标系中的位姿。包括旋转矩阵 $R$ 和平移向量 $t$。
  • 畸变系数 (Distortion):修正镜头制造缺陷。分为径向畸变(桶形/枕形,透镜形状引起)和切向畸变(透镜与传感器不平行引起)。

Q8:单应矩阵 (H)、基础矩阵 (F) 和本质矩阵 (E) 有什么区别?

  • A: * 单应矩阵 (H):描述两个平面之间的映射。适用于场景是平面(如地面、墙面)或相机只有旋转没有平移的情况。
  • 本质矩阵 (E):描述两个相机坐标系之间的空间几何关系,包含了外参($R, t$)。
  • 基础矩阵 (F):在本质矩阵基础上考虑了内参。它直接关联两张图像上的像素点坐标。

Q9:什么是极线约束 (Epipolar Constraint)?

  • A: * 当相机从两个位置观察同一空间点 $P$ 时,$P$、两个相机光心 $O_1, O_2$ 构成一个“极平面”。
  • 极线约束是指:左图中的点 $p_1$ 在右图中对应的匹配点 $p_2$,一定位于极平面与右像平面的交线(极线)上。
  • 意义:将 2D 匹配搜索从“全图搜索”降维到了“线搜索”。

这是深度学习核心部分的面试高频考点汇总。这部分不仅考察理论,更看重你对模型演进逻辑的理解。


🧠 网络基础

Q1:CNN 为什么比全连接网络(MLP)更适合处理图像?

  • A: 主要有三个特性:
  1. 局部感知(Locality):卷积核只关注邻域像素,符合图像空间相关性。
  2. 参数共享(Parameter Sharing):同一个卷积核在整张图上滑动,大幅减少参数量。
  3. 平移不变性(Translation Invariance):无论物体在图像哪个位置,卷积核都能提取相似特征。

Q2:1×1 卷积的作用是什么?

  • A: 1. 跨通道信息融合:实现通道间的线性组合。
  1. 升维/降维:改变通道数以减少计算量(如 ResNet 的 Bottleneck)。
  2. 增加非线性:在不改变空间分辨率的情况下添加激活函数,增强表达能力。

Q3:池化(Pooling)的作用及优缺点?

  • 作用:降维、扩大感受野、保持平移不变性。
  • 缺点:会丢失空间位置细节。现状:在现代检测/分割网络中,常被“带步长的卷积(Strided Conv)”取代以减少信息丢失。

Q4:BatchNorm (BN) 的原理和作用?

  • 原理:在每个 Batch 内将特征标准化为均值 0、方差 1,再通过学习两个参数($\gamma, \beta$)进行重构。
  • 作用:防止梯度消失/爆炸,加速收敛,允许使用更大的学习率,同时起到微弱的正则化作用。

🏛️ 经典网络架构

Q5:ResNet 解决了什么问题?残差结构怎么理解?

  • 问题:解决了深层网络的退化问题(即网络加深后,训练集误差反而上升)。
  • 残差结构:通过跳跃连接(Shortcut),让网络学习 $H(x) = F(x) + x$。如果 $F(x)$ 趋于 0,模型至少能实现恒等映射,保证性能不会比浅层差。

Q6:轻量化网络(如 MobileNet)的设计核心是什么?

  • A: 核心是深度可分离卷积(Depthwise Separable Convolution)
  • 将标准卷积拆分为 Depthwise(一个卷积核负责一个通道)和 Pointwise(1x1 卷积负责融合)。
  • 计算量对比:大约是标准卷积的 $1/N + 1/K^2$(通常降至 $1/9$)。

🎯 目标检测(重灾区)

Q7:One-stage 与 Two-stage 检测器的区别?

  • Two-stage (如 Faster R-CNN):先生成候选区域(Region Proposals),再进行精细分类和位置修正。优点:精度极高。
  • One-stage (如 YOLO, SSD):直接在特征图上回归位置和类别。优点:速度极快,适合实时场景。

Q8:简述 NMS(非极大值抑制)的流程及其改进。

  • 流程:按置信度排序 $\rightarrow$ 取最高分框 $\rightarrow$ 剔除所有与该框 IoU 大于阈值的冗余框 $\rightarrow$ 循环。
  • 改进Soft-NMS(不直接删除,而是降低重叠框的得分),解决密集场景下物体被误删的问题。

Q9:AP 和 mAP 的计算方式?

  • AP (Average Precision):P-R 曲线(精确率-召回率曲线)下的面积。
  • mAP:所有类别 AP 的平均值。常用 mAP@.5(IoU 阈值 0.5)作为衡量标准。

🖼️ 图像分割

Q10:语义、实例与全景分割的区别?

  • 语义分割:区分类别(如:这里全是“人”)。
  • 实例分割:区分个体(如:这是“人甲”,那是“人乙”)。
  • 全景分割:语义 + 实例,既分种类也分个体,还要管背景。 [Image comparison of Semantic, Instance, and Panoptic Segmentation]

Q11:U-Net 的核心思想?

  • A: Encoder-Decoder 结构 + 跳跃连接(Skip Connection)
  • Encoder 负责提取深层语义。
  • Decoder 负责恢复分辨率。
  • 跳跃连接将底层高分辨率的特征直接拼接到高层,弥补上采样过程中的细节丢失。

🚀 其他专项

Q12:SORT 与 DeepSORT 的联系?

  • SORT:利用卡尔曼滤波预测位置 + 匈牙利算法匹配,速度快但遮挡易丢目标。
  • DeepSORT:引入了外观特征匹配(Re-ID),物体被遮挡再出现后,依然能通过“长相”认出来。

Q13:OCR 中的 CRNN + CTC Loss 是做什么的?

  • CRNN:CNN 提取视觉特征 $\rightarrow$ RNN 处理序列关系。
  • CTC Loss:解决标签和预测序列“不对齐”的问题,不需要手动标注每个字符在图像中的具体位置。

Q14:GAN 与 Diffusion 原理简述?

  • GAN:生成器与判别器“博弈”,一个造假,一个识破,最终达到以假乱真。
  • Diffusion:先往图片里加噪声直到变乱码,再让模型学习如何把噪声一步步“还原”成清晰图像。

📉 损失函数 (Loss Functions)

Q1:交叉熵、Focal Loss、Dice Loss 分别怎么选?

  • 交叉熵 (Cross Entropy)

  • 场景:最通用的分类损失函数。

  • 特点:当预测概率偏离真实标签时,损失呈对数级增长。

  • Focal Loss

  • 场景类别严重不平衡的目标检测(如背景远多于目标)。

  • 原理:在交叉熵基础上增加权重因子,降低易分类样本(Easy Examples)的权重,让模型集中精力学习难分类的样本。

  • Dice Loss

  • 场景语义分割,尤其是目标极小的场景(如医学影像中的小病灶)。

  • 原理:直接优化预测区域与真实区域的 IoU(交并比)。它不关心像素总量,只关心重合度,因此对像素比例不敏感。

Q2:如何处理样本不平衡问题?

  • 数据层面

  • 过采样:重复稀有样本。

  • 欠采样:减少多类样本。

  • 数据增强:针对稀有类别进行特殊的几何或颜色变换。

  • 算法层面

  • 损失加权:给少数类更高的 Loss 权重。

  • 更换 Loss:使用上面提到的 Focal Loss。

  • OHEM (在线硬样本挖掘):只挑选 Loss 最大的前 $N$ 个样本进行反向传播。


🛠️ 训练优化策略

Q3:如何解决过拟合 (Overfitting)?

  • 数据端:增加数据量、使用更强的数据增强(Mixup, Cutout)。
  • 模型端:降低模型复杂度、加入 Dropout、使用 BatchNorm
  • 训练端
  • L1/L2 正则化:约束权重大小。
  • 早停 (Early Stopping):当验证集 Loss 不再下降时提前结束训练。
  • 标签平滑 (Label Smoothing):防止模型过于“自信”而陷入死胡同。

Q4:常见的学习率衰减 (Scheduler) 策略有哪些?

  • Step Decay:每隔固定步数(Epoch)下降一定倍数(如每 20 个 Epoch 降低 0.1)。
  • Cosine Annealing (余弦退火):学习率按余弦曲线下降,能帮助模型在后期更平滑地收敛到全局最优。
  • Warmup (预热):在训练初期先用极小的学习率,等模型稳定后再增加到初始设定值。作用:防止初期梯度爆炸破坏预训练权重。

Q5:SGD 和 Adam 优化器有什么区别?该选哪个?

  • SGD (随机梯度下降)

  • 优点:收敛更稳定,泛化能力通常比 Adam 好,模型天花板高。

  • 缺点:调参困难,需要精细设置学习率,收敛慢。

  • Adam (自适应矩估计)

  • 优点:收敛速度极快,对初始学习率不敏感(自带自适应调节)。

  • 缺点:容易陷入局部最优,后期可能出现震荡。

  • 建议初期用 Adam 快速验证想法,追求极致精度时用带动量的 SGD。


🛠️ 模型加速与优化

Q1:量化、剪枝、蒸馏分别是什么原理?

  • 量化 (Quantization)
    • 原理:将模型参数从高精度(FP32)转换为低精度(如 INT8 或 FP16)。
    • 作用:极大减少模型体积,利用硬件的向量化加速指令显著提升推理速度。
  • 剪枝 (Pruning)
    • 原理:移除神经网络中权重较小、对结果贡献微弱的神经元或通道(Channel)。
    • 作用:直接减少计算量(FLOPs),压缩模型体积。
  • 蒸馏 (Knowledge Distillation)
    • 原理:让一个复杂的“教师模型”指导一个轻量化的“学生模型”,通过学习教师模型的输出概率分布(Soft Label)来提升小模型的精度。

🚀 部署框架与中间件

Q2:ONNX、TensorRT、NCNN 分别起什么作用?

  • ONNX (Open Neural Network Exchange)
    • 作用:跨框架的“翻译官”。把 PyTorch 或 TensorFlow 的模型转换成一种通用格式,方便在不同平台上迁移。
  • TensorRT
    • 作用:NVIDIA 专门为自家 GPU 开发的推理优化引擎。它通过算子融合、显存优化和自动选型,能让模型在英伟达显卡上跑出极限速度。
  • NCNN / MNN
    • 作用:专为手机端、嵌入式(ARM 架构)优化的推理框架。不依赖第三方库,包体积极小,非常适合移动端部署。

🏗️ 生产环境实战逻辑

Q3:如何正确处理预处理与后处理?

  • 预处理 (Pre-processing)
    • 核心:必须与训练时的操作完全一致(缩放比例、均值、方差)。
    • 技巧:尽量在 GPU 上完成(使用 torchvision.transforms 或 CUDA 算子),避免 CPU 预处理成为整个链路的瓶颈。
  • 后处理 (Post-processing)
    • 核心:如目标检测中的 NMS、分割中的 Morphology(形态学处理)。
    • 技巧:如果模型输出很大,后处理往往比推理还慢。可以使用多线程或将 NMS 编写为 TensorRT 的插件(Plugin)直接在 GPU 运行。

Q4:多线程、批处理 (Batching) 与内存如何优化?

  • 批处理 (Batching):在服务器端,将多个用户的请求合并成一个 Batch 送入 GPU。这能提高 GPU 的吞吐量,但会稍微增加单个请求的延迟。
  • 多线程/多进程:由于 Python 有 GIL 锁,通常使用多进程负载均衡。
  • 内存优化:在推理阶段务必开启 torch.no_grad();定期释放无用的张量,避免显存泄露。

🔍 问题诊断:速度慢与精度低

Q5:如何定位模型速度慢(延迟高)的问题?

  1. 分段测速:测量“数据加载 -> 预处理 -> 推理 -> 后处理 -> 传输”各阶段耗时。
  2. 检查瓶颈
    • 如果 GPU 利用率低:瓶颈在 CPU 或 IO(数据读不过来)。
    • 如果 GPU 利用率高:模型计算量太大,需要量化或换用更小的 Backbone。
  3. 传输检查:针对你的 6Mbps 带宽,检查是否返回了过大的原始图像,应仅返回坐标点或经过 WebP 压缩的图。

Q6:如何定位模型精度低(甚至预测结果全错)的问题?

  1. 输入检查:可视化预处理后的图像,确认是否因为比例拉伸导致物体变形。
  2. 权重对齐:确认推理时加载的 state_dict 是否完整。
  3. 分布对齐:确认测试数据的场景分布(光照、角度)是否与训练集存在严重偏差(Domain Shift)。

🏗️ 项目深度访谈:实战拆解

Q1:你项目的难点是什么?

  • 话术技巧:不要只说算法难,要说算法与工程结合的难点。
  • 参考回答

    “难点在于在有限的带宽和算力资源下实现高可用的 AI 推理。因为我的服务器上行带宽只有 6Mbps,直接返回原始图像分析结果会导致明显的延迟。我必须在前端实现高性能的图像压缩,并在后端使用 FastAPI 异步处理请求,同时利用 TensorRT 对模型进行量化加速,将端到端延迟从 2 秒压低到了 300ms 以内。”

Q2:数据是怎么来的?怎么做数据增强?

  • 话术技巧:强调数据的质量控制针对性增强
  • 参考回答

    “数据主要由三部分组成:开源数据集(如 COCO/ImageNet)、自研的爬虫清洗数据,以及针对特定业务场景(如验证码或工业零件)采集的实拍数据。 增强策略:除了基础的旋转、缩放,我还引入了 Mosaic(马赛克增强) 来提升小目标检测能力,以及 Mixup 抑制过拟合。针对光照不均的问题,特别加入了随机亮度和对比度抖动,以增强模型在复杂环境下的鲁棒性。”

Q3:为什么选这个模型(如 YOLOv8 或 ViT)?

  • 话术技巧:体现“权衡(Trade-off)”思想。
  • 参考回答

    “我选择了 YOLOv8(或 v10),因为它在精度(mAP)和速度(FPS)之间达到了目前的工业最优平衡点。相比 Two-stage 模型,它更适合我的轻量化服务器部署;而相比纯 Transformer 架构(如 ViT),CNN 在处理小规模特定领域数据集时收敛更快,且对推理硬件的要求更低。”

Q4:指标是怎么提升的?(精度、速度、鲁棒性)

  • 参考方案
    • 精度提升:通过 SWA(随机加权平均) 提升模型泛化力;针对错题集进行硬样本挖掘(OHEM)
    • 速度提升:模型剪枝(去除冗余通道)+ INT8 量化
    • 鲁棒性提升:引入 Test-Time Augmentation (TTA),在推理时对输入图进行多尺度缩放取平均结果。

Q5:遇到过什么坑?怎么解决?

  • 话术技巧:讲一个从“懵逼”到“排查”再到“解决”的完整故事。
  • 参考案例

    “在部署初期,发现模型在线上环境的精度远低于本地测试集。排查后发现是因为 OpenCV 和 PIL 读图的默认通道顺序(BGR vs RGB)不一致,导致输入模型的数据分布发生了偏移。通过统一预处理脚本并增加输入归一化的校验逻辑,最终解决了这个问题。这让我意识到工程细节中‘一致性’的重要性。”

Q6:如何落地?具体的部署流程是怎样的?

  • 参考回答(道满科技实战版)
    1. 环境准备:基于 Docker 构建镜像,确保本地开发环境与腾讯云/阿里云服务器环境一致。
    2. 转换加速:将 PyTorch 模型导出为 ONNX 格式,再利用服务器环境转换成 TensorRT Engine
    3. API 封装:使用 FastAPI 封装推理接口,利用 BackgroundTasks 处理耗时任务。
    4. 资源托管:所有大尺寸静态资源托管在 LighthouseCOS,通过 CDN 加速,API 仅传输结构化 JSON 数据。
    5. 监控监控:配置 Prometheus 监控服务器 GPU 利用率和响应延迟。

💡 简单送分题(面试收官)

  1. 上采样和下采样:下采样(池化/卷积步长)为了缩小尺寸、提炼特征;上采样(反卷积/插值)为了恢复分辨率、精确定位。
  2. 感受野计算:记住公式 $RF_i = RF_{i-1} + (k-1) \times \prod_{j=1}^{i-1} s_j$。层数深、核大、步长多,感受野就大。
  3. 参数量计算
    • 卷积层:$K \times K \times C_{in} \times C_{out} + C_{out}$ (偏置项)。
  4. 椒盐与高斯噪声
    • 椒盐:黑白点,用中值滤波
    • 高斯:平滑波动,用高斯滤波

在 YOLO(You Only Look Once)的训练日志和可视化图表(如 results.png)中,IoULoss 是衡量模型练得“好不好”的核心指标。

简单来说:IoU 看位置准不准,Loss 看模型错得深不深。


1. IoU (Intersection over Union, 交并比)

IoU 是用来衡量两个框(预测框 vs 真实框)重叠程度的指标。

  • 计算公式: $$IoU = \frac{\text{A} \cap \text{B}}{\text{A} \cup \text{B}}$$ 即:两个框的“重叠面积”除以它们的“总面积”。
  • 数值范围:$0$ 到 $1$。
    • 1:完全重合(完美)。
    • 0:完全不重叠(完全没找对位置)。
    • > 0.5:通常认为是一个及格的预测。
    • > 0.7:非常精准。

2. Loss (损失函数)

Loss 代表模型预测值与真实值之间的误差。训练的过程就是通过“梯度下降”算法,让 Loss 越小越好。在 YOLO 中,总 Loss 通常由三部分组成:

① 定位损失 (Box Loss / iou_loss)

  • 含义:模型预测的矩形框($x, y, w, h$)离真实框的位置差多少。
  • 趋势:如果这个值在下降,说明模型找物体位置的能力在提高。
  • 进阶:现在的 YOLO 通常使用 GIoU, DIoU 或 CIoU,这些是 IoU 的变体,能更好地处理框不重叠时的惩罚。

② 置信度损失 (Objectness Loss / obj_loss)

  • 含义:模型判断“这个格子里到底有没有物体”的准确性。
  • 趋势:如果这个值高,说明模型容易“幻视”(把背景看成物体)或者“漏看”。

③ 分类损失 (Classification Loss / cls_loss)

  • 含义:模型判断“这个物体是什么”的准确性(是猫还是狗?)。
  • 趋势:如果位置找对了,但这个 Loss 很高,说明模型虽然圈出了物体,但经常认错品种。

3. 训练日志中的其他关键术语

在你的“道满 Python AI”项目训练输出中,你还会看到:

  • Precision (精确率):模型说是物体的那些框里,有多少真的是物体?(查准率
  • Recall (召回率):图片里所有的真实物体,模型找出了百分之多少?(查全率
  • mAP@.5:当 IoU 阈值设为 0.5 时,所有类别的平均精度。
  • mAP@.5:.95:在不同的 IoU 阈值(从 0.5 到 0.95,步长 0.05)下的平均精度。这是目前最权威的指标,数值越高,说明模型在极高要求下依然很准。

💡 针对你调试的实战建议

  1. Box Loss 不降反升? 可能是学习率过大,或者数据增强(如旋转、缩放)太猛,导致模型学不会位置。
  2. Cls Loss 很快就降到很低,但 mAP 不行? 说明模型只会认分类,但框不住位置,需要检查数据集的标签是否精准。
  3. 验证集 Loss 开始上升,训练集 Loss 还在下降? 典型的过拟合。你的模型在死记硬背训练图,建议增加数据量或提前停止训练。