一、传统ML基础

1.1 核心算法概览

算法类型CV应用特点
kNN监督-分类/回归图像分类(简单)无训练,需存储所有样本
SVM ⭐监督-分类行人检测/HOG分类小样本强,核函数强大
决策树/RF监督-分类/回归特征选择/人脸检测集成学习,抗过拟合
K-Means无监督-聚类图像分割/特征量化简单但需指定K
GMM无监督-聚类背景建模/运动分割软聚类
PCA无监督-降维人脸识别(Eigenface)线性降维最佳
LDA监督-降维FisherFace有监督降维
t-SNE无监督-降维特征可视化非线性可视化
HMM时序模型动作识别/手势时间序列建模
CRF结构化预测图像分割上下文建模

1.2 SVM (支持向量机) ⭐⭐⭐

核心思想: 找到最大间隔超平面

        原始空间              核空间(高维)
     ───●───●─○──       φ(●) ● ●     φ(○) ○
     ──●──○─────    →    ─────────    ────────
        ○──○───              ● ●        ● ○
     (不可分)           (线性可分)

核函数:

核公式参数特点
线性K(x,y) = x·y-无映射,快速
多项式K(x,y) = (x·y + c)^dc, d有限维度映射
RBFK(x,y) = exp(-γ)x-y
SigmoidK(x,y) = tanh(a(x·y)+b)a, b类似神经网络
from sklearn import svm

# HOG + SVM 行人检测
clf = svm.SVC(kernel='rbf', C=1.0, gamma='scale')
clf.fit(X_train, y_train)

# OpenCV 内置 SVM + HOG
hog = cv2.HOGDescriptor()
hog.setSVMDetector(cv2.HOGDescriptor_getDefaultPeopleDetector())

1.3 K-Means 与 图像量化

# 颜色量化 (压缩)
Z = img.reshape((-1, 3))  # RGB像素作为特征
Z = np.float32(Z)
criteria = (cv2.TERM_CRITERIA_EPS + cv2.TERM_CRITERIA_MAX_ITER, 10, 1.0)
_, labels, centers = cv2.kmeans(Z, K=16, None, criteria, 10, cv2.KMEANS_RANDOM_CENTERS)
centers = np.uint8(centers)
res = centers[labels.flatten()]
quantized = res.reshape((img.shape))

特征量化: K-Means构建视觉词典 (Bag-of-Visual-Words)

SIFT特征 → K-Means → 视觉单词(Codebook) → 直方图 = 每张图表示
   N×128       K=1000        1000个中心           1×1000

1.4 PCA (主成分分析) ⭐

本质: 找到数据方差最大的方向(特征向量)

输入: X (N×D, N个D维样本)
中心化: X̃ = X - μ
协方差: C = X̃ᵀX̃ / (N-1)  (D×D)
SVD:   C = UΣUᵀ
投影: Y = X̃ · Uₖ           (降维到k维)
# Eigenface 人脸识别
from sklearn.decomposition import PCA
pca = PCA(n_components=100)  # 降到100维
X_pca = pca.fit_transform(X)
# explained_variance_ratio_ 查看信息保留比例

1.5 Bag of Visual Words (BoVW)

流程: 图像 → 特征提取(SIFT) → 词典构建(K-Means) → 量化 → 直方图 → SVM分类

图像1: {SIFT₁, SIFT₂, ..., SIFTᵢ}  →  [2, 0, 1, ..., 5]   SVM → 类别A
图像2: {SIFT₁, SIFT₂, ..., SIFTⱼ}  →  [0, 3, 0, ..., 1]   SVM → 类别B
                    │                        ↑
              K-Means (K=500)          空间金字塔
              视觉词典                     (SPM)

二、传统视觉应用

2.1 人脸检测 - Viola-Jones

论文: Rapid Object Detection using a Boosted Cascade of Simple Features (2001)
开创性: 第一个实现实时人脸检测

