one euro filter in IBO

messing around in IBO
This commit is contained in:
Prohurtz 2023-04-22 17:41:57 -05:00
parent a763098bad
commit e5469cf42c
5 changed files with 50 additions and 16 deletions

View File

@ -2,6 +2,10 @@ import numpy as np
def BLINK(self): def BLINK(self):
if self.blink_clear == True:
self.max_ints = []
self.max_int = 0
intensity = np.sum(self.current_image_gray_clean) intensity = np.sum(self.current_image_gray_clean)
self.frames = self.frames + 1 self.frames = self.frames + 1

View File

@ -145,6 +145,7 @@ class EyeProcessor:
self.xmin = 69420 self.xmin = 69420
self.ymax = -69420 self.ymax = -69420
self.ymin = 69420 self.ymin = 69420
self.blink_clear = False
self.cct = 300 self.cct = 300
self.cccs = False self.cccs = False
self.ts = 10 self.ts = 10
@ -179,7 +180,7 @@ class EyeProcessor:
self.prev_y = None self.prev_y = None
self.bd_blink = False self.bd_blink = False
self.current_algo = InformationOrigin.HSRAC self.current_algo = InformationOrigin.HSRAC
try: try:
min_cutoff = float(self.settings.gui_min_cutoff) # 0.0004 min_cutoff = float(self.settings.gui_min_cutoff) # 0.0004
@ -258,6 +259,7 @@ class EyeProcessor:
def UPDATE(self): def UPDATE(self):
# print(self.blink_clear)
if self.settings.gui_BLINK: if self.settings.gui_BLINK:
self.eyeopen = BLINK(self) self.eyeopen = BLINK(self)
@ -496,9 +498,3 @@ class EyeProcessor:
self.ALGOSELECT() #run our algos in priority order set in settings self.ALGOSELECT() #run our algos in priority order set in settings
self.UPDATE() self.UPDATE()

View File

