☰
图像滤波的本质是内积:相关、卷积与相似性度量的三层真相
2026/10/27 1:53:08 网站建设 项目流程

简介:本资源是北京交通大学2024年计算机视觉课程核心考点精要汇总,面向高校本科生、考研备考学生及CV入门学习者,系统梳理课程必考的40个关键知识点,覆盖图像滤波原理(相关/卷积/内积)、Canny与Harris算法推导、SIFT特征构建、CNN基础(感受野、1×1卷积、残差结构)、目标检测演进(R-CNN→Faster R-CNN)、损失函数与优化策略等硬核内容,直击期末复习与面试高频考点。资源为单文件PDF,共1个9.69MB高清文档,排版清晰、公式严谨、逻辑连贯,含大量对比说明与物理/代数双视角解读,如高斯核参数设置依据、双阈值设计思想、小批量更新优势等,便于深度理解而非死记硬背。目前已有666人学习下载,是高效串联理论与算法本质的优质课程复习笔记。

1. 图像滤波不是“卷积=相关”,而是三者根本不在同一数学平面上:为什么你调参总翻车,根源在没搞清「内积」才是底层真相

你有没有试过:明明把高斯核尺寸从 5×5 改成 15×15,σ 却死守 2 不动,结果滤波后图像几乎看不出差别?或者用 OpenCV 的cv2.filter2D做模板匹配,结果和cv2.matchTemplate对不上——前者输出值偏小、位置偏移?又或者在实现 Canny 边缘检测时,非极大值抑制后边缘断断续续,双阈值一开就漏检?这些不是参数调得不够细,而是你站在了错误的数学地基上:图像滤波的三种定义方式——相关(correlation)、卷积(convolution)、内积(inner product)——根本不是“换种说法”,而是三个不同维度的操作:一个是空间对齐操作,一个是群作用下的反演操作,一个是向量空间中的几何度量。它们共享同一个计算形式(逐点乘加),却服务于完全不同的目的:相关用于模板匹配(保持方向直觉),卷积用于系统建模(满足线性时不变 LTI 系统的因果性),而内积才是所有滤波器响应的物理本质——它衡量的是图像局部块与滤波器模板在 ℝⁿ 空间中的“夹角余弦 × 模长乘积”,即相似性强度。课程里反复强调“卷积要翻转核”,但没人告诉你:在 GPU 上做卷积层前向传播时,PyTorch 实际执行的是相关(不翻转),而反向传播中梯度更新才真正走卷积定义;OpenCV 的filter2D默认是相关,convolve才是卷积;SIFT 的 DoG 计算用的是差分(减法),根本绕开了“翻不翻转”的争论。这份 2024 年北交大计算机视觉课程必考知识点汇总,表面是 40 道问答题,实则是把整个 CV 基础链条从“黑匣子”拉到光下解剖:它不教你怎么调sigma=2.4,而是逼你回答“为什么必须是6σ而不是5σ或7σ”;不让你背“SIFT 描述子是 128 维”,而是要求你推导出“为什么必须划分为 4×4 子区域、每个子区域统计 8 个方向梯度”——因为只有这个组合,才能在旋转不变性、光照鲁棒性、计算开销三者间达成帕累托最优。搞懂它,你写的滤波器不会崩,你调的 CNN 不会梯度消失,你复现的 RPN 不会 anchor 全飘飞。这不是复习资料,是给所有想把 CV 从“调包工”升级为“机制设计师”的人,递上的一把手术刀。

2. 滤波器的数学身份:相关、卷积、内积为何不可互换?从信号空间到 GPU 寄存器的三层映射

2.1 相关:人类直觉的投影操作,模板匹配的天然语言

相关(correlation)的本质,是将滤波器模板原样对齐到图像局部窗口上,不做任何翻转,直接做逐元素乘加。它的数学表达是:

(I \star K)(x, y) = \sum_{i=-a}^{a}\sum_{j=-b}^{b} I(x+i, y+j) \cdot K(i, j)