三大创新:

  1. Haar-like特征(矩形特征,积分图加速)
  2. AdaBoost(级联弱分类器)
  3. 级联结构(逐级过滤背景)
Haar特征:
     ████░     ██░░     ██░█░     █░░░
     ████░     ██░░     ░░██░     ██░░
     (边缘)  (水平)  (中心)  (对角线)

级联检测: 输入 → C1 → C2 → C3 → ... → 目标
                     ↓回绝检测    ↑ 每一级拒绝大部分背景
face_cascade = cv2.CascadeClassifier(cv2.data.haarcascades + 'haarcascade_frontalface_default.xml')
faces = face_cascade.detectMultiScale(gray, scaleFactor=1.1, minNeighbors=5, minSize=(30,30))

2.2 行人检测 - HOG + SVM(2.1节已详述)

2.3 图像检索

Pipeline:

查询图像 → 特征提取(SIFT/VLAD) → 特征向量 → 相似度搜索(余弦距离) → 排序结果

大规模检索: VLAD (Vector of Locally Aggregated Descriptors)

  • 比BoVW更紧凑
  • 存储每个视觉单词的残差和
  • 配合近似最近邻搜索 (FLANN/IVF)

2.4 背景建模

方法原理适用场景
帧差法frame(t) - frame(t-1)
MOG/MOG2高斯混合模型建模像素动态背景(树/水)
KNN核密度估计更鲁棒的背景建模
GMG贝叶斯推断快速初始化
backSub = cv2.createBackgroundSubtractorMOG2(history=500, varThreshold=16, detectShadows=True)

2.5 光流 (经典方法)

方法类型特点
Lucas-Kanade稀疏跟踪特征点,假设小运动
Horn-Schunck稠密全局平滑约束
Farneback稠密多项式展开,OpenCV实现
# Lucas-Kanade 稀疏光流
lk_params = dict(winSize=(15,15), maxLevel=2,
                 criteria=(cv2.TERM_CRITERIA_EPS|cv2.TERM_CRITERIA_COUNT, 10, 0.03))
p1, st, err = cv2.calcOpticalFlowPyrLK(old_gray, gray, p0, None, **lk_params)

# Farneback 稠密光流
flow = cv2.calcOpticalFlowFarneback(prev, next, None, 0.5, 3, 15, 3, 5, 1.2, 0)

三、特征选择与评估

方法原理特点
Filter统计指标(卡方/互信息)独立于分类器
WrapperRFE(递归消除)依赖分类器
EmbeddedLasso/Ridge训练时选择
# 卡方检验特征选择
from sklearn.feature_selection import SelectKBest, chi2
selector = SelectKBest(chi2, k=100)
X_selected = selector.fit_transform(X, y)

📺 推荐视频

内容链接
李航《统计学习方法》讲解B站搜索
SVM详解 (StatQuest)https://www.youtube.com/watch?v=efR1C6CvhmE
PCA主成分分析 (StatQuest)https://www.youtube.com/watch?v=FgakZw6K1QQ
Viola-Jones人脸检测https://www.youtube.com/watch?v=uEJ71VlVmMQ
Bag of Visual Wordshttps://www.youtube.com/watch?v=uxkhqPBIQ5Y

📚 推荐书籍

书名作者说明
统计学习方法 (第2版)李航经典ML必读
The Elements of Statistical Learning (ESL)Hastie et al.统计ML标准教材
Pattern Recognition and Machine Learning (PRML)Bishop概率视角ML
Machine Learning: A Probabilistic PerspectiveMurphy全面系统
Computer Vision: Algorithms and ApplicationsSzeliski (第14-15章)CV中的ML应用

附录:深层补充

1. SVM完整数学推导

1.1 硬间隔SVM(从原始问题到对偶问题的KKT推导)

原始问题:给定线性可分的数据 { ( x i , y i ) } i = 1 N \{(x_i, y_i)\}_{i=1}^N {(xi​,yi​)}i=1N​, y i ∈ { − 1 , + 1 } y_i \in \{-1, +1\} yi​∈{−1,+1},寻找最大间隔超平面 w T x + b = 0 w^T x + b = 0 wTx+b=0。

