想法的产生
最近总康到一些眼球追踪仪的评测视频,可以直接用人眼当鼠标,可是一上网搜这玩意儿的价格,发现都是上千的,于是就想着自己的电脑摄像头能不能实现这个功能,在网上搜索了一番后,只搜到了一个Lookie Lookie的repo能实现这个功能,尝试了一下赶脚不太精准,于是产生了写程序的邪恶念头
思路
首先要让摄像头定位到眼睛,那就需要人脸的检测模型,用现成的轮子是最为省事的方法。在全球最大的同性恋网站搜索实践了一番后,发现TadasBaltrusaitis的OpenFace检测最为精准(注意不是cmusatyalab的,链接)
不过这个项目是用C++写的,为了建神经网络方便,我还是准备用Python(程序对接就成了一大难题)
获取了人脸、眼睛数据后,还需要获取输出部分的原始数据以进行训练。这里我参考前文提到的Lookie Lookie,使用鼠标的坐标作为输出数据,通过鼠标点击进行数据的采集,这样在进行模型训练的时候就得眼睛盯着鼠标的坐标点击左键
因为需要一边进行数据的采集,一边进行神经网络的训练,所以我使用了PyTorch模块建立神经网络模型
人脸数据采集
在查阅了TadasBaltrusaitis的OpenFace的wiki后,我基本确定了在python中使用这个程序的思路。
首先,此程序可以使用命令进行单帧图像的数据采集,命令格式很简单,只需要确定输入图片以及输出路径即可。结合Python的cv2模块和subprocess模块,我编写了一个将摄像头图像保存,再使用openface进行处理输出数据,完毕后再使用python将输出的csv数据文件进行读取,并保存至全局变量data中。
在此之后我又仔细阅读了openface的wiki,弄懂了csv数据文件的各个部分,又写了筛数据、归一化的函数。
程序对接、人脸数据采集问题就此解决
鼠标点击坐标数据采集
这一部分相对较为简单,我使用了pywin32、PyHook3模块进行鼠标点击事件的监听以及坐标数据的获取。
神经网络模型建立及训练
这一部分我将归一化、预处理后的data作为输入,鼠标点击坐标作为输出,建立了一个BP神经网络,使用的是Relu激活函数,我整了六层,输入层有17个节点,隐含层有20个节点,输出层就是辣两个坐标。
每点击一次鼠标即进行一次训练,会输出模型预测的坐标和真实的坐标,已衡量模型的优劣
结果
结果GG了,训练时模型的输出几乎就是我历史点击坐标的平均值,起初我觉得是激活函数问题,在进行过几次更换之后还是不行