一、从"规则"到"学习":机器学习视觉的思路
"小陈,之前学的都是'人定规则'——阈值、滤波、特征匹配都是人设计好的算法。"老周说,"但'判断这张图是科幻书还是童书'这种问题,规则写不完。这时要上机器学习(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 卷积神经网络——让机器自己从数据里'长'出特征来。这是现代计算机视觉真正的开始。"