【问题标题】:Large Scale Image Classifier大规模图像分类器
【发布时间】:2011-08-07 20:42:54
【问题描述】:

我有大量标有植物名称的植物图像。为了对未标记的照片进行分类,在此数据集上进行训练的最佳算法是什么?照片经过处理,100% 的像素包含植物(例如叶子或树皮的特写镜头),因此没有其他对象/空白空间/背景需要算法过滤掉。

我已经尝试为所有照片生成SIFT 特征并将这些(特征、标签)对输入到LibLinear SVM,但准确度只有可怜的 6%。

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

编辑:一些示例图片:

【问题讨论】:

  • @belisarius,是的,请看我的编辑。

标签: image-processing machine-learning classification


【解决方案1】:

通常,您不会直接使用 SIFT 功能进行训练。对它们进行聚类(使用 k-means),然后在聚类成员标识符的直方图上进行训练(即,一个 k 维向量,它计算在位置 i 处分配给 的特征的数量>i-th 簇)。

这样,您可以获得每个图像的单个输出(以及单个 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()

【讨论】:

  • 集群成员标识符直方图是什么意思?
  • 在选择 K 时是否有一般的经验法则?我打算从 K=100 开始。是不是太高了?
  • 不,有经验法则。一般没那么重要。 K=100 似乎没问题。
  • 谢谢,代码完美地阐明了它。此外,开发 Mahotas 也做得很好。我发现它是一个非常有用的图像处理库。
  • 更新了选择 K 时的经验法则,在 2013 年的一篇论文中,我们表明 K=4/n(n 是点数)是我们数据的一个很好的启发式方法: bioinformatics.oxfordjournals.org/content/29/18/2343.short
【解决方案2】:

这是一个相当困难的问题。

你可以试试BoW model

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

有关详细信息,请参阅上面的 Wikipedia 文章和其中的参考文献。

【讨论】:

  • 我相信这与 luispedro 提到的方法基本相同,尽管 BoW 术语更直观一些。
【解决方案3】:

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

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

【讨论】:

  • 您能解释一下您所说的“更好的对齐方式”是什么意思吗?形状上下文似乎更适用于具有明确定义几何形状的简单轮廓和图像(例如徽标/字母/数字)。不是我的图像中出现的那种嘈杂的形状混乱。然而,Leafsnap 项目很有趣,并且看起来与我正在尝试做的完全一样。不幸的是,他们的网站实际上并没有进行任何分类,也没有提及他们使用什么技术成功地对图像进行分类。
【解决方案4】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-12
    • 2020-12-10
    • 2022-11-26
    • 2020-06-30
    • 1970-01-01
    • 2011-10-03
    相关资源
    最近更新 更多