第五章

传统机器学习视觉:HOG + SVM

第四层 · 特征工程/分类器 用 SVM 给图书分类

一、从"规则"到"学习":机器学习视觉的思路

"小陈,之前学的都是'人定规则'——阈值、滤波、特征匹配都是人设计好的算法。"老周说,"但'判断这张图是科幻书还是童书'这种问题,规则写不完。这时要上机器学习(Machine Learning)。"

传统规则 vs 机器学习:
  传统规则:人写"如果图片里有飞船 → 科幻"(写不完)
  机器学习:给机器看"这是科幻/这不是科幻"的样本
           → 机器自己学出"区分规律"

  机器学习视觉流程(传统):
    ① 收集数据:N 张图片 + 标签(科幻/童书/文学)
    ② 提取特征:把每张图变成"特征向量"(HOG 等)
    ③ 训练分类器:SVM/决策树/随机森林
    ④ 预测:新图 → 提取特征 → 分类器给答案

  关键概念:
    特征工程(Feature Engineering)= 人设计"怎么描述图像"
    分类器(Classifier)= 根据特征做判断的模型

"传统机器学习的核心是'特征工程 + 分类器'——特征工程决定'模型看什么',分类器决定'怎么判断'。这是深度学习的'前身',理解了它,CNN 的意义就一目了然。"


二、HOG 特征:描述"形状"的经典特征

"图像分类用什么特征?最经典之一:HOG(方向梯度直方图)——描述'物体的形状轮廓'。"老周说:

HOG(Histogram of Oriented Gradients)方向梯度直方图:
  思想:物体的"形状"可以通过"边缘的方向分布"来描述
    - 人体:竖直边缘多(躯干、腿)
    - 汽车:水平+竖直边缘混合
    - 文字:密集的混合方向小边缘

  提取过程:
    ① 把图分成小块(cell,如 8×8)
    ② 每块计算"梯度方向直方图"(哪个方向的边缘多)
    ③ 所有块的直方图拼成一个长向量 = 特征

  用途:
    行人检测(HOG+SVM 的经典组合,2005 年 Dala&Tiggs)
    通用物体分类

  OpenCV:
    hog = cv2.HOGDescriptor()
    features = hog.compute(img)     # 特征向量

  感受:HOG 描述"哪里有什么方向的边缘"
    = 图像的"形状指纹"(对光照变化鲁棒)

"HOG = '形状轮廓的统计指纹'——它不关心颜色,只关心'边缘长什么样、朝什么方向'。这就是为什么它能用来识别人形(行人检测的经典方案)。"


三、SVM:划"最佳分界线"的分类器

"有了特征向量,怎么分类?SVM(支持向量机)是传统视觉的'标配分类器'。"老周说:

SVM(Support Vector Machine)支持向量机:
  核心思想:在特征空间里画一条"分界线"
            把不同类别的样本分开,且"边界最宽"

  ┌─────────────────────────┐
  │   ○ ○ ○                │
  │   ○ ○   ← 科幻类样本    │
  │       ╲                │
  │        ╲  最佳分界线     │
  │         ╲              │
  │    × × × ×             │
  │    × ×  ← 童书类样本    │
  └─────────────────────────┘
  支持向量 = 离分界线最近的样本
  (它们"撑住"了分界线,故名支持向量机)

  核技巧(Kernel Trick):
    线性分不开?→ 映射到高维再分
    RBF 核:最常用(可处理复杂边界)

  sklearn 用法:
    from sklearn.svm import SVC
    model = SVC(kernel="rbf", C=1.0)
    model.fit(X_train, y_train)        # 训练
    pred = model.predict(X_test)       # 预测

"SVM 是'边界最大化'的分类器——它找的不是'任意一条分界线',而是'最稳的那条'(离两边样本都最远)。泛化能力强,是传统视觉的标配。"


四、完整实战:HOG + SVM 给书架图片分类

老周带小陈做了一个完整的"书架图片分类"例子(科幻/童书/文学):

import cv2
import numpy as np
from sklearn.svm import SVC
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score

