《基于caffe的表情识别》系列文章索引:http://blog.csdn.net/pangyunsheng/article/details/79434263
一、编译pycaffe
caffe提供了python、matlab、C++等语言的接口,这里我们使用python进行测试就需要先编译python接口,也就是编译pycaffe,我在之前给出的安装编译caffe的教程中,包含了编译pycaffe的内容,如果读者是在ubuntu16.04下编译,可以直接看我的教程:http://mp.blog.csdn.net/postedit/79418896,如果是其他操作系统或其他版本,百度解决一下,这里就不多介绍了。只有编译了pycaffe,才能使用python接口。
二、编写用于测试的网络结构deploy.prototxt
在第三篇文章【深度学习】基于caffe的表情识别(三)中讲到:在搭建网络结构时,需要用到3个文件,我们现在只用到了其中的两个,还有一个deploy.prototxt文件就是今天要介绍的,测试时用到的网络结构。
deploy.prototxt与train_val.prototxt的内容基本一致,只是结构稍微有点不同,因为是同一个模型的两个网络结构,一个用于训练阶段,一个用于测试,所以两者不会有太大区别。
在第三篇文章给出的链接https://pan.baidu.com/s/146EWRldMfRcyvIxtPYeceA中也给出了deploy.prototxt文件,大家可以下下来看一下它与train_val.prototxt文件的区别。
三、使用python测试
1.把caffemodel模型下载到本地
之前我们在DevCloud上已经训练好了用于表情识别的模型,现在要把它下载到本地,用于一会儿的测试。
1)首先用ssh colfax指令登陆到DevCloud
2)查看训练好的caffemodel模型
3)在本地使用scp命令将DevCloud上的caffemodel文件下载到本地,用下面指令:
scp colfax:/home/u12067/faceR/myfacialnet_iter_200000.caffemodel faceR/predict/
其中/home/u12067/faceR/myfacialnet_iter_200000.caffemodel是我caffemodel在DevCloud上的路径,testpy是我在本地根目录下创建的一个文件夹。
2.编写python程序,测试模型
创建一个名为testfn.py的python文件,加入下面代码:
#coding=utf-8
import caffe
import numpy as np
def faceRecognition(imagepath):
root='faceR/' #根目录
deploy=root + 'model/deploy.prototxt' #deploy文件
caffe_model=root + 'predict/myfacialnet_iter_200000.caffemodel' #训练好的 caffemodel
img=root + 'predict/' + imagepath
labels_filename = root + 'data/labels.txt' #类别名称文件,将数字标签转换回类别名称
net = caffe.Net(deploy,caffe_model,caffe.TEST) #加载model和network
#图片预处理设置
transformer = caffe.io.Transformer({'data': net.blobs['data'].data.shape}) #设定图片的shape格式(1,1,42,42)
transformer.set_transpose('data', (2,0,1)) #改变维度的顺序,由原始图片(42,42,1)变为(1,42,42)
#transformer.set_mean('data', np.load(mean_file).mean(1).mean(1)) #减去均值,前面训练模型时没有减均值,这儿就不用
transformer.set_raw_scale('data', 255) # 缩放到【0,255】之间
net.blobs['data'].reshape(1,1,42,42)
im=caffe.io.load_image(img,False)#加载图片
net.blobs['data'].data[...] = transformer.preprocess('data',im)#执行上面设置的图片预处理操作,并将图片载入到blob中
#执行测试
out = net.forward()
labels = np.loadtxt(labels_filename, str, delimiter='\t') #读取类别名称文件
prob= net.blobs['prob'].data[0].flatten() #取出最后一层(Softmax)属于某个类别的概率值,并打印
order=prob.argsort()[-1] #将概率值排序,取出最大值所在的序号
face=labels[order]
return face #face是最终识别的表情
face=faceRecognition('00014.jpg')
print("您的表情是:"+face)
3.运行程序,测试结果
运行刚刚编写的python程序:
python faceR/predict/testfn.py
得到输出结果:
这个图片是我在测试集的第7个文件夹中随机抽取的,也就是说它的真实表情应该是中性,与我们的模型预测出的结果一致!!
到这里,整个基于caffe的表情识别实验就已经完成了,但是就目前的实验来讲,这并不是最好的模型,还要再加入一些算法上和技巧上的改变才能进一步提高该模型的准确率,但是这就是基于caffe的深度学习模型的完整流程,希望能对一些刚刚入门caffe的新手起到一些帮助,如果有错误还请大家原谅并指出,希望与大家共同学习!
下一篇我还将要介绍一个小方法,即使用opencv中的人脸检测,检测出一张图片的人脸部分并裁剪,然后输入到我们的模型中进行预测。