基于深度学习的表情识别服务搭建(一)
背景
之前我完成了终端和服务端之间交流的全部内容,接下来我需要完成的是服务端识别线程的功能。完成之后,我们的系统应该就剩下前端和优化工作了
识别服务设计
我们称之为服务,是因为它并不能很好的和我们现有的系统无缝拼接,因为这个模块主要由Python实现,但是我们服务端最多只能是PHP+Java,我们的设计是这个样子的:
- 后台的Java+PHP负责从终端和web端接受音频图片或上传的视频,而识别服务仅仅完成对已有图片的处理
- 后台和识别服务通过网络方式通信,后台将从用户处接受到的文件名发送给识别服务,识别服务打开这些文件,完成识别,并将识别结果以json的格式发送给后台
有了具体框架,我们还需要定义识别服务的功能:
- 找出图片中每一张脸的位置
- 对图片中人脸的朝向进行分析
- 对人脸的表情进行分析
那么我们就清楚了我们如何去实现这一系列功能
实现方式的选择
经过前期组内的研究,人脸识别应该使用caffe,darknet中虽然有相关的网络,但是darknet的输入只能是彩色图片,而人脸表情特征实际上使用黑白图片就能表述清楚,由于对框架了解不够深入,不知如何做出调整,所以我们先使用功能完善,组内熟悉的Caffe完成表情分类
在寻找脸部方位检测方法的时候我们找到了dlib,这个东西其实是挺不错的,有许多功能,包括人脸检测,头部位置检测,鉴于我们不得不使用它,并考虑到组内其他同学调试方便(如果直接使用darknet的话问题会比较有趣,因为组内所有同学中只有我的电脑有独立显卡,而darknet由于不成熟的原因并不支持传统的CPU加速方法,完成一张图片的检测,GPU只需几十毫秒,而CPU需要80秒),我们决定先完全使用dlib+caffe完成一套系统,darknet过一段时间再考虑
总结一下我们的选择:
- 人脸检测:darknet(dlib)
- 头部位置识别:dlib
- 表情分类:caffe
dlib性能验证
经过我们的研究,dlib中人脸检测使用的是图形学方法,这在光线不均匀的情况下效果极差,表现为一下状态:


这样可以很明显的看出问题,但是基于深度学习方法的darknet似乎没有这样的烦恼

原本darknet的人脸检测框的没有这么方正,我对框选算法进行了一下修改,具体改动将在后续接入darknet的文章中详细介绍
功能实现
类定义:
class HPD():
# 3D facial model coordinates
landmarks_3d_list = [
np.array([
[0.000, 0.000, 0.000], # Nose tip
[0.000, -8.250, -1.625], # Chin
[-5.625, 4.250, -3.375], # Left eye left corner
[5.625, 4.250, -3.375], # Right eye right corner
[-3.750, -3.750, -3.125], # Left Mouth corner
[3.750, -3.750, -3.125] # Right mouth corner
], dtype=np.double),
np.array([
[0.000000, 0.000000, 6.763430], # 52 nose bottom edge
[6.825897, 6.760612, 4.402142], # 33 left brow left corner
[1.330353, 7.122144, 6.903745], # 29 left brow right corner
[-1.330353, 7.122144, 6.903745], # 34 right brow left corner
[-6.825897, 6.760612, 4.402142], # 38 right brow right corner
[5.311432, 5.485328, 3.987654], # 13 left eye left corner
[1.789930, 5.393625, 4.413414], # 17 left eye right corner
[-1.789930, 5.393625, 4.413414], # 25 right eye left corner
[-5.311432, 5.485328, 3.987654], # 21 right eye right corner
[2.005628, 1.409845, 6.165652], # 55 nose left corner
[-2.005628, 1.409845, 6.165652], # 49 nose right corner
[2.774015, -2.080775, 5.048531], # 43 mouth left corner
[-2.774015, -2.080775, 5.048531], # 39 mouth right corner
[0.000000, -3.116408, 6.097667], # 45 mouth central bottom corner
[0.000000, -7.415691, 4.070434] # 6 chin corner
], dtype=np.double),
np.array([
[0.000000, 0.000000, 6.763430]

本文介绍了基于深度学习的表情识别服务的搭建过程,包括选择使用dlib进行人脸检测,利用caffe进行表情分类。文章讨论了dlib在光线不均匀情况下的性能问题,并提及未来将接入darknet以提升性能。此外,还概述了实现该服务的类定义、辅助函数以及执行文件的基本功能。
最低0.47元/天 解锁文章
4784

被折叠的 条评论
为什么被折叠?



