教程:使用Mahotas进行分类¶
下面是一个使用mahotas和 scikit-learn 用于图像分类(但大部分代码可以很容易地改编为使用另一个机器学习包)。我假设有三个重要的目录: positives/
和 negatives/
包含手动标记的示例,其余数据位于 unlabeled/
目录。
以下是简单的算法:
计算正片和负片中所有图像的特征
学习量词
对未标记的图像使用该分类器
在下面的代码中,我使用了 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 )。