- 小D博士
- 2021年9月26日
- 讀畢需時 2 分鐘
一、前言
mediapipe模块还提供了面部468个特征点的检测,所以拿来试试做一个面部表情的检测。
这次要实现两个目标:
1.面部检测
2.微笑表情检测
二、算法原理
1.面部检测
依旧是采用谷歌的mediapipe模块来获取面部的468个特征点。然后根据需要提取出我们想要的特征点坐标。
※确定468个特征点分别是脸部的哪个位置,实在是个比较繁琐的工作。
2.微笑表情检测
微笑表情的话,其实网上有很多范例,但是大多都是基于嘴巴裂开的程度以及眼睛眉毛的位置变化来检测。虽然也可以实现,但是感觉精度并不是很高。
于是本人淡定的对着镜子揣摩了几天,有了以下思路:
①微笑的时候,嘴巴并不会张开,眉毛眼睛也并不会动。
②无论微笑或者大笑,只要你笑,你的法令纹必然会出现。(很残酷的事实)
基于以上两点,我决定通过提取法令纹部位的像素值,然后检测法令纹是否出现来判定是否在笑,再通过嘴部张开的程度来判定是大笑或者微笑。

以古帅的脸为例,就是要采集左边两个红点连线以及右边两个红点连线上的像素值,并且判断像素值大小的标准偏差。偏差越大说明法令纹越深,于是可以判定为笑。然后再通过上下嘴唇的高度差来判定嘴巴张开的大小。嘴巴张开很大就表示在大笑,嘴巴没有张开表示在微笑。
※如果对每一帧的检测结果都作为最终结果的话,会导致输出很不稳定(微弱的光强变化都有可能引起结果差异),所以我通过每10帧图像里面哪个结果多就作为最终输出。比如10帧图像里面微笑最多,则最终输出结果为微笑。
三、效果视频
效果还不错,完美的检测到三个表情。(由于本人太丑,就只有面部轮廓图,其余全部屏蔽掉)
※顺便吐槽一下反人类的美颜,在高级美颜的加持下,人在微笑的时候法令纹竟然会消失。。。这不科学
四、总结
如果测试环境固定的话精度还不错,但是如果想要在任意环境下也达到高精度,就需要依赖深度学习,但是深度学习又需要大量数据来训练,等以后有时间再做。
五、源码
https://www.deepvisionzero.com/download
※图像处理第5弹
Comments