Blame view

mmodel/svm/SVM.py 7.51 KB
c7fa1d60   Chunk   refractoration st...
1
2
3
4
5
6
7
'''
SVM Model.

@author: chunk
chunkplus@gmail.com
2014 Dec
'''
e3e7e73a   Chunk   spider standalone...
8
import os, sys
2bf33465   Chunk   staged.
9
10
11
from ...mfeat import *
from ...mmodel import *
from ...mmodel.svm.svmutil import *
e3e7e73a   Chunk   spider standalone...
12
from ...mspark import SC2
2bf33465   Chunk   staged.
13
from ...common import *
c7fa1d60   Chunk   refractoration st...
14

c7fa1d60   Chunk   refractoration st...
15
import numpy as np
84648488   Chunk   reverted.
16
17
import csv
import json
c7fa1d60   Chunk   refractoration st...
18
import pickle
84648488   Chunk   reverted.
19
import cv2
c7fa1d60   Chunk   refractoration st...
20
21
from sklearn import svm

e3e7e73a   Chunk   spider standalone...
22
package_dir = os.path.dirname(os.path.abspath(__file__))
84648488   Chunk   reverted.
23

c7fa1d60   Chunk   refractoration st...
24
25
26
27
28
29
30
dict_Train = {}
dict_databuf = {}
dict_tagbuf = {}
dict_featbuf = {}


class ModelSVM(ModelBase):
02528074   Chunk   staged.
31
    def __init__(self, toolset='sklearn', sc=None):
c7fa1d60   Chunk   refractoration st...
32
        ModelBase.__init__(self)
f20e20ce   Chunk   staged.
33
        self.toolset = toolset
02528074   Chunk   staged.
34
        self.sparker = sc
c7fa1d60   Chunk   refractoration st...
35

84648488   Chunk   reverted.
36

10b4f63f   Chunk   staged. Before Pa...
37
    def _train_libsvm(self, X, Y):
5ec38adb   Chunk   spark-local of da...
38
        X, Y = list(X), list(Y)
d0be60e7   Chunk   jpeg update.
39
        # X, Y = [float(i) for i in X], [float(i) for i in Y]
a9c10957   Chunk   hbase-svm & spark...
40
        prob = svm_problem(Y, X)
10b4f63f   Chunk   staged. Before Pa...
41
42
        param = svm_parameter('-t 0 -c 4 -b 1 -h 0')
        # param = svm_parameter(kernel_type=LINEAR, C=10)
a9c10957   Chunk   hbase-svm & spark...
43
        m = svm_train(prob, param)
e3e7e73a   Chunk   spider standalone...
44
        svm_save_model(os.path.join(package_dir, '../..', 'res/svm_libsvm.model'), m)
a9c10957   Chunk   hbase-svm & spark...
45
46
47
48
49

        self.model = m

        return m

f20e20ce   Chunk   staged.
50
    def _predict_libsvm(self, feat, model=None):
a9c10957   Chunk   hbase-svm & spark...
51
52
53
54
        if model is None:
            if self.model != None:
                model = self.model
            else:
1c2a3fa0   Chunk   staged.
55
                print 'loading model ...'
e3e7e73a   Chunk   spider standalone...
56
                model = svm_load_model(os.path.join(package_dir, '../..', 'res/svm_libsvm.model'))
a9c10957   Chunk   hbase-svm & spark...
57

5ec38adb   Chunk   spark-local of da...
58
59
60
        feat = [list(feat)]
        # print len(feat),[0] * len(feat)
        label, _, _ = svm_predict([0] * len(feat), feat, model)
a9c10957   Chunk   hbase-svm & spark...
61
62
        return label

84648488   Chunk   reverted.
63

f20e20ce   Chunk   staged.
64
    def _test_libsvm(self, X, Y, model=None):
a9c10957   Chunk   hbase-svm & spark...
65
66
67
68
        if model is None:
            if self.model != None:
                model = self.model
            else:
1c2a3fa0   Chunk   staged.
69
                print 'loading model ...'
e3e7e73a   Chunk   spider standalone...
70
                model = svm_load_model(os.path.join(package_dir, '../..', 'res/svm_libsvm.model'))
a9c10957   Chunk   hbase-svm & spark...
71

5ec38adb   Chunk   spark-local of da...
72
        X, Y = list(X), list(Y)
a9c10957   Chunk   hbase-svm & spark...
73
74
75
76
        p_labs, p_acc, p_vals = svm_predict(Y, X, model)
        # ACC, MSE, SCC = evaluations(Y, p_labs)

        return p_acc
c7fa1d60   Chunk   refractoration st...
77

1c2a3fa0   Chunk   staged.
78
79
    def _train_sklearn(self, X, Y):
        clf = svm.SVC(C=4, kernel='linear', shrinking=False, verbose=True)
