fix: bump binary blink open value

This commit is contained in:
Prohurtz 2024-04-22 21:17:47 -05:00
parent 2243e63f3c
commit b11485f3fb
4 changed files with 80 additions and 70 deletions

View File

@ -965,7 +965,7 @@ def External_Run_AHSF(frame_gray):
# (pupil_rect_coarse[0], pupil_rect_coarse[1]), # (pupil_rect_coarse[0], pupil_rect_coarse[1]),
# ( # (
# pupil_rect_coarse[0] + pupil_rect_coarse[2], # pupil_rect_coarse[0] + pupil_rect_coarse[2],
# pupil_rect_coarse[1] + pupil_rect_coarse[3], # pupil_rect_coarse[1] + pupil_rect_coarse[so 3],
# ), # ),
# (0, 255, 0), # (0, 255, 0),
# 2, # 2,

View File

@ -29,6 +29,7 @@ LICENSE: Summer Software Distribution License 1.0
import numpy as np import numpy as np
def BLINK(self): def BLINK(self):
if self.blink_clear == True: if self.blink_clear == True:
@ -39,14 +40,18 @@ def BLINK(self):
intensity = np.sum(self.current_image_gray_clean) intensity = np.sum(self.current_image_gray_clean)
if self.calibration_frame_counter == 300: if self.calibration_frame_counter == 300:
self.filterlist = [] #clear filter self.filterlist = [] # clear filter
if len(self.filterlist) < 300: if len(self.filterlist) < 300:
self.filterlist.append(intensity) self.filterlist.append(intensity)
else: else:
self.filterlist.pop(0) self.filterlist.pop(0)
self.filterlist.append(intensity) self.filterlist.append(intensity)
if intensity >= np.percentile(self.filterlist, 99) or intensity <= np.percentile(self.filterlist, 1) and len(self.max_ints) >= 1: # filter abnormally high values if (
try: # I don't want this here but I cant get python to stop crying when it's not intensity >= np.percentile(self.filterlist, 99)
or intensity <= np.percentile(self.filterlist, 1)
and len(self.max_ints) >= 1
): # filter abnormally high values
try: # I don't want this here but I cant get python to stop crying when it's not
intensity = min(self.max_ints) intensity = min(self.max_ints)
except: except:
pass pass
@ -54,7 +59,7 @@ def BLINK(self):
self.frames = self.frames + 1 self.frames = self.frames + 1
if intensity > self.max_int: if intensity > self.max_int:
self.max_int = intensity self.max_int = intensity
if self.frames > 300: #TODO: test this number more (make it a setting??) if self.frames > 300: # TODO: test this number more (make it a setting??)
self.max_ints.append(self.max_int) self.max_ints.append(self.max_int)
if intensity < self.min_int: if intensity < self.min_int:
self.min_int = intensity self.min_int = intensity
@ -63,9 +68,11 @@ def BLINK(self):
if intensity > min(self.max_ints): if intensity > min(self.max_ints):
blinkvalue = 0.0 blinkvalue = 0.0
else: else:
blinkvalue = 0.7 blinkvalue = 0.8
try: try:
return blinkvalue return blinkvalue
except: except:
return 0.7 return 0.8
# print(self.blinkvalue, self.max_int, self.min_int, self.frames, intensity)
# print(self.blinkvalue, self.max_int, self.min_int, self.frames, intensity)

View File

