共计 1951 个字符,预计需要花费 5 分钟才能阅读完成。
为什么我们需要 Bag of Words 模型
在传统计算机视觉任务中,我们常常遇到两个主要问题:

- 特征维度爆炸 :直接使用像素值作为特征会导致数据维度极高,计算复杂度呈指数增长
- 语义鸿沟 :低级视觉特征(如颜色、纹理)难以表达高级语义概念(如 ” 猫 ”、” 狗 ”)
Bag of Words(BoW) 模型借鉴了自然语言处理的思想,将这些无序的局部特征 ” 单词 ” 组合成一个 ” 视觉词典 ”,有效解决了上述问题。
BoW 模型的三阶段架构
1. 特征检测阶段
常用的特征提取方法对比:
- SIFT(Scale-Invariant Feature Transform):
$$ L(x,y,\sigma)=G(x,y,\sigma)*I(x,y) $$ - 优势:尺度不变性
-
缺点:计算量大
-
SURF(Speeded Up Robust Features):
使用 Hessian 矩阵近似:
$$ H(x,\sigma)=\begin{bmatrix} L_{xx}(x,\sigma) & L_{xy}(x,\sigma) \ L_{yx}(x,\sigma) & L_{yy}(x,\sigma) \end{bmatrix} $$ - 比 SIFT 快 3 倍
-
对模糊和旋转更鲁棒
-
ORB(Oriented FAST and Rotated BRIEF):
- FAST 特征点 +BRIEF 描述子
- 实时性最好
2. 词典构建阶段
使用 k -means 聚类将所有特征向量聚合成视觉单词:
from sklearn.cluster import MiniBatchKMeans
import numpy as np
# 假设 features 是所有图像提取的特征集合
k = 1000 # 视觉词典大小
kmeans = MiniBatchKMeans(n_clusters=k,
batch_size=1000, # 内存优化关键参数
compute_labels=False)
visual_vocabulary = kmeans.fit(features)
3. 特征编码阶段
原始词频统计的改进方案:
from sklearn.feature_extraction.text import TfidfTransformer
# 原始词频统计
bow_hist = np.zeros((num_images, k))
for i, img_features in enumerate(all_features):
words = visual_vocabulary.predict(img_features)
bow_hist[i] = np.bincount(words, minlength=k)
# TF-IDF 加权改进
tfidf = TfidfTransformer()
bow_tfidf = tfidf.fit_transform(bow_hist)
工程实践中的性能优化
视觉词典大小的选择
通过实验发现:
- 词典过小(<500):分类准确率低
- 词典过大(>2000):计算成本剧增
- 最佳范围:1000-1500
多进程加速技巧
Python 的 GIL 限制解决方案:
from multiprocessing import Pool
import cv2
def extract_sift(image_path):
img = cv2.imread(image_path)
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
sift = cv2.SIFT_create()
kp, des = sift.detectAndCompute(gray, None)
return des
with Pool(processes=4) as pool: # 根据 CPU 核心数调整
features = pool.map(extract_sift, image_paths)
避坑指南
光照归一化处理
def gamma_correction(img, gamma=1.0):
inv_gamma = 1.0 / gamma
table = np.array([((i / 255.0) ** inv_gamma) * 255
for i in np.arange(0, 256)]).astype("uint8")
return cv2.LUT(img, table)
k-means 初始化优化
# 使用 k -means++ 初始化
kmeans = MiniBatchKMeans(n_clusters=1000,
init='k-means++', # 更好的初始中心选择
n_init=3) # 多次运行取最优
开放性问题
在深度学习主导的今天,BoW 模型仍有其独特价值:
- 如何将 CNN 的深度特征与传统 BoW 结合?
- 能否用注意力机制改进视觉单词的权重分配?
- 在边缘设备上,BoW 能否作为轻量级替代方案?
经过实际项目验证,在特定场景下(如工业缺陷检测),优化后的 BoW 模型仍能达到 95%+ 的准确率,同时保持毫秒级的处理速度。这种传统方法与现代技术的结合,或许正是计算机视觉领域永恒的探索方向。
正文完
发表至: 计算机视觉
近一天内