9371f8fa   Chunk   SVM param engenee...
80
        clf.fit(X, Y)
e3e7e73a   Chunk   spider standalone...
81
        with open(os.path.join(package_dir, '../..', 'res/svm_sklearn.model'), 'wb') as modelfile:
9371f8fa   Chunk   SVM param engenee...
82
            model = pickle.dump(clf, modelfile)
c7fa1d60   Chunk   refractoration st...
83

9371f8fa   Chunk   SVM param engenee...
84
        self.model = clf
c7fa1d60   Chunk   refractoration st...
85

9371f8fa   Chunk   SVM param engenee...
86
        return clf
c7fa1d60   Chunk   refractoration st...
87

84648488   Chunk   reverted.
88

f20e20ce   Chunk   staged.
89
    def _predict_sklearn(self, feat, model=None):
be12257b   Chunk   data-feat-model f...
90
91
92
93
94
        """N.B. sklearn.svm.base.predict :
            Perform classification on samples in X.
                Parameters
                ----------
                X : {array-like, sparse matrix}, shape = [n_samples, n_features]
c7fa1d60   Chunk   refractoration st...
95

be12257b   Chunk   data-feat-model f...
96
97
98
99
100
101
102
103
104
                Returns
                -------
                y_pred : array, shape = [n_samples]
                    Class labels for samples in X.
        """
        if model is None:
            if self.model != None:
                model = self.model
            else:
1c2a3fa0   Chunk   staged.
105
                print 'loading model ...'
e3e7e73a   Chunk   spider standalone...
106
                with open(os.path.join(package_dir, '../..', 'res/svm_sklearn.model'), 'rb') as modelfile:
be12257b   Chunk   data-feat-model f...
107
                    model = pickle.load(modelfile)
c7fa1d60   Chunk   refractoration st...
108

be12257b   Chunk   data-feat-model f...
109
        return model.predict(feat)
c7fa1d60   Chunk   refractoration st...
110

9371f8fa   Chunk   SVM param engenee...
111
    def __test_sklearn(self, X, Y, model=None):
be12257b   Chunk   data-feat-model f...
112
113
114
115
        if model is None:
            if self.model != None:
                model = self.model
            else:
1c2a3fa0   Chunk   staged.
116
                print 'loading model ...'
e3e7e73a   Chunk   spider standalone...
117
                with open(os.path.join(package_dir, '../..', 'res/svm_sklearn.model'), 'rb') as modelfile:
be12257b   Chunk   data-feat-model f...
118
                    model = pickle.load(modelfile)
c7fa1d60   Chunk   refractoration st...
119

f20e20ce   Chunk   staged.
120
        result_Y = np.array(self._predict_sklearn(X, model))
c7fa1d60   Chunk   refractoration st...
121

13a594f1   Chunk   before 中期答辩~~~
122
123
124
125
126
127
128
129
130
131
132
        fp = 0
        tp = 0
        sum = np.sum(np.array(Y) == 1)
        positive, negative = np.sum(np.array(Y) == 1), np.sum(np.array(Y) == 0)
        print positive, negative
        for i in range(len(Y)):
            if Y[i] == 0 and result_Y[i] == 1:
                fp += 1
            elif Y[i] == 1 and result_Y[i] == 1:
                tp += 1
        return float(fp) / negative, float(tp) / positive, np.mean(Y == result_Y)
c7fa1d60   Chunk   refractoration st...
133

9371f8fa   Chunk   SVM param engenee...
134
    def _test_sklearn(self, X, Y, model=None):
1c2a3fa0   Chunk   staged.
135
        if model is None:
9371f8fa   Chunk   SVM param engenee...
136
137
138
139
            if self.model != None:
                model = self.model
            else:
                print 'loading model ...'
e3e7e73a   Chunk   spider standalone...
140
                with open(os.path.join(package_dir, '../..', 'res/svm_sklearn.model'), 'rb') as modelfile:
9371f8fa   Chunk   SVM param engenee...
141
                    model = pickle.load(modelfile)
1c2a3fa0   Chunk   staged.
142
143
144

        return model.score(X, Y)

84648488   Chunk   reverted.
145
146
147
148

    def _train_opencv(self, X, Y):
        svm_params = dict(kernel_type=cv2.SVM_LINEAR,
                          svm_type=cv2.SVM_C_SVC,
f4fb4381   Chunk   staged.
149
                          C=2.67, gamma=5.383)
84648488   Chunk   reverted.
150
151
152
153
154

        X, Y = np.array(X, dtype=np.float32), np.array(Y, dtype=np.float32)

        svm = cv2.SVM()
        svm.train(X, Y, params=svm_params)
e3e7e73a   Chunk   spider standalone...
155
        svm.save(os.path.join(package_dir, '../..', 'res/svm_opencv.model'))
