SVM图片归类

    xiaoxiao2022-07-05  175

    原先用了网上随手找的一段代码,gamma值设置不正确,出来的模型效果差。同事给了一段用过的带GridSearchCV参数自动搜寻,一下就ok。

    训练代码:

    #!/usr/bin/python #!--*-- coding:utf-8 --*-- import sys import cv2 import glob import time import numpy as np from skimage import feature as ft from sklearn import model_selection, preprocessing from sklearn.decomposition import IncrementalPCA from sklearn.externals import joblib from sklearn.svm import LinearSVC, SVC from sklearn.externals import joblib posjpgs = glob.glob('./pos/*.jpg') negjpgs = glob.glob('./neg/*.jpg') def hogfea(jpgfile):     img = cv2.imread(jpgfile, cv2.IMREAD_COLOR)     img = cv2.resize(img, (128, 128))     img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)     feature = ft.hog(img,  # input image                       orientations=9,  # number of bins                       pixels_per_cell=(20,20), # pixel per cell                       cells_per_block=(2,2), # cells per blcok                       block_norm = 'L2-Hys', #  block norm : str {‘L1’, ‘L1-sqrt’, ‘L2’, ‘L2-Hys’}, optional                       transform_sqrt = True, # power law compression (also known as gamma correction)                       feature_vector=True, # flatten the final vectors                       visualise=False) # return HOG map     return feature def train(features, labels):     # train test set split     X_train, X_test, Y_train, Y_test = model_selection.train_test_split(features, labels, test_size=0.2, random_state=2)     # RBF kernal: exhausted search for C and gamma, cross-validation data generation & svm training     time_start = time.time()     C_range = np.logspace(-6, 6, 3)     gamma_range = np.logspace(-3, 3, 3)     param_grid = dict(gamma=gamma_range, C=C_range)     clf = model_selection.GridSearchCV(SVC(kernel='rbf'), param_grid=param_grid,n_jobs=9)     clf.fit(X_train, Y_train)     print("    SVM success: The best parameters are %s with a score of %0.2f | costtime: %0.2fs"           % (clf.best_params_, clf.best_score_, time.time() - time_start))     return clf.best_estimator_, X_test, Y_test x_train = [] y_train = [] for jpgfile in posjpgs:     print 'pos ', jpgfile     x_train.append(hogfea(jpgfile))     y_train.append(1) for jpgfile in negjpgs:     print 'neg ', jpgfile     x_train.append(hogfea(jpgfile))     y_train.append(0) clf, X_test, Y_test = train(np.array(x_train), np.array(y_train).ravel()) joblib.dump(clf, "model.clf") s = clf.score(X_test, Y_test) print '    ** Tset ** score = {}'.format(s)

    预测代码:

    #!/usr/bin/python #!--*-- coding:utf-8 --*-- import sys import cv2 import numpy as np from skimage import feature as ft from sklearn import svm from sklearn.externals import joblib clf = joblib.load('model.clf') def hogfea(jpgfile): img = cv2.imread(jpgfile, cv2.IMREAD_COLOR) img = cv2.resize(img, (128, 128)) img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) feature = ft.hog(img, # input image orientations=9, # number of bins pixels_per_cell=(20,20), # pixel per cell cells_per_block=(2,2), # cells per blcok block_norm = 'L2-Hys', # block norm : str {‘L1’, ‘L1-sqrt’, ‘L2’, ‘L2-Hys’}, optional transform_sqrt = True, # power law compression (also known as gamma correction) feature_vector=True, # flatten the final vectors visualise=False) # return HOG map return feature fea = hogfea(sys.argv[1]) fea = np.reshape(fea, (1, fea.shape[0])) print fea, clf.decision_function(fea)[0]

     

    最新回复(0)