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_)
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]