几何间隔:点 x i x_i xi​ 到超平面的距离为 y i ( w T x i + b ) ∥ w ∥ \frac{y_i(w^T x_i + b)}{\|w\|} ∥w∥yi​(wTxi​+b)​。

优化问题(最大化最小几何间隔):
max ⁡ w , b 1 ∥ w ∥ min ⁡ i y i ( w T x i + b ) \max_{w,b} \frac{1}{\|w\|} \min_i y_i(w^T x_i + b) w,bmax​∥w∥1​imin​yi​(wTxi​+b)

令 min ⁡ i y i ( w T x i + b ) = 1 \min_i y_i(w^T x_i + b) = 1 mini​yi​(wTxi​+b)=1,转化为等价形式:
min ⁡ w , b 1 2 ∥ w ∥ 2 s.t.    y i ( w T x i + b ) ≥ 1 , ∀ i \min_{w,b} \frac{1}{2}\|w\|^2 \quad \text{s.t.} \; y_i(w^T x_i + b) \geq 1, \forall i w,bmin​21​∥w∥2s.t.yi​(wTxi​+b)≥1,∀i

Lagrange函数:引入 α i ≥ 0 \alpha_i \geq 0 αi​≥0:
L ( w , b , α ) = 1 2 ∥ w ∥ 2 − ∑ i = 1 N α i [ y i ( w T x i + b ) − 1 ] L(w,b,\alpha) = \frac{1}{2}\|w\|^2 - \sum_{i=1}^N \alpha_i [y_i(w^T x_i + b) - 1] L(w,b,α)=21​∥w∥2−i=1∑N​αi​[yi​(wTxi​+b)−1]

KKT条件:

  1. 平稳性: ∂ L ∂ w = 0 ⇒ w = ∑ α i y i x i \frac{\partial L}{\partial w} = 0 \Rightarrow w = \sum \alpha_i y_i x_i ∂w∂L​=0⇒w=∑αi​yi​xi​, ∂ L ∂ b = 0 ⇒ ∑ α i y i = 0 \frac{\partial L}{\partial b} = 0 \Rightarrow \sum \alpha_i y_i = 0 ∂b∂L​=0⇒∑αi​yi​=0
  2. 原始可行: y i ( w T x i + b ) − 1 ≥ 0 y_i(w^T x_i + b) - 1 \geq 0 yi​(wTxi​+b)−1≥0
  3. 对偶可行: α i ≥ 0 \alpha_i \geq 0 αi​≥0
  4. 互补松弛: α i [ y i ( w T x i + b ) − 1 ] = 0 \alpha_i [y_i(w^T x_i + b) - 1] = 0 αi​[yi​(wTxi​+b)−1]=0

对偶问题:代入KKT条件消除 w , b w,b w,b:
max ⁡ α ∑ i = 1 N α i − 1 2 ∑ i = 1 N ∑ j = 1 N α i α j y i y j x i T x j \max_\alpha \sum_{i=1}^N \alpha_i - \frac{1}{2} \sum_{i=1}^N \sum_{j=1}^N \alpha_i \alpha_j y_i y_j x_i^T x_j αmax​i=1∑N​αi​−21​i=1∑N​j=1∑N​αi​αj​yi​yj​xiT​xj​
s.t.    ∑ α i y i = 0 ,    α i ≥ 0 \text{s.t.} \; \sum \alpha_i y_i = 0, \; \alpha_i \geq 0 s.t.∑αi​yi​=0,αi​≥0

支持向量:只有 α i > 0 \alpha_i > 0 αi​>0 的样本才是支持向量(在间隔边界上)。

决策函数:
f ( x ) = sign ( ∑ i ∈ S V α i y i x i T x + b ) f(x) = \text{sign}\left(\sum_{i \in SV} \alpha_i y_i x_i^T x + b\right) f(x)=sign(i∈SV∑​αi​yi​xiT​x+b)

