MobileNet实战:基于 MobileNet 的人脸微表情分类(Caffe)
这一部分内容总共由下面四篇文章组成:
- MobileNet 进化史: 从 V1 到 V3(V1篇)
- MobileNet 进化史: 从 V1 到 V3(V2篇)
- MobileNet 进化史: 从 V1 到 V3(V3篇)
- MobileNet实战:基于 MobileNet 的人脸表情分类
1. 前言
前面我们已经简要介绍了 MobileNet 的版本演进,这一篇我们将利用 MobileNet 来完成一个简单的人脸微表情分类项目。说的更具体一点这里用嘴唇来区分不同的为表情,也就是根据嘴型来做分类———无表情,微笑,大笑和嘟嘴,这四类微表情。
如果说这个项目是在探讨如何进行表情分类,显然是不合格的。这里只是举一个实战的例子,依附这个例子来说明是如何一步步思考的,因此也完全可以换成其他的任务。另外这里用的是 mobilenet V1,主要是 V1 可以找到比较齐全的资料,比如训练网络,部署网络,预训练好的参数等。
本文的人脸微表情分类项目来源于 言有三 的 《深度学习之图像识别》一书,在此基础上进行了补充和完善。本文中的所有代码都可以在 github 中获取。
2. 数据集
人脸相关的开源数据集很多,关于表情识别的也有一些,比如 GENKI 等。如果没有合适的也可以自己录或者爬,这里关于数据的搜集就不多说了。
下面我讲一下图片的特征的提取,因为我们做的是基于嘴唇的微表情(也可以理解为就是嘴唇)的分类任务,所以我们需要从人脸图片中提取出嘴唇这个局部特征。这里基于 opencv 来做这个任务,opencv 中至少有两个方法可以做这个任务。
- 用 haarcascade_smile 模型来检查,但是这个效果不是太好
- 用 Dlib 关键点检查,找到嘴唇的标记点,用一个矩形画出 bounding box, 最后将这个 bbox 放大 λ \lambda λ 倍(这里用的 1.5 ),进行裁剪得到最后的样本。
这里采用第二种方法,完整的代码可以参考 github。下图中黄色是检测到的嘴部的 ROI,绿色是最后放大 1.5 倍后的 ROI。
通过这种办法,最后得到的 ROI 的图片大概都在 100x100 左右,四类表情,总共 15106 张图片。然后选取 10%(1510 张) 作为测试集。
另外 caffe 提供的图像均值计算工具都是针对 lmdb 格式的数据的,如果我们直接采用 list 的形式输入的话,就需要自己写代码计算了。shuffle 数据,分割训练和测试集,以及计算图片均值的代码都可以在上面的 github 中找到。
3. 模型设计
这里主要是为了熟悉 MobileNet,所以模型选择上没有什么好说的,就是 MobileNet。但是我们看一下 MobileNet 的网络结构,从 V1 到 V