基于ORB功能的k均值聚类

时间:2019-12-28 21:26:06

标签: opencv scikit-learn k-means orb

我必须基于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吗?

1 个答案:

答案 0 :(得分:1)

不得将关键点添加到分类器。分类将仅基于描述符进行,因此只需向分类器输入描述符作为输入特征即可。