2016-07-13 96 views
0

我有一個利用OpenCV設置python的CBIR系統。我已經成功地提取了關鍵點和描述符,使用k-means對它們進行聚類以創建碼本,並生成了基於此碼本描述圖像的直方圖。我想知道如何使用這段代碼最後一行生成的直方圖來訓練SVM,或者如果我以錯誤的方式解決這個問題。如何初始化和訓練python中的rootSIFT特性的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) 

回答

0

看看sklearn.svm以及如何SVM分類工作here。 也許你可以按照Bag of Words的常用程序,這意味着對於每個圖像特徵(直方圖),您應該選擇字典的最近碼字(根據特徵距離/相似性的某種度量)。