计算机视觉(CV)面试与实战红宝书

最近接了不少练手/面试卡壳的私信:要么只会调YOLOv8落地不了,要么被面试官问“ResNet为什么能做深层”“你用的Focal Loss alpha/gamma怎么调”答不上来。

这篇红宝书就是来补这个缺口的——浓缩3年算法岗面试经验+2年落地踩坑,从底层到工程,文字只说“面试/实战要用的”,代码都是“可复现/可修改”的


一、底层功底:面试敲门砖,调优基本功

1. 颜色空间与通道(🎯面试常考应用场景)

import cv2
import numpy as np

def hsv_color_segment():
    """【实战必备】绿幕/交通标志颜色分割"""
    img = cv2.imread("traffic_red.jpg")
    hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)
    # 红色分两段环绕H=0°
    lower1, upper1 = np.array([0,50,50]), np.array([10,255,255])
    lower2, upper2 = np.array([170,50,50]), np.array([180,255,255])
    mask = cv2.inRange(hsv, lower1, upper1) + cv2.inRange(hsv, lower2, upper2)
    return cv2.bitwise_and(img, img, mask=mask)
颜色空间应用场景优缺点
RGB显示、基础训练通道耦合高,光照敏感
HSV颜色分割光照鲁棒,通道独立
GRAY底层特征、降维丢色彩,计算快

2. 滤波降噪(⚠️实战避坑:选对滤波器)

不用代码演示太干,直接给实战口诀+踩坑场景

  • 椒盐噪声(随机黑白点)→ 中值滤波cv2.medianBlur,保护边缘
  • 高斯噪声(画面模糊颗粒小)→ 高斯滤波cv2.GaussianBlur
  • 磨皮美颜/保边去噪→ 双边滤波cv2.bilateralFilter

3. 经典特征与边缘(🎯传统岗/入门面试必问)

Canny边缘检测(4步要背)

高斯去噪→梯度幅值/方向计算→非极大值抑制(“变瘦”边缘)→双阈值滞后连接(弱边缘依附强边缘)

特征对比(直接记面试答案)

特征不变性速度专利应用
SIFT旋转/尺度/亮度高精度拼接/匹配
ORB旋转/部分尺度极快实时SLAM/移动端匹配

二、深度学习核心:面试重灾区(占比60%+)

1. CNN基础(3个核心点)

局部感知+参数共享

降低参数量,提取由浅入深的特征:边缘→纹理→物体→场景。

1×1卷积的3个作用(🚀ResNet/MobileNet/Inception都用)

  • 跨通道特征融合
  • 降维/升维(减少计算量)
  • 增加非线性(搭配激活函数)

BatchNorm的3个作用(🎯面试必背)

防止梯度消失/爆炸→加快收敛→允许更大学习率


2. 经典架构(只记最常考的ResNet残差块)

import torch
import torch.nn as nn
import torch.nn.functional as F

class ResBlock(nn.Module):
    """【面试核心】解决深层网络退化问题:Identity Mapping至少不比前一层差"""
    def __init__(self, in_ch, out_ch, stride=1):
        super().__init__()
        self.conv1 = nn.Conv2d(in_ch, out_ch, 3, stride, 1, bias=False)
        self.bn1 = nn.BatchNorm2d(out_ch)
        self.conv2 = nn.Conv2d(out_ch, out_ch, 3, 1, 1, bias=False)
        self.bn2 = nn.BatchNorm2d(out_ch)
        # 短接处理通道/尺寸不一致
        self.shortcut = nn.Sequential()
        if stride != 1 or in_ch != out_ch:
            self.shortcut = nn.Sequential(
                nn.Conv2d(in_ch, out_ch, 1, stride, bias=False),
                nn.BatchNorm2d(out_ch)
            )
    def forward(self, x):
        residual = self.shortcut(x)
        out = F.relu(self.bn1(self.conv1(x)))
        out = self.bn2(self.conv2(out))
        return F.relu(out + residual)

其他经典架构一句话记住:

  • MobileNet:深度可分离卷积(Depthwise+Pointwise)→ 参数量/计算量约降为1/9
  • Inception:多尺度卷积核并行→ 让网络自适应选感受野
  • Transformer:ViT是基础,但实际落地常结合CNN(如Swin Transformer)

3. 目标检测(🎯算法岗核心题)

单双阶段对比(一句话总结)

类型代表速度精度应用
One-stageYOLO/SSD略低实时/移动端
Two-stageFaster R-CNN医疗/精密检测

NMS(非极大值抑制)

  • 核心:按得分排序→ 抑制与最高分框IOU过大的冗余框
  • 改进:Soft-NMS(降低分数而非直接删除,缓解密集遮挡问题)

三、实战调优:从学生到工程师的跨越

1. 损失函数(⚠️类别不平衡/分割必调)

Focal Loss(目标检测背景远多于前景)

降低易分类样本的权重,让模型专注于难分类样本(α=0.25-0.75,γ=2-5,经验值)。

Dice Loss(语义分割小目标)

直接优化IOU,缓解前景像素占比过小的问题。


2. 优化器(新手练手选Adam,调优转SGD)

优化器特点适用
Adam自适应学习率,收敛快新手练手、快速迭代
SGD+Momentum稳定,最终精度高落地调优、竞赛刷榜

四、工程部署:算法落地的最后一公里

1. 模型加速(🚀生产环境3件套)

  1. 量化:FP32转INT8,推理速度提升2-4倍,内存降为1/4(PyTorch有官方API)
  2. 知识蒸馏:大模型(教师)的软标签指导小模型(学生),精度接近大模型
  3. TensorRT:NVIDIA闭源推理引擎,优化算子融合,生产环境GPU部署标配

2. 性能调优检查清单(⚠️落地必查)

速度慢排查

  • IO瓶颈:用num_workers加载数据,预加载到内存
  • 数据搬运:减少cpu()/gpu()频繁切换
  • 预处理慢:批量处理,用OpenCV代替PIL

精度低排查

  • 输入尺寸对齐训练尺寸
  • 数据增强强度是否合适(别把目标切没了)
  • 类别不平衡问题(Focal Loss、过采样、类别权重)

五、常考计算题(避坑指南,不用背太多)

输出尺寸公式

H_out = floor((H_in + 2*P - K)/S) + 1
W_out = 同理

(H/W:输入高/宽,P:填充,K:卷积核大小,S:步长)

面试示例:输入224×224,3×3卷积,步长1,填充1,输出尺寸?→ 224×224(“same”卷积)


六、总结

计算机视觉不是调包跑YOLO,这套体系是从学生到架构师的跨越:

  1. 底层功底:调优预处理的基础
  2. 深度学习:算法岗面试的核心
  3. 实战调优:落地的关键
  4. 工程部署:变现的最后一步
理论+实践结合:先看架构/算法原理,再跑开源代码复现,最后找小数据集(如Kaggle猫狗识别、红绿灯检测)练手。

相关教程