[人脸识别]使用VGG Face Model对一张图片进行测试
2017-09-30 16:24
721 查看
如果你已经按照上一篇的步骤做好了训练过程,那么你会得到一个名为VGG_FACE.caffemodel的模型,下面我们来对该模型进行测试。
需要注意的是在342行num_output,你需要修改为训练的种类数。
而deploy.prototxt与VGG_FACE_deploy.prototxt的区别,推荐参考:
http://blog.csdn.net/fx409494616/article/details/53008971
运行上述python代码,会打印出该图片属于的种类。
本部分参考:http://www.cnblogs.com/Allen-rg/p/5834551.html
一、新建配置文件
在测试之前我们需要新建一个配置文件,该配置文件与VGG_FACE_deploy.prototxt比较相像,但还是有点不一样。上篇中的VGG_FACE_deploy.prototxt是为了训练模型,而我们需要新建的配置文件是为了测试模型。你可以复制一份VGG_FACE_deploy.prototxt并且命名为deploy.prototxt,deploy.prototxt内容如下:(推荐直接复制)name: "VGG_FACE_16_Net" input: "data" input_dim: 1 input_dim: 3 input_dim: 224 input_dim: 224 force_backward: true layer { name: "conv1_1" type: "Convolution" bottom: "data" top: "conv1_1" convolution_param { num_output: 64 kernel_size: 3 pad: 1 } } layer { name: "relu1_1" type: "ReLU" bottom: "conv1_1" top: "conv1_1" } layer { name: "conv1_2" type: "Convolution" bottom: "conv1_1" top: "conv1_2" convolution_param { num_output: 64 kernel_size: 3 pad: 1 } } layer { name: "relu1_2" type: "ReLU" bottom: "conv1_2" top: "conv1_2" } layer { name: "pool1" type: "Pooling" bottom: "conv1_2" top: "pool1" pooling_param { pool: MAX kernel_size: 2 stride: 2 } } layer { name: "conv2_1" type: "Convolution" bottom: "pool1" top: "conv2_1" convolution_param { num_output: 128 kernel_size: 3 pad: 1 } } layer { name: "relu2_1" type: "ReLU" bottom: "conv2_1" top: "conv2_1" } layer { name: "conv2_2" type: "Convolution" bottom: "conv2_1" top: "conv2_2" convolution_param { num_output: 128 kernel_size: 3 pad: 1 } } layer { name: "relu2_2" type: "ReLU" bottom: "conv2_2" top: "conv2_2" } layer { name: "pool2" type: "Pooling" bottom: "conv2_2" top: "pool2" pooling_param { pool: MAX kernel_size: 2 stride: 2 } } layer { name: "conv3_1" type: "Convolution" bottom: "pool2" top: "conv3_1" convolution_param { num_output: 256 kernel_size: 3 pad: 1 } } layer { name: "relu3_1" type: "ReLU" bottom: "conv3_1" top: "conv3_1" } layer { name: "conv3_2" type: "Convolution" bottom: "conv3_1" top: "conv3_2" convolution_param { num_output: 256 kernel_size: 3 pad: 1 } } layer { name: "relu3_2" type: "ReLU" bottom: "conv3_2" top: "conv3_2" } layer { name: "conv3_3" type: "Convolution" bottom: "conv3_2" top: "conv3_3" convolution_param { num_output: 256 kernel_size: 3 pad: 1 } } layer { name: "relu3_3" type: "ReLU" bottom: "conv3_3" top: "conv3_3" } layer { name: "pool3" type: "Pooling" bottom: "conv3_3" top: "pool3" pooling_param { pool: MAX kernel_size: 2 stride: 2 } } layer { name: "conv4_1" type: "Convolution" bottom: "pool3" top: "conv4_1" convolution_param { num_output: 512 kernel_size: 3 pad: 1 } } layer { name: "relu4_1" type: "ReLU" bottom: "conv4_1" top: "conv4_1" } layer { name: "conv4_2" type: "Convolution" bottom: "conv4_1" top: "conv4_2" convolution_param { num_output: 512 kernel_size: 3 pad: 1 } } layer { name: "relu4_2" type: "ReLU" bottom: "conv4_2" top: "conv4_2" } layer { name: "conv4_3" type: "Convolution" bottom: "conv4_2" top: "conv4_3" convolution_param { num_output: 512 kernel_size: 3 pad: 1 } } layer { name: "relu4_3" type: "ReLU" bottom: "conv4_3" top: "conv4_3" } layer { name: "pool4" type: "Pooling" bottom: "conv4_3" top: "pool4" pooling_param { pool: MAX kernel_size: 2 stride: 2 } } layer { name: "conv5_1" type: "Convolution" bottom: "pool4" top: "conv5_1" convolution_param { num_output: 512 kernel_size: 3 pad: 1 } } layer { name: "relu5_1" type: "ReLU" bottom: "conv5_1" top: "conv5_1" } layer { name: "conv5_2" type: "Convolution" bottom: "conv5_1" top: "conv5_2" convolution_param { num_output: 512 kernel_size: 3 pad: 1 } } layer { name: "relu5_2" type: "ReLU" bottom: "conv5_2" top: "conv5_2" } layer { name: "conv5_3" type: "Convolution" bottom: "conv5_2" top: "conv5_3" convolution_param { num_output: 512 kernel_size: 3 pad: 1 } } layer { name: "relu5_3" type: "ReLU" bottom: "conv5_3" top: "conv5_3" } layer { name: "pool5" type: "Pooling" bottom: "conv5_3" top: "pool5" pooling_param { pool: MAX kernel_size: 2 stride: 2 } } layer { name: "fc6" type: "InnerProduct" bottom: "pool5" top: "fc6" inner_product_param { num_output: 4096 } } layer { name: "relu6" type: "ReLU" bottom: "fc6" top: "fc6" } layer { name: "drop6" type: "Dropout" bottom: "fc6" top: "fc6" dropout_param { dropout_ratio: 0.5 } } layer { name: "fc7" type: "InnerProduct" bottom: "fc6" top: "fc7" # Note that lr_mult can be set to 0 to disable any fine-tuning of this, and any other, layer inner_product_param { num_output: 4096 } } layer { name: "relu7" type: "ReLU" bottom: "fc7" top: "fc7" } layer { name: "drop7" type: "Dropout" bottom: "fc7" top: "fc7" dropout_param { dropout_ratio: 0.5 } } layer { name: "fc8_flickr" type: "InnerProduct" bottom: "fc7" top: "fc8_flickr" # lr_mult is set to higher than for other layers, because this layer is starting from random while the others are already trained propagate_down: false inner_product_param { num_output: 1072 #需修改 } } layer { name: "prob" type: "Softmax" bottom: "fc8_flickr" top: "prob" }
需要注意的是在342行num_output,你需要修改为训练的种类数。
而deploy.prototxt与VGG_FACE_deploy.prototxt的区别,推荐参考:
http://blog.csdn.net/fx409494616/article/details/53008971
二、模型测试
测试代码如下:# -*-coding:utf8-*-# import caffe #deploy文件 deployFile = #修改为第一步新建的配置文件地址 #caffemodel modelFile = #修改为模型地址 #测试图片地址 imgPath = #修改为待测试图片地址 def predictImg(net,imgPath): #图片预处理设置 transformer = caffe.io.Transformer({'data': net.blobs['data'].data.shape}) transformer.set_transpose('data', (2,0,1)) # 缩放到【0,255】之间 transformer.set_raw_scale('data', 255) #交换通道,将图片由RGB变为BGR transformer.set_channel_swap('data', (2,1,0)) # 加载图片 im = caffe.io.load_image(imgPath) #执行上面设置的图片预处理操作,并将图片载入到blob中 net.blobs['data'].data[...] = transformer.preprocess('data',im) # #执行测试 output = net.forward() output_prob = output['prob'][0] print(str(output_prob.argmax())) if __name__ == '__main__': #使用gpu caffe.set_mode_gpu() #加载网络 net = caffe.Net(deployFile,modelFile,caffe.TEST) predictImg(net,imgPath)
运行上述python代码,会打印出该图片属于的种类。
本部分参考:http://www.cnblogs.com/Allen-rg/p/5834551.html
相关文章推荐
- ROS使用笔记本自带USB摄像头运行pi_face_tracker,进行人脸识别
- 使用Imagenet VGG-19模型进行图片识别
- ROS使用USB摄像头运行pi_face_tracker,进行人脸识别
- 使用Imagenet VGG-19模型进行图片识别
- TensorFlow实现人脸识别(3)------将得到的训练图片以及测试图片进行处理
- 使用Imagenet VGG-19模型进行图片识别
- 基于VGG-Face的人脸识别测试
- Python 对图片进行人脸识别
- 怎样使用OpenCV进行人脸识别 [停止更新]
- windows下使用ffmpeg进行视频转码,图片拉取的Java测试代码
- Java使用OpenCV进行人脸识别
- 使用opencv创建一张纯黑色的图片与其他图片进行合成
- 怎样使用OpenCV进行人脸识别
- Java使用OpenCV进行人脸识别
- 使用现有的基于caffe训练好的imagenet model进行图片分类
- 怎样使用OpenCV进行人脸识别 [停止更新]
- Android使用Face++ SDK进行人脸识别和年龄检测
- 使用OpenCV进行人脸识别的三种算法(官方网翻译)
- 怎样使用OpenCV进行人脸识别
- 怎样使用OpenCV进行人脸识别