天天看点

MobileNet实战:基于 MobileNet 的人脸微表情分类(Caffe)MobileNet实战:基于 MobileNet 的人脸微表情分类(Caffe)

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。

MobileNet实战:基于 MobileNet 的人脸微表情分类(Caffe)MobileNet实战:基于 MobileNet 的人脸微表情分类(Caffe)

通过这种办法,最后得到的 ROI 的图片大概都在 100x100 左右,四类表情,总共 15106 张图片。然后选取 10%(1510 张) 作为测试集。

另外 caffe 提供的图像均值计算工具都是针对 lmdb 格式的数据的,如果我们直接采用 list 的形式输入的话,就需要自己写代码计算了。shuffle 数据,分割训练和测试集,以及计算图片均值的代码都可以在上面的 github 中找到。

3. 模型设计

这里主要是为了熟悉 MobileNet,所以模型选择上没有什么好说的,就是 MobileNet。但是我们看一下 MobileNet 的网络结构,从 V1 到 V3 都是输入 224 ∗ 224 224*224 224∗224 的图片,最后得到 7 ∗ 7 7*7 7∗7 的 feature,也就是说 MobileNet 模型的 s t r i d e = 224 / 7 = 32 stride = 224/7 = 32 stride=224/7=32,而我们得到的图片大小在 100 ∗ 100 100*100 100∗100 左右,假设我们的图片大小为 96 ∗ 96 96*96 96∗96(因为96是32的倍数),那么我们做后的 feature size 为 3 ∗ 3 3*3 3∗3,显然这也太小了,而且我们这里的分类也比较简单,所以最后综合考虑,只借用 MobileNet conv5_5 及之前的结构,这样最后得到的 feature size 为 6 ∗ 6 6*6 6∗6,与原网络比较接近。当然直接从全局来修改模型也是可以的,但是显然采取截取的方法更为简单。

另外为了得到比较好的结果,我们可以采用已经在 ImageNet 上训练好的权重来初始化我们的网络,也就是所谓的迁移学习。其实这个背后就是把已经训练好的权重 copy 到我们新的网络上来,然后接着跑,而 copy 的原则就是根据 layer 的名字,所以在我们的网络中从 data 层开始到 conv5_5 保持不变就可以了,但是从 c o n v 5 5 conv5_5 conv55​ 之后我们需要重新命名。

MobileNet实战:基于 MobileNet 的人脸微表情分类(Caffe)MobileNet实战:基于 MobileNet 的人脸微表情分类(Caffe)

4. 数据增强

我们实际输入模型的图片大小在上面已经确定了,就是 96 ∗ 96 96*96 96∗96,但是我们经常会采用图片裁剪的方式来对数据进行增强,借鉴很多做法是从256裁剪到224,这里我们把所有的图片 resize 到 128 ∗ 128 128*128 128∗128,然后再裁剪到 96 ∗ 96 96*96 96∗96,最后输入模型。另外可以用 caffe-augmentation 这个版本的 caffe,里面有更多的增强设置。

5. 训练

训练的时候我们需要保存好 log,方便后面可视化训练结果。下面是我训练后得到的 loss 和 acc 的数据所绘制的图形,从图中可以看到,训练到 3000次迭代时就已经基本稳定了,所以对于分类任务,一般是建议训练10个左右的 epoch 就可以了。

MobileNet实战:基于 MobileNet 的人脸微表情分类(Caffe)MobileNet实战:基于 MobileNet 的人脸微表情分类(Caffe)
MobileNet实战:基于 MobileNet 的人脸微表情分类(Caffe)MobileNet实战:基于 MobileNet 的人脸微表情分类(Caffe)

6. 测试

前面我们已经划分了训练集和测试集,具体代码可以参考github。

继续阅读