注意:这里K(i,j)的索引(i,j)是相对于模板中心的偏移,不是图像坐标。这意味着:当你用一个“向右指的手势模板”去匹配图像时,模板中(1,0)位置的高值对应图像(x+1,y)处的像素——方向完全一致。这正是模板匹配(如手势识别、logo 检测)需要的:你希望“模板指向哪,图像里目标就朝哪”。OpenCV 的cv2.matchTemplate默认使用cv2.TM_CCOEFF,其核心就是相关运算。但问题来了:为什么cv2.filter2D默认也是相关,却不能直接替代matchTemplate?因为filter2D输出的是每个位置的响应值,而matchTemplate还做了归一化(CCOEFF_NORMED)和极值定位。更关键的是——相关不具备交换律:I ⋆ K ≠ K ⋆ I,所以你不能把图像当模板、模板当图像去算。这是它和内积的根本区别。

2.2 卷积:LTI 系统的宪法,一切 CNN 层的底层契约

卷积(convolution)的定义强制要求滤波器翻转 180°:

(I * K)(x, y) = \sum_{i=-a}^{a}\sum_{j=-b}^{b} I(x-i, y-j) \cdot K(i, j) = (I \star \tilde{K})(x, y)

其中\tilde{K}(i,j) = K(-i,-j)。这个翻转不是为了“看起来对称”,而是为了满足线性时不变(LTI)系统的数学公理:若系统对输入δ(x,y)(单位脉冲)的响应是h(x,y),则对任意输入I(x,y)的输出必为I * h。CNN 的每一层,本质上都在学习一个 LTI 系统的冲激响应h。PyTorch 的nn.Conv2d在前向传播中,实际执行的是相关运算(即不翻转权重),但它在反向传播更新权重W的梯度时,计算的是∂L/∂W = ∂L/∂out * input,这个*是严格按卷积定义进行的——也就是对输入特征图做翻转相关。你可以验证:

import torch import torch.nn as nn conv = nn.Conv2d(1, 1, 3, bias=False) conv.weight.data = torch.tensor([[[[1,2,3],[4,5,6],[7,8,9]]]]) # 原始权重 x = torch.tensor([[[[0,0,0,0],[0,1,0,0],[0,0,0,0],[0,0,0,0]]]], dtype=torch.float32) print(conv(x)) # 输出 [[[[5.]]]] —— 中心像素 1 与权重中心 5 相乘,正是相关!

所以,CNN 的“卷积层”名不副实,实为“可学习的相关层”;而它的训练过程,才真正履行了卷积的数学契约。这就是为什么你不能把nn.Conv2d的权重直接拿去cv2.filter2D用——前者是相关视角的参数,后者默认也是相关,但尺度、归一化全不同。

2.3 内积:滤波响应的物理本质,所有“响应值”的终极解释

内积(inner product)把图像局部块I_{x,y}和滤波器K都拉平成向量:

\langle I_{x,y}, K \rangle = \text{vec}(I_{x,y})^\top \cdot \text{vec}(K)

这才是滤波器输出值R(x,y)的物理意义:它表示图像局部结构I_{x,y}与滤波器所编码的“理想模式”K在向量空间中的相似度。高响应值 = 二者方向接近(余弦值大)且各自模长不小。这个视角瞬间解释了所有现象:

  • 为什么高斯核尺寸增大但 σ 不变,效果类似?因为vec(K)的模长||K||随尺寸增大而稀释,而vec(I_{x,y})的模长在局部近似恒定,内积值趋于饱和;
  • 为什么 SIFT 描述子要归一化?就是为了消除||vec(I_{x,y})||的影响,只保留方向信息(余弦相似度);
  • 为什么 1×1 卷积能降维?因为它是在通道维度上做内积:C_in维输入向量与C_out个C_in维权重向量分别做内积,输出C_out维响应。

