From d37c50e39449dd3c4d5b5eee102094b301cb659a Mon Sep 17 00:00:00 2001 From: Ruben van de Ven Date: Fri, 4 May 2018 08:05:32 +0200 Subject: [PATCH] With testing screen, coordinate mapping, CMRmap colormap --- python_scripts/circle.png | Bin 0 -> 53517 bytes python_scripts/heatmap.py | 224 +++++++++++++++++++++++++++++++------- 2 files changed, 184 insertions(+), 40 deletions(-) create mode 100644 python_scripts/circle.png diff --git a/python_scripts/circle.png b/python_scripts/circle.png new file mode 100644 index 0000000000000000000000000000000000000000..71a63bb94315a3fd047205d61725fda9405000f5 GIT binary patch literal 53517 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 literal 0 HcmV?d00001 diff --git a/python_scripts/heatmap.py b/python_scripts/heatmap.py index e3c5b0d..3a6e798 100644 --- a/python_scripts/heatmap.py +++ b/python_scripts/heatmap.py @@ -2,7 +2,6 @@ import numpy as np import os import pickle import logging -from scipy.ndimage.filters import gaussian_filter from PIL import Image, ImageDraw,ImageTk from matplotlib import cm import sys @@ -14,7 +13,7 @@ import time import argparse import subprocess import json - +from threading import Thread import termios, fcntl, os class Heatmap: @@ -31,19 +30,114 @@ class Heatmap: ]) self.loadCoordinates() - self.windowRoot = Tk.Toplevel() + self.windowRoot = Tk.Tk() + self.windowRoot.geometry('800x600+4000+0') + self.windowRoot.attributes("-fullscreen", True) imageWindowSize = tuple(metricsSize) - self.windowRoot.geometry('%dx%d+%d+%d' % (imageWindowSize[0],imageWindowSize[1],0,0)) - self.canvas = Tk.Canvas(self.windowRoot,width=imageWindowSize[0],height=imageWindowSize[1]) - self.canvas.pack() + # self.windowRoot.geometry('%dx%d+%d+%d' % (imageWindowSize[0],imageWindowSize[1],0,0)) # we go full screen so not needed + self.canvas = Tk.Canvas(self.windowRoot,width=imageWindowSize[0],height=imageWindowSize[1],bd=0, highlightthickness=0, relief='ridge') + self.canvas.pack(fill="both", expand=True) + + self.mapSize = [1200,400] + self.mapWindowRoot = Tk.Toplevel(master=self.windowRoot) + self.mapWindowRoot.geometry('%dx%d' % tuple(self.mapSize)) + self.mapCanvas = Tk.Canvas(self.mapWindowRoot,width=self.mapSize[0],height=self.mapSize[1],bd=0, highlightthickness=0, relief='ridge') + self.mapCanvas.create_rectangle(20, 50, 22, 350, fill="black", width=0, tags="screenTop") + self.mapCanvas.create_rectangle(600, 50, 602, 300, fill="black", width=0, tags="screenSide") + # self.mapImage = Image.new('RGB', (500,350)) + # self.mapDraw = ImageDraw.Draw(self.mapImage) + self.mapCanvas.pack(fill="both", expand=True) + + self.windowRoot.bind("", self.onKeyPress) + self.mapWindowRoot.bind("", self.onKeyPress) + + # self.updateWindow() + self.currentTargets = [{ + u'confidence': 0.983333, + u'head_rot': [0.270533, -0.0669274, 0.113554], + u'gaze_angle': [0.025313, 0.403179], + u'fid': 0, + u'head_pos': [73.5302, 26.4475, 399.764], + 'target': [100,100] + }] + + # Have a pre-created blurred circle. + circle = Image.open("circle.png").convert("L") + self.circle = np.array(circle.resize((circle.size[0]/2,circle.size[1]/2))).astype(float) + self.circle = self.circle/np.max(self.circle) + self.circleRadius = float(self.circle.shape[0]-1)/2 + + # test drawing of metrics: + # self.addMetric(5,4,1) + # self.addMetric(100,100,1) + # self.addMetric(200,200,1) + self.addMetric(300,300,2) + # self.addMetric(1920,1070,2) + self.windowRoot.update() + self.windowGeometry = self.windowRoot.geometry().split("+")[0].split("x") + self.windowGeometry = (int(self.windowGeometry[0]), int(self.windowGeometry[0])) + self.logger.info("Window size: %s", self.windowGeometry) self.updateWindow() - def updateFromJson(self, frame): - self.logger.info("Received %s", frame) + def onKeyPress(self, event=None, charachter=None): + if event is None and charachter is not None: + k = charachter + else: + k = event.char + + print("PRESSED %s" % k) + if k.isdigit(): + print(len(self.currentTargets)) + if len(self.currentTargets): + c = int(k) + if c == 1: + self.setCoordinate("tl", self.currentTargets[0]) + elif c == 2: + self.setCoordinate("tr", self.currentTargets[0]) + elif c == 3: + self.setCoordinate("bl", self.currentTargets[0]) + elif c == 4: + self.setCoordinate("br", self.currentTargets[0]) + else: + if k == "q": + exit() + + + def addMetric(self,x,y,confidence): + s = self.metrics.shape # y,x + + startX = int( self.circleRadius - x if x <= self.circleRadius else 0) + endX = int( s[1] - x + self.circleRadius if x >= (s[1] - self.circleRadius) else self.circle.shape[0]) + startY = int( self.circleRadius - y if y <= self.circleRadius else 0) + endY = int( s[0] - y + self.circleRadius if y >= s[0] - self.circleRadius else self.circle.shape[1]) + + mStartX = int(max(0, x-self.circleRadius)) + mEndX = int(min(s[1], x+self.circleRadius+1)) + mStartY = int(max(0, y-self.circleRadius)) + mEndY = int(min(s[0], y+self.circleRadius+1)) + + self.logger.debug("Add metric at (%(x)d,%(y)d), circle %(startY)d:%(endY)d,%(startX)d:%(endX)d, matrix %(mStartY)d:%(mEndY)d,%(mStartX)d:%(mEndX)d" % locals()) + circlePart = self.circle[startY:endY,startX:endX] * confidence + + self.metrics[mStartY:mEndY,mStartX:mEndX] += circlePart + + def keepWindowUpdated(self): + while True: + self.updateWindow() + + def updateFromJson(self, frame): + t1 = time.time() + self.logger.info("Received %s", frame) + currentTargets = [] - newMetrics = np.zeros((self.metricsSize[1], self.metricsSize[0])) for face in frame: - # {u'confidence': 0.983333, u'head_rot': [0.270533, -0.0669274, 0.113554], u'gaze_angle': [0.025313, 0.403179], u'fid': 0, u'head_pos': [73.5302, 26.4475, 399.764]} + # { + # u'confidence': 0.983333, + # u'head_rot': [0.270533, -0.0669274, 0.113554], + # u'gaze_angle': [0.025313, 0.403179], + # u'fid': 0, + # u'head_pos': [73.5302, 26.4475, 399.764] + # } x, y = self.getTargetOfFace(face) self.logger.debug("Face %d on %s", face['fid'], [x,y]) @@ -52,24 +146,71 @@ class Heatmap: targetInt = (int(targetPoint[0]), int(targetPoint[1])) # check if point fits on screen: # if so, measure it - if targetInt[0] >= 0 and targetInt[1] >= 0 and targetInt[0] < self.metricsSize[1] and targetInt[1] < self.metricsSize[0]: - newMetrics[targetInt[1],targetInt[0]] += float(face['confidence']) + face['target'] = [targetInt[0], targetInt[1]] + currentTargets.append(face) + if targetInt[0] >= 0 and targetInt[1] >= 0 and targetInt[1] < self.metricsSize[1] and targetInt[0] < self.metricsSize[0]: + self.addMetric(targetInt[0], targetInt[1], face['confidence']) + + t2 = time.time() + self.logger.debug("Update took %fs", t2-t1) + self.currentTargets = currentTargets + # self.updateWindow() + + def updateMap(self): + self.mapCanvas.delete("figure") + virtualWidth = 300 + virtualHeight = 250 + mmPerPixel = abs(self.coordinates['tl'][0] - self.coordinates['tr'][0])/float(virtualWidth) + + for face in self.currentTargets: + dx = face['head_pos'][0]/mmPerPixel #left/right + dy = face['head_pos'][1]/mmPerPixel # top/down + dz = face['head_pos'][2]/mmPerPixel # front/back + + p1x = int(20 + dz) + p1y = int(virtualWidth / 2 + 50 + dx) + + p2x = int(600 + dz) + p2y = int(virtualHeight / 2 + 50 + dy) + self.mapCanvas.create_oval(p1x-3, p1y-3, p1x+3, p1y+3, fill="red", width=0, tags="figure") + self.mapCanvas.create_oval(p2x-3, p2y-3, p2x+3, p2y+3, fill="red", width=0, tags="figure") + + p3x = int(20) + p3y = int(float(face['target'][0]) / self.metricsSize[0] * virtualWidth + 50) + + p4x = int(600) + p4y = int(float(face['target'][1]) / self.metricsSize[1] * virtualHeight + 50) + self.mapCanvas.create_line(p1x,p1y, p3x,p3y, fill="green", tags="figure") + self.mapCanvas.create_line(p2x,p2y, p4x,p4y, fill="green", tags="figure") + + self.logger.debug("DRAW FACE TO", face, (p1x,p1y), "AND", (p2x,p2y)) + - self.metrics = self.metrics + gaussian_filter(newMetrics, sigma = 8) - self.updateWindow() def updateWindow(self): - normalisedMetrics = self.metrics / (np.max(self.metrics)) + t1 = time.time() + normalisedMetrics = self.metrics / (max(18,np.max(self.metrics))) # convert to colormap, thanks to: https://stackoverflow.com/a/10967471 - normalisedMetrics = np.uint8(cm.plasma(normalisedMetrics)*255) + colormap = cm.plasma + colormap = cm.CMRmap + normalisedMetrics = np.uint8(colormap(normalisedMetrics)*255) image = Image.fromarray(normalisedMetrics) - wpercent = (self.metricsSize[0] / float(image.size[0])) - hsize = int((float(image.size[1]) * float(wpercent))) - image = image.resize((self.metricsSize[0], hsize)) + self.updateMap() + # Too clunky for now: + # if len(self.currentTargets) > 0: + # c = ImageDraw.Draw(image) + # for t in self.currentTargets: + # c.ellipse((t[0]-20, t[1]-20, t[0]+20, t[1]+20), fill=(100,100,100,100))) + # del c + # wpercent = (self.windowGeometry[0] / float(image.size[0])) + # hsize = int((float(image.size[1]) * float(wpercent))) + image = image.resize((self.windowGeometry[0], self.windowGeometry[1])) tkpi = ImageTk.PhotoImage(image) self.canvas.delete("IMG") - imagesprite = self.canvas.create_image(500,500,image=tkpi, tags="IMG") + imagesprite = self.canvas.create_image(self.windowGeometry[0]/2,self.windowGeometry[1]/2 ,image=tkpi, tags="IMG", anchor="center") self.windowRoot.update() + t2 = time.time() + self.logger.debug("Draw took %fs", t2-t1) def getTargetOfFace(self, face): x = np.arctan(face['gaze_angle'][0])*face['head_pos'][2] + face['head_pos'][0] @@ -102,17 +243,32 @@ class Heatmap: def setCoordinate(self, pos, face): self.coordinates[pos] = self.getTargetOfFace(face) + print(self.hasAllCoordinates(), self.coordinates.values()) if self.hasAllCoordinates(): + self.logger.warning("Go create new transform") self.saveCoordinates() self.updateTransform() + def runCam(self, openface_exec, device): + for output in execute([openface_exec, "-device", str(device), "-cam_width", "1280", "-cam_height", "720"]): + try: + frame = json.loads(output) + self.updateFromJson(frame) + try: + c = sys.stdin.read(1) + self.onKeyPress(charachter=c) + except IOError: pass + except Exception as e: + self.logger.warning(str(e)) + self.logger.warning("received %s", output) + def main(openface_exec, coordinates_filename, device=0): logging.basicConfig( format='%(asctime)-15s %(name)s %(levelname)s: %(message)s' ) logger = logging.getLogger(__name__) - logger.setLevel(logging.DEBUG) + logger.setLevel(logging.WARNING) fd = sys.stdin.fileno() oldterm = termios.tcgetattr(fd) @@ -126,28 +282,16 @@ def main(openface_exec, coordinates_filename, device=0): # metrics matrix metricsSize = [1920,1080] + metricsSize = [1920/2,1080/2] + metricsSize = [800,600] heatmap = Heatmap(metricsSize, logger, coordinates_filename) + # heatmap.runCam(openface_exec, device) + thread = Thread(target=heatmap.runCam, args=(openface_exec, device)) + thread.start() + heatmap.keepWindowUpdated() + - for output in execute([openface_exec, "-device", str(device), "-cam_width", "1280", "-cam_height", "720"]): - try: - frame = json.loads(output) - heatmap.updateFromJson(frame) - try: - c = sys.stdin.read(1) - c = int(c) - if c == 1: - heatmap.setCoordinate("tl", frame[0]) - elif c == 2: - heatmap.setCoordinate("tr", frame[0]) - elif c == 3: - heatmap.setCoordinate("bl", frame[0]) - elif c == 4: - heatmap.setCoordinate("br", frame[0]) - except IOError: pass - except Exception as e: - logger.warning(str(e)) - logger.warning("received %s", output) finally: termios.tcsetattr(fd, termios.TCSAFLUSH, oldterm) fcntl.fcntl(fd, fcntl.F_SETFL, oldflags)