python - 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 模型中的特征,因此它可能只是一个简单的错误。如果我因为一些误解而完全错了,请告诉我。
解决方案
RandomForestClassifier
以及大多数传统的 ML 算法只能处理标量特征。因此,为了使用您的数据,您需要将其展平,例如
import numpy as np
np.flatten(features.values)
推荐阅读
- c++ - 在我的测试程序中,为什么 cv::resize 不能执行,而 cvtColor 可以?
- ruby-on-rails - 从 Active Storage 更改默认 URL
- php - 由于不活动,页面已过期。请刷新并在登录中重试
- ios - 在 Swift 中使用区域设置获取国家/地区代码(电话)
- java - 如何过滤 JSON 数组
- java - Elasticsearch MultiSearchRequestBuilder
- angularjs - AngularJS记录不会显示在列表页面中,直到页面没有刷新..?
- javascript - 阻止 Webpack 的默认加载器运行
- php - 连接到 PHP 中的 FTP 服务器时没有列出目录
- javascript - createReactClass 和 (React) 类中 this 的值