摘要
通过人脸图片对表情进行识别,受人脸姿态等其他因素地影响很大,如果达到80则是一个不错地成绩,但是该任务不仅仅是一个分类问题。
1 数据
在实际的任务中图片的脸部是不规整的,可能是一个人或者多个人;图片的大小可能不统一;数据集较大,数量庞大,不能一次性输入内存进行计算,而应该分批。
1.1 数据存储方法
形式一: 同一类的图片放到同一个文件夹下,文件夹以类别进行命名,如下图所示。
形式二: 两个文件夹,一个文件夹存放图片数据(非结构化数据),另一个CSV文件存储标签和路径。CSV文件中每一行以逗号隔开,左侧存储图片的地址,右边存储图片对应的标签。
1.2 数据探索
利用python脚本对数据进行探索,统计不同种类数据的数量,即获得样本数。主要利用OS库中的listdir和isdir函数。
import os
import numpy as np
lst_dir = os.listdir('./') #返回该路径下的所有子文件,获得一个list
for path in lst_dir:
if os.path.isdir(path): # 看遍历的path是一个文件夹还是一个文件,如果是文件夹继续
lst_jpg = os.listdir(path) # 获得path文件夹下的所有子文件
print(len(np.unique(lst_jpg))) # 通过np的unique对文件进行选择,过滤重复文件
2 Pipline的制定
对于CV方向利用openCV和python的框架进行。什么是Pipline?中文意思是管道,也就是制定一个处理流程。对于当前表情识别可按照下图指定Pipline。第一部分为数据预处理,第二部分为数据建模,而且第一部分数据预处理占用大部分时间,模型上一般利用现有模型。
1、截取人脸: 利用传统方法进行,这样速度很快。可以利用openCV或者face orgnal包。但是截取的人脸大小可能是不同的。
2、缩放和裁剪: 设置固定值,强行进行缩放可能造成脸部变形。这样就需要将缩放与裁剪相结合,找到最长或最短的一个维度,按照最短的放缩,然后再进行一个裁剪就会减小形变。
3、图片格式转换: 现有图片是一个RGB图片,但是我们不关注颜色,只关注脸部的形变,因此可以将其转化为灰度图片。对于PNG格式图片多了alpha通道,表示透明度。因此输入图片时要检查图片格式是否相同,通道数是否相同。
4、训练集划分: 在划分训练集时要划分出一个验证集,以评估训练的效果。
5、数据加载: 加载数据时应该分批加载,而不应该一股脑扔进内存,占用大量内存。
6、深度学习模型: 首先选择网络结构;然后设计损失函数,分类可以用交叉熵;再确定优化方法,利用Adam、SGD等。
7、模型训练: 模型训练时一般会用到数据增强,在数据加载后进行随机数据增强,一般放在数据加载与深度学习模型中间。加载数据后进行增强,然后输入模型进行训练。