def extract_hog(img):
    """把一张图变成 HOG 特征向量"""
    img = cv2.resize(img, (64, 128))          # 统一尺寸
    gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
    hog = cv2.HOGDescriptor(
        winSize=(64, 128), blockSize=(16, 16),
        blockStride=(8, 8), cellSize=(8, 8), nbins=9)
    return hog.compute(gray).flatten()        # 特征向量

# 1. 准备数据(每张图 → 特征向量 + 标签)
X, y = [], []
for img_path, label in zip(all_images, all_labels):
    img = cv2.imread(img_path)
    X.append(extract_hog(img))
    y.append(label)      # 0=科幻 1=童书 2=文学

X = np.array(X); y = np.array(y)

# 2. 划分训练/测试
X_train, X_test, y_train, y_test = train_test_split(
    X, y, test_size=0.2, random_state=42)

# 3. 训练 SVM
model = SVC(kernel="rbf", C=1.0, gamma="scale")
model.fit(X_train, y_train)

# 4. 评估
pred = model.predict(X_test)
print("准确率:", accuracy_score(y_test, pred))   # ~85%+

# 5. 预测新图
new_img = cv2.imread("new_book.jpg")
new_vec = extract_hog(new_img).reshape(1, -1)
print("预测类别:", model.predict(new_vec)[0])
完整流程回顾(传统机器学习视觉标准套路):
  数据收集(带标签的图片)
    → 特征提取(HOG 等)
    → 训练/测试划分
    → 训练分类器(SVM)
    → 评估(准确率)
    → 部署预测

  常见问题:
    数据少 → 效果差(特征工程再牛也救不了)
    类别不均衡 → 用类别权重
    特征没选好 → 换特征/融合特征

"这就是'特征工程时代'的标准开发流程——现在看它有点'原始',但它让你理解了机器学习的骨架:数据→特征→模型→评估。深度学习只是把这个流程里的'特征'也交给机器自己学。"


五、从 HOG+SVM 到 CNN:为什么要进化

"那为什么后来深度学习了?HOG+SVM 不够吗?"小陈问。

"因为特征工程的天花板。"老周说:

HOG+SVM 的局限:
  ① 特征是人设计的 → 只捕捉到"人想到的形状"
     (猫的纹理、毛色、耳朵结构……HOG 描述不了)
  ② 手工特征迁移性差:HOG 调好了行人,换个任务又要重新设计
  ③ 复杂语义("这是本温暖的书")没法用简单特征描述

  深度学习的答案:
    不设计特征,让"神经网络"自己学特征
    层数越深,特征越抽象:
      浅层:边缘、纹理(类似 HOG 在做的事)
      中层:部件(眼睛、轮子、书脊)
      深层:语义(脸、汽车、书)

  对比:
    HOG+SVM:人教机器"看形状"(特征固定)
    CNN:机器自己学"看什么"(特征自动进化)
    → 2012 年 AlexNet 碾压式获胜 → 深度学习时代到来

"记住:CNN 不是'另一个特征',是'让机器自己发明特征'。 下一章,我们进入深度学习——CNN 卷积神经网络,现代计算机视觉的地基。"


六、章末:老周的第五章总结

第四层:传统机器学习视觉
├── 流程:数据 → 特征工程 → 训练分类器 → 评估 → 预测
├── HOG 特征:形状轮廓的方向梯度统计(行人检测经典)
├── SVM:最佳分界线的分类器(核技巧处理非线性)
├── 完整实战:HOG+SVM 书架图片分类(准确率 85%+)
├── 局限:特征是人设计的(天花板有限)
├── 进化:深度学习让机器自己学特征
└── 意义:理解机器学习骨架,为 CNN 打基础
第六层(预告):深度学习与 CNN —— 机器自己学"看什么"

"小陈,HOG+SVM 让你体验了'机器学习视觉'的完整流程——但它的天花板你也能感觉到:'特征要人设计'。"老周说,"下一章,我们跨入深度学习:CNN 卷积神经网络——让机器自己从数据里'长'出特征来。这是现代计算机视觉真正的开始。"

✌ 语言