Python,OpenCV:如何将通过ORB提取的特征用于分类模型



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

所以我开始使用OpenCV,并使用ORB来检测150个关键点。据我所知,描述符包含每个关键点的信息,我将使用它作为特征。所以现在我对每个图像都有150个特征,每个特征阵列有32个。(150,32(。我想把它放入RandomForest分类器,但当我这样做时,我会得到错误>>>>

ValueError:设置具有序列的数组元素。

以下是一些代码:

dogs是数据帧

# 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]

阵列([02012130153183117271,22,1,90,2168,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模型中的特性进行过处理,所以这可能只是一个简单的错误。如果我因为误解而完全错了,请告诉我。

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

最新更新