1.2 软间隔SVM(松弛变量 ξ \xi ξ)

当数据不完全线性可分时,允许部分样本违反间隔约束:

min ⁡ w , b , ξ 1 2 ∥ w ∥ 2 + C ∑ i = 1 N ξ i \min_{w,b,\xi} \frac{1}{2}\|w\|^2 + C \sum_{i=1}^N \xi_i w,b,ξmin​21​∥w∥2+Ci=1∑N​ξi​
s.t.    y i ( w T x i + b ) ≥ 1 − ξ i ,    ξ i ≥ 0 , ∀ i \text{s.t.} \; y_i(w^T x_i + b) \geq 1 - \xi_i, \; \xi_i \geq 0, \forall i s.t.yi​(wTxi​+b)≥1−ξi​,ξi​≥0,∀i

其中 C C C 是惩罚参数( C → ∞ C \to \infty C→∞ 退化为硬间隔)。

对偶形式:
max ⁡ α ∑ α i − 1 2 ∑ ∑ α i α j y i y j x i T x j \max_\alpha \sum \alpha_i - \frac{1}{2} \sum \sum \alpha_i \alpha_j y_i y_j x_i^T x_j αmax​∑αi​−21​∑∑αi​αj​yi​yj​xiT​xj​
s.t.    ∑ α i y i = 0 ,    0 ≤ α i ≤ C \text{s.t.} \; \sum \alpha_i y_i = 0, \; 0 \leq \alpha_i \leq C s.t.∑αi​yi​=0,0≤αi​≤C

1.3 核函数与SMO算法

核技巧:将 x i T x j x_i^T x_j xiT​xj​ 替换为 K ( x i , x j ) = ϕ ( x i ) T ϕ ( x j ) K(x_i, x_j) = \phi(x_i)^T \phi(x_j) K(xi​,xj​)=ϕ(xi​)Tϕ(xj​)。

核公式
线性核 K ( x i , x j ) = x i T x j K(x_i,x_j)=x_i^Tx_j K(xi​,xj​)=xiT​xj​
多项式核 K = ( x i T x j + c ) d K=(x_i^Tx_j + c)^d K=(xiT​xj​+c)d
RBF核 K = exp ⁡ ( − γ ∣ x i − x j ∣ 2 ) K=\exp(-\gamma|x_i-x_j|^2) K=exp(−γ∣xi​−xj​∣2)
Sigmoid核 K = tanh ⁡ ( a x i T x j + b ) K=\tanh(a x_i^Tx_j + b) K=tanh(axiT​xj​+b)

SMO(Sequential Minimal Optimization):每次选择两个 α \alpha α 优化(因 ∑ α i y i = 0 \sum \alpha_i y_i = 0 ∑αi​yi​=0 约束),有解析解。收敛 O ( N 2 ) − O ( N 2.3 ) O(N^2)-O(N^{2.3}) O(N2)−O(N2.3)。


2. K-Means与GMM深入对比

2.1 K-Means的EM视角

K-Means是GMM的极限情况( σ → 0 \sigma \to 0 σ→0)。

E步(分配中心): c i = arg ⁡ min ⁡ k ∥ x i − μ k ∥ 2 c_i = \arg\min_k \|x_i - \mu_k\|^2 ci​=argmink​∥xi​−μk​∥2(硬分配)
M步(更新中心): μ k = 1 N k ∑ i : c i = k x i \mu_k = \frac{1}{N_k} \sum_{i: c_i = k} x_i μk​=Nk​1​∑i:ci​=k​xi​

数学实质:最小化总类内平方和 J = ∑ k = 1 K ∑ i ∈ C k ∥ x i − μ k ∥ 2 J = \sum_{k=1}^K \sum_{i \in C_k} \|x_i - \mu_k\|^2 J=∑k=1K​∑i∈Ck​​∥xi​−μk​∥2

2.2 GMM(高斯混合模型)

