基于词袋模型(BoW)的视觉分类教程Demo
---
项目介绍
本项目是一个基于经典词袋模型(Bag of Words, BoW)思想的计算机视觉分类教学演示。其核心逻辑是将图像中的局部特征视作具体的“单词”,通过建立视觉词典(Visual Vocabulary)来量化和描述图像内容。
通过该项目,用户可以深入了解如何将非结构化的图像数据转化为结构化的定长直方图向量,并利用机器学习分类器实现对不同几何形状(圆形、方形、星形)的自动化识别与归类。
---
功能特性
- 自动化数据集生成:内置合成数据引擎,能够随机生成带有噪声和模糊效果的几何形状图片,模拟真实环境需求。
- 鲁棒特征提取:采用具有旋转和缩放不变性的SURF算子捕捉图像局部细节。
- 高效词典构建:利用K-means聚类算法从海量特征中抽象出代表性的视觉单词。
- 经典机器学习框架:结合多分类支持向量机(SVM)实现高精度的类别预测。
- 多维度评估体系:自动生成混淆矩阵、特征频率直方图以及带有真值对比的预测结果可视化。
---
系统要求
- MATLAB 软件环境(建议 R2018b 或更高版本)
- Computer Vision Toolbox(计算机视觉工具箱)
- Statistics and Machine Learning Toolbox(统计与机器学习工具箱)
---
核心实现逻辑
代码的运行流程严格遵循以下六个步骤:
- 模拟数据集构建:生成指定数量的训练样本和测试样本。每张图像包含一个随机位置、随机大小的形状,并叠加了高斯噪声和高斯滤波。
- 局部描述子提取:遍历训练集图像,使用 detectSURFFeatures 寻找关键点,并使用 extractFeatures 获取对应的特征描述子。
- 视觉码本生成:将所有训练特征点汇总,通过 K-means 算法聚类出指定数量(如50个)的聚类中心。这些中心点构成了“视觉词典”,代表了图像世界中的基础视觉单元。
- BoW直方图编码:对于每一张图像,寻找其特征点在词典中距离最近的单词(最近邻搜索),统计各单词出现的频次,并进行归一化处理,将图像转化为一个定长的特征向量。
- 分类器训练:利用训练集的BoW特征直方图和对应的类别标签,构建多类SVM(One-vs-All 策略)分类模型。
- 性能评估与可视化:将模型应用于测试集,计算总准确率,展示混淆矩阵,并随机抽取样本进行预测结果的实景展示。
---
关键技术分析
SURF特征算子
代码中使用的SURF(加速稳健特征)提取算法是整个BoW流程的基石。它能够在大规模噪声和模糊干扰下,依然稳定地捕捉到形状的边缘和角点信息。
K-means 聚类与码本构建
该步骤是降维的关键。通过对成千上万个高维描述子进行聚类,将复杂的图像内容映射到有限的视觉单词空间。代码中加入了特征点总数限制逻辑,通过随机采样确保了在大规模数据下的运算效率。
直方图池化 (Histogram Pooling)
在编码阶段,程序使用了 dsearchn 函数进行最近邻匹配。池化操作(histcounts)忽略了特征点的空间位置,只关注特征出现的频率,这种特性赋予了BoW模型极强的几何变换鲁棒性(如平移、旋转)。
多分类SVM (fitcecoc)
代码采用了纠错输出码(ECOC)框架来训练SVM。该方法通过组合多个二分类器来解决三分类问题,能够充分利用BoW特征直方图提供的判别信息。
归一化处理
在生成BoW向量后,程序通过对直方图进行求和归一化,消除了图像中关键点数量差异对分类结果的影响,使模型更专注于“特征的组成比例”而非“特征的绝对数量”。
---
使用方法
- 确保已安装所需的MATLAB工具箱。
- 打开MATLAB,将工作路径指向代码所在文件夹。
- 在命令行窗口直接输入
main 并按回车。 - 程序将自动执行全流程,并在控制台实时打印训练进度。
- 运行结束后,会自动弹出两个窗口:
* 窗口1:展示测试集的混淆矩阵和示例图像的词频直方图。
* 窗口2:展示随机选取的测试样本及其真值标签与预测标签(绿色表示预测正确,红色表示预测错误)。