我在使用图像数据进行机器学习训练,并使用SIFT算法,但我的数据存在一些问题,其中一些图像的描述符为0。因此,当我完成训练和测试后,结果仅达到56%(显然,这不是我期望的结果)。为了解决这个问题,我决定删除那些描述符为0的图像。然而,我只能从包含图像描述符的images_descriptor数组中删除。我的问题在于,我不知道应该删除哪些图像,以便能够删除它们的’target’。
我的数据形状为: (15000, 64, 64, 3)
到目前为止,我的代码如下:
X = data['data']y = data['targets']#从X(即你的图像数据)中提取SIFT特征images_descriptor = extract_sift_feature(X)index_list = []filter_images_descriptor = []for i in range(len(images_descriptor)): if images_descriptor[i] is not None: filter_images_descriptor.append(images_descriptor[i]) if images_descriptor[i] is None: index = np.where(images_descriptor == images_descriptor[i]) index_list.append(index[0]) filter_images_descriptor = np.array(filter_images_descriptor)
我试图创建一个索引来从images_descriptor中获取索引,以便我能知道哪些图像的描述符为0,方法是使用np.where
。然后我可以从images_descriptor
中删除相应的图像,并在y
中删除它们。但我得到的结果是: (array([], dtype=int64)
。
回答:
针对数据中某些图像不包含特征的问题,我提供了一个解决方案,即删除任何不包含特征的数据
def extract_sift_feature(X, y): images_descriptor = [] filter_images_descriptor = [] NoneType_index_list = [] sift = cv2.SIFT_create() for i in range(len(X)): _kp, des = sift.detectAndCompute(X[i], None) images_descriptor.append(des) #检查是否有图像的特征描述符为0 if des is None: NoneType_index_list.append(i) images_descriptor = np.array(images_descriptor) #过滤掉特征描述符为0的图像 for i in range(len(images_descriptor)): if images_descriptor[i] is not None: filter_images_descriptor.append(images_descriptor[i]) filter_images_descriptor = np.array(filter_images_descriptor) new_y = np.delete(y, NoneType_index_list) return filter_images_descriptor, new_y