大规模图像分类器

时间:2011-04-18 12:39:31

标签: image-processing machine-learning classification

我有一大堆用植物学名称标记的植物图像。什么是用于训练此数据集以便对无标签照片进行分类的最佳算法?照片被处理,以便100%的像素包含植物(例如叶子或树皮的特写),因此没有其他对象/空白/背景,算法必须过滤掉。

我已经尝试为所有照片生成SIFT功能,并将这些(功能,标签)对提供给LibLinear SVM,但准确率却低了6%。

我也尝试将这些相同的数据提供给几个Weka分类器。准确性稍好一些(Logistic为25%,IBk为18%),但Weka不是为可扩展性而设计的(它将所有内容加载到内存中)。由于SIFT要素数据集是几百万行,我只能用随机3%切片测试Weka,因此它可能不具代表性。

编辑:一些示例图片:

Pachira aquatica Fagus grandifolia

4 个答案:

答案 0 :(得分:7)

通常情况下,您不会直接训练SIFT功能。对它们进行聚类(使用k-means),然后训练聚类成员标识符的直方图(即k维向量,在 i 位置计数,为分配了多少个要素> i -th cluster)。

这样,您可以获得每个图像的单个输出(以及单个k维特征向量)。

这是准代码(在Pythonn中使用mahotasmilk):

from mahotas.surf import surf
from milk.unsupervised.kmeans import kmeans,assign_centroids
import milk

# First load your data:
images = ...
labels = ...

local_features = [surfs(im, 6, 4, 2) for im in imgs]
allfeatures = np.concatenate(local_features)
_, centroids = kmeans(allfeatures, k=100)
histograms = []
for ls in local_features:
     hist = assign_centroids(ls, centroids, histogram=True)
     histograms.append(hist)

cmatrix, _ = milk.nfoldcrossvalidation(histograms, labels)
print "Accuracy:", (100*cmatrix.trace())/cmatrix.sum()

答案 1 :(得分:4)

这是一个相当难的问题。

您可以尝试BoW model

基本上,您在所有图像上提取SIFT特征,然后使用K-means将特征聚类为视觉词。之后,使用BoW向量训练分类器。

有关更多详细信息,请参阅上面的维基百科文章及其中的参考文献。

答案 2 :(得分:3)

您可能需要更好的对齐方式,而且可能不需要更多功能。除非你有通信,否则你无法获得可接受的表现。您需要知道一个叶子中的哪些点对应于另一个叶子上的点。这是计算机视觉中的“圣杯”问题之一。

人们使用shape context来解决这个问题。你应该看看this linkThis paper描述了leafsnap背后的基本系统。

答案 3 :(得分:1)

您可以根据此Bag-of-Features Descriptor on SIFT Features with OpenCV实施BoW模型。这是在OpenCV中实现BoW模型的一个非常好的教程。