def test_scheduling_limits(self): global best_score from kivy.clock import Clock gdb = Recognizer(db=[self.Ninvar]) tpls = len(self.Ninvar.templates) best_score = 0 gdb.db.append(self.Ninvar) r = gdb.recognize([Ncandidate], max_gpf=1) r.bind(on_complete=best_score_cb) self.assertEqual(r.progress, 0) Clock.tick() self.assertEqual(r.progress, 0.5) self.assertEqual(best_score, 0) Clock.tick() self.assertEqual(r.progress, 1) self.assertTrue(best_score > 0.94 and best_score < 0.95) best_score = 0 gdb.db.append(self.Ninvar) r = gdb.recognize([Ncandidate], max_gpf=1) r.bind(on_complete=best_score_cb) self.assertEqual(r.progress, 0) Clock.tick() self.assertEqual(r.progress, 1 / 3.) Clock.tick() self.assertEqual(r.progress, 2 / 3.) self.assertEqual(best_score, 0) Clock.tick() self.assertEqual(r.progress, 1) self.assertTrue(best_score > 0.94 and best_score < 0.95)
def test_protractor_bound(self): gdb = Recognizer(db=[self.Tbound, self.Nbound]) r = gdb.recognize([NGesture], orientation_sensitive=True, max_gpf=0) self.assertEqual(r.best['name'], 'N') self.assertTrue(r.best['score'] >= 0.99) r = gdb.recognize([NGesture], orientation_sensitive=False, max_gpf=0) self.assertEqual(r.best['name'], None) self.assertEqual(r.best['score'], 0) r = gdb.recognize([Ncandidate], orientation_sensitive=True, max_gpf=0) self.assertEqual(r.best['name'], 'N') self.assertTrue(r.best['score'] > 0.94 and r.best['score'] < 0.95)
def test_immediate(self): gdb = Recognizer(db=[self.Tinvar, self.Ninvar]) r = gdb.recognize([Ncandidate], max_gpf=0) self.assertEqual(r._match_ops, 4) self.assertEqual(r._completed, 2) self.assertEqual(r.progress, 1) self.assertTrue(r.best['score'] > 0.94 and r.best['score'] < 0.95)
def test_transfer(self): gdb1 = Recognizer(db=[self.Ninvar]) gdb2 = Recognizer() gdb1.transfer_gesture(gdb2, name='N') r = gdb2.recognize([Ncandidate], max_gpf=0) self.assertEqual(r.best['name'], 'N') self.assertTrue(r.best['score'] > 0.94 and r.best['score'] < 0.95)
def test_export_import_case_1(self): gdb1 = Recognizer(db=[self.Ninvar]) gdb2 = Recognizer() g = gdb1.export_gesture(name='N') gdb2.import_gesture(g) r = gdb2.recognize([Ncandidate], max_gpf=0) self.assertEqual(r.best['name'], 'N') self.assertTrue(r.best['score'] > 0.94 and r.best['score'] < 0.95)
def test_priority_sorting(self): gdb = Recognizer() gdb.add_gesture('N', [NGesture], priority=10) gdb.add_gesture('T', [TGesture], priority=5) r = gdb.recognize([Ncandidate], goodscore=0.01, max_gpf=0, force_priority_sort=True) self.assertEqual(r.best['name'], 'T') r = gdb.recognize([Ncandidate], goodscore=0.01, force_priority_sort=False, max_gpf=0) self.assertEqual(r.best['name'], 'N') r = gdb.recognize([Ncandidate], goodscore=0.01, max_gpf=0, priority=10) self.assertEqual(r.best['name'], 'T') r = gdb.recognize([Ncandidate], goodscore=0.01, max_gpf=0, priority=4) self.assertEqual(r.best['name'], None)
def test_parallel_recognize(self): global counter from kivy.clock import Clock counter = 0 gdb = Recognizer() for i in range(9): gdb.add_gesture('T', [TGesture], priority=50) gdb.add_gesture('N', [NGesture]) r1 = gdb.recognize([Ncandidate], max_gpf=1) r1.bind(on_complete=counter_cb) Clock.tick() # first run scheduled here; 9 left r2 = gdb.recognize([Ncandidate], max_gpf=1) r2.bind(on_complete=counter_cb) Clock.tick() # 8 left r3 = gdb.recognize([Ncandidate], max_gpf=1) r3.bind(on_complete=counter_cb) Clock.tick() # 7 left # run some immediate searches, should not interfere. for i in range(5): n = gdb.recognize([TGesture], max_gpf=0) self.assertEqual(n.best['name'], 'T') self.assertTrue(round(n.best['score'], 1) == 1.0) for i in range(6): Clock.tick() self.assertEqual(counter, 0) Clock.tick() self.assertEqual(counter, 1) Clock.tick() self.assertEqual(counter, 2) Clock.tick() self.assertEqual(counter, 3)
def test_timeout_case_1(self): global best_score from kivy.clock import Clock from time import sleep best_score = 0 gdb = Recognizer(db=[self.Tbound, self.Ninvar]) r = gdb.recognize([Ncandidate], max_gpf=1, timeout=0.4) Clock.tick() # matches Tbound in this tick self.assertEqual(best_score, 0) sleep(0.4) Clock.tick() # should match Ninv, but times out (got T) self.assertEqual(r.status, 'timeout') self.assertEqual(r.progress, .5) self.assertTrue(r.best['name'] == 'T') self.assertTrue(r.best['score'] < 0.5)
def test_scheduling(self): global best_score from kivy.clock import Clock gdb = Recognizer(db=[self.Tinvar, self.Ninvar]) r = gdb.recognize([Ncandidate], max_gpf=1) r.bind(on_complete=best_score_cb) # _recognize_tick is scheduled here; compares to Tinvar Clock.tick() self.assertEqual(r.progress, .5) self.assertEqual(best_score, .0) # Now complete the search operation Clock.tick() self.assertEqual(r.progress, 1) self.assertTrue(best_score > 0.94 and best_score < 0.95)
def test_export_import_case_2(self): from tempfile import mkstemp import os gdb1 = Recognizer(db=[self.Ninvar, self.Tinvar]) gdb2 = Recognizer() fh, fn = mkstemp() os.close(fh) g = gdb1.export_gesture(name='N', filename=fn) gdb2.import_gesture(filename=fn) os.unlink(fn) self.assertEqual(len(gdb1.db), 2) self.assertEqual(len(gdb2.db), 1) r = gdb2.recognize([Ncandidate], max_gpf=0) self.assertEqual(r.best['name'], 'N') self.assertTrue(r.best['score'] > 0.94 and r.best['score'] < 0.95)
def test_timeout_case_2(self): global best_score from kivy.clock import Clock from time import sleep best_score = 0 gdb = Recognizer(db=[self.Tbound, self.Ninvar, self.Tinvar]) r = gdb.recognize([Ncandidate], max_gpf=1, timeout=0.8) Clock.tick() # matches Tbound in this tick self.assertEqual(best_score, 0) sleep(0.4) Clock.tick() # matches Ninvar in this tick sleep(0.4) Clock.tick() # should match Tinvar, but times out self.assertEqual(r.status, 'timeout') self.assertEqual(r.progress, 2 / 3.) self.assertTrue(r.best['score'] >= .94 and r.best['score'] <= .95)
class StrokeRecognition(object): def __init__(self, parent, data, loglevel): self.strokes = [[]] self.time = time.time() self.gdb = Recognizer() self.logger = logging.getLogger('StrokeRecognition') self.logger.setLevel(loglevel) self.logger.addHandler(CH) self.logger.info('Creating Gestures Templates..') circle = [[Vector(int(10+10*cos(t)), int(10+10*sin(t))) for t in np.linspace(0,2*pi,8)]] self.gdb.add_gesture('Circle',circle, strokes_sensitive=True) #Horizontal or vertical lines give error self.gdb.add_gesture('Line', [[Vector(10,60),Vector(40,50)]], strokes_sensitive=True, priority=50) self.gdb.add_gesture('Triangle', [[Vector(10,10), Vector(15,15), Vector(20,20), Vector(20,20), Vector(25,15), Vector(30,10), Vector(30,10), Vector(20,10), Vector(10,10)]], strokes_sensitive=False, orientation_sensitive=False, permute=False) self.gdb.add_gesture('Rectangle', [[Vector(10,10), Vector(10,15), Vector(10,20), Vector(10,20), Vector(15,20), Vector(20,20), Vector(20,20), Vector(20,15), Vector(20,10), Vector(20,10), Vector(15,10), Vector(10,10)]], strokes_sensitive=False, orientation_sensitive=False, permute=False) self.logger.info('Templates created') self.found_gesture = False self.gesture = None self._data = data self._parent = parent self.ran = False self.gdb.bind(on_search_complete=self.search_stop) self.dist_thres = 0 self.time_thres = 2 self.skel_sub = mfilters.Subscriber( "skeleton", Image) self.clas_sub = mfilters.Subscriber( "class", TimeReference) self.image_ts = mfilters.TimeSynchronizer( [self.skel_sub, self.clas_sub], 30) self.image_ts.registerCallback( self.callback) self.bridge = CvBridge() def callback(self, skel, class_name): if self._parent.initialized and not self._parent.write_mode: try: skel = self.bridge.imgmsg_to_cv2(skel, desired_encoding= 'passthrough') action = class_name.source if action == 'Index': self.ran = False self.add_stroke_vector(skel[-1, -1, 1], skel[-1, -1, 0]) self.time = time.time() elif action == 'Palm': self.add_stroke() if not self.ran and time.time() - self.time > self.time_thres: self.ran = True if len(self.strokes[0])>0: self.progress = self.gdb.recognize(self.strokes[:-1]) #removing last empty sublist ^ clock.tick() self._data.add(gesture=self.gesture, found_gesture=self.found_gesture, strokes=self.strokes) self.strokes = [[]] evt = CreateEvent(EVT_STRK_TYPE, -1) wx.PostEvent(self._parent, evt) except Exception as e: exc_type, exc_value, exc_traceback = sys.exc_info() traceback.print_exception(exc_type, exc_value, exc_traceback, limit=2, file=sys.stdout) print e else: self.strokes = [[]] def search_stop(self, gdb, pt): best = pt.best dist = best['dist'] self.gesture = best['name'] if dist > self.dist_thres and self.gesture is not None: self.found_gesture = True self.logger.debug('Gesture found as ' + str(self.gesture) + ' having cos distance ' + str(dist)) else: self.found_gesture = False self.logger.debug('Gesture not found. \n\tBest candidate was '+ str(self.gesture) +' with cos distance:' + str(dist)) self.logger.debug('\tThe number of strokes was ' + str(len(self.strokes)-1)) self.logger.debug('\tStrokes:') for stroke in self.strokes[:-1]: self.logger.debug('\t\t'+str(stroke)) def add_stroke(self): if len(self.strokes[-1])>0: #add stroke only if last stroke is not empty self.strokes.append([]) def add_stroke_vector(self, xpoint, ypoint): if len(self.strokes[-1])>0: dist_check = norm(np.diff([np.array(self.strokes[-1][-1]), np.array([xpoint,ypoint])],axis=0))<10 else: dist_check = True if dist_check: self.strokes[-1].append(Vector(xpoint,ypoint))