特别说明:本次实验步骤大部分来源于http://blog.csdn.net/wjmishuai/article/details/50658670
1、caffe环境配置
主要参考:《深度学习 21天实战Caffe》
2、VGG人脸识别模型资料(提供论文和以及训练完的人脸模型)
http://www.robots.ox.ac.uk/~vgg/software/vgg_face/
3、LMDB数据集的获取
- 数据集划分
#保存图片的路径 PATH=/media/img echo "start..." #遍历文件夹 for name in $PATH/webface_img/*;do var=0 #遍历文件夹中的图片 for file_name in $name/*;do var=$(($var+1)); str=$file_name #保存图片路径 str=${str#*img} #保存图片lable lable=${str#*/} lable=${lable%%/*} if [ "$var" = "1" ] || [ "$var" = "3" ] || [ "$var" = "5" ]; then #验证集 echo $str" "$lable>>/home/gk/val.txt else #测试集 echo $str" "$lable>>/home/gk/train.txt fi done done echo "Done."
- 转换为LMDB格式
#保存生成的lmdb的目录 EXAMPLE=/media/gk/img #train.txt和val.txt所在的目录 DATA=/home/gk #转换图片的工具所在的目录 TOOLS=/home/gk/caffe-master/build/tools #图片所在的目录 TRAIN_DATA_ROOT=/media/gk/img/webface_img VAL_DATA_ROOT=/media/gk/img/webface_img # 设置 RESIZE=true 可以把图片resize成想要的尺寸。 RESIZE=true if $RESIZE; then RESIZE_HEIGHT=227 RESIZE_WIDTH=227 else RESIZE_HEIGHT=0 RESIZE_WIDTH=0 fi echo "Creating train lmdb..." GLOG_logtostderr=1 $TOOLS/convert_imageset \ --resize_height=$RESIZE_HEIGHT \ --resize_width=$RESIZE_WIDTH \ --shuffle \ $TRAIN_DATA_ROOT \ $DATA/train.txt \ $EXAMPLE/train_lmdb echo "Creating val lmdb..." GLOG_logtostderr=1 $TOOLS/convert_imageset \ --resize_height=$RESIZE_HEIGHT \ --resize_width=$RESIZE_WIDTH \ --shuffle \ $VAL_DATA_ROOT \ $DATA/val.txt \ $EXAMPLE/val_lmdb echo "Done."
4、mean文件,计算图像均值
#lmdb格式的文件所在的路径 EXAMPLE=/media/gk/img/lmdb_webface #均值文件保存的路径 DATA=/media/gk/44CA719BCA718A46 #转换图片的工具所在的目录 TOOLS=/home/gk/caffe-master/build/tools $TOOLS/compute_image_mean $EXAMPLE/train_lmdb \ $DATA/mean.binaryproto echo "Done."
5、模型训练
./build/tools/caffe train --solver=models/bvlc_reference_caffenet/solver.prototxt
- 主要是训练模型参数文件(slover.prototxt)和网络模型结构配置文件(tarin.prototxt)的编写。
6、模型的测试
- 参考:
http://nbviewer.jupyter.org/github/BVLC/caffe/tree/master/examples/
http://blog.csdn.net/wjmishuai/article/details/50854168
- 主要代码
//模型加载 net=caffe.Classifier('/home/gk/caffe-master/examples/VGG_net/deploy.prototxt', '/home/gk/caffe-master/examples/VGG_net/VGG_face.caffemodel') def compar_pic(path1,path2): global net #加载验证图片 X=read_image(path1) test_num=np.shape(X)[0] #X 作为 模型的输入 out = net.forward_all(data = X) #fc7是模型的输出,也就是特征值 feature1 = np.float64(out['fc7']) feature1=np.reshape(feature1,(test_num,4096)) #加载注册图片 X=read_image(path2) #X 作为 模型的输入 out = net.forward_all(data=X) #fc7是模型的输出,也就是特征值 feature2 = np.float64(out['fc7']) feature2=np.reshape(feature2,(test_num,4096)) #求两个特征向量的cos值,并作为是否相似的依据 predicts=pw.cosine_similarity(feature1,feature2) return predicts def read_image(filelist): averageImg = [129.1863,104.7624,93.5940] X=np.empty((1,3,224,224)) word=filelist.split('\n') filename=word[0] im1=skimage.io.imread(filename,as_grey=False) #归一化 image =skimage.transform.resize(im1,(224, 224))*255 X[0,0,:,:]=image[:,:,0]-averageImg[0] X[0,1,:,:]=image[:,:,1]-averageImg[1] X[0,2,:,:]=image[:,:,2]-averageImg[2] return
7、模型的微调
参考:http://blog.csdn.net/hlx371240/article/details/51388022