提示:别再把filter2D的输出叫“卷积结果”。它是相关值,是内积值,唯独不是数学卷积值——除非你手动翻转了核。

2.4 三者关系的代码级验证:用 PyTorch 手撕三重身份

我们用一个 3×3 Sobel-X 核(检测垂直边缘)来实证:

import torch import torch.nn.functional as F # Sobel-X 核:[[ -1, 0, 1], [-2, 0, 2], [-1, 0, 1]] K_sobel = torch.tensor([[[[-1,0,1],[-2,0,2],[-1,0,1]]]], dtype=torch.float32) K_sobel_flipped = torch.flip(K_sobel, [2,3]) # 翻转180°,得到卷积核 # 构造测试图像:中间一列全1,其余为0 → 应该在列左右产生强响应 I = torch.zeros(1,1,5,5) I[0,0,:,2] = 1 # 第3列全1 # 1. 相关:filter2D 方式(PyTorch conv2d 前向) corr_out = F.conv2d(I, K_sobel, padding=1) # padding=1 保证输出尺寸同输入 # 2. 卷积:用翻转后的核 conv_out = F.conv2d(I, K_sobel_flipped, padding=1) # 3. 内积:手动拉平计算(只算中心点 (2,2)) patch = I[0,0,1:4,1:4].flatten() # 取3x3局部块 k_vec = K_sobel.flatten() inner_prod = torch.dot(patch, k_vec) print("相关输出中心值:", corr_out[0,0,2,2].item()) # ≈ 0.0 (因对称抵消) print("卷积输出中心值:", conv_out[0,0,2,2].item()) # ≈ 0.0 (同上) print("内积计算值:", inner_prod.item()) # ≈ 0.0 # 但看 (2,1) 位置:左侧边缘,应有正响应 print("相关输出(2,1):", corr_out[0,0,2,1].item()) # ≈ 4.0 (-1*0 +0*0 +1*1 + ... 计算得4) print("卷积输出(2,1):", conv_out[0,0,2,1].item()) # ≈ -4.0 (翻转后符号相反)

结果清晰显示:相关与卷积在(2,1)处符号相反,而内积值等于相关值——因为F.conv2d前向就是相关。这证明:你在代码里写的每一行conv2d,都是在做内积;你调试时看到的每一个响应图,都是内积空间中的相似度热力图;而你模型学到的每一个权重,都是在高维空间中寻找与数据最“合拍”的方向向量。忘掉“卷积是翻转”,记住“内积是本质”。

3. 高斯家族的统治逻辑:从单核平滑到多尺度微分,为什么 σ 是唯一标尺

3.1 高斯核尺寸为何锁定在 6σ?3σ 原则背后的积分收敛真相

高斯函数g(x,y) = exp(-(x²+y²)/(2σ²))的离散化核,其有效支撑(support)并非无限。课程里说“取 6σ”,但没说清为什么不是5.9σ或6.1σ。真相藏在定积分的截断误差里:

\int_{-3\sigma}^{3\sigma} \int_{-3\sigma}^{3\sigma} g(x,y) \, dx\,dy \approx 0.9973

即 99.73% 的能量集中在±3σ范围内。但离散核是二维矩形窗,需覆盖[-3σ, 3σ]的完整区间,故核宽W = 2 * 3σ + 1 ≈ 6σ(+1 是为包含中心点)。若你强行用5σ核:

