我有一大堆用植物学名称标记的植物图像。什么是用于训练此数据集以便对无标签照片进行分类的最佳算法?照片被处理,以便100%的像素包含植物(例如叶子或树皮的特写),因此没有其他对象/空白/背景,算法必须过滤掉。
我已经尝试为所有照片生成SIFT功能,并将这些(功能,标签)对提供给LibLinear SVM,但准确率却低了6%。
我也尝试将这些相同的数据提供给几个Weka分类器。准确性稍好一些(Logistic为25%,IBk为18%),但Weka不是为可扩展性而设计的(它将所有内容加载到内存中)。由于SIFT要素数据集是几百万行,我只能用随机3%切片测试Weka,因此它可能不具代表性。
编辑:一些示例图片:
答案 0 :(得分:7)
通常情况下,您不会直接训练SIFT功能。对它们进行聚类(使用k-means),然后训练聚类成员标识符的直方图(即k维向量,在 i 位置计数,为分配了多少个要素> i -th cluster)。
这样,您可以获得每个图像的单个输出(以及单个k维特征向量)。
这是准代码(在Pythonn中使用mahotas和milk):
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 link。 This paper描述了leafsnap背后的基本系统。
答案 3 :(得分:1)
您可以根据此Bag-of-Features Descriptor on SIFT Features with OpenCV实施BoW模型。这是在OpenCV中实现BoW模型的一个非常好的教程。