class SVM(Symbol):
    ratio = 0.8

    def __init__(self):
        self.model = LinearSVC()

    def load(self, fn):
        r = np.load(fn)
        classes_ = r['classes']
        coef_ = r['coef']
        intercept_ = r['intercept']
        self.model.__setattr__('classes_', classes_)
        self.model.__setattr__('coef_', coef_)
        self.model.__setattr__('intercept_', intercept_)

    def train(self, samples, responses):
        self.model.fit(samples, responses)

    def predict(self, samples):
        return self.model.predict(samples)

    def save(self, path):
        classes_ = self.model.classes_
        coef_ = self.model.coef_
        intercept_ = self.model.intercept_
        np.savez(path, classes=classes_, coef=coef_, intercept=intercept_)
Ejemplo n.º 2
0
class SymbolRecognition(object):
    def __init__(self):
        # init the cv2 hog class
        self.winSize = (64, 64)
        blockSize = (16, 16)
        blockStride = (8, 8)
        cellSize = (8, 8)
        nbins = 9
        self.hog = cv2.HOGDescriptor(self.winSize, blockSize, blockStride,
                                     cellSize, nbins)
        # init the sklearn linearSVC
        modelpath = 'model.npz'
        self.model = LinearSVC()
        self.load_model(modelpath)

    def load_model(self, path):
        r = np.load(path)
        classes_ = r['classes']
        coef_ = r['coef']
        intercept_ = r['intercept']
        self.model.__setattr__('classes_', classes_)
        self.model.__setattr__('coef_', coef_)
        self.model.__setattr__('intercept_', intercept_)

    def extract_hog(self, im):
        descriptor = self.hog.compute(im)
        if descriptor is None:
            return None
        return descriptor.ravel()

    def predict(self, im):
        im = cv2.resize(im, self.winSize, interpolation=cv2.INTER_CUBIC)
        feature = self.extract_hog(im)
        return self.model.predict(feature.reshape(1, -1))[0]