def __call__(self, classifier, k=0, protectRare=True, rareThreshold=3): editedClassifier = _copyClassifier(classifier, k) toBeRemoved = set() progress = ProgressFactory("Generating edited MNN classifier...", len(classifier.get_glyphs())) # classify each glyph with its leave-one-out classifier for i, glyph in enumerate(classifier.get_glyphs()): editedClassifier.get_glyphs().remove(glyph) detectedClass = _getMainId(\ editedClassifier.guess_glyph_automatic(glyph)) # check if recognized class complies with the true class if glyph.get_main_id() != detectedClass: toBeRemoved.add(glyph) editedClassifier.get_glyphs().add(glyph) progress.step() rareClasses = self._getRareClasses(classifier.get_glyphs(), protectRare, rareThreshold) # remove 'bad' glyphs, if they are not in a rare class for glyph in toBeRemoved: if glyph.get_main_id() in rareClasses: continue editedClassifier.get_glyphs().remove(glyph) progress.kill() return editedClassifier
def __call__(self, classifier, k = 0, protectRare = True, rareThreshold = 3): editedClassifier = _copyClassifier(classifier, k) toBeRemoved = set() progress = ProgressFactory("Generating edited MNN classifier...", len(classifier.get_glyphs())) # classify each glyph with its leave-one-out classifier for i, glyph in enumerate(classifier.get_glyphs()): editedClassifier.get_glyphs().remove(glyph) detectedClass = _getMainId(\ editedClassifier.guess_glyph_automatic(glyph)) # check if recognized class complies with the true class if glyph.get_main_id() != detectedClass: toBeRemoved.add(glyph) editedClassifier.get_glyphs().add(glyph) progress.step() rareClasses = self._getRareClasses(classifier.get_glyphs(), protectRare, rareThreshold) # remove 'bad' glyphs, if they are not in a rare class for glyph in toBeRemoved: if glyph.get_main_id() in rareClasses: continue editedClassifier.get_glyphs().remove(glyph) progress.kill() return editedClassifier
def __call__(self, classifier, k=0, randomize=True): # special case of empty classifier if (not classifier.get_glyphs()): return _copyClassifier(classifier) if k == 0: k = classifier.num_k progress = ProgressFactory("Generating edited CNN classifier...", len(classifier.get_glyphs())) # initialize Store (a) with a single element if randomize: elem = _randomSetElement(classifier.get_glyphs()) else: elem = classifier.get_glyphs().__iter__().next() aGlyphs = [elem] a = kNNInteractive(aGlyphs, classifier.features, classifier._perform_splits, k) progress.step() # initialize Grabbag (b) with all other b = classifier.get_glyphs().copy() b.remove(aGlyphs[0]) # Classify each glyph in b with a as the classifier # If glyph is misclassified, add it to a, repeat until no elements are # added to a changed = True while changed == True: changed = False # copy needed because iteration through dict is not possible while # deleting items from it copyOfB = b.copy() for glyph in copyOfB: if glyph.get_main_id() != _getMainId( a.guess_glyph_automatic(glyph)): b.remove(glyph) a.get_glyphs().add(glyph) progress.step() changed = True progress.kill() a.num_k = 1 return a
def __call__(self, classifier, k = 0, randomize = True): # special case of empty classifier if (not classifier.get_glyphs()): return _copyClassifier(classifier) if k == 0: k = classifier.num_k progress = ProgressFactory("Generating edited CNN classifier...", len(classifier.get_glyphs())) # initialize Store (a) with a single element if randomize: elem = _randomSetElement(classifier.get_glyphs()) else: elem = classifier.get_glyphs().__iter__().next() aGlyphs = [elem] a = kNNInteractive(aGlyphs, classifier.features, classifier._perform_splits, k) progress.step() # initialize Grabbag (b) with all other b = classifier.get_glyphs().copy() b.remove(aGlyphs[0]); # Classify each glyph in b with a as the classifier # If glyph is misclassified, add it to a, repeat until no elements are # added to a changed = True while changed == True: changed = False # copy needed because iteration through dict is not possible while # deleting items from it copyOfB = b.copy() for glyph in copyOfB: if glyph.get_main_id() != _getMainId(a.guess_glyph_automatic(glyph)): b.remove(glyph) a.get_glyphs().add(glyph) progress.step() changed = True progress.kill() a.num_k = 1 return a