@ -1,4 +1,4 @@
''' """
------------------------------------------------------------------------------------------------------ ------------------------------------------------------------------------------------------------------
,@@@@@@ ,@@@@@@
@ -25,7 +25,7 @@ Algorithm App Implementations By: PallasNeko, Prohurtz
Copyright (c) 2023 EyeTrackVR <3 Copyright (c) 2023 EyeTrackVR <3
LICENSE: GNU GPLv3 LICENSE: GNU GPLv3
------------------------------------------------------------------------------------------------------ ------------------------------------------------------------------------------------------------------
''' """
import sys import sys
from typing import Tuple from typing import Tuple
import math import math
@ -36,6 +36,7 @@ import onnxruntime
from one_euro_filter import OneEuroFilter from one_euro_filter import OneEuroFilter
from utils.misc_utils import FastMedian, resource_path from utils.misc_utils import FastMedian, resource_path
import os import os
os.environ["OMP_NUM_THREADS"] = "1" os.environ["OMP_NUM_THREADS"] = "1"
# DADDY # DADDY
# Please change the name of this script and the name of the method if you have something better. # Please change the name of this script and the name of the method if you have something better.
@ -44,15 +45,16 @@ input_size = 192 # Do not change this number.
heatmap_size = 48 # Do not change this number. heatmap_size = 48 # Do not change this number.
kernel_size = 7 kernel_size = 7
if platform.system() == "Darwin": if platform.system() == "Darwin":
model_file = "EyeTrackApp/Models/daddy230210.onnx" # The model file name will be changed when performance stabilises. # funny MacOS files issues :P model_file = "Models/daddy230210.onnx" # The model file name will be changed when performance stabilises. # funny MacOS files issues :P
else: else:
model_file = "Models/daddy230210.onnx" # The model file name will be changed when performance stabilises. model_file = "Models/daddy230210.onnx" # The model file name will be changed when performance stabilises.
# SHA256 for model version verification # SHA256 for model version verification
# daddy230210.onnx = 59e59aa2a21024884200dd3acbd5e6a2e8d7209c46555fbdc727d4fe3adb68d3 # daddy230210.onnx = 59e59aa2a21024884200dd3acbd5e6a2e8d7209c46555fbdc727d4fe3adb68d3
imshow_enable = False imshow_enable = False
save_video = False save_video = False
save_filepath = 'output.mp4' save_filepath = "output.mp4"
def get_max_preds(batch_heatmaps): def get_max_preds(batch_heatmaps):
@ -89,12 +91,11 @@ def taylor(hm, coord):
dx = 0.5 * (hm[py][px + 1] - hm[py][px - 1]) dx = 0.5 * (hm[py][px + 1] - hm[py][px - 1])
dy = 0.5 * (hm[py + 1][px] - hm[py - 1][px]) dy = 0.5 * (hm[py + 1][px] - hm[py - 1][px])
dxx = 0.25 * (hm[py][px + 2] - 2 * hm[py][px] + hm[py][px - 2]) dxx = 0.25 * (hm[py][px + 2] - 2 * hm[py][px] + hm[py][px - 2])
dxy = 0.25 * (hm[py + 1][px + 1] - hm[py - 1][px + 1] - hm[py + 1][px - 1] \ dxy = 0.25 * (hm[py + 1][px + 1] - hm[py - 1][px + 1] - hm[py + 1][px - 1] + hm[py - 1][px - 1])
+ hm[py - 1][px - 1])
dyy = 0.25 * (hm[py + 2 * 1][px] - 2 * hm[py][px] + hm[py - 2 * 1][px]) dyy = 0.25 * (hm[py + 2 * 1][px] - 2 * hm[py][px] + hm[py - 2 * 1][px])
derivative = np.matrix([[dx], [dy]]) derivative = np.matrix([[dx], [dy]])
hessian = np.matrix([[dxx, dxy], [dxy, dyy]]) hessian = np.matrix([[dxx, dxy], [dxy, dyy]])
if dxx * dyy - dxy ** 2 != 0: if dxx * dyy - dxy**2 != 0:
hessianinv = hessian.I hessianinv = hessian.I
offset = -hessianinv * derivative offset = -hessianinv * derivative
offset = np.squeeze(np.array(offset.T), axis=0) offset = np.squeeze(np.array(offset.T), axis=0)
@ -113,9 +114,9 @@ def gaussian_blur(hm, kernel):
for j in range(num_joints): for j in range(num_joints):
origin_max = np.max(hm[i, j]) origin_max = np.max(hm[i, j])
dr = np.zeros((height + 2 * border, width + 2 * border)) dr = np.zeros((height + 2 * border, width + 2 * border))
dr[border: -border, border: -border] = hm[i, j].copy() dr[border:-border, border:-border] = hm[i, j].copy()
dr = cv2.GaussianBlur(dr, (kernel, kernel), 0) dr = cv2.GaussianBlur(dr, (kernel, kernel), 0)
hm[i, j] = dr[border: -border, border: -border].copy() hm[i, j] = dr[border:-border, border:-border].copy()
hm[i, j] *= origin_max / np.max(hm[i, j]) hm[i, j] *= origin_max / np.max(hm[i, j])
return hm return hm
@ -144,9 +145,9 @@ def get_final_preds(hm, realsize):
return preds, maxvals return preds, maxvals
def resize_with_pad(image: np.array, def resize_with_pad(
new_shape: Tuple[int, int], image: np.array, new_shape: Tuple[int, int], padding_color: Tuple[int] = (255, 255, 255)
padding_color: Tuple[int] = (255, 255, 255)) -> np.array: ) -> np.array:
""" """
https://gist.github.com/IdeaKing/11cf5e146d23c5bb219ba3508cca89ec https://gist.github.com/IdeaKing/11cf5e146d23c5bb219ba3508cca89ec
Maintains aspect ratio and resizes with padding. Maintains aspect ratio and resizes with padding.
@ -180,26 +181,29 @@ class BEER(object):
# todo https://peerj.com/articles/cs-943/ # todo https://peerj.com/articles/cs-943/
def ear(self, pred): def ear(self, pred):
p15 = np.linalg.norm(pred[1]-pred[5]) p15 = np.linalg.norm(pred[1] - pred[5])
p24 = np.linalg.norm(pred[2]-pred[4]) p24 = np.linalg.norm(pred[2] - pred[4])
p03 = np.linalg.norm(pred[0]-pred[3]) p03 = np.linalg.norm(pred[0] - pred[3])
self.p03_med+p03 self.p03_med + p03
if p03 > self.p03_med.median()*1.5: if p03 > self.p03_med.median() * 1.5:
return self.prev_ear return self.prev_ear
ear = (p15+p24)/(2*self.p03_med.median()) ear = (p15 + p24) / (2 * self.p03_med.median())
self.ear_minmax(ear) self.ear_minmax(ear)
norm_ear = self.ear_norm(ear) norm_ear = self.ear_norm(ear)
self.prev_ear = norm_ear.copy() self.prev_ear = norm_ear.copy()
return norm_ear return norm_ear
def ear_minmax(self,ear):
def ear_minmax(self, ear):
if ear < self.ear_min: if ear < self.ear_min:
self.ear_min = ear.copy() self.ear_min = ear.copy()
if ear > self.ear_max: if ear > self.ear_max:
self.ear_max = ear.copy() self.ear_max = ear.copy()
def ear_norm(self,ear): def ear_norm(self, ear):
return (ear-self.ear_min)/(self.ear_max-self.ear_min) # todo:It is better to add very small values to avoid zero division. return (ear - self.ear_min) / (
self.ear_max - self.ear_min
) # todo:It is better to add very small values to avoid zero division.
# #
@ -216,8 +220,10 @@ class DADDY_cls(object):
options.execution_mode = onnxruntime.ExecutionMode.ORT_SEQUENTIAL options.execution_mode = onnxruntime.ExecutionMode.ORT_SEQUENTIAL
options.graph_optimization_level = onnxruntime.GraphOptimizationLevel.ORT_ENABLE_ALL options.graph_optimization_level = onnxruntime.GraphOptimizationLevel.ORT_ENABLE_ALL
ort_session = onnxruntime.InferenceSession(resource_path(model_file), sess_options=options, providers=["CPUExecutionProvider"]) ort_session = onnxruntime.InferenceSession(
ort_session.set_providers(['CPUExecutionProvider']) # only cpu mode resource_path(model_file), sess_options=options, providers=["CPUExecutionProvider"]
)
ort_session.set_providers(["CPUExecutionProvider"]) # only cpu mode
self.ort_session = ort_session self.ort_session = ort_session
self.input_name = ort_session.get_inputs()[0].name self.input_name = ort_session.get_inputs()[0].name
@ -226,11 +232,7 @@ class DADDY_cls(object):
min_cutoff = 0.0004 min_cutoff = 0.0004
beta = 0.9 beta = 0.9
input_point = np.zeros((11, 2)) # np.array([1, 1]) input_point = np.zeros((11, 2)) # np.array([1, 1])
self.one_euro_filter = OneEuroFilter( self.one_euro_filter = OneEuroFilter(input_point, min_cutoff=min_cutoff, beta=beta)
input_point,
min_cutoff=min_cutoff,
beta=beta
)
# self.ear_oef = OneEuroFilter( # self.ear_oef = OneEuroFilter(
# np.zeros(1), # np.zeros(1),
# min_cutoff=min_cutoff, # min_cutoff=min_cutoff,
@ -282,7 +284,9 @@ class DADDY_cls(object):
# for i in range(heatmap.shape[0]): # for i in range(heatmap.shape[0]):
# cv2.imshow("heatmap_{}".format(i + 1), heatmap[i]) # cv2.imshow("heatmap_{}".format(i + 1), heatmap[i])
pred, max_val = get_final_preds(pred_heatmap, (self.current_image_gray.shape[1], self.current_image_gray.shape[0])) pred, max_val = get_final_preds(
pred_heatmap, (self.current_image_gray.shape[1], self.current_image_gray.shape[0])
)
pred = pred.reshape((-1, 2)) pred = pred.reshape((-1, 2))
# or # or
# pred, max_val = get_final_preds(pred_heatmap, input_size) # pred, max_val = get_final_preds(pred_heatmap, input_size)
@ -316,7 +320,6 @@ class DADDY_cls(object):
# cv2.putText(self.current_image_gray, str(i), (kps[i, 0] - 10, kps[i, 1] - 10), cv2.FONT_HERSHEY_SIMPLEX, 0.35, (0, 0, 255), 1) # cv2.putText(self.current_image_gray, str(i), (kps[i, 0] - 10, kps[i, 1] - 10), cv2.FONT_HERSHEY_SIMPLEX, 0.35, (0, 0, 255), 1)
# cv2.putText(self.current_image_gray, "EAR: "+str(ear), (self.current_image_gray.shape[1]//10, self.current_image_gray.shape[0]//10), cv2.FONT_HERSHEY_SIMPLEX, 0.75, (255,0,0), 1) # cv2.putText(self.current_image_gray, "EAR: "+str(ear), (self.current_image_gray.shape[1]//10, self.current_image_gray.shape[0]//10), cv2.FONT_HERSHEY_SIMPLEX, 0.75, (255,0,0), 1)
# global loopnum # global loopnum
# if loopnum < 1350*2: # if loopnum < 1350*2:
# # self.video.write(cv2.resize(gray_frame.copy(), (200, 150), None)) # # self.video.write(cv2.resize(gray_frame.copy(), (200, 150), None))

View File

@ -213,7 +213,7 @@ cct = 300
def RANSAC3D(self, hsrac_en): def RANSAC3D(self, hsrac_en):
f = False f = False
ranf = False ranf = False
blink = 0.7 blink = 0.8
angle = 0 angle = 0
if hsrac_en: if hsrac_en: