2015-08-27 144 views
0

我正在爲我的圖像處理項目構建SVM線性機器,我正在提取正面和負面樣品的功能並將其保存到目錄中。然後我用這些功能訓練SVM,但是我收到了一個我無法調試的錯誤。 下面是我train-classifier.py文件訓練分類 -無法訓練線性SVM機器

from skimage.feature import local_binary_pattern 
from sklearn.svm import LinearSVC 
from sklearn.linear_model import LogisticRegression 
from sklearn.externals import joblib 
import argparse as ap 
import glob 
import os 
from config import * 

if __name__ == "__main__": 
    # Parse the command line arguments 
    parser = ap.ArgumentParser() 
    parser.add_argument('-p', "--posfeat", help="Path to the positive features directory", required=True) 
    parser.add_argument('-n', "--negfeat", help="Path to the negative features directory", required=True) 
    parser.add_argument('-c', "--classifier", help="Classifier to be used", default="LIN_SVM") 
    args = vars(parser.parse_args()) 

    pos_feat_path = args["posfeat"] 
    neg_feat_path = args["negfeat"] 

    # Classifiers supported 
    clf_type = args['classifier'] 

    fds = [] 
    labels = [] 
    # Load the positive features 
    for feat_path in glob.glob(os.path.join(pos_feat_path,"*.feat")): 
     fd = joblib.load(feat_path) 
     fds.append(fd) 
     labels.append(1) 

    # Load the negative features 
    for feat_path in glob.glob(os.path.join(neg_feat_path,"*.feat")): 
     fd = joblib.load(feat_path) 
     fds.append(fd) 
     labels.append(0) 

    if clf_type is "LIN_SVM": 
     clf = LinearSVC() 
     print "Training a Linear SVM Classifier" 
     clf.fit(fds, labels) 
     # If feature directories don't exist, create them 
     if not os.path.isdir(os.path.split(model_path)[0]): 
      os.makedirs(os.path.split(model_path)[0]) 
     joblib.dump(clf, model_path) 
     print "Classifier saved to {}".format(model_path) 

我得到一個錯誤在該行clf.fit(FDS,標籤)以下是它說 -

Calculating the descriptors for the positive samples and saving them 
Positive features saved in ../data/features/pos 
Calculating the descriptors for the negative samples and saving them 
Negative features saved in ../data/features/neg 
Completed calculating features from training images 
Training a Linear SVM Classifier 
Traceback (most recent call last): 
    File "../object-detector/train-classifier.py", line 42, in <module> 
    clf.fit(fds, labels) 
    File "/usr/local/lib/python2.7/dist-packages/sklearn/svm/classes.py", line 200, in fit 
    dtype=np.float64, order="C") 
    File "/usr/local/lib/python2.7/dist-packages/sklearn/utils/validation.py", line 444, in check_X_y 
    ensure_min_features) 
    File "/usr/local/lib/python2.7/dist-packages/sklearn/utils/validation.py", line 344, in check_array 
    array = np.array(array, dtype=dtype, order=order, copy=copy) 
ValueError: setting an array element with a sequence. 
Traceback (most recent call last): 
    File "../object-detector/test-classifier.py", line 68, in <module> 
    fd = hog(im_window, orientations, pixels_per_cell, cells_per_block, visualize, normalize) 
    File "/usr/lib/python2.7/dist-packages/skimage/feature/_hog.py", line 63, in hog 
    raise ValueError("Currently only supports grey-level images") 
ValueError: Currently only supports grey-level images 

回答

0

您可以使用SVM類的OpenCV而不是scikit的。它很容易使用。

import cv2 

# prepare your test and train datasets 

svm = cv2.SVM() 
svm.train(some_train_data, responses, params) 

exp = svm.predict(some_test_data) 

欲瞭解更多信息,請OpenCV docs

1

我假定代碼來自https://github.com/bikz05/object-detector。您需要確保訓練樣本(pos和neg)具有相同的大小(widthxheight)並且是灰色圖像。你的測試圖像也應該是灰色的。

我使用ImageMagick的convert命令此:

轉換sample.png調整大小100x40 -colorspace灰色sample.png

更新(使用Python轉換爲灰度圖像和調整):

import cv2 

img = cv2.imread('color_image.jpg',0) 
im = cv2.resize(img, (100,40), interpolation=cv2.INTER_CUBIC) 
cv2.imwrite("gray_image.jpg", im) 
+0

你會如何在Python中轉換爲灰度? – rayryeng

+0

你可以使用:img = cv2.cvtColor(img,cv2.COLOR_RGB2GRAY) – susukacang

+0

我已經知道了。更新你的帖子。 – rayryeng