首页 > 解决方案 > Python、OpenCV:如何将通过 ORB 提取的特征用于分类模型?

问题描述

我有一组几千张图片(我从 40 张图片开始进行测试),我想构建一个分类器来判断图片中的对象。就像,这是我的狗的照片,我邻居狗的照片还是我兄弟狗的照片。我知道如何比较两张图片及其关键点,但我不确定是否使用在 ML 模型中提取的特征。

所以我开始使用 OpenCV 并使用 ORB 来检测 150 个关键点。据我了解,描述符具有来自每个关键点的信息,并且是我将用作特征的内容。所以现在我为每张图像有 150 个特征,每个特征数组有 32 个。(150,32)。我想把它放到一个 RandomForestClassifer 中,但是当我这样做时,我得到了错误 >>>>

ValueError:使用序列设置数组元素。

这是一些代码:

狗是数据框

# Init ORB
orb = cv2.ORB_create(nfeatures=150)

# Extract descriptors and put them in df
with tqdm(total=len(list(dogs.iterrows()))) as pbar:
    for index, row in dogs.iterrows():
        pbar.update(1)
        im = dogs.at[index, 'filtered']
        kp1, des1 = orb.detectAndCompute(im,None)
        dogs.at[index, 'kp'] = kp1
        dogs.at[index, 'des'] = des1
os.system('spd-say "Processing complete"')

X = dogs['des']
y = dogs['Id']
features = pd.DataFrame.from_records(X)
features['Id'] = dogs['Id']

X = features.drop('Id',1)
y = features['Id']

查看第一张图片的第一个特征

X[1][1]

数组([ 0, 201, 130, 153, 84, 131, 172, 71, 22, 1, 90, 2, 168, 202, 32, 64, 121, 42, 34, 144, 82, 186, 65, 215 , 52, 38, 154, 64, 149, 10, 176, 136], dtype=uint8)

clf = RandomForestClassifier(n_jobs=-1)
clf.fit(X,y)

我从未将数组用作 ML 模型中的特征,因此它可能只是一个简单的错误。如果我因为一些误解而完全错了,请告诉我。

标签: pythonopencvmachine-learningdata-science

解决方案


RandomForestClassifier以及大多数传统的 ML 算法只能处理标量特征。因此,为了使用您的数据,您需要将其展平,例如 import numpy as np np.flatten(features.values)


推荐阅读