模型: p ( x ) = ∑ k = 1 K π k N ( x ∣ μ k , Σ k ) p(x) = \sum_{k=1}^K \pi_k \mathcal{N}(x|\mu_k, \Sigma_k) p(x)=∑k=1K​πk​N(x∣μk​,Σk​), ∑ π k = 1 \sum \pi_k = 1 ∑πk​=1。

E步(责任度): γ i k = π k N ( x i ∣ μ k , Σ k ) ∑ j = 1 K π j N ( x i ∣ μ j , Σ j ) \gamma_{ik} = \frac{\pi_k \mathcal{N}(x_i|\mu_k, \Sigma_k)}{\sum_{j=1}^K \pi_j \mathcal{N}(x_i|\mu_j, \Sigma_j)} γik​=∑j=1K​πj​N(xi​∣μj​,Σj​)πk​N(xi​∣μk​,Σk​)​(软分配)

M步(更新): μ k = ∑ i γ i k x i ∑ i γ i k \mu_k = \frac{\sum_i \gamma_{ik} x_i}{\sum_i \gamma_{ik}} μk​=∑i​γik​∑i​γik​xi​​, π k = ∑ i γ i k N \pi_k = \frac{\sum_i \gamma_{ik}}{N} πk​=N∑i​γik​​

2.3 BIC/AIC选择K值

AIC = 2 k − 2 ln ⁡ ( L ) = 2k - 2\ln(L) =2k−2ln(L),BIC = k ln ⁡ ( N ) − 2 ln ⁡ ( L ) = k\ln(N) - 2\ln(L) =kln(N)−2ln(L)。选择最小值对应的K。


3. PCA的完整数学推导

3.1 最大方差视角

PCA寻找第一个主轴的方向 w 1 w_1 w1​( ∥ w 1 ∥ = 1 \|w_1\|=1 ∥w1​∥=1)以最大化投影方差:
max ⁡ w 1 Var ( X w 1 ) = max ⁡ w 1 w 1 T Σ w 1 \max_{w_1} \text{Var}(X w_1) = \max_{w_1} w_1^T \Sigma w_1 w1​max​Var(Xw1​)=w1​max​w1T​Σw1​
使用Lagrange: L = w 1 T Σ w 1 − λ ( w 1 T w 1 − 1 ) \mathcal{L} = w_1^T \Sigma w_1 - \lambda(w_1^T w_1 - 1) L=w1T​Σw1​−λ(w1T​w1​−1)
求导得: Σ w 1 = λ w 1 \Sigma w_1 = \lambda w_1 Σw1​=λw1​ → w 1 w_1 w1​ 是协方差矩阵的最大特征值对应的特征向量。

后续主成分依次为第2、第3大特征向量(正交约束下)。

3.2 最小重构误差视角

将数据投影到k维子空间后再重构,最小化重构误差:
min ⁡ W ∑ i ∥ x i − W W T x i ∥ 2 \min_{W} \sum_i \|x_i - W W^T x_i\|^2 Wmin​i∑​∥xi​−WWTxi​∥2

解同样为协方差矩阵的前k个特征向量。这两个视角等价。

3.3 SVD实现PCA

对中心化数据矩阵 X ~ ∈ R N × D \tilde{X} \in \mathbb{R}^{N \times D} X~∈RN×D 做SVD: X ~ = U Σ V T \tilde{X} = U \Sigma V^T X~=UΣVT

  • 协方差矩阵: Σ X = 1 N − 1 X ~ T X ~ = 1 N − 1 V Σ T Σ V T \Sigma_X = \frac{1}{N-1} \tilde{X}^T \tilde{X} = \frac{1}{N-1} V \Sigma^T \Sigma V^T ΣX​=N−11​X~TX~=N−11​VΣTΣVT
  • 主方向: V V V 的列(右奇异向量)
  • 投影: Y = X ~ V k = U k Σ k Y = \tilde{X} V_k = U_k \Sigma_k Y=X~Vk​=Uk​Σk​(降至k维)
  • 方差占比: ∑ i = 1 k σ i 2 ∑ i = 1 D σ i 2 \frac{\sum_{i=1}^k \sigma_i^2}{\sum_{i=1}^D \sigma_i^2} ∑i=1D​σi2​∑i=1k​σi2​​