@ -112,9 +112,9 @@ def fit_rotated_ellipse_ransac(data: np.ndarray, sfc: np.random.Generator, iter_
np.matmul(dm_rng_swap_trans, dm_rng_swap, out=dm_rng_5x5) np.matmul(dm_rng_swap_trans, dm_rng_swap, out=dm_rng_5x5)
# np.linalg.solve(np.matmul(dm_rng_swap_trans, dm_rng_swap), dm_rng_swap_trans) # solve is slow https://github.com/bogovicj/JaneliaMLCourse/issues/1 # np.linalg.solve(np.matmul(dm_rng_swap_trans, dm_rng_swap), dm_rng_swap_trans) # solve is slow https://github.com/bogovicj/JaneliaMLCourse/issues/1
# _umath_linalg.inv(dm_rng_5x5, signature='d->d', _umath_linalg.inv(dm_rng_5x5, signature='d->d',
# extobj=inv_ext, out=dm_rng_5x5) extobj=inv_ext, out=dm_rng_5x5)
dm_rng_5x5 = np.linalg.pinv(dm_rng_5x5) #dm_rng_5x5 = np.linalg.pinv(dm_rng_5x5)
np.matmul(dm_rng_5x5, dm_rng_swap_trans, out=dm_rng_p5smp) np.matmul(dm_rng_5x5, dm_rng_swap_trans, out=dm_rng_p5smp)
np.matmul(dm_rng_p5smp, dm_rng_six, out=dm_rng_p_npaxis) np.matmul(dm_rng_p5smp, dm_rng_six, out=dm_rng_p_npaxis)

View File

@ -3,6 +3,7 @@ import time
import os import os
import cv2 import cv2
from enums import EyeLR from enums import EyeLR
from one_euro_filter import OneEuroFilter
from utils.img_utils import safe_crop from utils.img_utils import safe_crop
#higher intensity means more closed/ more white/less pupil #higher intensity means more closed/ more white/less pupil
@ -85,6 +86,19 @@ class IntensityBasedOpeness:
self.img_roi = np.zeros(3, dtype=np.int32) self.img_roi = np.zeros(3, dtype=np.int32)
self.now_roi = np.zeros(3, dtype=np.int32) self.now_roi = np.zeros(3, dtype=np.int32)
self.prev_val = 0.5 self.prev_val = 0.5
# try:
# min_cutoff = float(self.settings.gui_min_cutoff) # 0.0004
# beta = float(self.settings.gui_speed_coefficient) # 0.9
# except:
print('\033[93m[WARN] OneEuroFilter values must be a legal number.\033[0m')
min_cutoff = 0.0004
beta = 0.9
noisy_point = np.array([1, 1])
self.one_euro_filter = OneEuroFilter(
noisy_point,
min_cutoff=min_cutoff,
beta=beta
)
def check(self, frameshape): def check(self, frameshape):
@ -156,10 +170,10 @@ class IntensityBasedOpeness:
lower_y = max(int_y - 15, 0) lower_y = max(int_y - 15, 0)
# frame_crop = frame[lower_y:upper_y, lower_x:upper_x] # frame_crop = frame[lower_y:upper_y, lower_x:upper_x]
frame_crop = safe_crop(frame, lower_x, lower_y, upper_x, upper_y, 1) # frame_crop = safe_crop(frame, lower_x, lower_y, upper_x, upper_y, 1)
#ret_, th = cv2.threshold(frame_crop, 80, 1.0, cv2.THRESH_BINARY_INV, dst=frame_crop) #ret_, th = cv2.threshold(frame_crop, 80, 1.0, cv2.THRESH_BINARY_INV, dst=frame_crop)
frame_crop = frame
ret, f = cv2.threshold(frame, 80, 255, cv2.THRESH_BINARY) #ret, f = cv2.threshold(frame, 80, 255, cv2.THRESH_BINARY)
# ret, frame_crop = cv2.threshold(frame_crop, 80, 255, cv2.THRESH_BINARY) # ret, frame_crop = cv2.threshold(frame_crop, 80, 255, cv2.THRESH_BINARY)
# The same can be done with cv2.integral, but since there is only one area of the rectangle for which we want to know the total value, there is no advantage in terms of computational complexity. # The same can be done with cv2.integral, but since there is only one area of the rectangle for which we want to know the total value, there is no advantage in terms of computational complexity.
@ -167,7 +181,8 @@ class IntensityBasedOpeness:
avg_color_per_row = np.average(frame_crop, axis=0) avg_color_per_row = np.average(frame_crop, axis=0)
avg_color = np.average(avg_color_per_row, axis=0) avg_color = np.average(avg_color_per_row, axis=0)
ar, ag, ab = avg_color ar, ag, ab = avg_color
intensity = ar intensity = int(ar * 8) #higher = closed
#cv2.imshow("IBO", frame_crop) #cv2.imshow("IBO", frame_crop)
#if cv2.waitKey(1) & 0xFF == ord("q"): #if cv2.waitKey(1) & 0xFF == ord("q"):
# pass # pass
@ -221,7 +236,7 @@ class IntensityBasedOpeness:
self.data[int_y, int_x] = intensity # set value self.data[int_y, int_x] = intensity # set value
changed = True changed = True
else: else:
intensitya = max(data_val + 0.02, 1) # if current intensity value is less (more pupil), save that intensitya = max(data_val + 0.001, 1) # if current intensity value is less (more pupil), save that
self.data[int_y, int_x] = intensitya # set value self.data[int_y, int_x] = intensitya # set value
changed = True changed = True
@ -232,7 +247,7 @@ class IntensityBasedOpeness:
if intensity > self.maxval: # if current intensity value is more (less pupil), save that NOTE: we have the if intensity > self.maxval: # if current intensity value is more (less pupil), save that NOTE: we have the
self.maxval = intensity # set value at 0 index self.maxval = intensity # set value at 0 index
else: else:
intensityd = max(self.maxval - 0.02, 1) # continuously adjust closed intensity, will be set when user blink, used to allow eyes to close when lighting changes intensityd = max(self.maxval - 0.01, 1) # continuously adjust closed intensity, will be set when user blink, used to allow eyes to close when lighting changes
self.maxval = intensityd # set value at 0 index self.maxval = intensityd # set value at 0 index
# print(intensityd, intensity) # print(intensityd, intensity)
if newval_flg: if newval_flg:
@ -260,4 +275,21 @@ class IntensityBasedOpeness:
#@filter_eyeopen = (eyeopen + self.prev_val) / 2 #@filter_eyeopen = (eyeopen + self.prev_val) / 2
self.prev_val = eyeopen self.prev_val = eyeopen
try:
noisy_point = np.array([float(eyeopen), float(eyeopen)]) # fliter our values with a One Euro Filter
point_hat = self.one_euro_filter(noisy_point)
eyeopenx = point_hat[0]
eyeopeny = point_hat[1]
eyeopen = (eyeopenx + eyeopeny) / 2
# print(eyeopen, eyeopenx, eyeopeny)
except:
pass
if eyeopen - self.prev_val > 100:
print('BLINK')
eyevec = abs(self.prev_val - eyeopen)
#print(eyevec)
if eyevec > 0.4:
print("BLINK LCOK", eyeopen, eyevec)
print(intensity)
return eyeopen return eyeopen

View File

@ -28,8 +28,10 @@ class cal():
self.config.calib_XMIN = 69420 self.config.calib_XMIN = 69420
self.config.calib_YMAX = -69420 self.config.calib_YMAX = -69420
self.config.calib_YMIN = 69420 self.config.calib_YMIN = 69420
self.blink_clear = True
self.calibration_frame_counter -= 1 self.calibration_frame_counter -= 1
elif self.calibration_frame_counter != None: elif self.calibration_frame_counter != None:
self.blink_clear = False
self.settings.gui_recenter_eyes = False self.settings.gui_recenter_eyes = False
if cx > self.config.calib_XMAX: if cx > self.config.calib_XMAX:
self.config.calib_XMAX = cx self.config.calib_XMAX = cx