本周团队完成了部分业务逻辑,并研究了情绪分析的相关API的调用与手势识别的实现,并推进了视线识别模块的建设。
项目前后端总体框架搭建
整体上使用前后端分离的方式,后台利用springboot内嵌的tomcat作为服务器,来从数据库中抽取数据,前台则使用nginx作为服务器,负责将从后台提供的数据进行渲染,前后台使用约定好的json接口来进行通信,接口格式如下:
{
"code": 0, //如果为0表示成功,如果大于0表示用户输入不符合条件,小于0说明为服务器内部错误
"message": "success", //如果code为0可以忽略这一项,不为0则直接提示这里的信息
"object": [{ //如果code不为0则可以忽略这一项,否则从这里取出真实需要的数据
...
}]
}
这样做有诸多优势:
-
前后端真正解耦,前后端可以各自开发,只需要利用协定接口进行通信即可。
-
更容易的发现bug,由于前后端可能的问题有各自特点,因此可以比较容易的定位bug。
-
减少后端服务器的压力,静态资源由nginx服务器获取到,后端只需要获取数据相关的动态资源。
-
接口易于重用,由于后端返回的数据是json字符串,因此即使以微信作为前端也只需要解析字符串并渲染即可,无需修改后端代码。
具体的配置方式请参考团队成员博客:@zekdot。
运行项目之后效果如下:
情绪分析
情绪分析是我们功能之一,由于对情绪分析的性能要求没有达到实时性,所以我们打算使用Face++提供的API来实现情绪的分析,具体的API调用方式请参考团队成员博客:@米老鼠与刘老根。
试用的效果也是比较理想的:
情绪分析结果为:
情绪分析的结果为:
anger:愤怒——14.67%
disgust:厌恶——0.163%
fear:恐惧——0.163%
happiness:高兴——1.936%
neutral:平静——68.429%
sadness:伤心——14.67%
surprise:惊讶——11.633%
下一步就是讨论如何利用识别结果来对用户此次的阅读体验进行评价,比如每隔10s采集一次情绪,最后通过一定的算法计算出一个0~5之间的数值来对用户体验进行评价,从而能进一步的完成推荐的功能。
手势识别与技术实现
手势识别也是我们的功能模块之一,主要是在用户不方便使用鼠标或者键盘操作的情况下实现简单的阅读交互,这里我们主要使用opencv通过图像处理的方式来尝试实现,详情请见成员博客:@Jemary_
将图像二值化之后,可以通过分析多个帧的序列看出轮廓位置的整体运动趋势:
具体的实现算法如下:
- 对两帧图做差分得到新图像
- 新图像灰度化、二值化处理
- 用goodFeaturesToTrack函数得到最大特征值的角点
- 计算角点的平均点,存入队列中
- 维护一个固定长度的队列,队列满时计算队列中数据(点位置)的移动情况,来确定运动方向
可以看到测试结果中有明显的效果:
但是目前仍然存在一些问题,如果人也在动的话是有干扰的,无法精确的判断出手势,在下周的工作中,打算计划用图像处理的方式对背景做一些处理,尽量只保留手部的动作,来避免干扰造成的影响。
自制数据集与模型在web上运行
由于项目一开始我们找到的数据集不能有效的实现我们的需求,同时我们在github上找到了一个类似的利用眼睛图片来得到注视的屏幕坐标的CNN项目lookielookie,但是美中不足的是,它是直接利用浏览器的CPU进行训练的,此外它只使用了部分眼睛图片来进行学习,用于学习的信息比较少。
综上,我们决定仿照lookielookie的方式来采集数据,然后从本地利用python下的tensorflow训练出模型,然后再将模型移植到浏览器下去运行,具体过程可以参考成员博客:@AFXBR
在python下训练的效果如下:
下一步就是想办法将脸部图像也作为训练数据,然后采集数据、训练模型。