SVD方法的数值优势:比直接计算协方差矩阵的EVD更稳定,尤其当 D ≫ N D \gg N D≫N 时。

3.4 核PCA(Kernel PCA)

将数据映射到高维空间再做PCA: ϕ ( x i ) ∈ F \phi(x_i) \in \mathcal{F} ϕ(xi​)∈F。

对映射后数据 Φ = [ ϕ ( x 1 ) , . . . , ϕ ( x N ) ] \Phi = [\phi(x_1), ..., \phi(x_N)] Φ=[ϕ(x1​),...,ϕ(xN​)],协方差矩阵特征向量满足: Φ Φ T v = λ v \Phi \Phi^T v = \lambda v ΦΦTv=λv。

由表示定理: v = ∑ i α i ϕ ( x i ) v = \sum_i \alpha_i \phi(x_i) v=∑i​αi​ϕ(xi​)。代入得: K α = λ α K \alpha = \lambda \alpha Kα=λα,其中 K i j = ϕ ( x i ) T ϕ ( x j ) K_{ij} = \phi(x_i)^T \phi(x_j) Kij​=ϕ(xi​)Tϕ(xj​)。


4. Bag of Visual Words(BoVW)

4.1 完整流程
def bovw_pipeline(images, K=500):
    # Step 1: 特征提取(从每张图像提取SIFT描述子)
    sift = cv2.SIFT_create()
    all_descriptors = []
    for img in images:
        kp, des = sift.detectAndCompute(img, None)
        if des is not None:
            all_descriptors.append(des)
    all_des = np.vstack(all_descriptors)  # (N_total, 128)
    
    # Step 2: 码本构建(K-Means聚类生成视觉词汇)
    from sklearn.cluster import MiniBatchKMeans
    kmeans = MiniBatchKMeans(n_clusters=K, batch_size=10000)
    kmeans.fit(all_des)  # 学习K个码本中心
    codebook = kmeans.cluster_centers_  # (K, 128)
    
    # Step 3: 直方图编码(将每张图的特征量化为直方图)
    histograms = []
    for img_idx, des in enumerate(all_descriptors):
        if des is None:
            hist = np.zeros(K)
        else:
            assigned = kmeans.predict(des)
            hist = np.bincount(assigned, minlength=K)
        # 归一化(L1或L2)
        hist = hist.astype(float) / (np.linalg.norm(hist, 1) + 1e-10)
        histograms.append(hist)
    
    # Step 4: SVM分类
    from sklearn.svm import SVC
    clf = SVC(kernel='rbf', C=100, gamma='scale')
    clf.fit(np.array(histograms), labels)
    return clf, codebook
4.2 空间金字塔匹配(SPM)

Lazebnik et al., 2006。解决BoVW丢失空间信息的缺陷。

原理:将图像递归划分为更细的网格,在每个层次独立量化编码,最后拼接所有层次的直方图。

Level 0 (1×1):  [直方图(256D)]
Level 1 (2×2):  [直方图] [直方图]
                  [直方图] [直方图]
Level 2 (4×4):  [16个直方图]

最终向量 = [L0:256] + [L1:4×256] + [L2:16×256] = 21×256 = 5376D

金字塔匹配核:两个图像的特征向量在每层的匹配数为:
K L ( X , Y ) = ∑ l = 0 L 1 2 L − l ⋅ ( I l − I l − 1 ) \mathcal{K}^L(X,Y) = \sum_{l=0}^L \frac{1}{2^{L-l}} \cdot (\mathcal{I}^l - \mathcal{I}^{l-1}) KL(X,Y)=l=0∑L​2L−l1​⋅(Il−Il−1)

其中 I l \mathcal{I}^l Il 是第l层的匹配数。越精细的层权重越大。


5. HOG的完整实现细节

