【问题标题】:Python, OpenCV :How to use features extracted via ORB for a classification model?Python、OpenCV:如何将通过 ORB 提取的特征用于分类模型?
【发布时间】:2019-05-05 05:14:47
【问题描述】:

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

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

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]

array([ 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 模型中的特征,因此它可能只是一个简单的错误。如果我因为一些误解而完全错了,请告诉我。

【问题讨论】:

    标签: python opencv machine-learning data-science


    【解决方案1】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-10-13
      • 2011-11-06
      • 2012-09-17
      • 2018-04-21
      • 1970-01-01
      • 2013-11-27
      • 2019-09-19
      • 2018-01-30
      相关资源
      最近更新 更多