本人菜鸟一枚,参照matlab帮助文件,写了第一篇博客,欢迎拍砖!
一、建立图像分类集
收集图像并把他们分成训练子集和测试子集,在matlab中,用imageDatastor()函数存储图像用于图像分类,以类别的形式组织图像使完成大量图像分类更容易些,你可以用splitEachLabel()函数把收集的图像分类成训练数据和测试数据。例如:
setDir = fullfile(toolboxdir('vision'),'visiondata','imageSets');
imds = imageDatastore(setDir,'IncludeSubfolders',true,'LabelSource',... 'foldernames');
把这些图像分成训练集和测试集,比如把30%的图像分成训练集,而剩余的分成测试集。
[trainingSet,testSet] = splitEachLabel(imds,0.3,'randomize');
二、建立特征包(bag of feature)
从每个图像类的典型图像中提取特征描述子,用以创建视觉词汇或特征包,bagOfFeature()通过在从训练集中提取的特征描述子上使用使用k-means聚类算法,定义特征和视觉词汇。该算法迭代地将描述子分组到k互斥簇中。由此产生的聚类是紧凑的,并以相似的特性分离。每个集群中心代表一个特性,或一个可视的单词。
你可以基于特征描述子提取特征,或者可以定义一个grid提取特征描述子,grid方法可能会丢失图像的细致纹理信息。因此,对不包含明显特征的图像使用grid,比如包含像海滩一类的风景图像。SURF检测子的使用提供了更大的尺度不变性。默认情况下,该算法运行“grid”方法。
这个算法流程对图像进行了整体分析,图像必须有合适的标签来描述它们所代表的类。例如,一组汽车图像可以标记为汽车。流程不依赖于空间信息,也不依赖于在图像中标记特定对象。视觉词汇技术依赖于非局部检测。
三、用视觉词汇训练图像分类器
trainImageCategoryClassifier
()函数返回一个图像分类器,这个函数使用带有SVM分类器的ECOC框架训练一个多类分类器。该函数使用bagOfFeatures
()返回的视觉词汇包,将图像集中的图像编码成视觉词的直方图。然后用视觉词汇的直方图作为正负样本来训练分类器。
1.使用bagOfFeatures()编码方法对训练集中的每幅图像进行编码,该函数从图像中检测并提取特征,然后近似的最邻近算法对每幅图像构建一个特征直方图,接下来,该函数根据描述子靠近特定的聚类中心的距离增加直方图。直方图长度对应的是bagOfFeatures()所构造的视觉词的数量。这样,直方图成为了图像的特征向量。 2. 对训练集中的每幅图像重复步骤1,进行创建训练数据。
3.分类器评价,使用imageCategoryClassifier
() evaluate
方法在测试集上检测分类器,一个完美的分类结果是在对角线上包含1的规则化矩阵。不正确的分类结果是分数值。
四、图像或图像集分类
在一副新图像上使用imageCategoryClassifier
()predict
方法,确定它的类别。
References
[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.
Related Topics