def train(): images, shapes, labels = images_shapes_not_all_labels_unmarked() flip = State.getKey('/flip', None) Face.double_data(images, shapes, flip_order=flip) predictor = Face.train_shape_predictor(images, shapes) State.setKey('/predictor', predictor) State.push('train predictor')
def dragCB(view, data): vi = view.drag_data #print 'dragCB',data,vi offset = (view.mouseDx * view.toolRX + view.mouseDy * view.toolRY) move_vertex(view, vi, offset[:2], delta=True) State.push('move vertex') QApp.app.updateMenus()
def boot_face(): fi = frame_number() img = get_frame_image(fi) predictor = get_predictor() shp = Face.detect_face(img, predictor) if shp is not None: set_frame_markup(fi, shp) State.push('boot face markup')
def import_image(): image_fn, _ = QApp.app.loadFilename( 'Choose an image to open', cwd(), 'Image Files (*.jpg *.jpeg *.png *.bmp *.tif)') if image_fn == '': return # cancel img = Face.load_image(image_fn) images, shapes = [], [] add_image(img) State.push('Import image')
def set_frame_cb(fi): view = QApp.view() # TODO should be part of the callback? if fi != frame_number(): State.setKey('/frame_number', fi) State.push('change frame') img = get_frame_image(fi) update_gui_image(view, img) update_markup_mesh(view) QApp.app.updateMenus() # trigger a full refesh here (TODO not needed?)
def train_aam(): images, shapes, labels = images_shapes_not_all_labels_unmarked() flip = State.getKey('/flip', None) aam_model = Face.train_aam_model(images, shapes, flip_order=flip, texture_rank=20) State.setKey('/aam', aam_model) State.push('train aam')
def update_flip_order_last2(): '''A hacky method that makes the last two added points be each others flip.''' flip = State.getKey('/flip', [16,15,14,13,12,11,10,9,8,7,6,5,4,3,2,1,0,\ 26,25,24,23,22,21,20,19,18,17,27,28,29,30,35,34,33,32,31,45,44,43,42,47,46,\ 39,38,37,36,41,40,54,53,52,51,50,49,48,59,58,57,56,55,64,63,62,61,60,67,66,65]) flip = list(flip) flip.extend([len(flip) + 1, len(flip)]) print flip flip = np.int32(flip) State.setKey('/flip', flip) State.push('update flip last 2')
def delete_image(): fi = frame_number images = State.getKey('/images', []) shapes = State.getKey('/shapes', []) labels = State.getKey('/labels', []) images.pop(fi) shapes.pop(fi) labels.pop(fi) State.setKey('/images', images) State.setKey('/shapes', shapes) State.setKey('/labels', labels) State.push('delete image')
def setFieldValueCommand(self, field, value): '''Be careful, this is usually called from a qt callback, so we mustn't rebuild qt objects here.''' if self.value_is_adjusting: return #print 'setFieldValueCommand', repr(field), repr(value) #print '/%s/attrs/%s' % (State.getSel(),field) State.setKey('/%s/attrs/%s' % (State.getSel(),field),value) self.edit_signal.emit(State.getSel(),field,value) # DH self.clean_state() # if changing the field has side effects, these should happen before the push (I think) State.push('Set %s' % str(field)) undoCmd = State.getUndoCmd() self.undoItem.setText('&Undo' if undoCmd is None else '&Undo [%s]' % undoCmd) redoCmd = State.getRedoCmd() self.redoItem.setText('Re&do' if redoCmd is None else 'Re&do [%s]' % redoCmd)
def retriangulate(): shp = get_predictor()['ref_shape'] edges = [] tris = Face.triangulate_2D(shp) for p0, p1, p2 in tris: edges.append((p0, p1)) edges.append((p1, p2)) edges.append((p2, p0)) edges = np.int32(edges) tris = np.int32(tris) State.setKey('/edges', edges) State.setKey('/tris', tris) State.push('triangulate')
def add_image(img, shp=None): if shp is None: shp = get_predictor()['ref_shape'] if not State.hasKey('/images') or not State.hasKey( '/shapes') or not State.hasKey('/labels'): State.setKey('/images', []) State.setKey('/shapes', []) State.setKey('/labels', []) fi = len(State.getKey('/images')) lbl = np.zeros(len(shp), dtype=np.int32) # unlabelled set_frame_image(fi, img) set_frame_markup(fi, shp) set_frame_labels(fi, lbl) State.push('add image')
def delete_selected_vertex(): vi = get_selected_vertex() shapes = State.getKey('/shapes') labels = State.getKey('/labels') vnames = State.getKey('/vnames') num_images, num_vertices = labels.shape which = range(0, vi) + range(vi + 1, num_vertices()) shapes = list(np.float32(shapes)[:, which]) labels = list(np.int32(labels)[:, which]) vnames = [vnames[x] for x in which] State.setKey('/shapes', shapes) State.setKey('/labels', labels) State.setKey('/vnames', vnames) State.push('delete vertex')
def add_vertex(vname=None): # TODO later, we want to initialise every vertex that has a zero label shapes = State.getKey('/shapes') labels = State.getKey('/labels') vnames = State.getKey('/vnames') if vname is None: vname = 'pt_%d' % len(vnames) shapes = np.float32(shapes) labels = np.int32(labels) num_images, num_vertices = labels.shape shapes = list( np.hstack((shapes, np.zeros((num_images, 1, 2), dtype=np.float32)))) labels = list( np.hstack((labels, np.zeros((num_images, 1), dtype=np.int32)))) vnames.append(vname) State.setKey('/shapes', shapes) State.setKey('/labels', labels) State.setKey('/vnames', vnames) State.push('add vertex')
def pickedCB(view, data, clearSelection=True): #print 'pickedCB',view,data,clearSelection if data is None: QApp.app.select(None) # TODO achievable through the view? else: primitive_type, pn, pi, distance = data if primitive_type is '3d': p = view.primitives[pn] if isinstance(p, GLPoints3D): if pi == -1: # edge print 'picked edge' return #name = p.names[pi] print "Picked:", pi if p is view.getLayer('ref_mesh'): move_vertex(view, pi, p.vertices[pi, :2]) select_vertex(view, pi) State.push('select vertex') QApp.app.updateMenus()
def reorder_images(): images = State.getKey('/images') shapes = State.getKey('/shapes') labels = State.getKey('/labels') old_order = State.getKey('/order', np.arange(len(images), dtype=np.int32)) norm_shapes, ref_shape, ref_pinv = Face.normalized_shapes(shapes) norm_shapes -= ref_shape shapes_u, shapes_s, shapes_vt = np.linalg.svd(norm_shapes.reshape( norm_shapes.shape[0], -1), full_matrices=0) wts = np.sum(shapes_u**2, axis=1) order = np.argsort(wts)[::-1] images = [images[o] for o in order] shapes = [shapes[o] for o in order] labels = [labels[o] for o in order] State.setKey('/images', images) State.setKey('/shapes', shapes) State.setKey('/labels', labels) State.setKey('/order', old_order[order]) State.push('reorder images')
def import_movie_frames(): movie_fn, _ = QApp.app.loadFilename( 'Choose a movie to open', cwd(), 'Movie Files (*.mp4 *.mov *.avi *.flv *.mpg)') if movie_fn == '': return # cancel set_cwd(movie_fn) txt_fn, _ = QApp.app.loadFilename( 'Choose a text file of frame indices to open', cwd(), 'Text Files (*.txt)') md = MovieReader.open_file(movie_fn, audio=False) images, shapes = [], [] if txt_fn == '': frames = range(0, md['vmaxframe'], 100) #if txt_fn == '': frames = range(30000, 38300, 100) else: frames = [int(l.split(':')[1]) for l in open(txt_fn, 'r').readlines()] for fi in frames: print fi, '/', frames[-1] MovieReader.readFrame(md, fi) add_image( np.frombuffer(md['vbuffer'], dtype=np.uint8).reshape(md['vheight'], md['vwidth'], 3).copy()) State.push('Import movie frames')
def keypress_cb(view, key): if key == ord('R'): State.setKey('/root/ui/attrs/booting',True) State.push('boot face') if key == ord('N'): State.setKey('/root/ui/attrs/setting_neutral',True) State.push('set neutral') if key == ord('S'): toggle_unreal() if key == ord('Z'): State.setKey('/root/ui/attrs/debugging',not State.getKey('/root/ui/attrs/debugging')) State.push('debugging')
def keyCB(view, key): #print 'keyCB',repr(key),type(key) if key == ord('R'): boot_from_ref_shape(view) State.push('boot markup') QApp.app.updateMenus() if key == ord('U'): if unlabel_selected_vertex(view): State.push('unlabel vertex') QApp.app.updateMenus() if key == ord('Z'): unlabel_all_vertices(view) State.push('unlabel all vertices') QApp.app.updateMenus()
def createKeyCommand(key, value): key = State.addKey(key,value) State.push('Create %s' % State.keyToName(key)) app.updateMenus()
def addOpItem(self, name, data, silent=False): #print 'addOpItem',name,data self.qnodes.addItem(name, data=data) if silent: return State.push('Add Op %s' % name) # TODO this method shouldn't be here self.updateMenus()