5.1 梯度计算

使用中心差分(1D离散导数的简单核 [ − 1 , 0 , 1 ] [-1, 0, 1] [−1,0,1]):
G x ( x , y ) = I ( x + 1 , y ) − I ( x − 1 , y ) G_x(x,y) = I(x+1,y) - I(x-1,y) Gx​(x,y)=I(x+1,y)−I(x−1,y)
G y ( x , y ) = I ( x , y + 1 ) − I ( x , y − 1 ) G_y(x,y) = I(x,y+1) - I(x,y-1) Gy​(x,y)=I(x,y+1)−I(x,y−1)

幅值: M ( x , y ) = G x 2 + G y 2 M(x,y) = \sqrt{G_x^2 + G_y^2} M(x,y)=Gx2​+Gy2​ ​
方向: θ ( x , y ) = arctan ⁡ ( G y / G x ) \theta(x,y) = \arctan(G_y/G_x) θ(x,y)=arctan(Gy​/Gx​), θ ∈ [ 0 ∘ , 180 ∘ ) \theta \in [0^\circ, 180^\circ) θ∈[0∘,180∘)(无符号梯度)

为什么用无符号梯度:Dalal & Triggs实验表明, [ 0 ∘ , 180 ∘ ) [0^\circ, 180^\circ) [0∘,180∘)(9个bin)比 [ 0 ∘ , 360 ∘ ) [0^\circ, 360^\circ) [0∘,360∘)(18个bin)效果更好,因为行人轮廓的左右子对称性使得有符号方向意义不大。

5.2 Cell/Block划分

Cell(细胞单元):8×8像素区域,每个cell生成9维直方图。

Block(块):2×2 cells = 16×16像素区域,每个block生成36维特征。

Block步长:1个cell(8像素),与HOG检测窗口64×128对应:

  • 水平方向: ( 64 / 8 − 1 ) = 7 (64/8 - 1) = 7 (64/8−1)=7 个位置
  • 垂直方向: ( 128 / 8 − 1 ) = 15 (128/8 - 1) = 15 (128/8−1)=15 个位置
  • 总block数: 7 × 15 = 105 7 \times 15 = 105 7×15=105
  • 特征向量: 105 × 36 = 3780 105 \times 36 = 3780 105×36=3780 维
5.3 归一化(L2-Hys)

Step 1:对block的36D向量做L2归一化: v ← v / ∥ v ∥ 2 2 + ϵ 2 v \leftarrow v / \sqrt{\|v\|_2^2 + \epsilon^2} v←v/∥v∥22​+ϵ2 ​
Step 2:截断(clipping): v i = min ⁡ ( v i , 0.2 ) v_i = \min(v_i, 0.2) vi​=min(vi​,0.2)(限制梯度幅值不能过大)
Step 3:再次L2归一化

为什么L2-Hys最好:截断操作使HOG对局部光照变化更鲁棒——强梯度不会过度主导整个block的归一化。

5.4 为什么HOG适合行人检测
  1. 边缘形状描述:行人轮廓以垂直边缘为主(腿、手臂、躯干),HOG的cell直方图能捕捉方向分布
  2. 局部对比度归一化:Block归一化使HOG对局部光照变化不敏感
  3. 空间信息保留:不像BoVW丢失空间信息,HOG在各cell中保留位置
  4. 多尺度检测:检测窗口滑动 + 图像金字塔
  5. Dalal & Triggs实验:在INRIA行人数据集上达到接近100%的检测率(当时最优)

Dalal & Triggs的关键发现:筛选出的最佳参数组合

  • 梯度方案: [ − 1 , 0 , 1 ] [-1,0,1] [−1,0,1] 无符号梯度(> 有符号、高斯平滑方向)
  • Cell大小:8×8(> 4×4或16×16)
  • Block大小:2×2 cells(> 1×1或3×3)
  • 归一化:L2-Hys(> L1-norm或L2-norm)
  • 重叠:50% block重叠表现最好

更多推荐