import numpy as np def gaussian_kernel_1d(size, sigma): x = np.arange(-size//2 + 1, size//2 + 1) kernel = np.exp(-x**2 / (2*sigma**2)) return kernel / kernel.sum() # 计算不同尺寸核的能量保留率 sigma = 2.0 for size in [5, 7, 9, 11, 13]: k = gaussian_kernel_1d(size, sigma) energy = np.sum(k[k > 1e-6]) # 忽略浮点下溢 print(f"size={size:2d}, energy={energy:.4f}") # 输出: # size= 5, energy=0.9545 # 仅95.45%,噪声抑制不足 # size= 7, energy=0.9920 # size= 9, energy=0.9987 # 已超99.73% # size=11, energy=0.9998 # size=13, energy=1.0000

看到没?size=7(≈3.5σ)时能量已达 99.2%,size=9(≈4.5σ)就超 99.8%。所谓6σ是工程保守值——它确保即使在σ估算有 ±10% 误差时,能量保留率仍 >99.5%。这也是为什么你把核从 7×7 改成 13×13,σ 不变,效果“类似”:多出来的边缘像素贡献的权重 <0.001,对内积结果的扰动远小于浮点精度。

3.2 高斯偏导核:去噪与求导的联合优化,为什么不能先高斯再求导?

高斯偏导核G_x = ∂g/∂x = -x/σ² * g(x,y)的设计,是计算效率与数值稳定性的双重胜利。直觉上,你可能想:先用高斯核平滑I,再用 Sobel 算子求导。但这样做有两大缺陷:

  1. 计算冗余:高斯平滑是O(W²N²)(W 为核宽,N 为图像边长),Sobel 求导是O(N²),总代价O(W²N²);
  2. 数值放大噪声:Sobel 是高通滤波器,会放大平滑后残留的高频噪声。

而高斯偏导核G_x是一个各向异性低通+微分的复合滤波器:它在x方向有微分特性(零均值、反对称),在y方向仍是平滑(高斯)。其频域响应H_x(u,v) = j2πu * exp(-2π²σ²(u²+v²))显示:它在低频区衰减(平滑),在中频区增强(边缘响应),在高频区又衰减(抑制噪声)。更重要的是,G_x可以通过分离卷积实现:

# 分离计算:先 y 方向高斯,再 x 方向一阶导 gauss_y = cv2.getGaussianKernel(15, sigma) # 15x1 sobel_x = cv2.Sobel(np.eye(15), cv2.CV_64F, 1, 0, ksize=3) # 15x15,但只用一行 # 实际计算:I -> (I * gauss_y.T) -> ((I * gauss_y.T) * sobel_x) # 代价:O(15*N²) + O(15*N²) = O(30N²),远低于 15x15 核的 O(225N²)

这就是课程第 4 题的答案:设计原理是“联合优化”,实现方式是“分离可积”。你写的每一行cv2.GaussianBlur+cv2.Sobel,底层都在偷偷做这个分解。

3.3 LoG 与 DoG:为什么 SIFT 用 DoG 代替 LoG?内存与精度的残酷权衡

Laplacian of Gaussian (LoG) 核∇²g = (∂²/∂x² + ∂²/∂y²)g是各向同性的二阶微分,能精确定位斑点(blob)。但它的计算成本高,且对噪声敏感。SIFT 用 Difference of Gaussians (DoG)D(x,y,σ) = G(x,y,kσ) - G(x,y,σ)近似 LoG,原因有三:

  1. 数学等价性:当k→1时,D(x,y,σ) ≈ (k-1)σ² ∇²g(x,y,σ),即 DoG 是 LoG 的尺度缩放;
  2. 计算极简:DoG = 两个高斯模糊图像相减,而高斯模糊可用快速算法(FFT 或 IIR),减法是O(N²);LoG 需先算二阶导再卷积,或构造复杂核;
  3. 内存友好:DoG 只需存两个模糊图像;LoG 需存一个大尺寸二阶导核(如 15×15),且无法分离。

但代价是:DoG 的极值点(用于关键点检测)比 LoG 的真实极值点有轻微偏移。SIFT 接受这个 trade-off,因为在金字塔多尺度下,这种偏移被尺度归一化吸收,且检测鲁棒性提升远大于定位精度损失。这就是第 11 题“双塔结构简化计算”的核心:用计算换鲁棒,用近似换效率。

4. 关键点检测的尺度战争:从 Harris 到 SIFT,为什么“自动尺度选择”是视觉系统的生存本能

4.1 Harris 角点:结构张量的特征值陷阱,为什么 det(M) 和 trace(M) 是救命稻草?

Harris 算子从灰度变化函数E(u,v) = Σ[I(x+u,y+v)-I(x,y)]²出发,经泰勒展开得二次型:

E(u,v) ≈ [u,v] M [u,v]^⊤, \quad M = \sum \begin{bmatrix} I_x^2 & I_x I_y \\ I_x I_y & I_y^2 \end{bmatrix}

M是 2×2 结构张量,其特征值λ₁, λ₂决定局部性质:λ₁≈λ₂>>0为角点,λ₁>>λ₂>0为边缘,λ₁≈λ₂≈0为平面。但实时计算特征值分解O(1)是不可能的(需解二次方程)。Harris 的神来之笔是定义响应函数:

R = \det(M) - k \cdot \operatorname{trace}(M)^2 = λ₁λ₂ - k(λ₁+λ₂)²

其中k=0.04~0.06。为什么R能代理?因为:

  • 当λ₁,λ₂都大 →det和trace²都大,但det增长更快(二次 vs 四次),R>0;
  • 当λ₁>>λ₂→det≈0,trace²≈λ₁²,R<0;
  • 当都小 →R≈0。
    det和trace是M的初等对称多项式,可由图像梯度直接累加得到,O(1)计算!这就是课程第 8 题的深意:Harris 不是在“算特征值”,而是在用代数不变量绕过数值计算地狱。

4.2 自动尺度选择:LoG 响应的极值,为什么必须是f(x,y,σ)的局部最大?

Harris 的致命缺陷是无尺度:固定窗口大小,小物体角点被淹没,大物体角点被过度平滑。自动尺度选择的核心思想(第 9 题)是构建尺度空间L(x,y,σ) = G(x,y,σ) * I(x,y),然后在(x,y,σ)三维空间中找LoG响应∇²L的极值点。但∇²L计算贵,故用 DoGD(x,y,σ) = L(x,y,kσ) - L(x,y,σ)。关键洞察(第 10 题):

特征尺度σ的物理意义,是使L(x,y,σ)在(x,y)处的LoG响应达到局部最大的尺度。

为什么?因为LoG是高斯的二阶导,其零交叉点(zero-crossing)对应图像中“斑点”的尺度。当σ小于物体真实尺度,LoG响应弱(高斯太窄,平滑不足);当σ大于真实尺度,LoG响应也弱(高斯太宽,细节抹平)。极值点∂(∇²L)/∂σ = 0正是响应最强的平衡点。这不是数学游戏,而是生物视觉的硬约束:视网膜神经节细胞的感受野大小随视野 eccentricity 变化,就是在做自动尺度选择。

4.3 SIFT 双塔结构:高斯金字塔与 DoG 金字塔的共生协议

SIFT 的“双塔”(第 11 题)指:

  • 高斯金字塔(Gaussian Pyramid):每组(octave)内,图像用不同σ的高斯核模糊,生成S+3层(S为每组层数,通常 3);
  • DoG 金字塔(Difference-of-Gaussian):每组内相邻高斯层相减,得S+2层 DoG。

“双塔”如何简化计算?四条铁律:

  1. 组内复用:G(x,y,2σ)不用新卷积,而是G(x,y,σ)卷积G(x,y,√3σ)(因σ₁²+σ₂²=σ₃²);
  2. 组间降采:下一组图像 = 当前组倒数第三层下采样 2×(σ翻倍,分辨率减半);
  3. DoG 替代 LoG:D(x,y,σ) ≈ c · ∇²L(x,y,σ),免去二阶导计算;
  4. 极值检测剪枝:DoG 极值点只需与同层 8 邻域 + 上下层各 9 邻域(共 26 点)比较,O(1)。

这四条让 SIFT 在 2004 年就能在 CPU 上实时运行。今天你用cv2.SIFT_create(),背后仍是这套协议。“双塔”不是结构,而是计算契约:用空间换时间,用近似换鲁棒,用尺度冗余换检测确定性。

5. 从特征到分类:视觉词典与线性分类器的隐秘纽带,NB/KNN/LinCls 如何共享同一棵决策树

5.1 视觉词典:SIFT 描述子的聚类,为什么 K-means 是唯一解?

构造视觉词典(第 14 题)的流程:提取所有图像的 SIFT 描述子 → 堆叠成N×128矩阵 → K-means 聚类 →K个聚类中心即K个视觉单词。为什么必须是 K-means?因为:

  • SIFT 描述子是ℓ²归一化的 128 维向量,其分布近似球面;
  • K-means 最小化Σ||x_i - μ_{c_i}||²,即在球面上找K个质心,使每个描述子到其质心距离平方和最小;
  • 其他聚类(如 DBSCAN)无法保证每个视觉单词有明确的“中心向量”,而后续的 BoW(Bag-of-Words)表示需要x_i投影到最近质心μ_k,形成K维直方图。

注意:K 的选择是艺术。K=1000时,每个单词太泛化(如“所有边缘”);K=100000时,单词太琐碎(如“左上角带缺口的圆”),导致直方图稀疏。经验公式:K ≈ 10 × (训练图像数)。

5.2 NB、KNN、LinCls 的统一视角:从生成式到判别式的决策流形

第 16 题问三者联系,答案藏在决策边界的几何形态里:

  • 朴素贝叶斯(NB):假设特征条件独立,P(y|x) ∝ P(x|y)P(y)。对高斯 NB,P(x|y)是多元高斯,决策边界是二次曲面;但若所有类协方差矩阵相等Σ_y = Σ,则log P(y|x)是x的线性函数 →线性边界(如w^⊤x + b = 0)。
  • KNN:不建模分布,直接查表。其风险R_{KNN} ≤ 2R^*(贝叶斯最优风险),即它用“局部平均”逼近全局最优。当K=1,边界是 Voronoi 图;K增大,边界平滑化,趋近线性。
  • 线性分类器(LinCls):直接学f(x) = w^⊤x + b,决策边界就是超平面w^⊤x + b = 0。

三者本质是同一棵树:

决策流形(Decision Manifold) / | \ 生成式(NB) 非参数(KNN) 判别式(LinCls) ↓ ↓ ↓ 概率建模 局部投票 参数学习 ↓ ↓ ↓ 线性边界(当Σ_y=Σ) → 近似线性边界 ← 精确线性边界

这就是为什么课程用“绿脸到红脸”比喻:NB 从联合分布P(x,y)推出P(y|x)(绿→红),LinCls 直接学P(y|x)(绿→红一步到位),KNN 用邻域统计估计P(y|x)(绿→蓝→红,多步逼近)。它们不是竞争关系,而是同一目标在不同计算约束下的实现方案。

5.3 权重矩阵 W 的双重人格:代数模板 vs 几何超平面,为什么 CNN 的 filter 是“活”的?

第 17 题s = Wx的解释,是理解所有线性模型的钥匙:

  • 代数视角:W的每一行w_i是一个“模板”(template),s_i = w_i^⊤x是输入x与模板w_i的匹配度。在 AlexNet 中,w_i就是某个卷积核在展平后的向量;在 SVM 中,w_i是支持向量的线性组合。
  • 几何视角:s_i = 0定义了一个超平面,s_i > 0表示x在该平面的正侧。对C类分类,W定义C个超平面,x落在哪个平面的正侧最“深”,就属于哪类。

但 CNN 的W是“活”的:它不是静态模板,而是感受野内的局部相关性探测器。一个 3×3 卷积核w,其几何意义是:在输入x的 3×3 区域上,w定义了一个 9 维空间中的方向,w^⊤x是该区域在w方向上的投影长度。当w学到“垂直边缘”模式,它就在所有图像中寻找这个方向的强投影。所以,CNN 的 filter 不是“画笔”,而是“探针”;不是“记住模板”,而是“定义坐标轴”。这就是第 25 题“感受野与权值共享”的真谛:权值共享,是强制所有探针在图像不同位置用同一套坐标系测量;感受野,是这个探针的物理探测范围。

6. 深度网络的进化动力学:从 R-CNN 到 Faster R-CNN,为什么“端到端”不是口号而是生存法则

6.1 R-CNN 的三重割裂:区域提议、特征提取、分类回归为何必须一体化?

R-CNN(第 35 题)的致命伤是三阶段割裂:

  1. 区域提议(Selective Search):CPU 上运行,耗时 2s/图,与 CNN 无关;
  2. 特征提取(CNN):每个 proposal 独立过 CNN,重复计算 2000 次;
  3. 分类回归(SVM + Linear Reg):独立训练,无法反向传播到 CNN。

这导致:

  • 计算黑洞:2000 个 proposal × 224×224 输入 × VGG-16 前向 = 10¹⁰ FLOPs;
  • 优化失能:CNN 特征提取器无法根据检测任务调整,SVM 的 margin 与 CNN 的特征分布不匹配;
  • 内存雪崩:存储 2000 个 4096-D 特征向量,需 GB 级内存。

Fast R-CNN(第 35 题)的破局点是RoI Pooling:整图过 CNN 一次得 feature map,再将 proposal 映射到 feature map 上,用 RoI Pooling 截取固定尺寸(7×7)特征。这带来三重革命:

  • 计算压缩:1 次 CNN + 2000 次 RoI Pooling(O(1)) vs 2000 次 CNN;
  • 端到端可训:RoI Pooling 可导,整个网络(CNN + RoI + FC)用 multi-task loss 联合优化;
  • 内存瘦身:只存 1 张 feature map(如 14×14×512),而非 2000 个向量。

但 Fast R-CNN 仍依赖外部 Selective Search,区域提议成为性能瓶颈。

6.2 Faster R-CNN 的终极整合:RPN 如何把“提议”变成“网络的呼吸”?

Faster R-CNN(第 36 题)的 RPN(Region Proposal Network)是深度学习范式的胜利:它把“提议”从外部模块,变成 CNN 主干的自然副产物。RPN 的设计哲学是:

  • 锚点(Anchor):在 feature map 每个位置预设k个(如 9 个)不同尺度/长宽比的 bounding box,作为“先验”。这不是手工设计,而是数据驱动的归纳——PASCAL VOC 中物体尺度分布决定了k=9(3 种尺度 × 3 种比例)。
  • 双头输出:每个锚点,RPN 同时预测:
    • 对象性(objectness):二分类 logits(1×H×W),判断是否含物体;
    • 边界框回归(bbox reg):4 个偏移量t_x,t_y,t_w,t_h(4×H×W),用于修正锚点。
  • 端到端联合:RPN 与检测头共享 feature map,loss = RPN cls loss + RPN reg loss + Det cls loss + Det reg loss。

RPN 的物理意义是:CNN 主干在提取语义特征的同时,其浅层特征已蕴含了物体存在的空间线索;RPN 就是把这个线索显式地读出来。它不再“提议”,而是“确认”——确认哪些锚点值得进入下一步检测。这解释了为什么 Faster R-CNN 的 mAP 比 Fast R-CNN 高 3 个点:提议质量提升,源于特征与提议的共生进化。

6.3 NMS 的数学本质:IoU 作为度量,为什么 0.7 是黄金阈值?

NMS(第 37 题)看似简单,实为度量空间中的贪心聚类。给定N个检测框{b_i}及其置信度{s_i},NMS 流程:

  1. 选b_{max}with maxs_i;

本文还有配套的精品资源,点击获取

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

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

立即咨询