本例通过 TensorFlow 构造卷积神经网络,做表情识别的测试。
输入数据可以从http://download.csdn.net/user/shinian1987上下载FER-2013 这个数据库, 一共有 35887 张人脸灰度图像的数据,每张分辨率48*48,已经做好了csv文件,每张图片的表情由0~6数字表示,分别代表(0=Angry, 1=Disgust, 2=Fear, 3=Happy, 4=Sad, 5=Surprise, 6=Neutral)。下载数据后,解压,将文件fer2013.csv放入和程序同一级目录下的'data'文件夹中即可。如果感兴趣可以把每张图像用PIL或者cv2库还原保存在本地,如下所示。
为了计算方便,本例中用其中的 30000张图像做训练,5000张图像做测试集,我们建立一个3个convolution layer 以及 3个 pooling layer 和一个 FC layer 的CNN 来做训练(再添加一级FC应该会更好些)。
CNN网络结构如下所示:
input -> conv 1 -> pool 1 -> conv 2 -> pool 2 -> conv 3 -> pool 3 -> fc 1 -> out
input -> 48×48
conv 1 -> filter size: 3×3, “SAME” padding, output: 48×48
pool 1 -> filter size: 2×2, output: 24×24
conv 2 -> filter size: 3×3, “SAME” padding output: 24×24
pool 2 -> filter size: 2×2, output: 12×12
conv 3 -> filter size: 3×3, “SAME” padding output: 12×12
pool 3 -> filter size: 2×2, output: 6×6
fc 1 -> hidden nodes: 200, output: 1×100
out -> 1×2
剩下直接上代码,代码很简单,试验环境是python3.6, tensorflow1.2.0,程序已经调通,复制粘贴就可以跑。感谢万水千山先生的无私分享宝贵知识,欢迎大家踩他,http://blog.csdn.net/matrix_space,他使用的是python2和老版本的tensorflow的搭建系统,有些过去有效的函数在新版本的tensorflow需要修改。
程序的算法总流程如下:
1. 先读csv数据
2. 将其中label和图像部分分别获取并保存,设置batch,方便训练网络时喂数据。
3. 构建CNN网络。
4. 训练,跑起来就可以去睡了,设置了跑100轮,要很长很长时间,电脑比较老,CPU(i5)的四个线程几乎一直满负荷,8G内存占用约5G左右,我的显卡是A卡,GPU还不支持,估计使用N卡同时使用GPU会好很多。
5. 验证。