Bag of Visual Words
目录
联系因果正则化论文作者
目前的问题是, 这篇论文里所有特征都是01, 他都处理了.
模型输入的特征不知道实际意义, 但是他最后还是能还原到图片上.
作者回信:
这篇文章当时是采用了Bag of Visual Words的特征提取方式,每张图片被抽象成了M维的词袋向量,每一维特征代表一个特定的visual word,可以被映射回原先的图像当中,一些示例可参考 (https://ww2.mathworks.cn/help/vision/ug/image-classification-with-bag-of-visual-words.html?s_tid=srchtitle_Bag%20of%20word_2)
根据matlab文档, 直方图为图像的特征向量。
而直方图长度对应于视觉单词visual word的数量(视觉单词的数量由bagOfFeatures对象构建)。
而每个visual word对应图中的多个grid(就像NLP的单词在中一篇文章出现过几次)
理论上来说, 确实可以做映射.
那么降维是否可以逆变换呢? PCA是可以的.
Bag of visual word类似于BoW模型,基本思想概括如下:
1)提取特征(Extract Features)
根据具体应用考虑,综合考虑特征的独特性、提取复杂性、效果好坏,处理是否方便等选择特征。
2)学习视觉词袋(Learn Visual Vocabulary)
统计图像数据库中出现的所有特征,去除冗余组成词袋。如果提取的图像特征过多,一般需要利用聚类算法先把相近的单词归为一类(类似于文档检索里的找词根),利用这些聚类结果来组成词袋。
3)利用视觉词袋量化图像特征(Quantize features using visual vocabulary)
4)利用词频表示图像(Represent images by frequencies of visual words)
参考文献:
[1] Csurka, G., C. R. Dance, L. Fan, J. Willamowski, and C. Bray. Visual Categorization with Bags of Keypoints. Workshop on Statistical Learning in Computer Vision. ECCV 1 (1–22), 1–2.
Matlab文档
https://ww2.mathworks.cn/help/vision/ug/image-classification-with-bag-of-visual-words.html?s_tid=srchtitle_Bag%20of%20word_2
使用视觉词袋进行图像分类
通过创建一个视觉词袋,使用CV的工具包用于图像类别分类。该过程生成代表图像的视觉词出现的直方图。这些直方图用于训练图像类别分类器。以下步骤介绍了如何设置图像,创建视觉词袋,然后训练并应用图像类别分类器。
第1步:设置图像类别集
组织图像, 并划分为训练集测试集。为了训练图像分类器, 使用imageageataStore函数存储图像。将图像组织成类别, 从而更容易处理大量图像。可以使用SpliteachLabel函数将图像拆分为训练和测试数据。
读取类别图像并创建图像集:
setDir = fullfile(toolboxdir('vision'),'visiondata','imageSets'); imds = imageDatastore(setDir,'IncludeSubfolders',true,'LabelSource',... 'foldernames'); |
将集合分成训练和测试图像子集。在此示例中,划分30%的图像用于训练, 剩余的则测试
[trainingSet,testSet] = splitEachLabel(imds,0.3,'randomize'); |
第2步:创建特征袋
创建视觉词汇表(visual vocabulary)或特征袋(bag of features), 通过从每个类别的代表性图像中提取特征描述符(feature descriptors)。
bagOfFeatores对象定义特征或视觉单词: 在(训练集提取的)特征描述符上使用K-means聚类(统计信息和机器学习工具箱)算法。
该算法迭代地将描述符分为K个互斥簇。产生的簇是紧凑的(compact),通过类似的特性(similar characteristics)分离。每个簇中心代表一个特征或视觉字。
可以基于特征检测器(feature detector)提取特征,或者定义网格(grid)以提取特征描述符。网格方法可能会失去细粒度的(fine-grained scale)尺度信息。因此,对于不包含不同特征(distinct features)的图像使用网格,例如包含景象的图像,如海滩。使用加速鲁棒特征(或SURF)检测器提供更大的范围的不变性(invariance)。默认情况下,该算法运行“网格”方法。
该算法的工作流将图像作为整体(entirety)分析。图像必须有合适label, 描述它们所代表的类别。例如,一组汽车图像的label为cars。工作流程不依赖于空间(spatial)信息,也不依赖于对图像中的特定对象标记。bag-of-visual-words技术依赖于无定位(localization)的检测.
第3步:用视觉词袋训练图像分类器
TrainimageCategoryClassifier函数返回图像分类器。
该函数训练一个多分类器, 通过纠错输出码(ECOC)+SVM二分类器. TrainimageCategoryClassfier函数使用(从bagOfFeatures对象得到的)视觉词袋,对图像编码得到视觉单词的直方图(histogram of visual words.)。然后使用视觉词的直方图作为正负样本, 来训练分类器。
1.使用bagOfFeatures编码方法从训练集中编码每个图像。
该函数对图像检测和提取特征,
然后使用近似最近邻算法来构建每个图像的特征直方图。
然后,该函数基于特定簇中心的描述符接近度递增直方图(increments histogram bins)。
直方图长度对应于视觉单词的数量(视觉单词的数量由bagOfFeatures对象构建)。
直方图为图像的特征向量。
2.对训练集中的每个图像重复步骤1以创建训练数据。
3. 评估分类器的效果。
使用imageCategoryClassifier的评估方法, 在图像验证集测试分类器。输出混淆矩阵表示对预测的分析。分类结果全对则得到对角线上的归一化矩阵。不正确则分类结果得到分数值。
第4步:对图像或图像集分类
在新图像上使用ImageCategoryClassifier预测方法来确定其类别。