glefundes / mobile-face-gaze

Lightweight gaze estimation with PyTorch.
GNU General Public License v2.0
94 stars 19 forks source link

Filtering the gaze vector #3

Open darkcurrent opened 3 years ago

darkcurrent commented 3 years ago

Gaze vector coordinates can be filtered over time with a low-pass filter. @berndporr's approach is very easy to use. Efficient realtime IIR filter in Python

If I try to write a short example in order to low pass filter the gaze vector movements over time:

import iir_filter
from scipy import signal

# Lets say you are using Face Mesh as face detector and landmark generator.
# In this way the FPS can be fixed for example to 20Hz.
FPS = 20 #Hz
f_nyquist = FPS/2 #Hz
cutoff_freq=2 #Hz
order=2 #Order of lp filter

sos = signal.butter(N=order, Wn=cutoff_freq/f_nyquist , btype='low', fs=FPS, output='sos')
filter_gaze_vec_0 = iir_filter.IIR_filter(sos) # first lp filter class for gaze vector first element
filter_gaze_vec_1 = iir_filter.IIR_filter(sos) # second lp filter class for gaze vector second element

while True:
    ret, frame = cap.read()
    ...
    ...
    # On every frame, gaze vector points are filtered.
    # Previous IIR coefficients are stored in the filter classes separately.
    # Every new value is filtered...
    sample_gaze_vec_0 = filter_gaze_vec_0.filter(sample_gaze_vec_0) 
    sample_gaze_vec_1 = filter_gaze_vec_1.filter(sample_gaze_vec_1)