EyeLoop基于Python的眼动仪(超棒)
https://github.com/simonarvin/eyeloop
这个开源的眼动仪是我最喜欢的,是我主要读的一份源码:
首先是漂亮的眼动示意图
特点
在非专用硬件上高速> 1000 Hz(无需专用处理单元)。
模块化,可读性,可定制性。
开源,完全是Python 3。
可在任何平台上使用,易于安装。
它是如何运行的
EyeLoop由两个功能模块组成:引擎和可选模块。引擎执行眼动追踪,而模块执行可选任务,例如:
实验
数据采集
将视频序列导入引擎
这些模块从引擎导入或提取数据,因此分别称为Importers和Extractors。
EyeLoop最吸引人的功能之一是其模块化:通过将模块与核心引擎结合在一起,即可轻松建立实验。因此,引擎只有一项任务:根据导入的序列计算眼动数据,并提供生成的数据以进行提取。
引擎
引擎按照视频流顺序处理视频的每一帧。首先,用户选择角膜反射,然后选择瞳孔。通过高斯核对帧进行二值化,滤波和平滑处理。然后,引擎利用算法检测轮廓。这将产生一个点矩阵,将其过滤以丢弃不匹配项。使用角膜反射,可以消除角膜反射和瞳孔之间的任何重叠。最后,通过拟合模型对形状进行参数化:椭圆形(适用于啮齿动物,猫等)或圆形模型(人类,非人类灵长类动物,啮齿动物等)。目标物种很容易更改:
python eyeloop/run_eyeloop.py --model circular/ellipsoid
最后,数据以JSON格式格式化,并传递给所有模块,例如用于渲染,数据采集和实验。
形状处理器
EyeLoop的引擎与Shape类进行通信,该类处理罢工轮廓检测。因此,至少两个形状的由实例化器,一个用于光瞳和定义Ñ为角膜反射:
class Engine:
def __init__(self, ...):
max_cr_processor = 3 #max number of corneal reflections
self.cr_processors = [Shape(self, type = 2) for _ in range(max_cr_processor)]
self.pupil_processor= Shape(self)
...
导入
为了使用视频序列进行眼动跟踪,我们使用导入程序类作为EyeLoop引擎的桥梁。import从摄像机或从目录中脱机获取视频序列,然后将其导入。简而言之,导入程序主类IMPORTER
包括旋转,调整大小和保存视频流的功能。另外,它通过传递必要的变量来配置引擎。
为什么要使用import?
使用import类而不是视频输入“内置”的原因是为了避免不兼容。例如,虽然大多数网络摄像机都与opencv(进口商cv)兼容,但基于Vimba的摄像机(Allied Vision摄像机)却不兼容。因此,通过模块化图像帧的导入,EyeLoop可以轻松集成到明显不同的设置中。
进口商
大多数相机与cv导入器兼容(默认)。
Allied Vision相机需要基于Vimba的进口商,即vimba。
建立您的第一个自定义进口商
要构建我们的第一个自定义导入器,我们实例化Importer类:
class Importer(IMPORTER):
def __init__(self) -> None:
self.scale = config.arguments.scale
在这里,我们定义关键变量,例如缩放比例。然后,我们加载第一帧,获取其尺寸,最后武装引擎:
...
(load image)
width, height = (image dimensions)
self.arm(width, height, image)
最后,该route()
函数加载视频帧并将它们按顺序传递给引擎:
def route(self)-> None:
def route(self) -> None:
while True:
image = ...
config.engine.update_feed(image)
self.frame += 1
(可选)添加一个release()
函数来控制导入过程的终止:
def release(self) -> None:
terminate()
https://github.com/simonarvin/eyeloop/blob/master/eyeloop/extractors/README.md
其实文章到这里就已经完结了,从这里看到的都是补的内容。补一点关于安装的内容。
我们将完整的库克隆下来后,结构是这样的
python.exe -m pip install -r .\requirements.txt
然后执行这个命令
安装这些依赖库,具体里面的库。在我其他的文章里面会有
pip install .
或者是执行这个命令也是可以的
ERROR: Package 'eyeloop' requires a different
Python: 3.6.5 not in '>=3.7'
就是发生了这个事情,挺突然的