ORB 特征的 k 均值聚类
k-means clustering on ORB features
我必须基于 ORB 特征的 k 均值聚类进行图像分类。如果我从文档中理解正确的话,一个特性本质上是一个关键点和一个描述符。当我执行 kmeans.fit() 时,我不确定我应该把什么作为 X:在示例 here 中它说 X_digits 是 Bunch 对象的一个 numpy 数组,所以我是假设我应该将关键点和相应的描述符组合在一起,并将其用作 kmeans.fit(x) 中的 X。
这是代码:
@dataclass
class BOVWFeaturizer(ImgFeaturizerABC):
number_of_features_per_image: int = 100
vocabulary_size: int = 8
def fit(self, images: np.ndarray, labels=None):
orb = cv.ORB_create(self.number_of_features_per_image)
keypoints_orb = orb.detect(images, None)
keypoints_orb, descriptors = orb.compute(images, keypoints_orb)
kmeans = cluster.KMeans(n_clusters=2, random_state=0)
"""
features = ## something that groups keypoints and descriptor
"""
kmeans.fit(features, labels)
return self
我之前没有机器学习或计算机视觉方面的知识,如果这是一个非常基础的问题,我很抱歉
编辑:
这是我尝试过的:
features = [[kp, desc] for kp, desc in zip(keypoints_orb, descriptors)]
features = [(kp, desc) for kp, desc in zip(keypoints_orb, descriptors)]
在这两种情况下,输出都是:
TypeError: float() argument must be a string or a number, not 'cv2.KeyPoint'
我试过将它转换为 ndarray:
features = np.ndarray([(kp, desc) for kp, desc in zip(keypoints_orb, descriptors)])
输出:
ValueError: maximum supported dimension for an ndarray is 32, found 100
我是否应该将两个值(关键点和描述符)压缩到一维 ndarray 中?
您不得向分类器添加关键点。分类将仅基于描述符进行,因此只需将描述符作为输入特征提供给分类器。
我必须基于 ORB 特征的 k 均值聚类进行图像分类。如果我从文档中理解正确的话,一个特性本质上是一个关键点和一个描述符。当我执行 kmeans.fit() 时,我不确定我应该把什么作为 X:在示例 here 中它说 X_digits 是 Bunch 对象的一个 numpy 数组,所以我是假设我应该将关键点和相应的描述符组合在一起,并将其用作 kmeans.fit(x) 中的 X。 这是代码:
@dataclass
class BOVWFeaturizer(ImgFeaturizerABC):
number_of_features_per_image: int = 100
vocabulary_size: int = 8
def fit(self, images: np.ndarray, labels=None):
orb = cv.ORB_create(self.number_of_features_per_image)
keypoints_orb = orb.detect(images, None)
keypoints_orb, descriptors = orb.compute(images, keypoints_orb)
kmeans = cluster.KMeans(n_clusters=2, random_state=0)
"""
features = ## something that groups keypoints and descriptor
"""
kmeans.fit(features, labels)
return self
我之前没有机器学习或计算机视觉方面的知识,如果这是一个非常基础的问题,我很抱歉
编辑: 这是我尝试过的:
features = [[kp, desc] for kp, desc in zip(keypoints_orb, descriptors)]
features = [(kp, desc) for kp, desc in zip(keypoints_orb, descriptors)]
在这两种情况下,输出都是:
TypeError: float() argument must be a string or a number, not 'cv2.KeyPoint'
我试过将它转换为 ndarray:
features = np.ndarray([(kp, desc) for kp, desc in zip(keypoints_orb, descriptors)])
输出:
ValueError: maximum supported dimension for an ndarray is 32, found 100
我是否应该将两个值(关键点和描述符)压缩到一维 ndarray 中?
您不得向分类器添加关键点。分类将仅基于描述符进行,因此只需将描述符作为输入特征提供给分类器。