84648488   Chunk   reverted.
156
157
158
159
160
161
162
163
164
165
166
167

        self.model = svm

        return svm


    def _predict_opencv(self, feat, model=None):
        if model is None:
            if self.model != None:
                model = self.model
            else:
                print 'loading model ...'
e3e7e73a   Chunk   spider standalone...
168
                with open(os.path.join(package_dir, '../..', 'res/svm_opencv.model'), 'rb') as modelfile:
84648488   Chunk   reverted.
169
170
171
172
173
174
175
176
177
178
179
180
                    model = pickle.load(modelfile)
        feat = np.array(feat, dtype=np.float32)

        return model.predict(feat)


    def _test_opencv(self, X, Y, model=None):
        if model is None:
            if self.model != None:
                model = self.model
            else:
                print 'loading model ...'
e3e7e73a   Chunk   spider standalone...
181
                with open(os.path.join(package_dir, '../..', 'res/svm_opencv.model'), 'rb') as modelfile:
84648488   Chunk   reverted.
182
183
184
185
                    model = pickle.load(modelfile)

        X, Y = np.array(X, dtype=np.float32), np.array(Y, dtype=np.float32)

f4fb4381   Chunk   staged.
186
        # result_Y = np.array([self._predict_cv(x, model) for x in X])
84648488   Chunk   reverted.
187
        result_Y = np.array(model.predict_all(X)).ravel()
f4fb4381   Chunk   staged.
188
189

        return np.mean(Y == result_Y)
84648488   Chunk   reverted.
190
191
192


    def _train_spark(self, X, Y=None):
02528074   Chunk   staged.
193
        if self.sparker == None:
f20e20ce   Chunk   staged.
194
            self.sparker = SC2.Sparker(host='HPC-server', appname='ImageCV', master='spark://HPC-server:7077')
e3e7e73a   Chunk   spider standalone...
195

f20e20ce   Chunk   staged.
196
197
        self.model = self.sparker.train_svm(X, Y)

02528074   Chunk   staged.
198
        return svm
f20e20ce   Chunk   staged.
199
200
201
202
203
204
205
206

    def _predict_spark(self, feat, model=None):
        return self.sparker.predict_svm(feat, model)

    def _test_spark(self, X, Y, model=None):
        return self.sparker.test_svm(X, Y, model)


84648488   Chunk   reverted.
207
    def train(self, X, Y=None):
02528074   Chunk   staged.
208

10b4f63f   Chunk   staged. Before Pa...
209
210
211
        if self.toolset == 'sklearn':
            return self._train_sklearn(X, Y)
        elif self.toolset == 'opencv':
84648488   Chunk   reverted.
212
213
            return self._train_opencv(X, Y)
        elif self.toolset == 'libsvm':
10b4f63f   Chunk   staged. Before Pa...
214
215
216
217
218
219
            return self._train_libsvm(X, Y)
        elif self.toolset == 'spark':
            return self._train_spark(X, Y)
        else:
            raise Exception("Unknown toolset!")

c7fa1d60   Chunk   refractoration st...
220
    def predict(self, feat, model=None):
be12257b   Chunk   data-feat-model f...
221

f20e20ce   Chunk   staged.
222
        if self.toolset == 'sklearn':
10b4f63f   Chunk   staged. Before Pa...
223
224
            return self._predict_sklearn(feat, model)
        elif self.toolset == 'opencv':
84648488   Chunk   reverted.
225
226
            return self._predict_opencv(feat, model)
        elif self.toolset == 'libsvm':
10b4f63f   Chunk   staged. Before Pa...
227
228
            return self._predict_libsvm(feat, model)
        elif self.toolset == 'spark':
02528074   Chunk   staged.
229
            return self._predict_spark(feat, model)
10b4f63f   Chunk   staged. Before Pa...
230
231
232
        else:
            raise Exception("Unknown toolset!")

f20e20ce   Chunk   staged.
233

84648488   Chunk   reverted.
234
    def test(self, X, Y=None, model=None):
02528074   Chunk   staged.
235

f20e20ce   Chunk   staged.
236
        if self.toolset == 'sklearn':
10b4f63f   Chunk   staged. Before Pa...
237
            return self.__test_sklearn(X, Y, model)
13a594f1   Chunk   before 中期答辩~~~
238
        elif self.toolset == 'opencv':
84648488   Chunk   reverted.
239
240
            return self._test_opencv(X, Y, model)
        elif self.toolset == 'libsvm':
10b4f63f   Chunk   staged. Before Pa...
241
242
            return self._test_libsvm(X, Y, model)
        elif self.toolset == 'spark':
02528074   Chunk   staged.
243
            return self._test_spark(X, Y, model)
10b4f63f   Chunk   staged. Before Pa...
244
245
        else:
            raise Exception("Unknown toolset!")
84648488   Chunk   reverted.