我有一个利用OpenCV在python中建立的CBIR系统。我已经成功地提取了关键点和描述符,使用 k 均值将它们聚类以创建密码本,并基于此密码本生成描述图像的直方图。我想知道如何使用在此代码的最后一行生成的这些直方图来训练 SVM,或者我是否以错误的方式执行此操作。
import argparse
import glob
import cv2
import numpy
import pickle
import base64
from scipy.cluster.vq import *
from cassandra.cluster import Cluster
def compute(imagePath, eps=1e-7)
sift = cv2.xfeatures2d.SIFT_create()
image = cv2.imread(imagePath, 0)
kp, des = sift.detectAndCompute(image, None)
if des is not None:
kp, des = sift.compute(image, kp)
if len(kp) == 0:
return ([], None)
des /= (des.sum(axis=1, keepdims=True) + eps)
des = numpy.sqrt(des)
des = whiten(des)
return kp, des
for imagePath in dataset :
kp,des = compute(imagePath)
codes, distortion = vq(des, codebook)
hist, bins = numpy.histogram(codes, K)
在这里看看sklearn.svm以及SVM分类的工作原理。也许您可以按照单词袋的通用程序进行操作,这意味着对于每个图像特征(直方图),您应该选择字典中最近的码字(根据特征距离/相似性的某种度量)。