接前面博客:http://blog.csdn.net/lanxuecc/article/details/52329708 我学会了用caffe训练自己的测试自己的图片,但是这里测试的是测试数据集,那么如何用训练好的caffemodel测试自己的单张图片呢。下面记录下我用训练好的lenet_iter_10000.caffemodelg来测试mnist图片的整个摸索过程::::
用训练好的caffemodel来测试单张图片需要一个deploy.prototxt文件来指定网络的模型构造。
事实上deploy.prototxt文件与lenet_train_test.prototxt文件类似,只是首尾有些差别。仿照博客http://www.cnblogs.com/denny402/p/5685818.html 中的教程用deploy.py文件来生成deploy.prototxt文件。
# -*- coding: utf-8 -*-
caffe_root = '/home/schao/sc_tmp/caffe/caffe-master/'
import sys
sys.path.insert(0, caffe_root + 'python')
from caffe import layers as L,params as P,to_proto
root='/home/schao/sc_tmp/caffe/caffe-master/'
deploy='/home/schao/sc_tmp/caffe/caffe-master/examples/mnist/deploy.prototxt' #文件保存路径
def create_deploy():
#少了第一层,data层
conv1=L.Convolution(name='conv1',bottom='data', kernel_size=5, stride=1,num_output=20, pad=0,weight_filler=dict(type='xavier'))
pool1=L.Pooling(conv1,name='pool1',pool=P.Pooling.MAX, kernel_size=2, stride=2)
conv2=L.Convolution(pool1, name='conv2',kernel_size=5, stride=1,num_output=50, pad=0,weight_filler=dict(type='xavier'))
pool2=L.Pooling(conv2, name='pool2',top='pool2', pool=P.Pooling.MAX, kernel_size=2, stride=2)
fc3=L.InnerProduct(pool2, name='ip1',num_output=500,weight_filler=dict(type='xavier'))
relu3=L.ReLU(fc3, name='relu1',in_place=True)
fc4 = L.InnerProduct(relu3, name='ip2',num_output=10,weight_filler=dict(type='xavier'))
#最后没有accuracy层,但有一个Softmax层
prob=L.Softmax(fc4, name='prob')
return to_proto(prob)
def write_deploy():
with open(deploy, 'w') as f:
f.write('name:"LeNet"\n')
f.write('layer {\n')
f.write('name:"data"\n')
f.write('type:"Input"\n')
f.write('input_param { shape : {')
f.write('dim:1 ')
f.write('dim:3 ')
f.write('dim:28 ')
f.write('dim:28 ')
f.write('} }\n\n')
f.write(str(create_deploy()))
if __name__ == '__main__':
write_deploy()
生成的deploy.prototxt文件如下
name: "LeNet"
/*原来训练与测试两层数据层*/
/*layer {
name: "mnist"
type: "Data"
top: "data"
top: "label"
include {
phase: TRAIN
}
transform_param {
scale: 0.00390625
}
data_param {
source: "examples/mnist/mnist_train_lmdb"
batch_size: 64
backend: LMDB
}
}
layer {
name: "mnist"
type: "Data"
top: "data"
top: "label"
include {
phase: TEST
}
transform_param {
scale: 0.00390625
}
data_param {
source: "examples/mnist/mnist_test_lmdb"
batch_size: 100
backend: LMDB
}
}*/
/*被替换成如下*/
layer {
name: "data"
type: "Input"
top: "data"
input_param { shape: { dim: 1 dim: 1 dim: 28 dim: 28 } }
}
/*卷积层与全连接层中的权值学习率,偏移值学习率,偏移值初始化方式,因为这些值在caffemodel文件中已经提供*/
layer {
name: "conv1"
type: "Convolution"
bottom: "data"
top: "conv1"
convolution_param {
num_output: 20
kernel_size: 5
stride: 1
weight_filler {
type: "xavier"
}
}
}
layer {
name: "pool1"
type: "Pooling"
bottom: "conv1"
top: "pool1"
pooling_param {
pool: MAX
kernel_size: 2
stride: 2
}
}
layer {
name: "conv2"
type: "Convolution"
bottom: "pool1"
top: "conv2"
convolution_param {
num_output: 50
kernel_size: 5
stride: 1
weight_filler {
type: "xavier"
}
}
}
layer {
name: "pool2"
type: "Pooling"
bottom: "conv2"
top: "pool2"
pooling_param {
pool: MAX
kernel_size: 2
stride: 2
}
}
layer {
name: "ip1"
type: "InnerProduct"
bottom: "pool2"
top: "ip1"
inner_product_param {
num_output: 500
weight_filler {
type: "xavier"
}
}
}
layer {
name: "relu1"
type: "ReLU"
bottom: "ip1"
top: "ip1"
}
layer {
name: "ip2"
type: "InnerProduct"
bottom: "ip1"
top: "ip2"
inner_product_param {
num_output: 10
weight_filler {
type: "xavier"
}
}
}
/*删除了原有的测试模块的测试精度层*/
/*输出层的类型由SoftmaxWithLoss变成Softmax,训练是输出时是loss,应用时是prob。*/
layer {
name: "prob"
type: "Softmax"
bottom: "ip2"
top: "prob"
}
总得来说,deploy.prototxt就是在lenet_train_test.prototxt的基础上稍作改动,input_param { shape: { dim: 1 dim: 1 dim: 28 dim: 28 } } 这四个dim参数分别是
第一个:对待识别样本图片进行数据增广的数量,一个图片会变成10个,之后输入到网络进行识别。如果不进行数据增广,可以设置成1。
第二个:图片的通道数,一般灰度图片为单通道,则值为1,如果为非灰度图3通道图片则为3。
第三个:图片的高度,单位像素。
第四个:图片的宽度,单位像素。
对deploy.prototxt的理解来源于:
http://blog.csdn.net/ddqqfree123/article/details/52389337
http://www.cnblogs.com/daihengchen/p/5761304.html
http://caffecn.cn/?/question/431
http://blog.csdn.net/sunshine_in_moon/article/details/49472901
http://stackoverflow.com/questions/36002387/channel-swap-needs-to-have-the-same-number-of-dimensions-as-the-input-channels-e/36075282
http://blog.csdn.net/u010417185/article/details/52137825
http://www.cnblogs.com/denny402/p/5685818.html
执行
python deploy.py
生成deploy.prototxt。在生成过程中我遇到以下几个报错
报错: ImportError: No module named caffe
解决:
这种情况一般是没有把caffe中的和python相关的内容的路径添加到python的编译路径中。所以在deploy.py文件开始部位加入
caffe_root = '/home/schao/sc_tmp/caffe/caffe-master/'
import sys
sys.path.insert(0, caffe_root + 'python')
指定caffe源码所在路径。
报错:ImportError: liblapack.so.3 cannot open shared object file:No such file or directory
解决:
找不到这个库,但是我在系统中能找到这个库,说明已安装但找不到库位置,那么指定该库所有位置到LD_LIBRARY_PATH共享目录去,ubuntu系统在/etc/ld.so.conf.d/目录中添加lapack.conf,指定这个库目录。
报错: import numpy as npImportError: No module named numpy
解决:
用下列命令安装
apt-get install pyton-numpy
报错:libblas.so.3: cannot open shared object file: No such file or directory
解决:
因为我已经安装守OpenBlas库,所以建立一个软链接指向这个库
update-alternatives --install /usr/lib/libblas.so.3 libblas.so.3 /usr/local/OpenBlas/lib/libopenblas.so 37
报错: import skimage.ioImportError: No module named skimage.io
解决:
参考这个网页中方案解决:
http://www.linuxdiyf.com/linux/15537.html