教程:使用Mahotas进行分类

下面是一个使用mahotas和 scikit-learn 用于图像分类(但大部分代码可以很容易地改编为使用另一个机器学习包)。我假设有三个重要的目录: positives/negatives/ 包含手动标记的示例,其余数据位于 unlabeled/ 目录。

以下是简单的算法:

  1. 计算正片和负片中所有图像的特征

  2. 学习量词

  3. 对未标记的图像使用该分类器

在下面的代码中,我使用了 jug 为您提供在多个处理器上运行它的可能性,但如果您删除提到的每一行,代码也可以运行 TaskGenerator

我们从一系列进口产品开始::

from glob import glob
import mahotas
import mahotas.features
from jug import TaskGenerator

现在,我们定义一个计算特征的函数。一般而言,纹理特征速度非常快,并提供非常好的结果:

@TaskGenerator
def features_for(imname):
    img = mahotas.imread(imname)
    return mahotas.features.haralick(img).mean(0)

mahotas.features.haralick 在4个方向上返回要素。我们只是取平均数(有时你用利差 ptp() 也是如此)。

下面是学习和应用分类器的两个函数。这些只是 scikit-learn 功能::

@TaskGenerator
def learn_model(features, labels):
    from sklearn.ensemble import RandomForestClassifier
    clf = RandomForestClassifier()
    clf.fit(features, labels)
    return clf

@TaskGenerator
def classify(model, features):
     return model.predict(features)

我们假设我们有三个预先准备好的目录,其中包含jpeg格式的图像。此位必须适应您自己的设置::

positives = glob('positives/*.jpg')
negatives = glob('negatives/*.jpg')
unlabeled = glob('unlabeled/*.jpg')

最后,进行了实际计算。获取所有培训数据的特征并学习模型:

features = map(features_for, negatives + positives)
labels = [0] * len(negatives) + [1] * len(positives)

model = learn_model(features, labels)

labeled = [classify(model, features_for(u)) for u in unlabeled]

这使用纹理功能,这可能已经足够好了,但您可以使用 mahotas.features 如果您愿意(或尝试 mahotas.surf ,但这会变得更加复杂)。

(这是由 a question on Stackoverflow )。